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