1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at
9 * http://www.opensource.org/licenses/cddl1.txt.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2004-2012 Emulex. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #ifndef _EMLXS_FCF_H
28 #define _EMLXS_FCF_H
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #define FCFTAB_MAX_FCFI_COUNT 1
35 #define FCFI_MAX_VFI_COUNT 1
36
37 /* Internal generic events */
38 #define FCF_EVENT_STATE_ENTER 0
39
40 /* External async fabric events */
41 #define FCF_EVENT_SHUTDOWN 1
42 #define FCF_EVENT_LINKUP 2
43 #define FCF_EVENT_LINKDOWN 3
44 #define FCF_EVENT_CVL 4
45 #define FCF_EVENT_FCFTAB_FULL 5
46 #define FCF_EVENT_FCF_FOUND 6
47 #define FCF_EVENT_FCF_LOST 7
48 #define FCF_EVENT_FCF_CHANGED 8
49
50 /* Internal async events */
51 #define FCF_EVENT_FCFTAB_ONLINE 9
52 #define FCF_EVENT_FCFTAB_OFFLINE 10
53
54 #define FCF_EVENT_FCFI_ONLINE 11
55 #define FCF_EVENT_FCFI_OFFLINE 12
56 #define FCF_EVENT_FCFI_PAUSE 13
57
58 #define FCF_EVENT_VFI_ONLINE 14
59 #define FCF_EVENT_VFI_OFFLINE 15
60 #define FCF_EVENT_VFI_PAUSE 16
61
62 #define FCF_EVENT_VPI_ONLINE 17
63 #define FCF_EVENT_VPI_OFFLINE 18
64 #define FCF_EVENT_VPI_PAUSE 19
65
66 #define FCF_EVENT_RPI_ONLINE 20
67 #define FCF_EVENT_RPI_OFFLINE 21
68 #define FCF_EVENT_RPI_PAUSE 22
69 #define FCF_EVENT_RPI_RESUME 23
70
71 /* State change reason codes */ /* explan */
72 #define FCF_REASON_NONE 0
73 #define FCF_REASON_REENTER 1
74 #define FCF_REASON_EVENT 2 /* evt */
75 #define FCF_REASON_REQUESTED 3
76 #define FCF_REASON_NO_MBOX 4
77 #define FCF_REASON_NO_BUFFER 5
78 #define FCF_REASON_SEND_FAILED 6 /* status */
79 #define FCF_REASON_MBOX_FAILED 7 /* status */
80 #define FCF_REASON_MBOX_BUSY 8 /* status */
81 #define FCF_REASON_NO_FCFI 9
82 #define FCF_REASON_NO_VFI 10
83 #define FCF_REASON_ONLINE_FAILED 11
84 #define FCF_REASON_OFFLINE_FAILED 12
85 #define FCF_REASON_OP_FAILED 13 /* attempts */
86 #define FCF_REASON_NO_PKT 14
87 #define FCF_REASON_NO_NODE 15
88 #define FCF_REASON_NOT_ALLOWED 16
89 #define FCF_REASON_UNUSED 17
90 #define FCF_REASON_INVALID 18
91
92 typedef struct XRIobj
93 {
94 struct XRIobj *_f;
95 struct XRIobj *_b;
96 uint16_t XRI;
97 uint16_t state;
98 #define XRI_STATE_FREE 0
99 #define XRI_STATE_ALLOCATED 1
100
101 uint16_t sge_count;
102 uint16_t iotag;
103 MBUF_INFO SGList;
104 struct RPIobj *rpip;
105 struct RPIobj *reserved_rpip;
106 emlxs_buf_t *sbp;
107 uint32_t rx_id; /* Used for unsol exchanges */
108 uint32_t flag;
109 #define EMLXS_XRI_RESERVED 0x00000001
110 #define EMLXS_XRI_PENDING_IO 0x00000002
111 #define EMLXS_XRI_BUSY 0x00000004
112
113 uint32_t type;
114 #define EMLXS_XRI_SOL_FCP_TYPE 1
115 #define EMLXS_XRI_UNSOL_FCP_TYPE 2
116 #define EMLXS_XRI_SOL_CT_TYPE 3
117 #define EMLXS_XRI_UNSOL_CT_TYPE 4
118 #define EMLXS_XRI_SOL_ELS_TYPE 5
119 #define EMLXS_XRI_UNSOL_ELS_TYPE 6
120 #define EMLXS_XRI_SOL_BLS_TYPE 7
121
122 } XRIobj_t;
123
124
125 typedef struct emlxs_deferred_cmpl
126 {
127 struct emlxs_port *port;
128 struct emlxs_node *node;
129
130 void *arg1;
131 void *arg2;
132 void *arg3;
133
134 } emlxs_deferred_cmpl_t;
135
136
137 #define FABRIC_RPI 0xffff
138
139 typedef struct RPIobj
140 {
141 uint16_t index;
142 uint16_t RPI;
143
144 uint16_t prev_reason;
145 uint16_t prev_state;
146
147 uint16_t reason;
148 uint16_t state;
149 #define RPI_STATE_FREE 0
150
151 #define RPI_STATE_RESERVED 1
152 #define RPI_STATE_OFFLINE 2
153
154 #define RPI_STATE_UNREG_CMPL 3
155 #define RPI_STATE_UNREG_FAILED 4
156 #define RPI_STATE_UNREG 5
157
158 #define RPI_STATE_REG 6
159 #define RPI_STATE_REG_FAILED 7
160 #define RPI_STATE_REG_CMPL 8
161
162 #define RPI_STATE_PAUSED 9
163
164 #define RPI_STATE_RESUME 10
165 #define RPI_STATE_RESUME_FAILED 11
166 #define RPI_STATE_RESUME_CMPL 12
167
168 #define RPI_STATE_ONLINE 13
169
170
171 uint32_t flag;
172 #define EMLXS_RPI_VPI 0x00000010 /* rpi_online set */
173 #define EMLXS_RPI_PAUSED 0x00000020 /* rpi_paused set */
174 #define EMLXS_RPI_REG 0x00000040
175
176 #define EMLXS_RPI_FIRST 0x80000000
177
178 uint32_t attempts;
179 uint32_t xri_count; /* Managed by XRIobj_t */
180
181 uint32_t idle_timer;
182
183 struct VPIobj *vpip;
184
185 /* Node info */
186 struct emlxs_node *node;
187 uint32_t did;
188 SERV_PARM sparam;
189
190 emlxs_deferred_cmpl_t *cmpl;
191
192 } RPIobj_t;
193
194
195 typedef struct VPIobj
196 {
197 uint16_t index;
198 uint16_t VPI;
199
200 uint16_t prev_reason;
201 uint16_t prev_state;
202
203 uint16_t reason;
204 uint16_t state;
205 #define VPI_STATE_OFFLINE 0
206
207 #define VPI_STATE_INIT 1
208 #define VPI_STATE_INIT_FAILED 2
209 #define VPI_STATE_INIT_CMPL 3
210
211 #define VPI_STATE_UNREG_CMPL 4
212 #define VPI_STATE_UNREG_FAILED 5
213 #define VPI_STATE_UNREG 6
214
215 #define VPI_STATE_LOGO_CMPL 7
216 #define VPI_STATE_LOGO_FAILED 8
217 #define VPI_STATE_LOGO 9
218
219 #define VPI_STATE_PORT_OFFLINE 10
220 #define VPI_STATE_PORT_ONLINE 11
221
222 #define VPI_STATE_LOGI 12
223 #define VPI_STATE_LOGI_FAILED 13
224 #define VPI_STATE_LOGI_CMPL 14
225
226 #define VPI_STATE_REG 15
227 #define VPI_STATE_REG_FAILED 16
228 #define VPI_STATE_REG_CMPL 17
229
230 #define VPI_STATE_PAUSED 18
231 #define VPI_STATE_ONLINE 19
232
233
234 uint32_t flag;
235 #define EMLXS_VPI_ONLINE_REQ 0x00000001
236 #define EMLXS_VPI_OFFLINE_REQ 0x00000002
237 #define EMLXS_VPI_PAUSE_REQ 0x00000004
238 #define EMLXS_VPI_REQ_MASK 0x0000000F
239
240 #define EMLXS_VPI_VFI 0x00000010 /* vpi_online set */
241 #define EMLXS_VPI_VFI_LOGI 0x00000020 /* logi_count set */
242 #define EMLXS_VPI_INIT 0x00000040
243 #define EMLXS_VPI_REG 0x00000080
244 #define EMLXS_VPI_PORT_ONLINE 0x00000100
245 #define EMLXS_VPI_LOGI 0x00000200
246 #define EMLXS_VPI_PORT_UNBIND 0x40000000
247 #define EMLXS_VPI_PORT_ENABLED 0x80000000
248
249 uint32_t attempts;
250
251 RPIobj_t fabric_rpi; /* Reserved Fabric RPI object */
252 RPIobj_t *fabric_rpip; /* Fabric RPI pointer (&fabric_rpi) */
253 RPIobj_t *p2p_rpip;
254
255 struct emlxs_port *port;
256
257 struct VFIobj *vfip; /* Managed by VFIobj_t */
258 uint32_t rpi_online; /* Managed by RPIobj_t */
259 uint32_t rpi_paused; /* Managed by RPIobj_t */
260
261 } VPIobj_t;
262
263
264 typedef struct VFIobj
265 {
266 uint16_t index;
267 uint16_t VFI;
268
269 uint16_t prev_reason;
270 uint16_t prev_state;
271
272 uint16_t reason;
273 uint16_t state;
274 #define VFI_STATE_OFFLINE 0
275
276 #define VFI_STATE_INIT 1
277 #define VFI_STATE_INIT_FAILED 2
278 #define VFI_STATE_INIT_CMPL 3
279
280 #define VFI_STATE_VPI_OFFLINE_CMPL 4
281 #define VFI_STATE_VPI_OFFLINE 5
282
283 #define VFI_STATE_VPI_ONLINE 6
284 #define VFI_STATE_VPI_ONLINE_CMPL 7
285
286 #define VFI_STATE_UNREG_CMPL 8
287 #define VFI_STATE_UNREG_FAILED 9
288 #define VFI_STATE_UNREG 10
289
290 #define VFI_STATE_REG 11
291 #define VFI_STATE_REG_FAILED 12
292 #define VFI_STATE_REG_CMPL 13
293
294 #define VFI_STATE_PAUSED 14
295 #define VFI_STATE_ONLINE 15
296
297 uint32_t flag;
298 #define EMLXS_VFI_ONLINE_REQ 0x00000001
299 #define EMLXS_VFI_OFFLINE_REQ 0x00000002
300 #define EMLXS_VFI_PAUSE_REQ 0x00000004
301 #define EMLXS_VFI_REQ_MASK 0x0000000F
302
303 #define EMLXS_VFI_FCFI 0x00000010 /* vfi_online set */
304 #define EMLXS_VFI_INIT 0x00000020
305 #define EMLXS_VFI_REG 0x00000040
306
307 SERV_PARM sparam; /* Last registered sparams */
308
309 uint32_t attempts;
310
311 struct FCFIobj *fcfp; /* Managed by FCFIobj_t */
312
313 uint32_t vpi_online; /* Managed by VPIobj_t */
314 uint32_t logi_count; /* Managed by VPIobj_t */
315 struct VPIobj *flogi_vpip; /* Managed by VPIobj_t */
316
317 } VFIobj_t;
318
319
320 typedef struct FCFIobj
321 {
322 uint16_t index;
323 uint16_t FCFI;
324
325 uint16_t fcf_index;
326 uint16_t vlan_id;
327
328 uint16_t prev_reason;
329 uint16_t prev_state;
330
331 uint16_t reason;
332 uint16_t state;
333 #define FCFI_STATE_FREE 0
334
335 #define FCFI_STATE_OFFLINE 1
336
337 #define FCFI_STATE_UNREG_CMPL 2
338 #define FCFI_STATE_UNREG_FAILED 3
339 #define FCFI_STATE_UNREG 4
340
341 #define FCFI_STATE_REG 5
342 #define FCFI_STATE_REG_FAILED 6
343 #define FCFI_STATE_REG_CMPL 7
344
345 #define FCFI_STATE_VFI_OFFLINE_CMPL 8
346 #define FCFI_STATE_VFI_OFFLINE 9
347
348 #define FCFI_STATE_VFI_ONLINE 10
349 #define FCFI_STATE_VFI_ONLINE_CMPL 11
350
351 #define FCFI_STATE_PAUSED 12
352 #define FCFI_STATE_ONLINE 13
353
354
355 uint16_t pad;
356 uint16_t generation;
357
358 uint32_t offline_timer;
359 uint32_t attempts;
360
361 uint32_t event_tag;
362 uint32_t flag;
363 #define EMLXS_FCFI_ONLINE_REQ 0x00000001
364 #define EMLXS_FCFI_OFFLINE_REQ 0x00000002
365 #define EMLXS_FCFI_PAUSE_REQ 0x00000004
366 #define EMLXS_FCFI_REQ_MASK 0x0000000F
367
368 #define EMLXS_FCFI_FCFTAB 0x00000010 /* fcfi_online set */
369 #define EMLXS_FCFI_REG 0x00000020
370
371 #define EMLXS_FCFI_VALID 0x00000100
372 #define EMLXS_FCFI_AVAILABLE 0x00000200
373 #define EMLXS_FCFI_CONFIGURED 0x00000400
374 #define EMLXS_FCFI_FRESH 0x00000800
375 #define EMLXS_FCFI_FAILED 0x00001000
376 #define EMLXS_FCFI_SELECTED 0x00002000 /* in use */
377
378 #define EMLXS_FCFI_VLAN_ID 0x00010000
379 #define EMLXS_FCFI_BOOT 0x00020000
380 #define EMLXS_FCFI_PRIMARY 0x00040000
381
382 #define EMLXS_FCFI_TAGGED 0x80000000
383
384 /* struct VFTable vftab */
385
386 FCF_RECORD_t fcf_rec;
387 uint32_t priority;
388
389 uint32_t vfi_online; /* Managed by VFIobj_t */
390
391 } FCFIobj_t;
392
393
394 typedef struct VFTable
395 {
396 uint16_t prev_reason;
397 uint16_t prev_state;
398
399 uint16_t reason;
400 uint16_t state;
401 #define VFTAB_STATE_DISABLED 0
402
403 uint32_t vfi_active;
404 uint32_t vfi_count;
405 VFIobj_t *table;
406
407 } VFTable_t;
408
409 typedef struct FCFTable
410 {
411
412 uint16_t prev_reason;
413 uint16_t prev_state;
414
415 uint16_t reason;
416 uint16_t state;
417 /* Common states */
418 #define FCFTAB_STATE_SHUTDOWN 0
419 #define FCFTAB_STATE_OFFLINE 1
420
421 /* FCOE states */
422 #define FCOE_FCFTAB_STATE_SHUTDOWN FCFTAB_STATE_SHUTDOWN
423 #define FCOE_FCFTAB_STATE_OFFLINE FCFTAB_STATE_OFFLINE
424
425 #define FCOE_FCFTAB_STATE_SOLICIT 2
426 #define FCOE_FCFTAB_STATE_SOLICIT_FAILED 3
427 #define FCOE_FCFTAB_STATE_SOLICIT_CMPL 4
428
429 #define FCOE_FCFTAB_STATE_READ 5
430 #define FCOE_FCFTAB_STATE_READ_FAILED 6
431 #define FCOE_FCFTAB_STATE_READ_CMPL 7
432
433 #define FCOE_FCFTAB_STATE_FCFI_OFFLINE_CMPL 8
434 #define FCOE_FCFTAB_STATE_FCFI_OFFLINE 9
435
436 #define FCOE_FCFTAB_STATE_FCFI_ONLINE 10
437 #define FCOE_FCFTAB_STATE_FCFI_ONLINE_CMPL 11
438
439 #define FCOE_FCFTAB_STATE_ONLINE 12
440
441
442 /* FC states */
443 #define FC_FCFTAB_STATE_SHUTDOWN FCFTAB_STATE_SHUTDOWN
444 #define FC_FCFTAB_STATE_OFFLINE FCFTAB_STATE_OFFLINE
445
446 #define FC_FCFTAB_STATE_TOPO 2
447 #define FC_FCFTAB_STATE_TOPO_FAILED 3
448 #define FC_FCFTAB_STATE_TOPO_CMPL 4
449
450 #define FC_FCFTAB_STATE_CFGLINK 5
451 #define FC_FCFTAB_STATE_CFGLINK_FAILED 6
452 #define FC_FCFTAB_STATE_CFGLINK_CMPL 7
453
454 #define FC_FCFTAB_STATE_SPARM 8
455 #define FC_FCFTAB_STATE_SPARM_FAILED 9
456 #define FC_FCFTAB_STATE_SPARM_CMPL 10
457
458 #define FC_FCFTAB_STATE_FCFI_OFFLINE_CMPL 11
459 #define FC_FCFTAB_STATE_FCFI_OFFLINE 12
460
461 #define FC_FCFTAB_STATE_FCFI_ONLINE 13
462 #define FC_FCFTAB_STATE_FCFI_ONLINE_CMPL 14
463
464 #define FC_FCFTAB_STATE_ONLINE 15
465
466
467 uint16_t TID;
468 uint16_t generation;
469
470 uint32_t flag;
471 /* Common flags */
472 #define EMLXS_FCFTAB_REQ_MASK 0x0000000F
473 #define EMLXS_FCFTAB_SHUTDOWN 0x80000000
474
475 /* FCOE flags */
476 #define EMLXS_FCOE_FCFTAB_SOL_REQ 0x00000001
477 #define EMLXS_FCOE_FCFTAB_READ_REQ 0x00000002
478 #define EMLXS_FCOE_FCFTAB_OFFLINE_REQ 0x00000004
479
480 /* FC flags */
481 #define EMLXS_FC_FCFTAB_TOPO_REQ 0x00000001
482 #define EMLXS_FC_FCFTAB_CFGLINK_REQ 0x00000002
483 #define EMLXS_FC_FCFTAB_SPARM_REQ 0x00000004
484 #define EMLXS_FC_FCFTAB_OFFLINE_REQ 0x00000008
485
486 uint32_t attempts;
487
488 uint32_t fcfi_online; /* Managed by FCFIobj_t */
489
490 FCFIobj_t *fcfi[FCFTAB_MAX_FCFI_COUNT];
491 uint32_t fcfi_count;
492
493 FCFIobj_t *table;
494 uint16_t table_count;
495
496 uint32_t online_timer; /* FC */
497
498 uint32_t sol_timer; /* FCOE */
499 uint32_t read_timer; /* FCOE */
500
501 } FCFTable_t;
502 #define FCFTAB_READ_ALL (void*)0xffff
503
504 #ifdef __cplusplus
505 }
506 #endif
507
508 #endif /* _EMLXS_FCF_H */