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_MBOX_H
28 #define	_EMLXS_MBOX_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 /* SLI 2/3 Mailbox defines */
35 
36 #define	MBOX_SIZE			256
37 #define	MBOX_EXTENSION_OFFSET		MBOX_SIZE
38 
39 #ifdef MBOX_EXT_SUPPORT
40 #define	MBOX_EXTENSION_SIZE		1024
41 #else
42 #define	MBOX_EXTENSION_SIZE		0
43 #endif /* MBOX_EXT_SUPPORT */
44 
45 
46 
47 /* ==== Mailbox Commands ==== */
48 #define	MBX_SHUTDOWN			0x00	/* terminate testing */
49 #define	MBX_LOAD_SM			0x01
50 #define	MBX_READ_NV			0x02
51 #define	MBX_WRITE_NV			0x03
52 #define	MBX_RUN_BIU_DIAG		0x04
53 #define	MBX_INIT_LINK			0x05
54 #define	MBX_DOWN_LINK			0x06
55 #define	MBX_CONFIG_LINK			0x07
56 #define	MBX_PART_SLIM			0x08
57 #define	MBX_CONFIG_RING			0x09
58 #define	MBX_RESET_RING			0x0A
59 #define	MBX_READ_CONFIG			0x0B
60 #define	MBX_READ_RCONFIG		0x0C
61 #define	MBX_READ_SPARM			0x0D
62 #define	MBX_READ_STATUS			0x0E
63 #define	MBX_READ_RPI			0x0F
64 #define	MBX_READ_XRI			0x10
65 #define	MBX_READ_REV			0x11
66 #define	MBX_READ_LNK_STAT		0x12
67 #define	MBX_REG_LOGIN			0x13
68 #define	MBX_UNREG_LOGIN			0x14  /* SLI2/3 */
69 #define	MBX_UNREG_RPI			0x14  /* SLI4 */
70 #define	MBX_READ_LA			0x15
71 #define	MBX_CLEAR_LA			0x16
72 #define	MBX_DUMP_MEMORY			0x17
73 #define	MBX_DUMP_CONTEXT		0x18
74 #define	MBX_RUN_DIAGS			0x19
75 #define	MBX_RESTART			0x1A
76 #define	MBX_UPDATE_CFG			0x1B
77 #define	MBX_DOWN_LOAD			0x1C
78 #define	MBX_DEL_LD_ENTRY		0x1D
79 #define	MBX_RUN_PROGRAM			0x1E
80 #define	MBX_SET_MASK			0x20
81 #define	MBX_SET_VARIABLE		0x21
82 #define	MBX_UNREG_D_ID			0x23
83 #define	MBX_KILL_BOARD			0x24
84 #define	MBX_CONFIG_FARP			0x25
85 #define	MBX_BEACON			0x2A
86 #define	MBX_READ_VPI			0x2B
87 #define	MBX_CONFIG_MSIX			0x30
88 #define	MBX_HEARTBEAT			0x31
89 #define	MBX_WRITE_VPARMS		0x32
90 #define	MBX_ASYNC_EVENT			0x33
91 
92 #define	MBX_READ_EVENT_LOG_STATUS	0x37
93 #define	MBX_READ_EVENT_LOG		0x38
94 #define	MBX_WRITE_EVENT_LOG		0x39
95 #define	MBX_NV_LOG			0x3A
96 #define	MBX_PORT_CAPABILITIES		0x3B
97 #define	MBX_IOV_CONTROL			0x3C
98 #define	MBX_IOV_MBX			0x3D
99 
100 
101 #define	MBX_CONFIG_HBQ			0x7C  /* SLI3 */
102 #define	MBX_LOAD_AREA			0x81
103 #define	MBX_RUN_BIU_DIAG64		0x84
104 #define	MBX_GET_DEBUG			0x86
105 #define	MBX_CONFIG_PORT			0x88
106 #define	MBX_READ_SPARM64		0x8D
107 #define	MBX_READ_RPI64			0x8F
108 #define	MBX_CONFIG_MSI			0x90
109 #define	MBX_REG_LOGIN64			0x93 /* SLI2/3 */
110 #define	MBX_REG_RPI			0x93 /* SLI4 */
111 #define	MBX_READ_LA64			0x95 /* SLI2/3 */
112 #define	MBX_READ_TOPOLOGY		0x95 /* SLI4 */
113 #define	MBX_REG_VPI			0x96 /* NPIV */
114 #define	MBX_UNREG_VPI			0x97 /* NPIV */
115 #define	MBX_FLASH_WR_ULA		0x98
116 #define	MBX_SET_DEBUG			0x99
117 #define	MBX_SLI_CONFIG			0x9B
118 #define	MBX_LOAD_EXP_ROM		0x9C
119 #define	MBX_REQUEST_FEATURES		0x9D
120 #define	MBX_RESUME_RPI			0x9E
121 #define	MBX_REG_VFI			0x9F
122 #define	MBX_REG_FCFI			0xA0
123 #define	MBX_UNREG_VFI			0xA1
124 #define	MBX_UNREG_FCFI			0xA2
125 #define	MBX_INIT_VFI			0xA3
126 #define	MBX_INIT_VPI			0xA4
127 #define	MBX_ACCESS_VDATA		0xA5
128 #define	MBX_MAX_CMDS			0xA6
129 
130 
131 /*
132  * Define Status
133  */
134 #define	MBX_SUCCESS			0x0
135 #define	MBX_FAILURE			0x1
136 #define	MBXERR_NUM_IOCBS		0x2
137 #define	MBXERR_IOCBS_EXCEEDED		0x3
138 #define	MBXERR_BAD_RING_NUMBER		0x4
139 #define	MBXERR_MASK_ENTRIES_RANGE	0x5
140 #define	MBXERR_MASKS_EXCEEDED		0x6
141 #define	MBXERR_BAD_PROFILE		0x7
142 #define	MBXERR_BAD_DEF_CLASS		0x8
143 #define	MBXERR_BAD_MAX_RESPONDER	0x9
144 #define	MBXERR_BAD_MAX_ORIGINATOR	0xA
145 #define	MBXERR_RPI_REGISTERED		0xB
146 #define	MBXERR_RPI_FULL			0xC
147 #define	MBXERR_NO_RESOURCES		0xD
148 #define	MBXERR_BAD_RCV_LENGTH		0xE
149 #define	MBXERR_DMA_ERROR		0xF
150 #define	MBXERR_NOT_SUPPORTED		0x10
151 #define	MBXERR_UNSUPPORTED_FEATURE	0x11
152 #define	MBXERR_UNKNOWN_COMMAND		0x12
153 #define	MBXERR_BAD_IP_BIT		0x13
154 #define	MBXERR_BAD_PCB_ALIGN		0x14
155 #define	MBXERR_BAD_HBQ_ID		0x15
156 #define	MBXERR_BAD_HBQ_STATE		0x16
157 #define	MBXERR_BAD_HBQ_MASK_NUM		0x17
158 #define	MBXERR_BAD_HBQ_MASK_SUBSET	0x18
159 #define	MBXERR_HBQ_CREATE_FAIL		0x19
160 #define	MBXERR_HBQ_EXISTING		0x1A
161 #define	MBXERR_HBQ_RSPRING_FULL		0x1B
162 #define	MBXERR_HBQ_DUP_MASK		0x1C
163 #define	MBXERR_HBQ_INVAL_GET_PTR	0x1D
164 #define	MBXERR_BAD_HBQ_SIZE		0x1E
165 #define	MBXERR_BAD_HBQ_ORDER		0x1F
166 #define	MBXERR_INVALID_ID		0x20
167 
168 #define	MBXERR_INVALID_VFI		0x30
169 
170 #define	MBXERR_FLASH_WRITE_FAILED	0x100
171 
172 #define	MBXERR_INVALID_LINKSPEED	0x500
173 
174 #define	MBXERR_BAD_REDIRECT		0x900
175 #define	MBXERR_RING_ALREADY_CONFIG	0x901
176 
177 #define	MBXERR_RING_INACTIVE		0xA00
178 
179 #define	MBXERR_RPI_INACTIVE		0xF00
180 
181 #define	MBXERR_NO_ACTIVE_XRI		0x1100
182 #define	MBXERR_XRI_NOT_ACTIVE		0x1101
183 
184 #define	MBXERR_RPI_INUSE		0x1400
185 
186 #define	MBXERR_NO_LINK_ATTENTION	0x1500
187 
188 #define	MBXERR_INVALID_SLI_MODE		0x8800
189 #define	MBXERR_INVALID_HOST_PTR		0x8801
190 #define	MBXERR_CANT_CFG_SLI_MODE	0x8802
191 #define	MBXERR_BAD_OVERLAY		0x8803
192 #define	MBXERR_INVALID_FEAT_REQ		0x8804
193 
194 #define	MBXERR_CONFIG_CANT_COMPLETE	0x88FF
195 
196 #define	MBXERR_DID_ALREADY_REGISTERED	0x9600
197 #define	MBXERR_DID_INCONSISTENT		0x9601
198 #define	MBXERR_VPI_TOO_LARGE		0x9603
199 
200 #define	MBXERR_STILL_ASSOCIATED		0x9700
201 
202 #define	MBXERR_INVALID_VF_STATE		0x9F00
203 #define	MBXERR_VFI_ALREADY_REGISTERED	0x9F02
204 #define	MBXERR_VFI_TOO_LARGE		0x9F03
205 
206 #define	MBXERR_LOAD_FW_FAILED		0xFFFE
207 #define	MBXERR_FIND_FW_FAILED		0xFFFF
208 
209 /* Driver special codes */
210 #define	MBX_DRIVER_RESERVED		0xF9 /* Set to lowest drv status */
211 #define	MBX_NONEMBED_ERROR		0xF9
212 #define	MBX_OVERTEMP_ERROR		0xFA
213 #define	MBX_HARDWARE_ERROR		0xFB
214 #define	MBX_DRVR_ERROR			0xFC
215 #define	MBX_BUSY			0xFD
216 #define	MBX_TIMEOUT			0xFE
217 #define	MBX_NOT_FINISHED		0xFF
218 
219 /*
220  * flags for EMLXS_SLI_ISSUE_MBOX_CMD()
221  */
222 #define	MBX_POLL	0x01	/* poll mailbox till command done, */
223 				/* then return */
224 #define	MBX_SLEEP	0x02	/* sleep till mailbox intr cmpl */
225 				/* wakes thread up */
226 #define	MBX_WAIT	0x03	/* wait for comand done, then return */
227 #define	MBX_NOWAIT	0x04	/* issue command then return immediately */
228 #define	MBX_BOOTSTRAP	0x80	/* issue a command on the bootstrap mbox */
229 
230 
231 
232 /*
233  * Begin Structure Definitions for Mailbox Commands
234  */
235 
236 typedef struct revcompat
237 {
238 #ifdef EMLXS_BIG_ENDIAN
239 	uint32_t	ldflag:1;	/* Set in SRAM descriptor */
240 	uint32_t	ldcount:7;	/* For use by program load */
241 	uint32_t	kernel:4;	/* Kernel ID */
242 	uint32_t	kver:4;	/* Kernel compatibility version */
243 	uint32_t	SMver:4;	/* Sequence Manager version */
244 					/* 0 if none */
245 	uint32_t	ENDECver:4;	/* ENDEC+ version, 0 if none */
246 	uint32_t	BIUtype:4;	/* PCI = 0 */
247 	uint32_t	BIUver:4;	/* BIU version, 0 if none */
248 #endif
249 #ifdef EMLXS_LITTLE_ENDIAN
250 	uint32_t	BIUver:4;	/* BIU version, 0 if none */
251 	uint32_t	BIUtype:4;	/* PCI = 0 */
252 	uint32_t	ENDECver:4;	/* ENDEC+ version, 0 if none */
253 	uint32_t	SMver:4;	/* Sequence Manager version */
254 					/* 0 if none */
255 	uint32_t	kver:4;	/* Kernel compatibility version */
256 	uint32_t	kernel:4;	/* Kernel ID */
257 	uint32_t	ldcount:7;	/* For use by program load */
258 	uint32_t	ldflag:1;	/* Set in SRAM descriptor */
259 #endif
260 } REVCOMPAT;
261 
262 typedef struct id_word
263 {
264 #ifdef EMLXS_BIG_ENDIAN
265 	uint8_t		Type;
266 	uint8_t		Id;
267 	uint8_t		Ver;
268 	uint8_t		Rev;
269 #endif
270 #ifdef EMLXS_LITTLE_ENDIAN
271 	uint8_t		Rev;
272 	uint8_t		Ver;
273 	uint8_t		Id;
274 	uint8_t		Type;
275 #endif
276 	union
277 	{
278 		REVCOMPAT	cp;
279 		uint32_t	revcomp;
280 	} un;
281 } PROG_ID;
282 
283 typedef struct
284 {
285 #ifdef EMLXS_BIG_ENDIAN
286 	uint8_t		tval;
287 	uint8_t		tmask;
288 	uint8_t		rval;
289 	uint8_t		rmask;
290 #endif
291 #ifdef EMLXS_LITTLE_ENDIAN
292 	uint8_t		rmask;
293 	uint8_t		rval;
294 	uint8_t		tmask;
295 	uint8_t		tval;
296 #endif
297 } RR_REG;
298 
299 
300 /* Structure used for a HBQ entry */
301 typedef struct
302 {
303 	ULP_BDE64	bde;
304 	union UN_TAG
305 	{
306 		uint32_t	w;
307 		struct
308 		{
309 #ifdef EMLXS_BIG_ENDIAN
310 			uint32_t	HBQ_tag:4;
311 			uint32_t	HBQE_tag:28;
312 #endif
313 #ifdef EMLXS_LITTLE_ENDIAN
314 			uint32_t	HBQE_tag:28;
315 			uint32_t	HBQ_tag:4;
316 #endif
317 		} ext;
318 	} unt;
319 } HBQE_t;
320 
321 typedef struct
322 {
323 #ifdef EMLXS_BIG_ENDIAN
324 	uint8_t		tmatch;
325 	uint8_t		tmask;
326 	uint8_t		rctlmatch;
327 	uint8_t		rctlmask;
328 #endif
329 #ifdef EMLXS_LITTLE_ENDIAN
330 	uint8_t		rctlmask;
331 	uint8_t		rctlmatch;
332 	uint8_t		tmask;
333 	uint8_t		tmatch;
334 #endif
335 } HBQ_MASK;
336 
337 #define	EMLXS_MAX_HBQ_BUFFERS	4096
338 
339 typedef struct
340 {
341 	uint32_t	HBQ_num_mask;		/* number of mask entries in */
342 						/* port array */
343 	uint32_t	HBQ_recvNotify;		/* Rcv buffer notification */
344 	uint32_t	HBQ_numEntries;		/* # of entries in HBQ */
345 	uint32_t	HBQ_headerLen;		/* 0 if not profile 4 or 5 */
346 	uint32_t	HBQ_logEntry;		/* Set to 1 if this HBQ used */
347 						/* for LogEntry */
348 	uint32_t	HBQ_profile;		/* Selection profile 0=all, */
349 						/* 7=logentry */
350 	uint32_t	HBQ_ringMask;		/* Binds HBQ to a ring e.g. */
351 						/* Ring0=b0001, ring2=b0100 */
352 	uint32_t	HBQ_id;			/* index of this hbq in ring */
353 						/* of HBQs[] */
354 	uint32_t	HBQ_PutIdx_next;	/* Index to next HBQ slot to */
355 						/* use */
356 	uint32_t	HBQ_PutIdx;		/* HBQ slot to use */
357 	uint32_t	HBQ_GetIdx;		/* Local copy of Get index */
358 						/* from Port */
359 	uint16_t	HBQ_PostBufCnt;		/* Current number of entries */
360 						/* in list */
361 	MATCHMAP	*HBQ_PostBufs[EMLXS_MAX_HBQ_BUFFERS];
362 	MATCHMAP	HBQ_host_buf;		/* HBQ host buffer for HBQEs */
363 	HBQ_MASK	HBQ_Masks[6];
364 
365 	union
366 	{
367 		uint32_t	allprofiles[12];
368 
369 		struct
370 		{
371 #ifdef EMLXS_BIG_ENDIAN
372 			uint32_t	seqlenoff:16;
373 			uint32_t	maxlen:16;
374 #endif
375 #ifdef EMLXS_LITTLE_ENDIAN
376 			uint32_t	maxlen:16;
377 			uint32_t	seqlenoff:16;
378 #endif
379 #ifdef EMLXS_BIG_ENDIAN
380 			uint32_t	rsvd1:28;
381 			uint32_t	seqlenbcnt:4;
382 #endif
383 #ifdef EMLXS_LITTLE_ENDIAN
384 			uint32_t	seqlenbcnt:4;
385 			uint32_t	rsvd1:28;
386 #endif
387 			uint32_t	rsvd[10];
388 		} profile2;
389 
390 		struct
391 		{
392 #ifdef EMLXS_BIG_ENDIAN
393 			uint32_t	seqlenoff:16;
394 			uint32_t	maxlen:16;
395 #endif
396 #ifdef EMLXS_LITTLE_ENDIAN
397 			uint32_t	maxlen:16;
398 			uint32_t	seqlenoff:16;
399 #endif
400 #ifdef EMLXS_BIG_ENDIAN
401 			uint32_t	cmdcodeoff:28;
402 			uint32_t	rsvd1:12;
403 			uint32_t	seqlenbcnt:4;
404 #endif
405 #ifdef EMLXS_LITTLE_ENDIAN
406 			uint32_t	seqlenbcnt:4;
407 			uint32_t	rsvd1:12;
408 			uint32_t	cmdcodeoff:28;
409 #endif
410 			uint32_t	cmdmatch[8];
411 
412 			uint32_t	rsvd[2];
413 		} profile3;
414 
415 		struct
416 		{
417 #ifdef EMLXS_BIG_ENDIAN
418 			uint32_t	seqlenoff:16;
419 			uint32_t	maxlen:16;
420 #endif
421 #ifdef EMLXS_LITTLE_ENDIAN
422 			uint32_t	maxlen:16;
423 			uint32_t	seqlenoff:16;
424 #endif
425 #ifdef EMLXS_BIG_ENDIAN
426 			uint32_t	cmdcodeoff:28;
427 			uint32_t	rsvd1:12;
428 			uint32_t	seqlenbcnt:4;
429 #endif
430 #ifdef EMLXS_LITTLE_ENDIAN
431 			uint32_t	seqlenbcnt:4;
432 			uint32_t	rsvd1:12;
433 			uint32_t	cmdcodeoff:28;
434 #endif
435 			uint32_t	cmdmatch[8];
436 
437 			uint32_t	rsvd[2];
438 		} profile5;
439 	} profiles;
440 } HBQ_INIT_t;
441 
442 
443 
444 /* Structure for MB Command LOAD_SM and DOWN_LOAD */
445 
446 
447 typedef struct
448 {
449 #ifdef EMLXS_BIG_ENDIAN
450 	uint32_t	rsvd2:24;
451 	uint32_t	keep:1;
452 	uint32_t	acknowledgment:1;
453 	uint32_t	version:1;
454 	uint32_t	erase_or_prog:1;
455 	uint32_t	update_flash:1;
456 	uint32_t	update_ram:1;
457 	uint32_t	method:1;
458 	uint32_t	load_cmplt:1;
459 #endif
460 #ifdef EMLXS_LITTLE_ENDIAN
461 	uint32_t	load_cmplt:1;
462 	uint32_t	method:1;
463 	uint32_t	update_ram:1;
464 	uint32_t	update_flash:1;
465 	uint32_t	erase_or_prog:1;
466 	uint32_t	version:1;
467 	uint32_t	acknowledgment:1;
468 	uint32_t	keep:1;
469 	uint32_t	rsvd2:24;
470 #endif
471 
472 #define	DL_FROM_BDE	0	/* method */
473 #define	DL_FROM_SLIM	1
474 
475 #define	PROGRAM_FLASH	0	/* erase_or_prog */
476 #define	ERASE_FLASH	1
477 
478 	uint32_t	dl_to_adr;
479 	uint32_t	dl_len;
480 	union
481 	{
482 		uint32_t	dl_from_slim_offset;
483 		ULP_BDE		dl_from_bde;
484 		ULP_BDE64	dl_from_bde64;
485 		PROG_ID		prog_id;
486 	} un;
487 } LOAD_SM_VAR;
488 
489 
490 /* Structure for MB Command READ_NVPARM (02) */
491 /* Good for SLI2/3 and SLI4 */
492 
493 typedef struct
494 {
495 	uint32_t	rsvd1[3];	/* Read as all one's */
496 	uint32_t	rsvd2;		/* Read as all zero's */
497 	uint32_t	portname[2];	/* N_PORT name */
498 	uint32_t	nodename[2];	/* NODE name */
499 #ifdef EMLXS_BIG_ENDIAN
500 	uint32_t	pref_DID:24;
501 	uint32_t	hardAL_PA:8;
502 #endif
503 #ifdef EMLXS_LITTLE_ENDIAN
504 	uint32_t	hardAL_PA:8;
505 	uint32_t	pref_DID:24;
506 #endif
507 	uint32_t	rsvd3[21];	/* Read as all one's */
508 } READ_NV_VAR;
509 
510 
511 /* Structure for MB Command WRITE_NVPARMS (03) */
512 /* Good for SLI2/3 and SLI4 */
513 
514 typedef struct
515 {
516 	uint32_t	rsvd1[3];	/* Must be all one's */
517 	uint32_t	rsvd2;		/* Must be all zero's */
518 	uint32_t	portname[2];	/* N_PORT name */
519 	uint32_t	nodename[2];	/* NODE name */
520 #ifdef EMLXS_BIG_ENDIAN
521 	uint32_t	pref_DID:24;
522 	uint32_t	hardAL_PA:8;
523 #endif
524 #ifdef EMLXS_LITTLE_ENDIAN
525 	uint32_t	hardAL_PA:8;
526 	uint32_t	pref_DID:24;
527 #endif
528 	uint32_t	rsvd3[21];	/* Must be all one's */
529 } WRITE_NV_VAR;
530 
531 
532 /* Structure for MB Command RUN_BIU_DIAG64 (0x84) */
533 /* Good for SLI2/3 and SLI4 */
534 
535 typedef struct
536 {
537 	uint32_t	rsvd1;
538 	union
539 	{
540 		struct
541 		{
542 			ULP_BDE64	xmit_bde64;
543 			ULP_BDE64	rcv_bde64;
544 		} s2;
545 	} un;
546 } BIU_DIAG_VAR;
547 
548 
549 /* Structure for MB Command INIT_LINK (05) */
550 /* Good for SLI2/3 and SLI4 */
551 
552 typedef struct
553 {
554 #ifdef EMLXS_BIG_ENDIAN
555 	uint32_t	rsvd1:24;
556 	uint32_t	lipsr_AL_PA:8;	/* AL_PA to issue Lip Selective */
557 					/* Reset to */
558 #endif
559 #ifdef EMLXS_LITTLE_ENDIAN
560 	uint32_t	lipsr_AL_PA:8;	/* AL_PA to issue Lip Selective */
561 					/* Reset to */
562 	uint32_t	rsvd1:24;
563 #endif
564 
565 #ifdef EMLXS_BIG_ENDIAN
566 	uint8_t		fabric_AL_PA;	/* If using a Fabric Assigned AL_PA */
567 	uint8_t		rsvd2;
568 	uint16_t	link_flags;
569 #endif
570 #ifdef EMLXS_LITTLE_ENDIAN
571 	uint16_t	link_flags;
572 	uint8_t		rsvd2;
573 	uint8_t		fabric_AL_PA;	/* If using a Fabric Assigned AL_PA */
574 #endif
575 #define	FLAGS_LOCAL_LB			0x01	/* link_flags (=1) */
576 						/* ENDEC loopback */
577 #define	FLAGS_TOPOLOGY_MODE_LOOP_PT	0x00	/* Attempt loop then pt-pt */
578 #define	FLAGS_TOPOLOGY_MODE_PT_PT	0x02	/* Attempt pt-pt only */
579 #define	FLAGS_TOPOLOGY_MODE_LOOP	0x04	/* Attempt loop only */
580 #define	FLAGS_TOPOLOGY_MODE_PT_LOOP	0x06	/* Attempt pt-pt then loop */
581 #define	FLAGS_LIRP_LILP			0x80	/* LIRP / LILP is disabled */
582 
583 #define	FLAGS_TOPOLOGY_FAILOVER		0x0400	/* Bit 10 */
584 #define	FLAGS_LINK_SPEED		0x0800	/* Bit 11 */
585 #define	FLAGS_PREABORT_RETURN		0x4000	/* Bit 14 */
586 
587 	uint32_t	link_speed;	/* NEW_FEATURE */
588 #define	LINK_SPEED_AUTO			0	/* Auto selection */
589 #define	LINK_SPEED_1G			1	/* 1 Gigabaud */
590 #define	LINK_SPEED_2G			2	/* 2 Gigabaud */
591 } INIT_LINK_VAR;
592 
593 
594 /* Structure for MB Command DOWN_LINK (06) */
595 /* Good for SLI2/3 and SLI4 */
596 
597 typedef struct
598 {
599 	uint32_t	rsvd1;
600 } DOWN_LINK_VAR;
601 
602 
603 /* Structure for MB Command CONFIG_LINK (07) */
604 
605 typedef struct
606 {
607 #ifdef EMLXS_BIG_ENDIAN
608 	uint32_t	cr:1;
609 	uint32_t	ci:1;
610 	uint32_t	cr_delay:6;
611 	uint32_t	cr_count:8;
612 	uint32_t	rsvd1:8;
613 	uint32_t	MaxBBC:8;
614 #endif
615 #ifdef EMLXS_LITTLE_ENDIAN
616 	uint32_t	MaxBBC:8;
617 	uint32_t	rsvd1:8;
618 	uint32_t	cr_count:8;
619 	uint32_t	cr_delay:6;
620 	uint32_t	ci:1;
621 	uint32_t	cr:1;
622 #endif
623 	uint32_t	myId;
624 	uint32_t	rsvd2;
625 	uint32_t	edtov;
626 	uint32_t	arbtov;
627 	uint32_t	ratov;
628 	uint32_t	rttov;
629 	uint32_t	altov;
630 	uint32_t	crtov;
631 	uint32_t	citov;
632 #ifdef EMLXS_BIG_ENDIAN
633 	uint32_t	rrq_enable:1;
634 	uint32_t	rrq_immed:1;
635 	uint32_t	rsvd4:29;
636 	uint32_t	ack0_enable:1;
637 #endif
638 #ifdef EMLXS_LITTLE_ENDIAN
639 	uint32_t	ack0_enable:1;
640 	uint32_t	rsvd4:29;
641 	uint32_t	rrq_immed:1;
642 	uint32_t	rrq_enable:1;
643 #endif
644 } CONFIG_LINK;
645 
646 
647 /* Structure for MB Command PART_SLIM (08) */
648 
649 typedef struct
650 {
651 #ifdef EMLXS_BIG_ENDIAN
652 	uint32_t		unused1:24;
653 	uint32_t		numRing:8;
654 #endif
655 #ifdef EMLXS_LITTLE_ENDIAN
656 	uint32_t		numRing:8;
657 	uint32_t		unused1:24;
658 #endif
659 	emlxs_ring_def_t	ringdef[4];
660 	uint32_t		hbainit;
661 } PART_SLIM_VAR;
662 
663 
664 /* Structure for MB Command CONFIG_RING (09) */
665 
666 typedef struct
667 {
668 #ifdef EMLXS_BIG_ENDIAN
669 	uint32_t	unused2:6;
670 	uint32_t	recvSeq:1;
671 	uint32_t	recvNotify:1;
672 	uint32_t	numMask:8;
673 	uint32_t	profile:8;
674 	uint32_t	unused1:4;
675 	uint32_t	ring:4;
676 #endif
677 #ifdef EMLXS_LITTLE_ENDIAN
678 	uint32_t	ring:4;
679 	uint32_t	unused1:4;
680 	uint32_t	profile:8;
681 	uint32_t	numMask:8;
682 	uint32_t	recvNotify:1;
683 	uint32_t	recvSeq:1;
684 	uint32_t	unused2:6;
685 #endif
686 #ifdef EMLXS_BIG_ENDIAN
687 	uint16_t	maxRespXchg;
688 	uint16_t	maxOrigXchg;
689 #endif
690 #ifdef EMLXS_LITTLE_ENDIAN
691 	uint16_t	maxOrigXchg;
692 	uint16_t	maxRespXchg;
693 #endif
694 	RR_REG		rrRegs[6];
695 } CONFIG_RING_VAR;
696 
697 
698 /* Structure for MB Command RESET_RING (10) */
699 
700 typedef struct
701 {
702 	uint32_t	ring_no;
703 } RESET_RING_VAR;
704 
705 
706 /* Structure for MB Command READ_CONFIG (11) */
707 /* Good for SLI2/3 only */
708 
709 typedef struct
710 {
711 #ifdef EMLXS_BIG_ENDIAN
712 	uint32_t	cr:1;
713 	uint32_t	ci:1;
714 	uint32_t	cr_delay:6;
715 	uint32_t	cr_count:8;
716 	uint32_t	InitBBC:8;
717 	uint32_t	MaxBBC:8;
718 #endif
719 #ifdef EMLXS_LITTLE_ENDIAN
720 	uint32_t	MaxBBC:8;
721 	uint32_t	InitBBC:8;
722 	uint32_t	cr_count:8;
723 	uint32_t	cr_delay:6;
724 	uint32_t	ci:1;
725 	uint32_t	cr:1;
726 #endif
727 #ifdef EMLXS_BIG_ENDIAN
728 	uint32_t	topology:8;
729 	uint32_t	myDid:24;
730 #endif
731 #ifdef EMLXS_LITTLE_ENDIAN
732 	uint32_t	myDid:24;
733 	uint32_t	topology:8;
734 #endif
735 	/* Defines for topology (defined previously) */
736 #ifdef EMLXS_BIG_ENDIAN
737 	uint32_t	AR:1;
738 	uint32_t	IR:1;
739 	uint32_t	rsvd1:29;
740 	uint32_t	ack0:1;
741 #endif
742 #ifdef EMLXS_LITTLE_ENDIAN
743 	uint32_t	ack0:1;
744 	uint32_t	rsvd1:29;
745 	uint32_t	IR:1;
746 	uint32_t	AR:1;
747 #endif
748 	uint32_t	edtov;
749 	uint32_t	arbtov;
750 	uint32_t	ratov;
751 	uint32_t	rttov;
752 	uint32_t	altov;
753 	uint32_t	lmt;
754 
755 #define	LMT_1GB_CAPABLE		0x0004
756 #define	LMT_2GB_CAPABLE		0x0008
757 #define	LMT_4GB_CAPABLE		0x0040
758 #define	LMT_8GB_CAPABLE		0x0080
759 #define	LMT_10GB_CAPABLE	0x0100
760 #define	LMT_16GB_CAPABLE	0x0200
761 /* E2E supported on adapters >= 8GB */
762 #define	LMT_E2E_CAPABLE		(LMT_8GB_CAPABLE|LMT_10GB_CAPABLE)
763 
764 	uint32_t	rsvd2;
765 	uint32_t	rsvd3;
766 	uint32_t	max_xri;
767 	uint32_t	max_iocb;
768 	uint32_t	max_rpi;
769 	uint32_t	avail_xri;
770 	uint32_t	avail_iocb;
771 	uint32_t	avail_rpi;
772 	uint32_t	max_vpi;
773 	uint32_t	max_alpa;
774 	uint32_t	rsvd4;
775 	uint32_t	avail_vpi;
776 
777 } READ_CONFIG_VAR;
778 
779 
780 /* Structure for MB Command READ_CONFIG(0x11) */
781 /* Good for SLI4 only */
782 
783 typedef struct
784 {
785 #ifdef EMLXS_BIG_ENDIAN
786 	uint32_t	extents:1;	/* Word 1 */
787 	uint32_t	rsvd1:31;
788 
789 	uint32_t	topology:8;	/* Word 2 */
790 	uint32_t	rsvd2:15;
791 	uint32_t	ldv:1;
792 	uint32_t	link_type:2;
793 	uint32_t	link_number:6;
794 #endif
795 #ifdef EMLXS_LITTLE_ENDIAN
796 	uint32_t	rsvd1:31;	/* Word 1 */
797 	uint32_t	extents:1;
798 
799 	uint32_t	link_number:6;	/* Word 2 */
800 	uint32_t	link_type:2;
801 	uint32_t	ldv:1;
802 	uint32_t	rsvd2:15;
803 	uint32_t	topology:8;
804 #endif
805 	uint32_t	rsvd3;		/* Word 3 */
806 	uint32_t	edtov;		/* Word 4 */
807 	uint32_t	rsvd4;		/* Word 5 */
808 	uint32_t	ratov;		/* Word 6 */
809 	uint32_t	rsvd5;		/* Word 7 */
810 	uint32_t	rsvd6;		/* Word 8 */
811 	uint32_t	lmt;		/* Word 9 */
812 	uint32_t	rsvd8;		/* Word 10 */
813 	uint32_t	rsvd9;		/* Word 11 */
814 
815 #ifdef EMLXS_BIG_ENDIAN
816 	uint16_t	XRICount;	/* Word 12 */
817 	uint16_t	XRIBase;	/* Word 12 */
818 
819 	uint16_t	RPICount;	/* Word 13 */
820 	uint16_t	RPIBase;	/* Word 13 */
821 
822 	uint16_t	VPICount;	/* Word 14 */
823 	uint16_t	VPIBase;	/* Word 14 */
824 
825 	uint16_t	VFICount;	/* Word 15 */
826 	uint16_t	VFIBase;	/* Word 15 */
827 
828 	uint16_t	FCFICount;	/* Word 16 */
829 	uint16_t	rsvd10;		/* Word 16 */
830 
831 	uint16_t	EQCount;	/* Word 17 */
832 	uint16_t	RQCount;	/* Word 17 */
833 
834 	uint16_t	CQCount;	/* Word 18 */
835 	uint16_t	WQCount;	/* Word 18 */
836 #endif
837 #ifdef EMLXS_LITTLE_ENDIAN
838 	uint16_t	XRIBase;	/* Word 12 */
839 	uint16_t	XRICount;	/* Word 12 */
840 
841 	uint16_t	RPIBase;	/* Word 13 */
842 	uint16_t	RPICount;	/* Word 13 */
843 
844 	uint16_t	VPIBase;	/* Word 14 */
845 	uint16_t	VPICount;	/* Word 14 */
846 
847 	uint16_t	VFIBase;	/* Word 15 */
848 	uint16_t	VFICount;	/* Word 15 */
849 
850 	uint16_t	rsvd10;		/* Word 16 */
851 	uint16_t	FCFICount;	/* Word 16 */
852 
853 	uint16_t	RQCount;	/* Word 17 */
854 	uint16_t	EQCount;	/* Word 17 */
855 
856 	uint16_t	WQCount;	/* Word 18 */
857 	uint16_t	CQCount;	/* Word 18 */
858 #endif
859 
860 } READ_CONFIG4_VAR;
861 
862 /* Structure for MB Command READ_RCONFIG (12) */
863 
864 typedef struct
865 {
866 #ifdef EMLXS_BIG_ENDIAN
867 	uint32_t	rsvd2:7;
868 	uint32_t	recvNotify:1;
869 	uint32_t	numMask:8;
870 	uint32_t	profile:8;
871 	uint32_t	rsvd1:4;
872 	uint32_t	ring:4;
873 #endif
874 #ifdef EMLXS_LITTLE_ENDIAN
875 	uint32_t	ring:4;
876 	uint32_t	rsvd1:4;
877 	uint32_t	profile:8;
878 	uint32_t	numMask:8;
879 	uint32_t	recvNotify:1;
880 	uint32_t	rsvd2:7;
881 #endif
882 #ifdef EMLXS_BIG_ENDIAN
883 	uint16_t	maxResp;
884 	uint16_t	maxOrig;
885 #endif
886 #ifdef EMLXS_LITTLE_ENDIAN
887 	uint16_t	maxOrig;
888 	uint16_t	maxResp;
889 #endif
890 	RR_REG		rrRegs[6];
891 #ifdef EMLXS_BIG_ENDIAN
892 	uint16_t	cmdRingOffset;
893 	uint16_t	cmdEntryCnt;
894 	uint16_t	rspRingOffset;
895 	uint16_t	rspEntryCnt;
896 	uint16_t	nextCmdOffset;
897 	uint16_t	rsvd3;
898 	uint16_t	nextRspOffset;
899 	uint16_t	rsvd4;
900 #endif
901 #ifdef EMLXS_LITTLE_ENDIAN
902 	uint16_t	cmdEntryCnt;
903 	uint16_t	cmdRingOffset;
904 	uint16_t	rspEntryCnt;
905 	uint16_t	rspRingOffset;
906 	uint16_t	rsvd3;
907 	uint16_t	nextCmdOffset;
908 	uint16_t	rsvd4;
909 	uint16_t	nextRspOffset;
910 #endif
911 } READ_RCONF_VAR;
912 
913 
914 /* Structure for MB Command READ_SPARM (13) */
915 /* Structure for MB Command READ_SPARM64 (0x8D) */
916 /* Good for SLI2/3 and SLI4 */
917 
918 typedef struct
919 {
920 	uint32_t	rsvd1;
921 	uint32_t	rsvd2;
922 	union
923 	{
924 		ULP_BDE		sp;	/* This BDE points to SERV_PARM */
925 					/* structure */
926 		ULP_BDE64	sp64;
927 	} un;
928 	uint32_t	rsvd3;
929 
930 #ifdef EMLXS_BIG_ENDIAN
931 	uint16_t	portNameCnt;
932 	uint16_t	portNameOffset;
933 
934 	uint16_t	fabricNameCnt;
935 	uint16_t	fabricNameOffset;
936 
937 	uint16_t	lportNameCnt;
938 	uint16_t	lportNameOffset;
939 
940 	uint16_t	lfabricNameCnt;
941 	uint16_t	lfabricNameOffset;
942 
943 #endif
944 #ifdef EMLXS_LITTLE_ENDIAN
945 	uint16_t	portNameOffset;
946 	uint16_t	portNameCnt;
947 
948 	uint16_t	fabricNameOffset;
949 	uint16_t	fabricNameCnt;
950 
951 	uint16_t	lportNameOffset;
952 	uint16_t	lportNameCnt;
953 
954 	uint16_t	lfabricNameOffset;
955 	uint16_t	lfabricNameCnt;
956 
957 #endif
958 
959 } READ_SPARM_VAR;
960 
961 
962 /* Structure for MB Command READ_STATUS (14) */
963 /* Good for SLI2/3 and SLI4 */
964 
965 typedef struct
966 {
967 #ifdef EMLXS_BIG_ENDIAN
968 	uint32_t	rsvd1:31;
969 	uint32_t	clrCounters:1;
970 
971 	uint16_t	activeXriCnt;
972 	uint16_t	activeRpiCnt;
973 #endif
974 #ifdef EMLXS_LITTLE_ENDIAN
975 	uint32_t	clrCounters:1;
976 	uint32_t	rsvd1:31;
977 
978 	uint16_t	activeRpiCnt;
979 	uint16_t	activeXriCnt;
980 #endif
981 	uint32_t	xmitByteCnt;
982 	uint32_t	rcvByteCnt;
983 	uint32_t	xmitFrameCnt;
984 	uint32_t	rcvFrameCnt;
985 	uint32_t	xmitSeqCnt;
986 	uint32_t	rcvSeqCnt;
987 	uint32_t	totalOrigExchanges;
988 	uint32_t	totalRespExchanges;
989 	uint32_t	rcvPbsyCnt;
990 	uint32_t	rcvFbsyCnt;
991 } READ_STATUS_VAR;
992 
993 
994 /* Structure for MB Command READ_RPI (15) */
995 /* Structure for MB Command READ_RPI64 (0x8F) */
996 
997 typedef struct
998 {
999 #ifdef EMLXS_BIG_ENDIAN
1000 	uint16_t	nextRpi;
1001 	uint16_t	reqRpi;
1002 	uint32_t	rsvd2:8;
1003 	uint32_t	DID:24;
1004 #endif
1005 #ifdef EMLXS_LITTLE_ENDIAN
1006 	uint16_t	reqRpi;
1007 	uint16_t	nextRpi;
1008 	uint32_t	DID:24;
1009 	uint32_t	rsvd2:8;
1010 #endif
1011 	union
1012 	{
1013 		ULP_BDE		sp;
1014 		ULP_BDE64	sp64;
1015 	} un;
1016 } READ_RPI_VAR;
1017 
1018 
1019 /* Structure for MB Command READ_XRI (16) */
1020 
1021 typedef struct
1022 {
1023 #ifdef EMLXS_BIG_ENDIAN
1024 	uint16_t	nextXri;
1025 	uint16_t	reqXri;
1026 	uint16_t	rsvd1;
1027 	uint16_t	rpi;
1028 	uint32_t	rsvd2:8;
1029 	uint32_t	DID:24;
1030 	uint32_t	rsvd3:8;
1031 	uint32_t	SID:24;
1032 	uint32_t	rsvd4;
1033 	uint8_t		seqId;
1034 	uint8_t		rsvd5;
1035 	uint16_t	seqCount;
1036 	uint16_t	oxId;
1037 	uint16_t	rxId;
1038 	uint32_t	rsvd6:30;
1039 	uint32_t	si:1;
1040 	uint32_t	exchOrig:1;
1041 #endif
1042 #ifdef EMLXS_LITTLE_ENDIAN
1043 	uint16_t	reqXri;
1044 	uint16_t	nextXri;
1045 	uint16_t	rpi;
1046 	uint16_t	rsvd1;
1047 	uint32_t	DID:24;
1048 	uint32_t	rsvd2:8;
1049 	uint32_t	SID:24;
1050 	uint32_t	rsvd3:8;
1051 	uint32_t	rsvd4;
1052 	uint16_t	seqCount;
1053 	uint8_t		rsvd5;
1054 	uint8_t		seqId;
1055 	uint16_t	rxId;
1056 	uint16_t	oxId;
1057 	uint32_t	exchOrig:1;
1058 	uint32_t	si:1;
1059 	uint32_t	rsvd6:30;
1060 #endif
1061 } READ_XRI_VAR;
1062 
1063 
1064 /* Structure for MB Command READ_REV (17) */
1065 /* Good for SLI2/3 only */
1066 
1067 typedef struct
1068 {
1069 #ifdef EMLXS_BIG_ENDIAN
1070 	uint32_t	cv:1;
1071 	uint32_t	rr:1;
1072 	uint32_t	co:1;
1073 	uint32_t	rp:1;
1074 	uint32_t	cv3:1;
1075 	uint32_t	rf3:1;
1076 	uint32_t	rsvd1:10;
1077 	uint32_t	offset:14;
1078 	uint32_t	rv:2;
1079 #endif
1080 #ifdef EMLXS_LITTLE_ENDIAN
1081 	uint32_t	rv:2;
1082 	uint32_t	offset:14;
1083 	uint32_t	rsvd1:10;
1084 	uint32_t	rf3:1;
1085 	uint32_t	cv3:1;
1086 	uint32_t	rp:1;
1087 	uint32_t	co:1;
1088 	uint32_t	rr:1;
1089 	uint32_t	cv:1;
1090 #endif
1091 	uint32_t	biuRev;
1092 	uint32_t	smRev;
1093 	union
1094 	{
1095 		uint32_t	smFwRev;
1096 		struct
1097 		{
1098 #ifdef EMLXS_BIG_ENDIAN
1099 			uint8_t		ProgType;
1100 			uint8_t		ProgId;
1101 			uint16_t	ProgVer:4;
1102 			uint16_t	ProgRev:4;
1103 			uint16_t	ProgFixLvl:2;
1104 			uint16_t	ProgDistType:2;
1105 			uint16_t	DistCnt:4;
1106 #endif
1107 #ifdef EMLXS_LITTLE_ENDIAN
1108 			uint16_t	DistCnt:4;
1109 			uint16_t	ProgDistType:2;
1110 			uint16_t	ProgFixLvl:2;
1111 			uint16_t	ProgRev:4;
1112 			uint16_t	ProgVer:4;
1113 			uint8_t		ProgId;
1114 			uint8_t		ProgType;
1115 #endif
1116 		} b;
1117 	} un;
1118 	uint32_t	endecRev;
1119 #ifdef EMLXS_BIG_ENDIAN
1120 	uint8_t		feaLevelHigh;
1121 	uint8_t		feaLevelLow;
1122 	uint8_t		fcphHigh;
1123 	uint8_t		fcphLow;
1124 #endif
1125 #ifdef EMLXS_LITTLE_ENDIAN
1126 	uint8_t		fcphLow;
1127 	uint8_t		fcphHigh;
1128 	uint8_t		feaLevelLow;
1129 	uint8_t		feaLevelHigh;
1130 #endif
1131 	uint32_t	postKernRev;
1132 	uint32_t	opFwRev;
1133 	uint8_t		opFwName[16];
1134 
1135 	uint32_t	sliFwRev1;
1136 	uint8_t		sliFwName1[16];
1137 	uint32_t	sliFwRev2;
1138 	uint8_t		sliFwName2[16];
1139 } READ_REV_VAR;
1140 
1141 /* Structure for MB Command READ_REV (17) */
1142 /* Good for SLI4 only */
1143 
1144 typedef struct
1145 {
1146 #ifdef EMLXS_BIG_ENDIAN
1147 	uint32_t	Rsvd3:2;
1148 	uint32_t	VPD:1;
1149 	uint32_t	rsvd2:6;
1150 	uint32_t	dcbxMode:2;
1151 	uint32_t	FCoE:1;
1152 	uint32_t	sliLevel:4;
1153 	uint32_t	rsvd1:16;
1154 #endif
1155 #ifdef EMLXS_LITTLE_ENDIAN
1156 	uint32_t	rsvd1:16;
1157 	uint32_t	sliLevel:4;
1158 	uint32_t	FCoE:1;
1159 	uint32_t	dcbxMode:2;
1160 	uint32_t	rsvd2:6;
1161 	uint32_t	VPD:1;
1162 	uint32_t	Rsvd3:2;
1163 #endif
1164 
1165 	uint32_t	HwRev1;
1166 	uint32_t	HwRev2;
1167 	uint32_t	Rsvd4;
1168 	uint32_t	HwRev3;
1169 
1170 #ifdef EMLXS_BIG_ENDIAN
1171 	uint8_t		feaLevelHigh;
1172 	uint8_t		feaLevelLow;
1173 	uint8_t		fcphHigh;
1174 	uint8_t		fcphLow;
1175 #endif
1176 #ifdef EMLXS_LITTLE_ENDIAN
1177 	uint8_t		fcphLow;
1178 	uint8_t		fcphHigh;
1179 	uint8_t		feaLevelLow;
1180 	uint8_t		feaLevelHigh;
1181 #endif
1182 
1183 	uint32_t	Redboot;
1184 
1185 	uint32_t	ARMFwId;
1186 	uint8_t		ARMFwName[16];
1187 
1188 	uint32_t	ULPFwId;
1189 	uint8_t		ULPFwName[16];
1190 
1191 	uint32_t	Rsvd6[30];
1192 
1193 	ULP_BDE64	VPDBde;
1194 
1195 	uint32_t	ReturnedVPDLength;
1196 
1197 } READ_REV4_VAR;
1198 
1199 #define	EMLXS_DCBX_MODE_CIN	0	/* Mapped to nonFIP mode */
1200 #define	EMLXS_DCBX_MODE_CEE	1	/* Mapped to FIP mode */
1201 
1202 /* Structure for MB Command READ_LINK_STAT (18) */
1203 /* Good for SLI2/3 and SLI4 */
1204 
1205 typedef struct
1206 {
1207 	uint32_t	rsvd1;
1208 	uint32_t	linkFailureCnt;
1209 	uint32_t	lossSyncCnt;
1210 
1211 	uint32_t	lossSignalCnt;
1212 	uint32_t	primSeqErrCnt;
1213 	uint32_t	invalidXmitWord;
1214 	uint32_t	crcCnt;
1215 	uint32_t	primSeqTimeout;
1216 	uint32_t	elasticOverrun;
1217 	uint32_t	arbTimeout;
1218 
1219 	uint32_t	rxBufCredit;
1220 	uint32_t	rxBufCreditCur;
1221 
1222 	uint32_t	txBufCredit;
1223 	uint32_t	txBufCreditCur;
1224 
1225 	uint32_t	EOFaCnt;
1226 	uint32_t	EOFdtiCnt;
1227 	uint32_t	EOFniCnt;
1228 	uint32_t	SOFfCnt;
1229 	uint32_t	DropAERCnt;
1230 	uint32_t	DropRcv;
1231 } READ_LNK_VAR;
1232 
1233 
1234 /* Structure for MB Command REG_LOGIN (19) */
1235 /* Structure for MB Command REG_LOGIN64 (0x93) */
1236 /* Structure for MB Command REG_RPI (0x93) */
1237 /* Good for SLI2/3 and SLI4 */
1238 
1239 typedef struct
1240 {
1241 #ifdef EMLXS_BIG_ENDIAN
1242 	uint16_t	rsvd1;
1243 	uint16_t	rpi;
1244 	uint32_t	CI:1;
1245 	uint32_t	rsvd2:1;
1246 	uint32_t	TERP:1;
1247 	uint32_t	rsvd3:4;
1248 	uint32_t	update:1;
1249 	uint32_t	did:24;
1250 #endif
1251 #ifdef EMLXS_LITTLE_ENDIAN
1252 	uint16_t	rpi;
1253 	uint16_t	rsvd1;
1254 	uint32_t	did:24;
1255 	uint32_t	update:1;
1256 	uint32_t	rsvd3:4;
1257 	uint32_t	TERP:1;
1258 	uint32_t	rsvd2:1;
1259 	uint32_t	CI:1;
1260 #endif
1261 	union
1262 	{
1263 		ULP_BDE		sp;
1264 		ULP_BDE64	sp64;
1265 	} un;
1266 
1267 #ifdef EMLXS_BIG_ENDIAN
1268 	uint16_t	rsvd6;
1269 	uint16_t	vpi;
1270 #endif
1271 #ifdef EMLXS_LITTLE_ENDIAN
1272 	uint16_t	vpi;
1273 	uint16_t	rsvd6;
1274 #endif
1275 } REG_LOGIN_VAR;
1276 
1277 /* Word 30 contents for REG_LOGIN */
1278 typedef union
1279 {
1280 	struct
1281 	{
1282 #ifdef EMLXS_BIG_ENDIAN
1283 		uint16_t	rsvd1:12;
1284 		uint16_t	class:4;
1285 		uint16_t	xri;
1286 #endif
1287 #ifdef EMLXS_LITTLE_ENDIAN
1288 		uint16_t	xri;
1289 		uint16_t	class:4;
1290 		uint16_t	rsvd1:12;
1291 #endif
1292 	} f;
1293 	uint32_t	word;
1294 } REG_WD30;
1295 
1296 
1297 /* Structure for MB Command UNREG_LOGIN (0x14) - SLI2/3 */
1298 /* Structure for MB Command UNREG_RPI (0x14) - SLI4 */
1299 
1300 typedef struct
1301 {
1302 #ifdef EMLXS_BIG_ENDIAN
1303 	uint16_t	ll:2;		/* SLI4 only */
1304 	uint16_t	rsvd1:14;
1305 	uint16_t	rpi;
1306 #endif
1307 #ifdef EMLXS_LITTLE_ENDIAN
1308 	uint16_t	rpi;
1309 	uint16_t	rsvd1:14;
1310 	uint16_t	ll:2;		/* SLI4 only */
1311 #endif
1312 
1313 	uint32_t	rsvd2;
1314 	uint32_t	rsvd3;
1315 	uint32_t	rsvd4;
1316 	uint32_t	rsvd5;
1317 #ifdef EMLXS_BIG_ENDIAN
1318 	uint16_t	rsvd6;
1319 	uint16_t	vpi;
1320 #endif
1321 #ifdef EMLXS_LITTLE_ENDIAN
1322 	uint16_t	vpi;
1323 	uint16_t	rsvd6;
1324 #endif
1325 } UNREG_LOGIN_VAR;
1326 
1327 /* Structure for MB Command REG_FCFI (0xA0) */
1328 /* Good for SLI4 only */
1329 
1330 typedef struct
1331 {
1332 #ifdef EMLXS_BIG_ENDIAN
1333 	uint16_t	FCFI;
1334 	uint16_t	InfoIndex;
1335 
1336 	uint16_t	RQId0;
1337 	uint16_t	RQId1;
1338 	uint16_t	RQId2;
1339 	uint16_t	RQId3;
1340 
1341 	uint8_t		Id0_type;
1342 	uint8_t		Id0_type_mask;
1343 	uint8_t		Id0_rctl;
1344 	uint8_t		Id0_rctl_mask;
1345 
1346 	uint8_t		Id1_type;
1347 	uint8_t		Id1_type_mask;
1348 	uint8_t		Id1_rctl;
1349 	uint8_t		Id1_rctl_mask;
1350 
1351 	uint8_t		Id2_type;
1352 	uint8_t		Id2_type_mask;
1353 	uint8_t		Id2_rctl;
1354 	uint8_t		Id2_rctl_mask;
1355 
1356 	uint8_t		Id3_type;
1357 	uint8_t		Id3_type_mask;
1358 	uint8_t		Id3_rctl;
1359 	uint8_t		Id3_rctl_mask;
1360 
1361 	uint32_t	Rsvd1: 17;
1362 	uint32_t	mam: 2;
1363 	uint32_t	vv: 1;
1364 	uint32_t	vlanTag: 12;
1365 #endif
1366 #ifdef EMLXS_LITTLE_ENDIAN
1367 	uint16_t	InfoIndex;
1368 	uint16_t	FCFI;
1369 
1370 	uint16_t	RQId1;
1371 	uint16_t	RQId0;
1372 	uint16_t	RQId3;
1373 	uint16_t	RQId2;
1374 
1375 	uint8_t		Id0_rctl_mask;
1376 	uint8_t		Id0_rctl;
1377 	uint8_t		Id0_type_mask;
1378 	uint8_t		Id0_type;
1379 
1380 	uint8_t		Id1_rctl_mask;
1381 	uint8_t		Id1_rctl;
1382 	uint8_t		Id1_type_mask;
1383 	uint8_t		Id1_type;
1384 
1385 	uint8_t		Id2_rctl_mask;
1386 	uint8_t		Id2_rctl;
1387 	uint8_t		Id2_type_mask;
1388 	uint8_t		Id2_type;
1389 
1390 	uint8_t		Id3_rctl_mask;
1391 	uint8_t		Id3_rctl;
1392 	uint8_t		Id3_type_mask;
1393 	uint8_t		Id3_type;
1394 
1395 	uint32_t	vlanTag: 12;
1396 	uint32_t	vv: 1;
1397 	uint32_t	mam: 2;
1398 	uint32_t	Rsvd1: 17;
1399 #endif
1400 
1401 }  REG_FCFI_VAR;
1402 
1403 /* Defines for mam */
1404 #define	EMLXS_REG_FCFI_MAM_SPMA	1	/* Server Provided MAC Address */
1405 #define	EMLXS_REG_FCFI_MAM_FPMA	2	/* Fabric Provided MAC Address */
1406 
1407 /* Structure for MB Command UNREG_FCFI (0xA2) */
1408 /* Good for SLI4 only */
1409 
1410 typedef struct
1411 {
1412 	uint32_t	Rsvd1;
1413 #ifdef EMLXS_BIG_ENDIAN
1414 	uint16_t	Rsvd2;
1415 	uint16_t	FCFI;
1416 #endif
1417 #ifdef EMLXS_LITTLE_ENDIAN
1418 	uint16_t	FCFI;
1419 	uint16_t	Rsvd2;
1420 #endif
1421 }  UNREG_FCFI_VAR;
1422 
1423 /* Structure for MB Command RESUME_RPI (0x9E) */
1424 /* Good for SLI4 only */
1425 
1426 typedef struct
1427 {
1428 #ifdef EMLXS_BIG_ENDIAN
1429 	uint16_t	Rsvd1;
1430 	uint16_t	RPI;
1431 
1432 	uint32_t	EventTag;
1433 	uint32_t	rsvd2[3];
1434 
1435 	uint16_t	VFI;
1436 	uint16_t	VPI;
1437 #endif
1438 #ifdef EMLXS_LITTLE_ENDIAN
1439 	uint16_t	RPI;
1440 	uint16_t	Rsvd1;
1441 
1442 	uint32_t	EventTag;
1443 	uint32_t	rsvd2[3];
1444 
1445 	uint16_t	VPI;
1446 	uint16_t	VFI;
1447 #endif
1448 
1449 }  RESUME_RPI_VAR;
1450 
1451 
1452 /* Structure for MB Command UNREG_D_ID (0x23) */
1453 
1454 typedef struct
1455 {
1456 	uint32_t	did;
1457 
1458 	uint32_t	rsvd2;
1459 	uint32_t	rsvd3;
1460 	uint32_t	rsvd4;
1461 	uint32_t	rsvd5;
1462 #ifdef EMLXS_BIG_ENDIAN
1463 	uint16_t	rsvd6;
1464 	uint16_t	vpi;
1465 #endif
1466 #ifdef EMLXS_LITTLE_ENDIAN
1467 	uint16_t	vpi;
1468 	uint16_t	rsvd6;
1469 #endif
1470 } UNREG_D_ID_VAR;
1471 
1472 
1473 /* Structure for MB Command READ_LA (21) */
1474 /* Structure for MB Command READ_LA64 (0x95) */
1475 
1476 typedef struct
1477 {
1478 	uint32_t	eventTag;	/* Event tag */
1479 #ifdef EMLXS_BIG_ENDIAN
1480 	uint32_t	rsvd2:19;
1481 	uint32_t	fa:1;
1482 	uint32_t	mm:1;
1483 	uint32_t	tc:1;
1484 	uint32_t	pb:1;
1485 	uint32_t	il:1;
1486 	uint32_t	attType:8;
1487 #endif
1488 #ifdef EMLXS_LITTLE_ENDIAN
1489 	uint32_t	attType:8;
1490 	uint32_t	il:1;
1491 	uint32_t	pb:1;
1492 	uint32_t	tc:1;
1493 	uint32_t	mm:1;
1494 	uint32_t	fa:1;
1495 	uint32_t	rsvd2:19;
1496 #endif
1497 #define	AT_RESERVED	0x00	/* Reserved - attType */
1498 #define	AT_LINK_UP	0x01	/* Link is up */
1499 #define	AT_LINK_DOWN	0x02	/* Link is down */
1500 #define	AT_NO_HARD_ALPA	0x03	/* SLI4 */
1501 
1502 #ifdef EMLXS_BIG_ENDIAN
1503 	uint8_t		granted_AL_PA;
1504 	uint8_t		lipAlPs;
1505 	uint8_t		lipType;
1506 	uint8_t		topology;
1507 #endif
1508 #ifdef EMLXS_LITTLE_ENDIAN
1509 	uint8_t		topology;
1510 	uint8_t		lipType;
1511 	uint8_t		lipAlPs;
1512 	uint8_t		granted_AL_PA;
1513 #endif
1514 
1515 	/* lipType */
1516 #define	LT_PORT_INIT	0x00	/* An L_PORT initing (F7, AL_PS) - lipType */
1517 #define	LT_PORT_ERR	0x01	/* Err @L_PORT rcv'er (F8, AL_PS) */
1518 #define	LT_RESET_APORT	0x02	/* Lip Reset of some other port */
1519 #define	LT_RESET_MYPORT	0x03	/* Lip Reset of my port */
1520 
1521 	/* topology */
1522 #define	TOPOLOGY_PT_PT	0x01	/* Topology is pt-pt / pt-fabric */
1523 #define	TOPOLOGY_LOOP	0x02	/* Topology is FC-AL (private) */
1524 
1525 	union
1526 	{
1527 		ULP_BDE		lilpBde;	/* This BDE points to a */
1528 						/* 128 byte buffer to store */
1529 						/* the LILP AL_PA position */
1530 						/* map into */
1531 		ULP_BDE64	lilpBde64;
1532 	} un;
1533 #ifdef EMLXS_BIG_ENDIAN
1534 	uint32_t	Dlu:1;
1535 	uint32_t	Dtf:1;
1536 	uint32_t	Drsvd2:14;
1537 	uint32_t	DlnkSpeed:8;
1538 	uint32_t	DnlPort:4;
1539 	uint32_t	Dtx:2;
1540 	uint32_t	Drx:2;
1541 #endif
1542 #ifdef EMLXS_LITTLE_ENDIAN
1543 	uint32_t	Drx:2;
1544 	uint32_t	Dtx:2;
1545 	uint32_t	DnlPort:4;
1546 	uint32_t	DlnkSpeed:8;
1547 	uint32_t	Drsvd2:14;
1548 	uint32_t	Dtf:1;
1549 	uint32_t	Dlu:1;
1550 #endif
1551 #ifdef EMLXS_BIG_ENDIAN
1552 	uint32_t	Ulu:1;
1553 	uint32_t	Utf:1;
1554 	uint32_t	Ursvd2:14;
1555 	uint32_t	UlnkSpeed:8;
1556 	uint32_t	UnlPort:4;
1557 	uint32_t	Utx:2;
1558 	uint32_t	Urx:2;
1559 #endif
1560 #ifdef EMLXS_LITTLE_ENDIAN
1561 	uint32_t	Urx:2;
1562 	uint32_t	Utx:2;
1563 	uint32_t	UnlPort:4;
1564 	uint32_t	UlnkSpeed:8;
1565 	uint32_t	Ursvd2:14;
1566 	uint32_t	Utf:1;
1567 	uint32_t	Ulu:1;
1568 #endif
1569 #define	LA_1GHZ_LINK   0x04	/* lnkSpeed */
1570 #define	LA_2GHZ_LINK   0x08	/* lnkSpeed */
1571 #define	LA_4GHZ_LINK   0x10	/* lnkSpeed */
1572 #define	LA_8GHZ_LINK   0x20	/* lnkSpeed */
1573 #define	LA_10GHZ_LINK  0x40	/* lnkSpeed */
1574 #define	LA_16GHZ_LINK  0x80	/* lnkSpeed */
1575 } READ_LA_VAR;
1576 
1577 
1578 /* Structure for MB Command CLEAR_LA (22) */
1579 
1580 typedef struct
1581 {
1582 	uint32_t	eventTag;	/* Event tag */
1583 	uint32_t	rsvd1;
1584 } CLEAR_LA_VAR;
1585 
1586 /* Structure for MB Command DUMP */
1587 /* Good for SLI2/3 only */
1588 
1589 typedef struct
1590 {
1591 #ifdef EMLXS_BIG_ENDIAN
1592 	uint32_t	rsvd:25;
1593 	uint32_t	ra:1;
1594 	uint32_t	co:1;
1595 	uint32_t	cv:1;
1596 	uint32_t	type:4;
1597 
1598 	uint32_t	entry_index:16;
1599 	uint32_t	region_id:16;
1600 #endif
1601 #ifdef EMLXS_LITTLE_ENDIAN
1602 	uint32_t	type:4;
1603 	uint32_t	cv:1;
1604 	uint32_t	co:1;
1605 	uint32_t	ra:1;
1606 	uint32_t	rsvd:25;
1607 
1608 	uint32_t	region_id:16;
1609 	uint32_t	entry_index:16;
1610 #endif
1611 	uint32_t	base_adr;
1612 	uint32_t	word_cnt;
1613 	uint32_t	resp_offset;
1614 } DUMP_VAR;
1615 
1616 /* Structure for MB Command DUMP */
1617 /* Good for SLI4 only */
1618 
1619 typedef struct
1620 {
1621 #ifdef EMLXS_BIG_ENDIAN
1622 	uint32_t	ppi:4;
1623 	uint32_t	phy_index:4;
1624 	uint32_t	rsvd:20;
1625 	uint32_t	type:4;
1626 
1627 	uint32_t	entry_index:16;
1628 	uint32_t	region_id:16;
1629 #endif
1630 #ifdef EMLXS_LITTLE_ENDIAN
1631 	uint32_t	type:4;
1632 	uint32_t	rsvd:20;
1633 	uint32_t	phy_index:4;
1634 	uint32_t	ppi:4;
1635 
1636 	uint32_t	region_id:16;
1637 	uint32_t	entry_index:16;
1638 #endif
1639 	uint32_t	available_cnt;
1640 	uint32_t	addrLow;
1641 	uint32_t	addrHigh;
1642 	uint32_t	rsp_cnt;
1643 } DUMP4_VAR;
1644 
1645 /*
1646  * Dump type
1647  */
1648 #define	DMP_MEM_REG	0x1
1649 #define	DMP_NV_PARAMS	0x2
1650 
1651 /*
1652  * Dump region ID
1653  */
1654 #define	NODE_CFG_A_REGION_ID	0
1655 #define	NODE_CFG_B_REGION_ID	1
1656 #define	NODE_CFG_C_REGION_ID	2
1657 #define	NODE_CFG_D_REGION_ID	3
1658 #define	WAKE_UP_PARMS_REGION_ID	4
1659 #define	DEF_PCI_CFG_REGION_ID	5
1660 #define	PCI_CFG_1_REGION_ID	6
1661 #define	PCI_CFG_2_REGION_ID	7
1662 #define	RSVD1_REGION_ID		8
1663 #define	RSVD2_REGION_ID		9
1664 #define	RSVD3_REGION_ID		10
1665 #define	RSVD4_REGION_ID		11
1666 #define	RSVD5_REGION_ID		12
1667 #define	RSVD6_REGION_ID		13
1668 #define	RSVD7_REGION_ID		14
1669 #define	DIAG_TRACE_REGION_ID	15
1670 #define	WWN_REGION_ID		16
1671 
1672 #define	DMP_VPD_REGION		14
1673 #define	DMP_VPD_SIZE		1024
1674 #define	DMP_VPD_DUMP_WCOUNT	24
1675 
1676 #define	DMP_FCOE_REGION		23
1677 #define	DMP_FCOE_DUMP_WCOUNT	256
1678 
1679 
1680 /* Structure for MB Command UPDATE_CFG */
1681 /* Good for SLI2/3 and SLI4 */
1682 
1683 typedef struct
1684 {
1685 #ifdef EMLXS_BIG_ENDIAN
1686 	uint32_t	rsvd2:16;
1687 	uint32_t	proc_type:8;
1688 	uint32_t	rsvd1:1;
1689 	uint32_t	Abit:1;
1690 	uint32_t	Obit:1;
1691 	uint32_t	Vbit:1;
1692 	uint32_t	req_type:4;
1693 #define	INIT_REGION	1
1694 #define	UPDATE_DATA	2
1695 #define	CLEAN_UP_CFG	3
1696 	uint32_t	entry_len:16;
1697 	uint32_t	region_id:16;
1698 #endif
1699 
1700 #ifdef EMLXS_LITTLE_ENDIAN
1701 	uint32_t	req_type:4;
1702 #define	INIT_REGION	1
1703 #define	UPDATE_DATA	2
1704 #define	CLEAN_UP_CFG	3
1705 	uint32_t	Vbit:1;
1706 	uint32_t	Obit:1;
1707 	uint32_t	Abit:1;
1708 	uint32_t	rsvd1:1;
1709 	uint32_t	proc_type:8;
1710 	uint32_t	rsvd2:16;
1711 
1712 	uint32_t	region_id:16;
1713 	uint32_t	entry_len:16;
1714 #endif
1715 
1716 	uint32_t	rsp_info;
1717 	uint32_t	byte_len;
1718 	uint32_t	cfg_data;
1719 } UPDATE_CFG_VAR;
1720 
1721 /* Structure for MB Command DEL_LD_ENTRY (29) */
1722 
1723 typedef struct
1724 {
1725 #ifdef EMLXS_LITTLE_ENDIAN
1726 	uint32_t	list_req:2;
1727 	uint32_t	list_rsp:2;
1728 	uint32_t	rsvd:28;
1729 #else
1730 	uint32_t	rsvd:28;
1731 	uint32_t	list_rsp:2;
1732 	uint32_t	list_req:2;
1733 #endif
1734 
1735 #define	FLASH_LOAD_LIST	1
1736 #define	RAM_LOAD_LIST	2
1737 #define	BOTH_LISTS	3
1738 
1739 	PROG_ID		prog_id;
1740 } DEL_LD_ENTRY_VAR;
1741 
1742 /* Structure for MB Command LOAD_AREA (81) */
1743 typedef struct
1744 {
1745 #ifdef EMLXS_LITTLE_ENDIAN
1746 	uint32_t	load_cmplt:1;
1747 	uint32_t	method:1;
1748 	uint32_t	rsvd1:1;
1749 	uint32_t	update_flash:1;
1750 	uint32_t	erase_or_prog:1;
1751 	uint32_t	version:1;
1752 	uint32_t	rsvd2:2;
1753 	uint32_t	progress:8;
1754 	uint32_t	step:8;
1755 	uint32_t	area_id:8;
1756 #else
1757 	uint32_t	area_id:8;
1758 	uint32_t	step:8;
1759 	uint32_t	progress:8;
1760 	uint32_t	rsvd2:2;
1761 	uint32_t	version:1;
1762 	uint32_t	erase_or_prog:1;
1763 	uint32_t	update_flash:1;
1764 	uint32_t	rsvd1:1;
1765 	uint32_t	method:1;
1766 	uint32_t	load_cmplt:1;
1767 #endif
1768 	uint32_t	dl_to_adr;
1769 	uint32_t	dl_len;
1770 	union
1771 	{
1772 		uint32_t	dl_from_slim_offset;
1773 		ULP_BDE		dl_from_bde;
1774 		ULP_BDE64	dl_from_bde64;
1775 		PROG_ID		prog_id;
1776 	} un;
1777 } LOAD_AREA_VAR;
1778 
1779 /* Structure for MB Command LOAD_EXP_ROM (9C) */
1780 typedef struct
1781 {
1782 #ifdef EMLXS_LITTLE_ENDIAN
1783 	uint32_t	rsvd1:8;
1784 	uint32_t	progress:8;
1785 	uint32_t	step:8;
1786 	uint32_t	rsvd2:8;
1787 #else
1788 	uint32_t	rsvd2:8;
1789 	uint32_t	step:8;
1790 	uint32_t	progress:8;
1791 	uint32_t	rsvd1:8;
1792 #endif
1793 	uint32_t	dl_to_adr;
1794 	uint32_t	rsvd3;
1795 	union
1796 	{
1797 		uint32_t	word[2];
1798 		PROG_ID		prog_id;
1799 	} un;
1800 } LOAD_EXP_ROM_VAR;
1801 
1802 
1803 /* Structure for MB Command CONFIG_HBQ (7C) */
1804 
1805 typedef struct
1806 {
1807 #ifdef EMLXS_BIG_ENDIAN
1808 	uint32_t	rsvd1:7;
1809 	uint32_t	recvNotify:1;	/* Receive Notification */
1810 	uint32_t	numMask:8;	/* # Mask Entries */
1811 	uint32_t	profile:8;	/* Selection Profile */
1812 	uint32_t	rsvd2:8;
1813 #endif
1814 #ifdef EMLXS_LITTLE_ENDIAN
1815 	uint32_t	rsvd2:8;
1816 	uint32_t	profile:8;	/* Selection Profile */
1817 	uint32_t	numMask:8;	/* # Mask Entries */
1818 	uint32_t	recvNotify:1;	/* Receive Notification */
1819 	uint32_t	rsvd1:7;
1820 #endif
1821 
1822 #ifdef EMLXS_BIG_ENDIAN
1823 	uint32_t	hbqId:16;
1824 	uint32_t	rsvd3:12;
1825 	uint32_t	ringMask:4;
1826 #endif
1827 #ifdef EMLXS_LITTLE_ENDIAN
1828 	uint32_t	ringMask:4;
1829 	uint32_t	rsvd3:12;
1830 	uint32_t	hbqId:16;
1831 #endif
1832 
1833 #ifdef EMLXS_BIG_ENDIAN
1834 	uint32_t	numEntries:16;
1835 	uint32_t	rsvd4:8;
1836 	uint32_t	headerLen:8;
1837 #endif
1838 #ifdef EMLXS_LITTLE_ENDIAN
1839 	uint32_t	headerLen:8;
1840 	uint32_t	rsvd4:8;
1841 	uint32_t	numEntries:16;
1842 #endif
1843 
1844 	uint32_t	hbqaddrLow;
1845 	uint32_t	hbqaddrHigh;
1846 
1847 #ifdef EMLXS_BIG_ENDIAN
1848 	uint32_t	rsvd5:31;
1849 	uint32_t	logEntry:1;
1850 #endif
1851 #ifdef EMLXS_LITTLE_ENDIAN
1852 	uint32_t	logEntry:1;
1853 	uint32_t	rsvd5:31;
1854 #endif
1855 
1856 	uint32_t	rsvd6;	/* w7 */
1857 	uint32_t	rsvd7;	/* w8 */
1858 	uint32_t	rsvd8;	/* w9 */
1859 
1860 	HBQ_MASK	hbqMasks[6];
1861 
1862 	union
1863 	{
1864 		uint32_t	allprofiles[12];
1865 
1866 		struct
1867 		{
1868 #ifdef EMLXS_BIG_ENDIAN
1869 			uint32_t	seqlenoff:16;
1870 			uint32_t	maxlen:16;
1871 #endif
1872 #ifdef EMLXS_LITTLE_ENDIAN
1873 			uint32_t	maxlen:16;
1874 			uint32_t	seqlenoff:16;
1875 #endif
1876 #ifdef EMLXS_BIG_ENDIAN
1877 			uint32_t	rsvd1:28;
1878 			uint32_t	seqlenbcnt:4;
1879 #endif
1880 #ifdef EMLXS_LITTLE_ENDIAN
1881 			uint32_t	seqlenbcnt:4;
1882 			uint32_t	rsvd1:28;
1883 #endif
1884 			uint32_t	rsvd[10];
1885 		} profile2;
1886 
1887 		struct
1888 		{
1889 #ifdef EMLXS_BIG_ENDIAN
1890 			uint32_t	seqlenoff:16;
1891 			uint32_t	maxlen:16;
1892 #endif
1893 #ifdef EMLXS_LITTLE_ENDIAN
1894 			uint32_t	maxlen:16;
1895 			uint32_t	seqlenoff:16;
1896 #endif
1897 #ifdef EMLXS_BIG_ENDIAN
1898 			uint32_t	cmdcodeoff:28;
1899 			uint32_t	rsvd1:12;
1900 			uint32_t	seqlenbcnt:4;
1901 #endif
1902 #ifdef EMLXS_LITTLE_ENDIAN
1903 			uint32_t	seqlenbcnt:4;
1904 			uint32_t	rsvd1:12;
1905 			uint32_t	cmdcodeoff:28;
1906 #endif
1907 			uint32_t	cmdmatch[8];
1908 
1909 			uint32_t	rsvd[2];
1910 		} profile3;
1911 
1912 		struct
1913 		{
1914 #ifdef EMLXS_BIG_ENDIAN
1915 			uint32_t	seqlenoff:16;
1916 			uint32_t	maxlen:16;
1917 #endif
1918 #ifdef EMLXS_LITTLE_ENDIAN
1919 			uint32_t	maxlen:16;
1920 			uint32_t	seqlenoff:16;
1921 #endif
1922 #ifdef EMLXS_BIG_ENDIAN
1923 			uint32_t	cmdcodeoff:28;
1924 			uint32_t	rsvd1:12;
1925 			uint32_t	seqlenbcnt:4;
1926 #endif
1927 #ifdef EMLXS_LITTLE_ENDIAN
1928 			uint32_t	seqlenbcnt:4;
1929 			uint32_t	rsvd1:12;
1930 			uint32_t	cmdcodeoff:28;
1931 #endif
1932 			uint32_t	cmdmatch[8];
1933 
1934 			uint32_t	rsvd[2];
1935 		} profile5;
1936 	} profiles;
1937 } CONFIG_HBQ_VAR;
1938 
1939 
1940 /* Structure for MB Command REG_VPI(0x96) */
1941 /* Good for SLI2/3 and SLI4 */
1942 
1943 typedef struct
1944 {
1945 #ifdef EMLXS_BIG_ENDIAN
1946 	uint32_t	rsvd1;
1947 	uint32_t	rsvd2:7;
1948 	uint32_t	upd:1;
1949 	uint32_t	sid:24;
1950 	uint32_t	portname[2];    /* N_PORT name */
1951 	uint32_t	rsvd5;
1952 	uint16_t	vfi;
1953 	uint16_t	vpi;
1954 #endif
1955 #ifdef EMLXS_LITTLE_ENDIAN
1956 	uint32_t	rsvd1;
1957 	uint32_t	sid:24;
1958 	uint32_t	upd:1;
1959 	uint32_t	rsvd2:7;
1960 	uint32_t	portname[2];    /* N_PORT name */
1961 	uint32_t	rsvd5;
1962 	uint16_t	vpi;
1963 	uint16_t	vfi;
1964 #endif
1965 } REG_VPI_VAR;
1966 
1967 /* Structure for MB Command INIT_VPI(0xA3) */
1968 /* Good for SLI4 only */
1969 
1970 typedef struct
1971 {
1972 #ifdef EMLXS_BIG_ENDIAN
1973 	uint16_t	vfi;
1974 	uint16_t	vpi;
1975 #endif
1976 #ifdef EMLXS_LITTLE_ENDIAN
1977 	uint16_t	vpi;
1978 	uint16_t	vfi;
1979 #endif
1980 } INIT_VPI_VAR;
1981 
1982 /* Structure for MB Command UNREG_VPI (0x97) */
1983 /* Good for SLI2/3 */
1984 
1985 typedef struct
1986 {
1987 	uint32_t	rsvd1;
1988 	uint32_t	rsvd2;
1989 	uint32_t	rsvd3;
1990 	uint32_t	rsvd4;
1991 	uint32_t	rsvd5;
1992 #ifdef EMLXS_BIG_ENDIAN
1993 	uint16_t	rsvd6;
1994 	uint16_t	vpi;
1995 #endif
1996 #ifdef EMLXS_LITTLE_ENDIAN
1997 	uint16_t	vpi;
1998 	uint16_t	rsvd6;
1999 #endif
2000 } UNREG_VPI_VAR;
2001 
2002 /* Structure for MB Command UNREG_VPI (0x97) */
2003 /* Good for SLI4 */
2004 
2005 typedef struct
2006 {
2007 	uint32_t	rsvd1;
2008 #ifdef EMLXS_BIG_ENDIAN
2009 	uint8_t		ii:2;
2010 	uint16_t	rsvd2:14;
2011 	uint16_t	index;
2012 #endif
2013 #ifdef EMLXS_LITTLE_ENDIAN
2014 	uint16_t	index;
2015 	uint16_t	rsvd2:14;
2016 	uint8_t		ii:2;
2017 #endif
2018 } UNREG_VPI_VAR4;
2019 
2020 /* Structure for MB Command REG_VFI(0x9F) */
2021 /* Good for SLI4 only */
2022 
2023 typedef struct
2024 {
2025 #ifdef EMLXS_BIG_ENDIAN
2026 	uint16_t	rsvd1:2;
2027 	uint16_t	upd:1;
2028 	uint16_t	vp:1;
2029 	uint16_t	rsvd2:12;
2030 	uint16_t	vfi;
2031 
2032 	uint16_t	vpi;
2033 	uint16_t	fcfi;
2034 
2035 	uint32_t	portname[2];    /* N_PORT name */
2036 
2037 	ULP_BDE64	bde;
2038 
2039 /* CHANGE with next firmware drop */
2040 	uint32_t	edtov;
2041 	uint32_t	ratov;
2042 
2043 	uint32_t	rsvd5:8;
2044 	uint32_t	sid:24;
2045 #endif
2046 #ifdef EMLXS_LITTLE_ENDIAN
2047 	uint16_t	vfi;
2048 	uint16_t	rsvd2:12;
2049 	uint16_t	vp:1;
2050 	uint16_t	upd:1;
2051 	uint16_t	rsvd1:2;
2052 
2053 	uint16_t	fcfi;
2054 	uint16_t	vpi;
2055 
2056 	uint32_t	portname[2];    /* N_PORT name */
2057 
2058 	ULP_BDE64	bde;
2059 
2060 /* CHANGE with next firmware drop */
2061 	uint32_t	edtov;
2062 	uint32_t	ratov;
2063 
2064 	uint32_t	sid:24;
2065 	uint32_t	rsvd5:8;
2066 #endif
2067 } REG_VFI_VAR;
2068 
2069 /* Structure for MB Command INIT_VFI(0xA4) */
2070 /* Good for SLI4 only */
2071 
2072 typedef struct
2073 {
2074 #ifdef EMLXS_BIG_ENDIAN
2075 	uint32_t	vr:1;
2076 	uint32_t	vt:1;
2077 	uint32_t	vf:1;
2078 	uint32_t	rsvd1:13;
2079 	uint32_t	vfi:16;
2080 
2081 	uint16_t	rsvd2;
2082 	uint16_t	fcfi;
2083 
2084 	uint32_t	rsvd3:16;
2085 	uint32_t	pri:3;
2086 	uint32_t	vf_id:12;
2087 	uint32_t	rsvd4:1;
2088 
2089 	uint32_t	hop_count:8;
2090 	uint32_t	rsvd5:24;
2091 #endif
2092 #ifdef EMLXS_LITTLE_ENDIAN
2093 	uint32_t	vfi:16;
2094 	uint32_t	rsvd1:13;
2095 	uint32_t	vf:1;
2096 	uint32_t	vt:1;
2097 	uint32_t	vr:1;
2098 
2099 	uint16_t	fcfi;
2100 	uint16_t	rsvd2;
2101 
2102 	uint32_t	rsvd4:1;
2103 	uint32_t	vf_id:12;
2104 	uint32_t	pri:3;
2105 	uint32_t	rsvd3:16;
2106 
2107 	uint32_t	rsvd5:24;
2108 	uint32_t	hop_count:8;
2109 #endif
2110 } INIT_VFI_VAR;
2111 
2112 /* Structure for MB Command UNREG_VFI (0xA1) */
2113 /* Good for SLI4 only */
2114 
2115 typedef struct
2116 {
2117 #ifdef EMLXS_BIG_ENDIAN
2118 	uint32_t	rsvd1:3;
2119 	uint32_t	vp:1;
2120 	uint32_t	rsvd2:28;
2121 
2122 	uint16_t	vpi;
2123 	uint16_t	vfi;
2124 #endif
2125 #ifdef EMLXS_LITTLE_ENDIAN
2126 	uint32_t	rsvd2:28;
2127 	uint32_t	vp:1;
2128 	uint32_t	rsvd1:3;
2129 
2130 	uint16_t	vfi;
2131 	uint16_t	vpi;
2132 #endif
2133 } UNREG_VFI_VAR;
2134 
2135 
2136 
2137 typedef struct
2138 {
2139 #ifdef EMLXS_BIG_ENDIAN
2140 	uint32_t	read_log:1;
2141 	uint32_t	clear_log:1;
2142 	uint32_t	mbox_rsp:1;
2143 	uint32_t	resv:28;
2144 #endif
2145 #ifdef EMLXS_LITTLE_ENDIAN
2146 	uint32_t	resv:28;
2147 	uint32_t	mbox_rsp:1;
2148 	uint32_t	clear_log:1;
2149 	uint32_t	read_log:1;
2150 #endif
2151 
2152 	uint32_t	offset;
2153 
2154 	union
2155 	{
2156 		ULP_BDE		sp;
2157 		ULP_BDE64	sp64;
2158 	} un;
2159 } READ_EVT_LOG_VAR;
2160 
2161 typedef struct
2162 {
2163 
2164 #ifdef EMLXS_BIG_ENDIAN
2165 	uint16_t	split_log_next;
2166 	uint16_t	log_next;
2167 
2168 	uint32_t	size;
2169 
2170 	uint32_t	format:8;
2171 	uint32_t	resv2:22;
2172 	uint32_t	log_level:1;
2173 	uint32_t	split_log:1;
2174 #endif
2175 #ifdef EMLXS_LITTLE_ENDIAN
2176 	uint16_t	log_next;
2177 	uint16_t	split_log_next;
2178 
2179 	uint32_t	size;
2180 
2181 	uint32_t	split_log:1;
2182 	uint32_t	log_level:1;
2183 	uint32_t	resv2:22;
2184 	uint32_t	format:8;
2185 #endif
2186 
2187 	uint32_t	offset;
2188 } LOG_STATUS_VAR;
2189 
2190 
2191 /* Structure for MB Command CONFIG_PORT (0x88) */
2192 typedef struct
2193 {
2194 #ifdef EMLXS_BIG_ENDIAN
2195 	uint32_t	cBE:1;
2196 	uint32_t	cET:1;
2197 	uint32_t	cHpcb:1;
2198 	uint32_t	rMA:1;
2199 	uint32_t	sli_mode:4;
2200 	uint32_t	pcbLen:24;	/* bit 23:0 of memory based port */
2201 					/* config block */
2202 #endif
2203 #ifdef EMLXS_LITTLE_ENDIAN
2204 	uint32_t	pcbLen:24;	/* bit 23:0 of memory based port */
2205 					/* config block */
2206 	uint32_t	sli_mode:4;
2207 	uint32_t	rMA:1;
2208 	uint32_t	cHpcb:1;
2209 	uint32_t	cET:1;
2210 	uint32_t	cBE:1;
2211 #endif
2212 
2213 	uint32_t	pcbLow;		/* bit 31:0 of memory based port */
2214 					/* config block */
2215 	uint32_t	pcbHigh; 	/* bit 63:32 of memory based port */
2216 					/* config block */
2217 	uint32_t	hbainit[5];
2218 
2219 #ifdef EMLXS_BIG_ENDIAN
2220 	uint32_t	hps:1; /* Host pointers in SLIM */
2221 	uint32_t	rsvd:31;
2222 #endif
2223 #ifdef EMLXS_LITTLE_ENDIAN
2224 	uint32_t	rsvd:31;
2225 	uint32_t	hps:1; /* Host pointers in SLIM */
2226 #endif
2227 
2228 #ifdef EMLXS_BIG_ENDIAN
2229 	uint32_t	rsvd1:24;
2230 	uint32_t	cmv:1;		/* Configure Max VPIs */
2231 	uint32_t	ccrp:1;		/* Config Command Ring Polling */
2232 	uint32_t	csah:1;		/* Configure Synchronous Abort */
2233 					/* Handling */
2234 	uint32_t	chbs:1;		/* Cofigure Host Backing store */
2235 	uint32_t	cinb:1;		/* Enable Interrupt Notification */
2236 					/* Block */
2237 	uint32_t	cerbm:1;	/* Configure Enhanced Receive */
2238 					/* Buffer Management */
2239 	uint32_t	cmx:1;		/* Configure Max XRIs */
2240 	uint32_t	cmr:1;		/* Configure Max RPIs */
2241 #endif
2242 #ifdef EMLXS_LITTLE_ENDIAN
2243 	uint32_t	cmr:1;		/* Configure Max RPIs */
2244 	uint32_t	cmx:1;		/* Configure Max XRIs */
2245 	uint32_t	cerbm:1;	/* Configure Enhanced Receive */
2246 					/* Buffer Management */
2247 	uint32_t	cinb:1;		/* Enable Interrupt Notification */
2248 					/* Block */
2249 	uint32_t	chbs:1;		/* Cofigure Host Backing store */
2250 	uint32_t	csah:1;		/* Configure Synchronous Abort */
2251 					/* Handling */
2252 	uint32_t	ccrp:1;		/* Config Command Ring Polling */
2253 	uint32_t	cmv:1;		/* Configure Max VPIs */
2254 	uint32_t	rsvd1:24;
2255 #endif
2256 #ifdef EMLXS_BIG_ENDIAN
2257 	uint32_t	rsvd2:19;	/* Reserved */
2258 	uint32_t	gdss:1;		/* Configure Data Security SLI */
2259 	uint32_t	rsvd3:3;	/* Reserved */
2260 	uint32_t	gbg:1;		/* Grant BlockGuard */
2261 	uint32_t	gmv:1;		/* Grant Max VPIs */
2262 	uint32_t	gcrp:1;		/* Grant Command Ring Polling */
2263 	uint32_t	gsah:1;		/* Grant Synchronous Abort Handling */
2264 	uint32_t	ghbs:1;		/* Grant Host Backing Store */
2265 	uint32_t	ginb:1;		/* Grant Interrupt Notification Block */
2266 	uint32_t	gerbm:1;	/* Grant ERBM Request */
2267 	uint32_t	gmx:1;		/* Grant Max XRIs */
2268 	uint32_t	gmr:1;		/* Grant Max RPIs */
2269 #endif
2270 #ifdef EMLXS_LITTLE_ENDIAN
2271 	uint32_t	gmr:1;		/* Grant Max RPIs */
2272 	uint32_t	gmx:1;		/* Grant Max XRIs */
2273 	uint32_t	gerbm:1;	/* Grant ERBM Request */
2274 	uint32_t	ginb:1;		/* Grant Interrupt Notification Block */
2275 	uint32_t	ghbs:1;		/* Grant Host Backing Store */
2276 	uint32_t	gsah:1;		/* Grant Synchronous Abort Handling */
2277 	uint32_t	gcrp:1;		/* Grant Command Ring Polling */
2278 	uint32_t	gmv:1;		/* Grant Max VPIs */
2279 	uint32_t	gbg:1;		/* Grant BlockGuard */
2280 	uint32_t	rsvd3:3;	/* Reserved */
2281 	uint32_t	gdss:1;		/* Configure Data Security SLI */
2282 	uint32_t	rsvd2:19;	/* Reserved */
2283 #endif
2284 
2285 #ifdef EMLXS_BIG_ENDIAN
2286 	uint32_t	max_rpi:16;	/* Max RPIs Port should configure */
2287 	uint32_t	max_xri:16;	/* Max XRIs Port should configure */
2288 #endif
2289 #ifdef EMLXS_LITTLE_ENDIAN
2290 	uint32_t	max_xri:16;	/* Max XRIs Port should configure */
2291 	uint32_t	max_rpi:16;	/* Max RPIs Port should configure */
2292 #endif
2293 
2294 #ifdef EMLXS_BIG_ENDIAN
2295 	uint32_t	max_hbq:16;	/* Max HBQs Host expect to configure */
2296 	uint32_t	rsvd4:16;	/* Max HBQs Host expect to configure */
2297 #endif
2298 #ifdef EMLXS_LITTLE_ENDIAN
2299 	uint32_t	rsvd4:16;	/* Max HBQs Host expect to configure */
2300 	uint32_t	max_hbq:16;	/* Max HBQs Host expect to configure */
2301 #endif
2302 
2303 	uint32_t	rsvd5;		/* Reserved */
2304 
2305 #ifdef EMLXS_BIG_ENDIAN
2306 	uint32_t	rsvd6:16;	/* Reserved */
2307 	uint32_t	vpi_max:16;	/* Max number of virt N-Ports */
2308 #endif
2309 #ifdef EMLXS_LITTLE_ENDIAN
2310 	uint32_t	vpi_max:16;	/* Max number of virt N-Ports */
2311 	uint32_t	rsvd6:16;	/* Reserved */
2312 #endif
2313 } CONFIG_PORT_VAR;
2314 
2315 /* Structure for MB Command REQUEST_FEATURES (0x9D) */
2316 /* Good for SLI4 only */
2317 
2318 typedef struct
2319 {
2320 #ifdef EMLXS_BIG_ENDIAN
2321 	uint32_t	rsvd1:31;
2322 	uint32_t	QueryMode:1;
2323 #endif
2324 #ifdef EMLXS_LITTLE_ENDIAN
2325 	uint32_t	QueryMode:1;
2326 	uint32_t	rsvd1:31;
2327 #endif
2328 
2329 	uint32_t	featuresRequested;
2330 	uint32_t	featuresEnabled;
2331 
2332 } REQUEST_FEATURES_VAR;
2333 
2334 #define	SLI4_FEATURE_INHIBIT_AUTO_ABTS		0x0001
2335 #define	SLI4_FEATURE_NPIV			0x0002
2336 #define	SLI4_FEATURE_DIF			0x0004
2337 #define	SLI4_FEATURE_VIRTUAL_FABRICS		0x0008
2338 #define	SLI4_FEATURE_FCP_INITIATOR		0x0010
2339 #define	SLI4_FEATURE_FCP_TARGET			0x0020
2340 #define	SLI4_FEATURE_FCP_COMBO			0x0040
2341 #define	SLI4_FEATURE_RSVD1			0x0080
2342 #define	SLI4_FEATURE_RQD			0x0100
2343 #define	SLI4_FEATURE_INHIBIT_AUTO_ABTS_R	0x0200
2344 #define	SLI4_FEATURE_HIGH_LOGIN_MODE		0x0400
2345 #define	SLI4_FEATURE_PERF_HINT			0x0800
2346 
2347 
2348 /* SLI-2 Port Control Block */
2349 
2350 /* SLIM POINTER */
2351 #define	SLIMOFF	0x30	/* WORD */
2352 
2353 typedef struct _SLI2_RDSC
2354 {
2355 	uint32_t	cmdEntries;
2356 	uint32_t	cmdAddrLow;
2357 	uint32_t	cmdAddrHigh;
2358 
2359 	uint32_t	rspEntries;
2360 	uint32_t	rspAddrLow;
2361 	uint32_t	rspAddrHigh;
2362 } SLI2_RDSC;
2363 
2364 typedef struct _PCB
2365 {
2366 #ifdef EMLXS_BIG_ENDIAN
2367 	uint32_t	type:8;
2368 #define	TYPE_NATIVE_SLI2	0x01;
2369 	uint32_t	feature:8;
2370 #define	FEATURE_INITIAL_SLI2	0x01;
2371 	uint32_t	rsvd:12;
2372 	uint32_t	maxRing:4;
2373 #endif
2374 #ifdef EMLXS_LITTLE_ENDIAN
2375 	uint32_t	maxRing:4;
2376 	uint32_t	rsvd:12;
2377 	uint32_t	feature:8;
2378 #define	FEATURE_INITIAL_SLI2	0x01;
2379 	uint32_t	type:8;
2380 #define	TYPE_NATIVE_SLI2	0x01;
2381 #endif
2382 
2383 	uint32_t	mailBoxSize;
2384 	uint32_t	mbAddrLow;
2385 	uint32_t	mbAddrHigh;
2386 
2387 	uint32_t	hgpAddrLow;
2388 	uint32_t	hgpAddrHigh;
2389 
2390 	uint32_t	pgpAddrLow;
2391 	uint32_t	pgpAddrHigh;
2392 	SLI2_RDSC	rdsc[MAX_RINGS_AVAILABLE];
2393 } PCB;
2394 
2395 /* NEW_FEATURE */
2396 typedef struct
2397 {
2398 #ifdef EMLXS_BIG_ENDIAN
2399 	uint32_t	rsvd0:27;
2400 	uint32_t	discardFarp:1;
2401 	uint32_t	IPEnable:1;
2402 	uint32_t	nodeName:1;
2403 	uint32_t	portName:1;
2404 	uint32_t	filterEnable:1;
2405 #endif
2406 #ifdef EMLXS_LITTLE_ENDIAN
2407 	uint32_t	filterEnable:1;
2408 	uint32_t	portName:1;
2409 	uint32_t	nodeName:1;
2410 	uint32_t	IPEnable:1;
2411 	uint32_t	discardFarp:1;
2412 	uint32_t	rsvd:27;
2413 #endif
2414 	NAME_TYPE	portname;
2415 	NAME_TYPE	nodename;
2416 	uint32_t	rsvd1;
2417 	uint32_t	rsvd2;
2418 	uint32_t	rsvd3;
2419 	uint32_t	IPAddress;
2420 } CONFIG_FARP_VAR;
2421 
2422 
2423 /* NEW_FEATURE */
2424 typedef struct
2425 {
2426 #ifdef EMLXS_BIG_ENDIAN
2427 	uint32_t	defaultMessageNumber:16;
2428 	uint32_t	rsvd1:3;
2429 	uint32_t	nid:5;
2430 	uint32_t	rsvd2:5;
2431 	uint32_t	defaultPresent:1;
2432 	uint32_t	addAssociations:1;
2433 	uint32_t	reportAssociations:1;
2434 #endif
2435 #ifdef EMLXS_LITTLE_ENDIAN
2436 	uint32_t	reportAssociations:1;
2437 	uint32_t	addAssociations:1;
2438 	uint32_t	defaultPresent:1;
2439 	uint32_t	rsvd2:5;
2440 	uint32_t	nid:5;
2441 	uint32_t	rsvd1:3;
2442 	uint32_t	defaultMessageNumber:16;
2443 #endif
2444 	uint32_t	attConditions;
2445 	uint8_t		attentionId[16];
2446 	uint16_t	messageNumberByHA[32];
2447 	uint16_t	messageNumberByID[16];
2448 	uint32_t	rsvd3;
2449 } CONFIG_MSI_VAR;
2450 
2451 
2452 /* NEW_FEATURE */
2453 typedef struct
2454 {
2455 #ifdef EMLXS_BIG_ENDIAN
2456 	uint32_t	defaultMessageNumber:8;
2457 	uint32_t	rsvd1:11;
2458 	uint32_t	nid:5;
2459 	uint32_t	rsvd2:5;
2460 	uint32_t	defaultPresent:1;
2461 	uint32_t	addAssociations:1;
2462 	uint32_t	reportAssociations:1;
2463 #endif
2464 #ifdef EMLXS_LITTLE_ENDIAN
2465 	uint32_t	reportAssociations:1;
2466 	uint32_t	addAssociations:1;
2467 	uint32_t	defaultPresent:1;
2468 	uint32_t	rsvd2:5;
2469 	uint32_t	nid:5;
2470 	uint32_t	rsvd1:11;
2471 	uint32_t	defaultMessageNumber:8;
2472 #endif
2473 	uint32_t	attConditions1;
2474 	uint32_t	attConditions2;
2475 	uint8_t		attentionId[16];
2476 	uint8_t		messageNumberByHA[64];
2477 	uint8_t		messageNumberByID[16];
2478 	uint32_t	autoClearByHA1;
2479 	uint32_t	autoClearByHA2;
2480 	uint32_t	autoClearByID;
2481 	uint32_t	resv3;
2482 } CONFIG_MSIX_VAR;
2483 
2484 
2485 /* Union of all Mailbox Command types */
2486 
2487 typedef union
2488 {
2489 	uint32_t		varWords[31];
2490 	LOAD_SM_VAR		varLdSM;	/* cmd =  1 (LOAD_SM) */
2491 	READ_NV_VAR		varRDnvp;	/* cmd =  2 (READ_NVPARMS) */
2492 	WRITE_NV_VAR		varWTnvp;	/* cmd =  3 (WRITE_NVPARMS) */
2493 	BIU_DIAG_VAR		varBIUdiag;	/* cmd =  4 (RUN_BIU_DIAG) */
2494 	INIT_LINK_VAR		varInitLnk;	/* cmd =  5 (INIT_LINK) */
2495 	DOWN_LINK_VAR		varDwnLnk;	/* cmd =  6 (DOWN_LINK) */
2496 	CONFIG_LINK		varCfgLnk;	/* cmd =  7 (CONFIG_LINK) */
2497 	PART_SLIM_VAR		varSlim;	/* cmd =  8 (PART_SLIM) */
2498 	CONFIG_RING_VAR		varCfgRing;	/* cmd =  9 (CONFIG_RING) */
2499 	RESET_RING_VAR		varRstRing;	/* cmd = 10 (RESET_RING) */
2500 	READ_CONFIG_VAR		varRdConfig;	/* cmd = 11 (READ_CONFIG) */
2501 	READ_RCONF_VAR		varRdRConfig;	/* cmd = 12 (READ_RCONFIG) */
2502 	READ_SPARM_VAR		varRdSparm;	/* cmd = 13 (READ_SPARM(64)) */
2503 	READ_STATUS_VAR		varRdStatus;	/* cmd = 14 (READ_STATUS) */
2504 	READ_RPI_VAR		varRdRPI;	/* cmd = 15 (READ_RPI(64)) */
2505 	READ_XRI_VAR		varRdXRI;	/* cmd = 16 (READ_XRI) */
2506 	READ_REV_VAR		varRdRev;	/* cmd = 17 (READ_REV) */
2507 	READ_LNK_VAR		varRdLnk;	/* cmd = 18 (READ_LNK_STAT) */
2508 	REG_LOGIN_VAR		varRegLogin;	/* cmd = 19 (REG_LOGIN(64)) */
2509 	UNREG_LOGIN_VAR		varUnregLogin;	/* cmd = 20 (UNREG_LOGIN) */
2510 	READ_LA_VAR		varReadLA;	/* cmd = 21 (READ_LA(64)) */
2511 	CLEAR_LA_VAR		varClearLA;	/* cmd = 22 (CLEAR_LA) */
2512 	DUMP_VAR		varDmp;		/* Warm Start DUMP mbx cmd */
2513 	UPDATE_CFG_VAR		varUpdateCfg;	/* cmd = 0x1b Warm Start */
2514 						/* UPDATE_CFG cmd */
2515 	DEL_LD_ENTRY_VAR	varDelLdEntry;	/* cmd = 0x1d (DEL_LD_ENTRY) */
2516 	UNREG_D_ID_VAR		varUnregDID;	/* cmd = 0x23 (UNREG_D_ID) */
2517 	CONFIG_FARP_VAR		varCfgFarp;	/* cmd = 0x25 (CONFIG_FARP) */
2518 	CONFIG_MSI_VAR		varCfgMSI;	/* cmd = 0x90 (CONFIG_MSI) */
2519 	CONFIG_MSIX_VAR		varCfgMSIX;	/* cmd = 0x30 (CONFIG_MSIX) */
2520 	CONFIG_HBQ_VAR		varCfgHbq;	/* cmd = 0x7C (CONFIG_HBQ) */
2521 	LOAD_AREA_VAR		varLdArea;	/* cmd = 0x81 (LOAD_AREA) */
2522 	CONFIG_PORT_VAR		varCfgPort;	/* cmd = 0x88 (CONFIG_PORT) */
2523 	LOAD_EXP_ROM_VAR	varLdExpRom;	/* cmd = 0x9C (LOAD_XP_ROM) */
2524 	REG_VPI_VAR		varRegVpi;	/* cmd = 0x96 (REG_VPI) */
2525 	UNREG_VPI_VAR		varUnregVpi;	/* cmd = 0x97 (UNREG_VPI) */
2526 	READ_EVT_LOG_VAR	varRdEvtLog;	/* cmd = 0x38 (READ_EVT_LOG) */
2527 	LOG_STATUS_VAR		varLogStat;	/* cmd = 0x37 */
2528 
2529 } MAILVARIANTS;
2530 
2531 #define	MAILBOX_CMD_BSIZE	128
2532 #define	MAILBOX_CMD_WSIZE	32
2533 
2534 /*
2535  * SLI-2 specific structures
2536  */
2537 
2538 typedef struct _SLI1_DESC
2539 {
2540 	emlxs_rings_t	mbxCring[4];
2541 	uint32_t	mbxUnused[24];
2542 } SLI1_DESC; /* 128 bytes */
2543 
2544 typedef struct
2545 {
2546 	uint32_t	cmdPutInx;
2547 	uint32_t	rspGetInx;
2548 } HGP;
2549 
2550 typedef struct
2551 {
2552 	uint32_t	cmdGetInx;
2553 	uint32_t	rspPutInx;
2554 } PGP;
2555 
2556 typedef struct _SLI2_DESC
2557 {
2558 	HGP		host[4];
2559 	PGP		port[4];
2560 	uint32_t	HBQ_PortGetIdx[16];
2561 } SLI2_DESC; /* 128 bytes */
2562 
2563 typedef union
2564 {
2565 	SLI1_DESC	s1;	/* 32 words, 128 bytes */
2566 	SLI2_DESC	s2;	/* 32 words, 128 bytes */
2567 } SLI_VAR;
2568 
2569 typedef volatile struct
2570 {
2571 #ifdef EMLXS_BIG_ENDIAN
2572 	uint16_t	mbxStatus;
2573 	uint8_t		mbxCommand;
2574 	uint8_t		mbxReserved:6;
2575 	uint8_t		mbxHc:1;
2576 	uint8_t		mbxOwner:1;	/* Low order bit first word */
2577 #endif
2578 #ifdef EMLXS_LITTLE_ENDIAN
2579 	uint8_t		mbxOwner:1;	/* Low order bit first word */
2580 	uint8_t		mbxHc:1;
2581 	uint8_t		mbxReserved:6;
2582 	uint8_t		mbxCommand;
2583 	uint16_t	mbxStatus;
2584 #endif
2585 	MAILVARIANTS	un;		/* 124 bytes */
2586 	SLI_VAR		us;		/* 128 bytes */
2587 } MAILBOX;				/* 256 bytes */
2588 
2589 
2590 
2591 /* SLI4 IOCTL Mailbox */
2592 /* ALL SLI4 specific mbox commands have a standard request /response header */
2593 /* Word 0 is just like SLI 3 */
2594 
2595 typedef struct mbox_req_hdr
2596 {
2597 #ifdef EMLXS_BIG_ENDIAN
2598 	uint32_t	domain:8;		/* word 6 */
2599 	uint32_t	port:8;
2600 	uint32_t	subsystem:8;
2601 	uint32_t	opcode:8;
2602 
2603 	uint32_t	timeout;		/* word 7 */
2604 
2605 	uint32_t	req_length;		/* word 8 */
2606 
2607 	uint32_t	reserved1:24;		/* word 9 */
2608 	uint32_t	version:8;		/* word 9 */
2609 #endif
2610 #ifdef EMLXS_LITTLE_ENDIAN
2611 	uint32_t	opcode:8;
2612 	uint32_t	subsystem:8;
2613 	uint32_t	port:8;
2614 	uint32_t	domain:8;		/* word 6 */
2615 
2616 	uint32_t	timeout;		/* word 7 */
2617 
2618 	uint32_t	req_length;		/* word 8 */
2619 
2620 	uint32_t	version:8;		/* word 9 */
2621 	uint32_t	reserved1:24;		/* word 9 */
2622 #endif
2623 
2624 } mbox_req_hdr_t;
2625 
2626 
2627 typedef struct mbox_req_hdr2
2628 {
2629 #ifdef EMLXS_BIG_ENDIAN
2630 	uint32_t	vf_number:16;		/* word 6 */
2631 	uint32_t	subsystem:8;
2632 	uint32_t	opcode:8;
2633 
2634 	uint32_t	timeout;		/* word 7 */
2635 
2636 	uint32_t	req_length;		/* word 8 */
2637 
2638 	uint32_t	vh_number:6;		/* word 9 */
2639 	uint32_t	pf_number:10;
2640 	uint32_t	reserved1:8;
2641 	uint32_t	version:8;
2642 #endif
2643 #ifdef EMLXS_LITTLE_ENDIAN
2644 	uint32_t	opcode:8;
2645 	uint32_t	subsystem:8;
2646 	uint32_t	vf_number:16;		/* word 6 */
2647 
2648 	uint32_t	timeout;		/* word 7 */
2649 
2650 	uint32_t	req_length;		/* word 8 */
2651 
2652 	uint32_t	version:8;
2653 	uint32_t	reserved1:8;
2654 	uint32_t	pf_number:10;
2655 	uint32_t	vh_number:6;		/* word 9 */
2656 #endif
2657 
2658 } mbox_req_hdr2_t;
2659 
2660 typedef struct mbox_rsp_hdr
2661 {
2662 #ifdef EMLXS_BIG_ENDIAN
2663 	uint32_t	domain:8;		/* word 6 */
2664 	uint32_t	reserved1:8;
2665 	uint32_t	subsystem:8;
2666 	uint32_t	opcode:8;
2667 
2668 	uint32_t	reserved2:16;		/* word 7 */
2669 	uint32_t	extra_status:8;
2670 	uint32_t	status:8;
2671 #endif
2672 #ifdef EMLXS_LITTLE_ENDIAN
2673 	uint32_t	opcode:8;
2674 	uint32_t	subsystem:8;
2675 	uint32_t	reserved1:8;
2676 	uint32_t	domain:8;		/* word 6 */
2677 
2678 	uint32_t	status:8;
2679 	uint32_t	extra_status:8;
2680 	uint32_t	reserved2:16;		/* word 7 */
2681 #endif
2682 	uint32_t	rsp_length;		/* word 8 */
2683 	uint32_t	allocated_length;	/* word 9 */
2684 } mbox_rsp_hdr_t;
2685 
2686 #define	MBX_RSP_STATUS_SUCCESS		0x00
2687 #define	MBX_RSP_STATUS_FAILED		0x01
2688 #define	MBX_RSP_STATUS_ILLEGAL_REQ	0x02
2689 #define	MBX_RSP_STATUS_ILLEGAL_FIELD	0x03
2690 #define	MBX_RSP_STATUS_FCF_IN_USE	0x3A
2691 #define	MBX_RSP_STATUS_NO_FCF		0x43
2692 
2693 #define	MGMT_ADDI_STATUS_INCOMPATIBLE	0xA2
2694 
2695 typedef struct be_req_hdr
2696 {
2697 #ifdef EMLXS_BIG_ENDIAN
2698 	uint32_t	special:8;		/* word 1 */
2699 	uint32_t	reserved2:16;		/* word 1 */
2700 	uint32_t	sge_cnt:5;		/* word 1 */
2701 	uint32_t	reserved1:2;		/* word 1 */
2702 	uint32_t	embedded:1;		/* word 1 */
2703 #endif
2704 #ifdef EMLXS_LITTLE_ENDIAN
2705 	uint32_t	embedded:1;		/* word 1 */
2706 	uint32_t	reserved1:2;		/* word 1 */
2707 	uint32_t	sge_cnt:5;		/* word 1 */
2708 	uint32_t	reserved2:16;		/* word 1 */
2709 	uint32_t	special:8;		/* word 1 */
2710 #endif
2711 	uint32_t	payload_length;		/* word 2 */
2712 	uint32_t	tag_low;		/* word 3 */
2713 	uint32_t	tag_hi;			/* word 4 */
2714 	uint32_t	reserved3;		/* word 5 */
2715 	union
2716 	{
2717 		mbox_req_hdr_t	hdr_req;
2718 		mbox_req_hdr2_t hdr_req2;
2719 		mbox_rsp_hdr_t	hdr_rsp;
2720 	} un_hdr;
2721 } be_req_hdr_t;
2722 
2723 #define	EMLXS_MAX_NONEMBED_SIZE		(1024 * 64)
2724 
2725 /* SLI_CONFIG Mailbox commands */
2726 
2727 #define	IOCTL_SUBSYSTEM_COMMON			0x01
2728 #define	IOCTL_SUBSYSTEM_FCOE			0x0C
2729 #define	IOCTL_SUBSYSTEM_DCBX			0x10
2730 
2731 #define	COMMON_OPCODE_READ_FLASHROM		0x06
2732 #define	COMMON_OPCODE_WRITE_FLASHROM		0x07
2733 #define	COMMON_OPCODE_CQ_CREATE			0x0C
2734 #define	COMMON_OPCODE_EQ_CREATE			0x0D
2735 #define	COMMON_OPCODE_MQ_CREATE 		0x15
2736 #define	COMMON_OPCODE_GET_CNTL_ATTRIB		0x20
2737 #define	COMMON_OPCODE_NOP			0x21
2738 #define	COMMON_OPCODE_QUERY_FIRMWARE_CONFIG	0x3A
2739 #define	COMMON_OPCODE_RESET			0x3D
2740 #define	COMMON_OPCODE_SET_PHYSICAL_LINK_CFG_V1	0x3E
2741 
2742 #define	COMMON_OPCODE_GET_BOOT_CFG		0x42
2743 #define	COMMON_OPCODE_SET_BOOT_CFG		0x43
2744 #define	COMMON_OPCODE_MANAGE_FAT		0x44
2745 #define	COMMON_OPCODE_GET_PHYSICAL_LINK_CFG_V1	0x47
2746 #define	COMMON_OPCODE_GET_PORT_NAME		0x4D
2747 
2748 #define	COMMON_OPCODE_MQ_CREATE_EXT		0x5A
2749 #define	COMMON_OPCODE_GET_VPD_DATA		0x5B
2750 #define	COMMON_OPCODE_GET_PHY_DETAILS		0x66
2751 #define	COMMON_OPCODE_SEND_ACTIVATION		0x73
2752 #define	COMMON_OPCODE_RESET_LICENSES		0x74
2753 #define	COMMON_OPCODE_GET_CNTL_ADDL_ATTRIB	0x79
2754 
2755 #define	COMMON_OPCODE_GET_EXTENTS_INFO		0x9A
2756 #define	COMMON_OPCODE_GET_EXTENTS		0x9B
2757 #define	COMMON_OPCODE_ALLOC_EXTENTS		0x9C
2758 #define	COMMON_OPCODE_DEALLOC_EXTENTS		0x9D
2759 
2760 #define	COMMON_OPCODE_GET_PROFILE_CAPS		0xA1
2761 #define	COMMON_OPCODE_GET_MR_PROFILE_CAPS	0xA2
2762 #define	COMMON_OPCODE_SET_MR_PROFILE_CAPS	0xA3
2763 #define	COMMON_OPCODE_GET_PROFILE_CFG		0xA4
2764 #define	COMMON_OPCODE_SET_PROFILE_CFG		0xA5
2765 #define	COMMON_OPCODE_GET_PROFILE_LIST		0xA6
2766 #define	COMMON_OPCODE_GET_ACTIVE_PROFILE	0xA7
2767 #define	COMMON_OPCODE_SET_ACTIVE_PROFILE	0xA8
2768 #define	COMMON_OPCODE_SET_FACTORY_PROFILE_CFG	0xA9
2769 
2770 #define	COMMON_OPCODE_READ_OBJ			0xAB
2771 #define	COMMON_OPCODE_WRITE_OBJ			0xAC
2772 #define	COMMON_OPCODE_READ_OBJ_LIST		0xAD
2773 #define	COMMON_OPCODE_DELETE_OBJ		0xAE
2774 #define	COMMON_OPCODE_GET_SLI4_PARAMS		0xB5
2775 
2776 #define	FCOE_OPCODE_WQ_CREATE			0x01
2777 #define	FCOE_OPCODE_CFG_POST_SGL_PAGES		0x03
2778 #define	FCOE_OPCODE_RQ_CREATE			0x05
2779 #define	FCOE_OPCODE_READ_FCF_TABLE		0x08
2780 #define	FCOE_OPCODE_ADD_FCF_TABLE		0x09
2781 #define	FCOE_OPCODE_DELETE_FCF_TABLE		0x0A
2782 #define	FCOE_OPCODE_POST_HDR_TEMPLATES		0x0B
2783 #define	FCOE_OPCODE_REDISCOVER_FCF_TABLE	0x10
2784 #define	FCOE_OPCODE_SET_FCLINK_SETTINGS		0x21
2785 
2786 #define	DCBX_OPCODE_GET_DCBX_MODE		0x04
2787 #define	DCBX_OPCODE_SET_DCBX_MODE		0x05
2788 
2789 typedef	struct
2790 {
2791 	struct
2792 	{
2793 		uint32_t opcode;
2794 #define	MGMT_FLASHROM_OPCODE_FLASH		1
2795 #define	MGMT_FLASHROM_OPCODE_SAVE		2
2796 #define	MGMT_FLASHROM_OPCODE_CLEAR		3
2797 #define	MGMT_FLASHROM_OPCODE_REPORT		4
2798 #define	MGMT_FLASHROM_OPCODE_INFO		5
2799 #define	MGMT_FLASHROM_OPCODE_CRC		6
2800 #define	MGMT_FLASHROM_OPCODE_OFFSET_FLASH	7
2801 #define	MGMT_FLASHROM_OPCODE_OFFSET_SAVE	8
2802 #define	MGMT_PHY_FLASHROM_OPCODE_FLASH		9
2803 #define	MGMT_PHY_FLASHROM_OPCODE_SAVE		10
2804 
2805 		uint32_t optype;
2806 #define	MGMT_FLASHROM_OPTYPE_ISCSI_FIRMWARE	0
2807 #define	MGMT_FLASHROM_OPTYPE_REDBOOT		1
2808 #define	MGMT_FLASHROM_OPTYPE_ISCSI_BIOS		2
2809 #define	MGMT_FLASHROM_OPTYPE_PXE_BIOS		3
2810 #define	MGMT_FLASHROM_OPTYPE_CTRLS		4
2811 #define	MGMT_FLASHROM_OPTYPE_CFG_IPSEC		5
2812 #define	MGMT_FLASHROM_OPTYPE_CFG_INI		6
2813 #define	MGMT_FLASHROM_OPTYPE_ROM_OFFSET		7
2814 #define	MGMT_FLASHROM_OPTYPE_FCOE_BIOS		8
2815 #define	MGMT_FLASHROM_OPTYPE_ISCSI_BACKUP	9
2816 #define	MGMT_FLASHROM_OPTYPE_FCOE_FIRMWARE	10
2817 #define	MGMT_FLASHROM_OPTYPE_FCOE_BACKUP	11
2818 #define	MGMT_FLASHROM_OPTYPE_CTRLP		12
2819 #define	MGMT_FLASHROM_OPTYPE_NCSI_FIRMWARE	13
2820 #define	MGMT_FLASHROM_OPTYPE_CFG_NIC		14
2821 #define	MGMT_FLASHROM_OPTYPE_CFG_DCBX		15
2822 #define	MGMT_FLASHROM_OPTYPE_CFG_PXE_BIOS	16
2823 #define	MGMT_FLASHROM_OPTYPE_CFG_ALL		17
2824 #define	MGMT_FLASHROM_OPTYPE_PHY_FIRMWARE	0xff /* Driver defined */
2825 
2826 		uint32_t data_buffer_size; /* Align to 4KB */
2827 		uint32_t offset;
2828 		uint32_t data_buffer; /* image starts here */
2829 
2830 	} params;
2831 
2832 } IOCTL_COMMON_FLASHROM;
2833 
2834 
2835 typedef	struct
2836 {
2837 	union
2838 	{
2839 		struct
2840 		{
2841 			uint32_t rsvd;
2842 		} request;
2843 
2844 
2845 		struct
2846 		{
2847 #ifdef EMLXS_BIG_ENDIAN
2848 			uint16_t interface_type;
2849 			uint16_t phy_type;
2850 #endif
2851 #ifdef EMLXS_LITTLE_ENDIAN
2852 			uint16_t phy_type;
2853 			uint16_t interface_type;
2854 #endif
2855 
2856 /* phy_type */
2857 #define	PHY_XAUI		0x0
2858 #define	PHY_AEL_2020		0x1 /* eluris/Netlogic */
2859 #define	PHY_LSI_BRCM1		0x2 /* Peak pre-production board */
2860 #define	PHY_LSI_BRCM2		0x3 /* Peak production board */
2861 #define	PHY_SOLARFLARE		0x4 /* Dell recommended */
2862 #define	PHY_AMCC_QT2025		0x5 /* AMCC PHY */
2863 #define	PHY_AMCC_QT2225		0x6 /* AMCC PHY */
2864 #define	PHY_BRCM_5931		0x7 /* Broadcom Phy used by HP LOM */
2865 #define	PHY_BE3_INTERNAL_10GB	0x8 /* Internal 10GbPHY in BE3 */
2866 #define	PHY_BE3_INTERNAL_1GB	0x9 /* Internal 1Gb PHY in BE3 */
2867 #define	PHY_TN_2022		0xa /* Teranetics dual port 65nm PHY */
2868 #define	PHY_MARVELL_88E1340	0xb /* Marvel 1G PHY */
2869 #define	PHY_MARVELL_88E1322	0xc /* Marvel 1G PHY */
2870 #define	PHY_TN_8022		0xd /* Teranetics dual port 40nm PHY */
2871 #define	PHY_TYPE_NOT_SUPPORTED
2872 
2873 /* interface_type */
2874 #define	CX4_10GB_TYPE		0x0
2875 #define	XFP_10GB_TYPE		0x1
2876 #define	SFP_1GB_TYPE		0x2
2877 #define	SFP_PLUS_10GB_TYPE	0x3
2878 #define	KR_10GB_TYPE		0x4
2879 #define	KX4_10GB_TYPE		0x5
2880 #define	BASET_10GB_TYPE		0x6 /* 10G BaseT */
2881 #define	BASET_1000_TYPE		0x7 /* 1000 BaseT */
2882 #define	BASEX_1000_TYPE		0x8 /* 1000 BaseX */
2883 #define	SGMII_TYPE		0x9
2884 #define	INTERFACE_10GB_DISABLED	0xff /* Interface type not supported */
2885 
2886 			uint32_t misc_params;
2887 			uint32_t rsvd[4];
2888 		} response;
2889 
2890 	} params;
2891 
2892 } IOCTL_COMMON_GET_PHY_DETAILS;
2893 
2894 
2895 typedef	struct
2896 {
2897 	union
2898 	{
2899 		struct
2900 		{
2901 			uint32_t rsvd;
2902 		} request;
2903 
2904 
2905 		struct
2906 		{
2907 #ifdef EMLXS_BIG_ENDIAN
2908 			uint8_t port3_name;
2909 			uint8_t port2_name;
2910 			uint8_t port1_name;
2911 			uint8_t port0_name;
2912 #endif
2913 #ifdef EMLXS_LITTLE_ENDIAN
2914 			uint8_t port0_name;
2915 			uint8_t port1_name;
2916 			uint8_t port2_name;
2917 			uint8_t port3_name;
2918 #endif
2919 		} response;
2920 
2921 	} params;
2922 
2923 } IOCTL_COMMON_GET_PORT_NAME;
2924 
2925 
2926 typedef	struct
2927 {
2928 	union
2929 	{
2930 		struct
2931 		{
2932 #ifdef EMLXS_BIG_ENDIAN
2933 			uint32_t rsvd:30;
2934 			uint32_t pt:2;
2935 #endif
2936 #ifdef EMLXS_LITTLE_ENDIAN
2937 			uint32_t pt:2;
2938 			uint32_t rsvd:30;
2939 #endif
2940 #define	PORT_TYPE_GIGE		0
2941 #define	PORT_TYPE_FC		1
2942 		} request;
2943 
2944 
2945 		struct
2946 		{
2947 #ifdef EMLXS_BIG_ENDIAN
2948 			uint8_t port3_name;
2949 			uint8_t port2_name;
2950 			uint8_t port1_name;
2951 			uint8_t port0_name;
2952 #endif
2953 #ifdef EMLXS_LITTLE_ENDIAN
2954 			uint8_t port0_name;
2955 			uint8_t port1_name;
2956 			uint8_t port2_name;
2957 			uint8_t port3_name;
2958 #endif
2959 		} response;
2960 
2961 	} params;
2962 
2963 } IOCTL_COMMON_GET_PORT_NAME_V1;
2964 
2965 
2966 typedef	struct
2967 {
2968 	union
2969 	{
2970 		struct
2971 		{
2972 			uint32_t fat_operation;
2973 #define	RETRIEVE_FAT		0
2974 #define	QUERY_FAT		1
2975 #define	CLEAR_FAT		2
2976 
2977 			uint32_t read_log_offset;
2978 			uint32_t read_log_length;
2979 			uint32_t data_buffer_size;
2980 			uint32_t data_buffer;
2981 		} request;
2982 
2983 		struct
2984 		{
2985 			uint32_t log_size;
2986 			uint32_t read_log_length;
2987 			uint32_t rsvd0;
2988 			uint32_t rsvd1;
2989 			uint32_t data_buffer;
2990 		} response;
2991 
2992 	} params;
2993 
2994 } IOCTL_COMMON_MANAGE_FAT;
2995 
2996 
2997 typedef	struct
2998 {
2999 	union
3000 	{
3001 		struct
3002 		{
3003 #ifdef EMLXS_BIG_ENDIAN
3004 			uint32_t EOF:1; /* word 4 */
3005 			uint32_t rsvd0:7;
3006 			uint32_t desired_write_length:24;
3007 #endif
3008 #ifdef EMLXS_LITTLE_ENDIAN
3009 			uint32_t desired_write_length:24;
3010 			uint32_t rsvd0:7;
3011 			uint32_t EOF:1;  /* word 4 */
3012 #endif
3013 			uint32_t write_offset;  /* word 5 */
3014 			char object_name[(4 * 26)];   /* word 6 - 31 */
3015 			uint32_t buffer_desc_count; /* word 32 */
3016 
3017 #ifdef EMLXS_BIG_ENDIAN
3018 			uint32_t rsvd:8; /* word 33 */
3019 			uint32_t buffer_length:24;
3020 #endif
3021 #ifdef EMLXS_LITTLE_ENDIAN
3022 			uint32_t buffer_length:24;
3023 			uint32_t rsvd:8; /* word 33 */
3024 #endif
3025 			uint32_t buffer_addrlo; /* word 34 */
3026 			uint32_t buffer_addrhi; /* word 35 */
3027 		} request;
3028 
3029 		struct
3030 		{
3031 			uint32_t actual_write_length;
3032 
3033 #ifdef EMLXS_BIG_ENDIAN
3034 			uint32_t rsvd:24;
3035 			uint32_t change_status:8;
3036 #endif
3037 #ifdef EMLXS_LITTLE_ENDIAN
3038 			uint32_t change_status:8;
3039 			uint32_t rsvd:24;
3040 #endif
3041 #define	CS_NO_RESET		0
3042 #define	CS_REBOOT_RQD		1
3043 #define	CS_FW_RESET_RQD		2
3044 #define	CS_PROTO_RESET_RQD	3
3045 		} response;
3046 
3047 	} params;
3048 
3049 } IOCTL_COMMON_WRITE_OBJECT;
3050 
3051 
3052 typedef	struct
3053 {
3054 	union
3055 	{
3056 		struct
3057 		{
3058 #ifdef EMLXS_BIG_ENDIAN
3059 			uint32_t descriptor_offset:16; /* word 4 */
3060 			uint32_t descriptor_count:16;
3061 #endif
3062 #ifdef EMLXS_LITTLE_ENDIAN
3063 			uint32_t descriptor_count:16;
3064 			uint32_t descriptor_offset:16; /* word 4 */
3065 #endif
3066 			uint32_t reserved;  /* word 5 */
3067 			char object_name[(4 * 26)];   /* word 6 - 31 */
3068 			uint32_t buffer_desc_count; /* word 32 */
3069 
3070 #ifdef EMLXS_BIG_ENDIAN
3071 			uint32_t rsvd:8; /* word 33 */
3072 			uint32_t buffer_length:24;
3073 #endif
3074 #ifdef EMLXS_LITTLE_ENDIAN
3075 			uint32_t buffer_length:24;
3076 			uint32_t rsvd:8; /* word 33 */
3077 #endif
3078 			uint32_t buffer_addrlo; /* word 34 */
3079 			uint32_t buffer_addrhi; /* word 35 */
3080 		} request;
3081 
3082 		struct
3083 		{
3084 #ifdef EMLXS_BIG_ENDIAN
3085 			uint32_t reserved:16;
3086 			uint32_t actual_descriptor_count:16;
3087 #endif
3088 #ifdef EMLXS_LITTLE_ENDIAN
3089 			uint32_t actual_descriptor_count:16;
3090 			uint32_t reserved:16;
3091 #endif
3092 		} response;
3093 
3094 	} params;
3095 
3096 } IOCTL_COMMON_READ_OBJECT_LIST;
3097 
3098 
3099 typedef	struct
3100 {
3101 	union
3102 	{
3103 		struct
3104 		{
3105 #ifdef EMLXS_BIG_ENDIAN
3106 			uint32_t reserved:16; /* word 4 */
3107 			uint32_t boot_instance:8;
3108 			uint32_t boot_status:8;
3109 #endif
3110 #ifdef EMLXS_LITTLE_ENDIAN
3111 			uint32_t boot_status:8;
3112 			uint32_t boot_instance:8;
3113 			uint32_t reserved:16; /* word 4 */
3114 #endif
3115 		} request;
3116 
3117 		struct
3118 		{
3119 #ifdef EMLXS_BIG_ENDIAN
3120 			uint32_t reserved:16; /* word 4 */
3121 			uint32_t boot_instance:8;
3122 			uint32_t boot_status:8;
3123 #endif
3124 #ifdef EMLXS_LITTLE_ENDIAN
3125 			uint32_t boot_status:8;
3126 			uint32_t boot_instance:8;
3127 			uint32_t reserved:16; /* word 4 */
3128 #endif
3129 		} response;
3130 
3131 	} params;
3132 
3133 } IOCTL_COMMON_BOOT_CFG;
3134 
3135 
3136 /* IOCTL_COMMON_QUERY_FIRMWARE_CONFIG */
3137 typedef struct _BE_FW_CFG
3138 {
3139 	uint32_t	BEConfigNumber;
3140 	uint32_t	ASICRevision;
3141 	uint32_t	PhysicalPort;
3142 	uint32_t	FunctionMode;
3143 	uint32_t	ULPMode;
3144 
3145 } BE_FW_CFG;
3146 
3147 typedef	struct _IOCTL_COMMON_QUERY_FIRMWARE_CONFIG
3148 {
3149 	union
3150 	{
3151 		struct
3152 		{
3153 			uint32_t	rsvd0;
3154 		} request;
3155 
3156 		BE_FW_CFG	response;
3157 
3158 	}	params;
3159 
3160 } IOCTL_COMMON_QUERY_FIRMWARE_CONFIG;
3161 
3162 
3163 
3164 /* IOCTL_FCOE_READ_FCF_TABLE */
3165 typedef struct
3166 {
3167 	uint32_t	max_recv_size;
3168 	uint32_t	fka_adv_period;
3169 	uint32_t	fip_priority;
3170 
3171 #ifdef EMLXS_BIG_ENDIAN
3172 	uint8_t		fcf_mac_address_hi[4];
3173 
3174 	uint8_t		mac_address_provider;
3175 	uint8_t		fcf_available;
3176 	uint8_t		fcf_mac_address_low[2];
3177 
3178 	uint8_t		fabric_name_identifier[8];
3179 
3180 	uint8_t		fcf_sol:1;
3181 	uint8_t		rsvd0:5;
3182 	uint8_t		fcf_fc:1;
3183 	uint8_t		fcf_valid:1;
3184 	uint8_t		fc_map[3];
3185 
3186 	uint16_t	fcf_state;
3187 	uint16_t	fcf_index;
3188 #endif
3189 #ifdef EMLXS_LITTLE_ENDIAN
3190 	uint8_t		fcf_mac_address_hi[4];
3191 
3192 	uint8_t		fcf_mac_address_low[2];
3193 	uint8_t		fcf_available;
3194 	uint8_t		mac_address_provider;
3195 
3196 	uint8_t		fabric_name_identifier[8];
3197 
3198 	uint8_t		fc_map[3];
3199 	uint8_t		fcf_valid:1;
3200 	uint8_t		fcf_fc:1;
3201 	uint8_t		rsvd0:5;
3202 	uint8_t		fcf_sol:1;
3203 
3204 	uint16_t	fcf_index;
3205 	uint16_t	fcf_state;
3206 #endif
3207 
3208 	uint8_t		vlan_bitmap[512];
3209 	uint8_t		switch_name_identifier[8];
3210 
3211 } FCF_RECORD_t;
3212 
3213 #define	EMLXS_FCOE_MAX_RCV_SZ	0x800
3214 
3215 /* defines for mac_address_provider */
3216 #define	EMLXS_MAM_BOTH	0	/* Both SPMA and FPMA */
3217 #define	EMLXS_MAM_FPMA	1	/* Fabric Provided MAC Address */
3218 #define	EMLXS_MAM_SPMA	2	/* Server Provided MAC Address */
3219 
3220 typedef struct
3221 {
3222 	union
3223 	{
3224 		struct
3225 		{
3226 #ifdef EMLXS_BIG_ENDIAN
3227 			uint16_t	rsvd0;
3228 			uint16_t	fcf_index;
3229 #endif
3230 #ifdef EMLXS_LITTLE_ENDIAN
3231 			uint16_t	fcf_index;
3232 			uint16_t	rsvd0;
3233 #endif
3234 
3235 		} request;
3236 
3237 		struct
3238 		{
3239 			uint32_t	event_tag;
3240 #ifdef EMLXS_BIG_ENDIAN
3241 			uint16_t	rsvd0;
3242 			uint16_t	next_valid_fcf_index;
3243 #endif
3244 #ifdef EMLXS_LITTLE_ENDIAN
3245 			uint16_t	next_valid_fcf_index;
3246 			uint16_t	rsvd0;
3247 #endif
3248 			FCF_RECORD_t fcf_entry[1];
3249 
3250 		} response;
3251 
3252 	} params;
3253 
3254 } IOCTL_FCOE_READ_FCF_TABLE;
3255 
3256 
3257 /* IOCTL_FCOE_ADD_FCF_TABLE */
3258 typedef struct
3259 {
3260 	union
3261 	{
3262 		struct
3263 		{
3264 #ifdef EMLXS_BIG_ENDIAN
3265 			uint16_t	rsvd0;
3266 			uint16_t	fcf_index;
3267 #endif
3268 #ifdef EMLXS_LITTLE_ENDIAN
3269 			uint16_t	fcf_index;
3270 			uint16_t	rsvd0;
3271 #endif
3272 			FCF_RECORD_t fcf_entry;
3273 
3274 		} request;
3275 	} params;
3276 
3277 } IOCTL_FCOE_ADD_FCF_TABLE;
3278 
3279 
3280 /* IOCTL_FCOE_DELETE_FCF_TABLE */
3281 typedef struct
3282 {
3283 	union
3284 	{
3285 		struct
3286 		{
3287 #ifdef EMLXS_BIG_ENDIAN
3288 			uint16_t	fcf_indexes[1];
3289 			uint16_t	fcf_count;
3290 #endif
3291 #ifdef EMLXS_LITTLE_ENDIAN
3292 			uint16_t	fcf_count;
3293 			uint16_t	fcf_indexes[1];
3294 #endif
3295 
3296 		} request;
3297 	} params;
3298 
3299 } IOCTL_FCOE_DELETE_FCF_TABLE;
3300 
3301 
3302 /* IOCTL_FCOE_REDISCOVER_FCF_TABLE */
3303 typedef struct
3304 {
3305 	union
3306 	{
3307 		struct
3308 		{
3309 #ifdef EMLXS_BIG_ENDIAN
3310 			uint16_t	rsvd0;
3311 			uint16_t	fcf_count;
3312 #endif
3313 #ifdef EMLXS_LITTLE_ENDIAN
3314 			uint16_t	fcf_count;
3315 			uint16_t	rsvd0;
3316 #endif
3317 			uint32_t	rsvd1;
3318 			uint16_t	fcf_index[1];
3319 
3320 		} request;
3321 	} params;
3322 
3323 } IOCTL_FCOE_REDISCOVER_FCF_TABLE;
3324 
3325 
3326 #define	FCOE_FCF_MAC0	0x0E
3327 #define	FCOE_FCF_MAC1	0xFC
3328 #define	FCOE_FCF_MAC2	0x00
3329 #define	FCOE_FCF_MAC3	0xFF
3330 #define	FCOE_FCF_MAC4	0xFF
3331 #define	FCOE_FCF_MAC5	0xFE
3332 
3333 #define	FCOE_FCF_MAP0	0x0E
3334 #define	FCOE_FCF_MAP1	0xFC
3335 #define	FCOE_FCF_MAP2	0x00
3336 
3337 #define	MGMT_STATUS_FCF_IN_USE	0x3a
3338 
3339 /* IOCTL_COMMON_NOP */
3340 typedef	struct _IOCTL_COMMON_NOP
3341 {
3342 	union
3343 	{
3344 		struct
3345 		{
3346 			uint64_t	context;
3347 		} request;
3348 
3349 		struct
3350 		{
3351 			uint64_t	context;
3352 		} response;
3353 
3354 	} params;
3355 
3356 } IOCTL_COMMON_NOP;
3357 
3358 
3359 /*	Context for EQ create	*/
3360 typedef	struct _EQ_CONTEXT
3361 {
3362 #ifdef EMLXS_BIG_ENDIAN
3363 	uint32_t	Size:1;
3364 	uint32_t	Rsvd2:1;
3365 	uint32_t	Valid:1;
3366 	uint32_t	Rsvd1:29;
3367 
3368 	uint32_t	Armed:1;
3369 	uint32_t	Rsvd4:2;
3370 	uint32_t	Count:3;
3371 	uint32_t	Rsvd3:26;
3372 
3373 	uint32_t	Rsvd6:9;
3374 	uint32_t	DelayMult:10;
3375 	uint32_t	Rsvd5:13;
3376 #endif
3377 #ifdef EMLXS_LITTLE_ENDIAN
3378 	uint32_t	Rsvd1:29;
3379 	uint32_t	Valid:1;
3380 	uint32_t	Rsvd2:1;
3381 	uint32_t	Size:1;
3382 
3383 	uint32_t	Rsvd3:26;
3384 	uint32_t	Count:3;
3385 	uint32_t	Rsvd4:2;
3386 	uint32_t	Armed:1;
3387 
3388 	uint32_t	Rsvd5:13;
3389 	uint32_t	DelayMult:10;
3390 	uint32_t	Rsvd6:9;
3391 #endif
3392 
3393 	uint32_t	Rsvd7;
3394 
3395 } EQ_CONTEXT;
3396 
3397 
3398 /* define for Count field */
3399 #define	EQ_ELEMENT_COUNT_1024	2
3400 #define	EQ_ELEMENT_COUNT_2048	3
3401 #define	EQ_ELEMENT_COUNT_4096	4
3402 
3403 /* define for Size field */
3404 #define	EQ_ELEMENT_SIZE_4	0
3405 
3406 /* define for DelayMullt - used for interrupt coalescing */
3407 #define	EQ_DELAY_MULT		64
3408 
3409 /*	Context for CQ create	*/
3410 typedef	struct _CQ_CONTEXT
3411 {
3412 #ifdef EMLXS_BIG_ENDIAN
3413 	uint32_t	Eventable:1;
3414 	uint32_t	Rsvd3:1;
3415 	uint32_t	Valid:1;
3416 	uint32_t	Count:2;
3417 	uint32_t	Rsvd2:12;
3418 	uint32_t	NoDelay:1;
3419 	uint32_t	CoalesceWM:2;
3420 	uint32_t	Rsvd1:12;
3421 
3422 	uint32_t	Armed:1;
3423 	uint32_t	Rsvd5:1;
3424 	uint32_t	EQId:8;
3425 	uint32_t	Rsvd4:22;
3426 
3427 	uint32_t	Rsvd6;
3428 #endif
3429 #ifdef EMLXS_LITTLE_ENDIAN
3430 	uint32_t	Rsvd1:12;
3431 	uint32_t	CoalesceWM:2;
3432 	uint32_t	NoDelay:1;
3433 	uint32_t	Rsvd2:12;
3434 	uint32_t	Count:2;
3435 	uint32_t	Valid:1;
3436 	uint32_t	Rsvd3:1;
3437 	uint32_t	Eventable:1;
3438 
3439 	uint32_t	Rsvd4:22;
3440 	uint32_t	EQId:8;
3441 	uint32_t	Rsvd5:1;
3442 	uint32_t	Armed:1;
3443 
3444 	uint32_t	Rsvd6;
3445 #endif
3446 
3447 	uint32_t	Rsvd7;
3448 
3449 } CQ_CONTEXT;
3450 
3451 typedef	struct _CQ_CONTEXT_V2
3452 {
3453 #ifdef EMLXS_BIG_ENDIAN
3454 	uint32_t	Eventable:1;
3455 	uint32_t	Rsvd3:1;
3456 	uint32_t	Valid:1;
3457 	uint32_t	CqeCnt:2;
3458 	uint32_t	CqeSize:2;
3459 	uint32_t	Rsvd2:9;
3460 	uint32_t	AutoValid:1;
3461 	uint32_t	NoDelay:1;
3462 	uint32_t	CoalesceWM:2;
3463 	uint32_t	Rsvd1:12;
3464 
3465 	uint32_t	Armed:1;
3466 	uint32_t	Rsvd4:15;
3467 	uint32_t	EQId:16;
3468 
3469 	uint32_t	Rsvd5:16;
3470 	uint32_t	Count1:16;
3471 #endif
3472 #ifdef EMLXS_LITTLE_ENDIAN
3473 	uint32_t	Rsvd1:12;
3474 	uint32_t	CoalesceWM:2;
3475 	uint32_t	NoDelay:1;
3476 	uint32_t	AutoValid:1;
3477 	uint32_t	Rsvd2:9;
3478 	uint32_t	CqeSize:2;
3479 	uint32_t	CqeCnt:2;
3480 	uint32_t	Valid:1;
3481 	uint32_t	Rsvd3:1;
3482 	uint32_t	Eventable:1;
3483 
3484 	uint32_t	EQId:16;
3485 	uint32_t	Rsvd4:15;
3486 	uint32_t	Armed:1;
3487 
3488 	uint32_t	Count1:16;
3489 	uint32_t	Rsvd5:16;
3490 #endif
3491 
3492 	uint32_t	Rsvd7;
3493 
3494 } CQ_CONTEXT_V2;
3495 
3496 /* CqeSize */
3497 #define	CQE_SIZE_16_BYTES	0
3498 #define	CQE_SIZE_32_BYTES	1
3499 
3500 /* define for Count field */
3501 #define	CQ_ELEMENT_COUNT_256	0
3502 #define	CQ_ELEMENT_COUNT_512	1
3503 #define	CQ_ELEMENT_COUNT_1024	2
3504 #define	CQ_ELEMENT_COUNT_SPECIFIED	3
3505 
3506 /*	Context for MQ create	*/
3507 typedef	struct _MQ_CONTEXT
3508 {
3509 #ifdef EMLXS_BIG_ENDIAN
3510 	uint32_t	CQId:10;
3511 	uint32_t	Rsvd2:2;
3512 	uint32_t	Size:4;
3513 	uint32_t	Rsvd1:16;
3514 
3515 	uint32_t	Valid:1;
3516 	uint32_t	Rsvd3:31;
3517 
3518 	uint32_t	Rsvd4:21;
3519 	uint32_t	ACQId:10;
3520 	uint32_t	ACQV:1;
3521 #endif
3522 #ifdef EMLXS_LITTLE_ENDIAN
3523 	uint32_t	Rsvd1:16;
3524 	uint32_t	Size:4;
3525 	uint32_t	Rsvd2:2;
3526 	uint32_t	CQId:10;
3527 
3528 	uint32_t	Rsvd3:31;
3529 	uint32_t	Valid:1;
3530 
3531 	uint32_t	ACQV:1;
3532 	uint32_t	ACQId:10;
3533 	uint32_t	Rsvd4:21;
3534 #endif
3535 
3536 	uint32_t	Rsvd5;
3537 
3538 } MQ_CONTEXT;
3539 
3540 
3541 typedef	struct _MQ_CONTEXT_V1
3542 {
3543 #ifdef EMLXS_BIG_ENDIAN
3544 	uint32_t	Rsvd2:12;
3545 	uint32_t	Size:4;
3546 	uint32_t	ACQId:16;
3547 
3548 	uint32_t	Valid:1;
3549 	uint32_t	Rsvd3:31;
3550 
3551 	uint32_t	Rsvd4:31;
3552 	uint32_t	ACQV:1;
3553 #endif
3554 #ifdef EMLXS_LITTLE_ENDIAN
3555 	uint32_t	ACQId:16;
3556 	uint32_t	Size:4;
3557 	uint32_t	Rsvd2:12;
3558 
3559 	uint32_t	Rsvd3:31;
3560 	uint32_t	Valid:1;
3561 
3562 	uint32_t	ACQV:1;
3563 	uint32_t	Rsvd4:31;
3564 #endif
3565 
3566 	uint32_t	Rsvd5;
3567 
3568 } MQ_CONTEXT_V1;
3569 
3570 
3571 /* define for Size field */
3572 #define	MQ_ELEMENT_COUNT_16 0x05
3573 
3574 /*	Context for RQ create	*/
3575 typedef	struct _RQ_CONTEXT
3576 {
3577 #ifdef EMLXS_BIG_ENDIAN
3578 	uint32_t	Rsvd2:12;
3579 	uint32_t	RqeCnt:4;
3580 	uint32_t	Rsvd1:16;
3581 
3582 	uint32_t	Rsvd3;
3583 
3584 	uint32_t	CQId:16;
3585 	uint32_t	BufferSize:16;
3586 #endif
3587 #ifdef EMLXS_LITTLE_ENDIAN
3588 	uint32_t	Rsvd1:16;
3589 	uint32_t	RqeCnt:4;
3590 	uint32_t	Rsvd2:12;
3591 
3592 	uint32_t	Rsvd3;
3593 
3594 	uint32_t	BufferSize:16;
3595 	uint32_t	CQId:16;
3596 #endif
3597 
3598 	uint32_t  Rsvd5;
3599 
3600 } RQ_CONTEXT;
3601 
3602 typedef	struct _RQ_CONTEXT_V1
3603 {
3604 #ifdef EMLXS_BIG_ENDIAN
3605 	uint32_t	RqeCnt:16;
3606 	uint32_t	Rsvd1:4;
3607 	uint32_t	RqeSize:4;
3608 	uint32_t	PageSize:8;
3609 
3610 	uint32_t	Rsvd2;
3611 
3612 	uint32_t	CQId:16;
3613 	uint32_t	Rsvd:16;
3614 #endif
3615 #ifdef EMLXS_LITTLE_ENDIAN
3616 	uint32_t	PageSize:8;
3617 	uint32_t	RqeSize:4;
3618 	uint32_t	Rsvd1:4;
3619 	uint32_t	RqeCnt:16;
3620 
3621 	uint32_t	Rsvd2;
3622 
3623 	uint32_t	Rsvd:16;
3624 	uint32_t	CQId:16;
3625 #endif
3626 
3627 	uint32_t	BufferSize;
3628 
3629 } RQ_CONTEXT_V1;
3630 
3631 /* RqeSize */
3632 #define	RQE_SIZE_8_BYTES	0x02
3633 #define	RQE_SIZE_16_BYTES	0x03
3634 #define	RQE_SIZE_32_BYTES	0x04
3635 #define	RQE_SIZE_64_BYTES	0x05
3636 #define	RQE_SIZE_128_BYTES	0x06
3637 
3638 /* RQ PageSize */
3639 #define	RQ_PAGE_SIZE_4K		0x01
3640 #define	RQ_PAGE_SIZE_8K		0x02
3641 #define	RQ_PAGE_SIZE_16K	0x04
3642 #define	RQ_PAGE_SIZE_32K	0x08
3643 #define	RQ_PAGE_SIZE_64K	0x10
3644 
3645 
3646 /* IOCTL_COMMON_EQ_CREATE */
3647 typedef	struct
3648 {
3649 	union
3650 	{
3651 		struct
3652 		{
3653 #ifdef EMLXS_BIG_ENDIAN
3654 			uint16_t	Rsvd1;
3655 			uint16_t	NumPages;
3656 #endif
3657 #ifdef EMLXS_LITTLE_ENDIAN
3658 			uint16_t	NumPages;
3659 			uint16_t	Rsvd1;
3660 #endif
3661 			EQ_CONTEXT	EQContext;
3662 			BE_PHYS_ADDR	Pages[8];
3663 		} request;
3664 
3665 		struct
3666 		{
3667 #ifdef EMLXS_BIG_ENDIAN
3668 			uint16_t	MsiIndex; /* V1 only */
3669 			uint16_t	EQId;
3670 #endif
3671 #ifdef EMLXS_LITTLE_ENDIAN
3672 			uint16_t	EQId;
3673 			uint16_t	MsiIndex; /* V1 only */
3674 #endif
3675 		} response;
3676 	} params;
3677 
3678 } IOCTL_COMMON_EQ_CREATE;
3679 
3680 
3681 typedef	struct
3682 {
3683 #ifdef EMLXS_BIG_ENDIAN
3684 		uint32_t	Rsvd1:24;		/* Word 0 */
3685 		uint32_t	ProtocolType:8;
3686 
3687 		uint32_t	Rsvd3:3;		/* Word 1 */
3688 		uint32_t	SliHint2:5;
3689 		uint32_t	SliHint1:8;
3690 		uint32_t	IfType:4;
3691 		uint32_t	SliFamily:4;
3692 		uint32_t	Revision:4;
3693 		uint32_t	Rsvd2:3;
3694 		uint32_t	FT:1;
3695 
3696 		uint32_t	EqRsvd3:4;		/* Word 2 */
3697 		uint32_t	EqeCntMethod:4;
3698 		uint32_t	EqPageSize:8;
3699 		uint32_t	EqRsvd2:4;
3700 		uint32_t	EqeSize:4;
3701 		uint32_t	EqRsvd1:4;
3702 		uint32_t	EqPageCnt:4;
3703 
3704 		uint32_t	EqRsvd4:16;		/* Word 3 */
3705 		uint32_t	EqeCntMask:16;
3706 
3707 		uint32_t	CqRsvd3:4;		/* Word 4 */
3708 		uint32_t	CqeCntMethod:4;
3709 		uint32_t	CqPageSize:8;
3710 		uint32_t	CQV:2;
3711 		uint32_t	CqRsvd2:2;
3712 		uint32_t	CqeSize:4;
3713 		uint32_t	CqRsvd1:4;
3714 		uint32_t	CqPageCnt:4;
3715 
3716 		uint32_t	CqRsvd4:16;		/* Word 5 */
3717 		uint32_t	CqeCntMask:16;
3718 
3719 		uint32_t	MqRsvd2:4;		/* Word 6 */
3720 		uint32_t	MqeCntMethod:4;
3721 		uint32_t	MqPageSize:8;
3722 		uint32_t	MQV:2;
3723 		uint32_t	MqRsvd1:10;
3724 		uint32_t	MqPageCnt:4;
3725 
3726 		uint32_t	MqRsvd3:16;		/* Word 7 */
3727 		uint32_t	MqeCntMask:16;
3728 
3729 		uint32_t	WqRsvd3:4;		/* Word 8 */
3730 		uint32_t	WqeCntMethod:4;
3731 		uint32_t	WqPageSize:8;
3732 		uint32_t	WQV:2;
3733 		uint32_t	WqeRsvd2:2;
3734 		uint32_t	WqeSize:4;
3735 		uint32_t	WqRsvd1:4;
3736 		uint32_t	WqPageCnt:4;
3737 
3738 		uint32_t	WqRsvd4:16;		/* Word 9 */
3739 		uint32_t	WqeCntMask:16;
3740 
3741 		uint32_t	RqRsvd3:4;		/* Word 10 */
3742 		uint32_t	RqeCntMethod:4;
3743 		uint32_t	RqPageSize:8;
3744 		uint32_t	RQV:2;
3745 		uint32_t	RqeRsvd2:2;
3746 		uint32_t	RqeSize:4;
3747 		uint32_t	RqRsvd1:4;
3748 		uint32_t	RqPageCnt:4;
3749 
3750 		uint32_t	RqDbWin:4;		/* Word 11 */
3751 		uint32_t	RqRsvd4:12;
3752 		uint32_t	RqeCntMask:16;
3753 
3754 		uint32_t	Loopback:4;		/* Word 12 */
3755 		uint32_t	Rsvd4:12;
3756 		uint32_t	PHWQ:1;
3757 		uint32_t	PHON:1;
3758 		uint32_t	PHOFF:1;
3759 		uint32_t	TRIR:1;
3760 		uint32_t	TRTY:1;
3761 		uint32_t	TCCA:1;
3762 		uint32_t	MWQE:1;
3763 		uint32_t	ASSI:1;
3764 		uint32_t	TERP:1;
3765 		uint32_t	TGT:1;
3766 		uint32_t	AREG:1;
3767 		uint32_t	FBRR:1;
3768 		uint32_t	SGLR:1;
3769 		uint32_t	HDRR:1;
3770 		uint32_t	EXT:1;
3771 		uint32_t	FCOE:1;
3772 
3773 		uint32_t	SgeLength;		/* Word 13 */
3774 
3775 		uint32_t	SglRsvd2:8;		/* Word 14 */
3776 		uint32_t	SglAlign:8;
3777 		uint32_t	SglPageSize:8;
3778 		uint32_t	SglRsvd1:4;
3779 		uint32_t	SglPageCnt:4;
3780 
3781 		uint32_t	Rsvd5:16;		/* Word 15 */
3782 		uint32_t	MinRqSize:16;
3783 
3784 		uint32_t	MaxRqSize;		/* Word 16 */
3785 
3786 		uint32_t	RPIMax:16;
3787 		uint32_t	XRIMax:16;		/* Word 17 */
3788 
3789 		uint32_t	VFIMax:16;
3790 		uint32_t	VPIMax:16;		/* Word 18 */
3791 #endif
3792 #ifdef EMLXS_LITTLE_ENDIAN
3793 		uint32_t	ProtocolType:8;		/* Word 0 */
3794 		uint32_t	Rsvd1:24;
3795 
3796 		uint32_t	FT:1;			/* Word 1 */
3797 		uint32_t	Rsvd2:3;
3798 		uint32_t	Revision:4;
3799 		uint32_t	SliFamily:4;
3800 		uint32_t	IfType:4;
3801 		uint32_t	SliHint1:8;
3802 		uint32_t	SliHint2:5;
3803 		uint32_t	Rsvd3:3;
3804 
3805 		uint32_t	EqPageCnt:4;		/* Word 2 */
3806 		uint32_t	EqRsvd1:4;
3807 		uint32_t	EqeSize:4;
3808 		uint32_t	EqRsvd2:4;
3809 		uint32_t	EqPageSize:8;
3810 		uint32_t	EqeCntMethod:4;
3811 		uint32_t	EqRsvd3:4;
3812 
3813 		uint32_t	EqeCntMask:16;		/* Word 3 */
3814 		uint32_t	EqRsvd4:16;
3815 
3816 		uint32_t	CqPageCnt:4;		/* Word 4 */
3817 		uint32_t	CqRsvd1:4;
3818 		uint32_t	CqeSize:4;
3819 		uint32_t	CqRsvd2:2;
3820 		uint32_t	CQV:2;
3821 		uint32_t	CqPageSize:8;
3822 		uint32_t	CqeCntMethod:4;
3823 		uint32_t	CqRsvd3:4;
3824 
3825 		uint32_t	CqeCntMask:16;		/* Word 5 */
3826 		uint32_t	CqRsvd4:16;
3827 
3828 		uint32_t	MqPageCnt:4;		/* Word 6 */
3829 		uint32_t	MqRsvd1:10;
3830 		uint32_t	MQV:2;
3831 		uint32_t	MqPageSize:8;
3832 		uint32_t	MqeCntMethod:4;
3833 		uint32_t	MqRsvd2:4;
3834 
3835 		uint32_t	MqeCntMask:16;		/* Word 7 */
3836 		uint32_t	MqRsvd3:16;
3837 
3838 		uint32_t	WqPageCnt:4;		/* Word 8 */
3839 		uint32_t	WqRsvd1:4;
3840 		uint32_t	WqeSize:4;
3841 		uint32_t	WqeRsvd2:2;
3842 		uint32_t	WQV:2;
3843 		uint32_t	WqPageSize:8;
3844 		uint32_t	WqeCntMethod:4;
3845 		uint32_t	WqRsvd3:4;
3846 
3847 		uint32_t	WqeCntMask:16;		/* Word 9 */
3848 		uint32_t	WqRsvd4:16;
3849 
3850 		uint32_t	RqPageCnt:4;		/* Word 10 */
3851 		uint32_t	RqRsvd1:4;
3852 		uint32_t	RqeSize:4;
3853 		uint32_t	RqeRsvd2:2;
3854 		uint32_t	RQV:2;
3855 		uint32_t	RqPageSize:8;
3856 		uint32_t	RqeCntMethod:4;
3857 		uint32_t	RqRsvd3:4;
3858 
3859 		uint32_t	RqeCntMask:16;		/* Word 11 */
3860 		uint32_t	RqRsvd4:12;
3861 		uint32_t	RqDbWin:4;
3862 
3863 		uint32_t	FCOE:1;			/* Word 12 */
3864 		uint32_t	EXT:1;
3865 		uint32_t	HDRR:1;
3866 		uint32_t	SGLR:1;
3867 		uint32_t	FBRR:1;
3868 		uint32_t	AREG:1;
3869 		uint32_t	TGT:1;
3870 		uint32_t	TERP:1;
3871 		uint32_t	ASSI:1;
3872 		uint32_t	MWQE:1;
3873 		uint32_t	TCCA:1;
3874 		uint32_t	TRTY:1;
3875 		uint32_t	TRIR:1;
3876 		uint32_t	PHOFF:1;
3877 		uint32_t	PHON:1;
3878 		uint32_t	PHWQ:1;
3879 		uint32_t	Rsvd4:12;
3880 		uint32_t	Loopback:4;
3881 
3882 		uint32_t	SgeLength;		/* Word 13 */
3883 
3884 		uint32_t	SglPageCnt:4;		/* Word 14 */
3885 		uint32_t	SglRsvd1:4;
3886 		uint32_t	SglPageSize:8;
3887 		uint32_t	SglAlign:8;
3888 		uint32_t	SglRsvd2:8;
3889 
3890 		uint32_t	MinRqSize:16;		/* Word 15 */
3891 		uint32_t	Rsvd5:16;
3892 
3893 		uint32_t	MaxRqSize;		/* Word 16 */
3894 
3895 		uint32_t	XRIMax:16;		/* Word 17 */
3896 		uint32_t	RPIMax:16;
3897 
3898 		uint32_t	VPIMax:16;		/* Word 18 */
3899 		uint32_t	VFIMax:16;
3900 #endif
3901 
3902 		uint32_t	Rsvd6;			/* Word 19 */
3903 
3904 } sli_params_t;
3905 
3906 /* SliFamily values */
3907 #define	SLI_FAMILY_BE2		0x0
3908 #define	SLI_FAMILY_BE3		0x1
3909 #define	SLI_FAMILY_LANCER_A	0xA
3910 #define	SLI_FAMILY_LANCER_B	0xB
3911 
3912 
3913 
3914 /* IOCTL_COMMON_SLI4_PARAMS */
3915 typedef	struct
3916 {
3917 	union
3918 	{
3919 		struct
3920 		{
3921 			uint32_t	Rsvd1;
3922 		} request;
3923 
3924 		struct
3925 		{
3926 			sli_params_t param;
3927 		} response;
3928 	} params;
3929 
3930 } IOCTL_COMMON_SLI4_PARAMS;
3931 
3932 
3933 #define	MAX_EXTENTS		16 /* 1 to 104 */
3934 
3935 /* IOCTL_COMMON_EXTENTS */
3936 typedef	struct
3937 {
3938 	union
3939 	{
3940 		struct
3941 		{
3942 #ifdef EMLXS_BIG_ENDIAN
3943 			uint16_t	RscCnt;
3944 			uint16_t	RscType;
3945 #endif
3946 #ifdef EMLXS_LITTLE_ENDIAN
3947 			uint16_t	RscType;
3948 			uint16_t	RscCnt;
3949 #endif
3950 		} request;
3951 
3952 		struct
3953 		{
3954 #ifdef EMLXS_BIG_ENDIAN
3955 			uint16_t	ExtentSize;
3956 			uint16_t	ExtentCnt;
3957 #endif
3958 #ifdef EMLXS_LITTLE_ENDIAN
3959 			uint16_t	ExtentCnt;
3960 			uint16_t	ExtentSize;
3961 #endif
3962 
3963 			uint16_t	RscId[MAX_EXTENTS];
3964 
3965 		} response;
3966 	} params;
3967 
3968 } IOCTL_COMMON_EXTENTS;
3969 
3970 /* RscType */
3971 #define	RSC_TYPE_FCOE_VFI	0x20
3972 #define	RSC_TYPE_FCOE_VPI	0x21
3973 #define	RSC_TYPE_FCOE_RPI	0x22
3974 #define	RSC_TYPE_FCOE_XRI	0x23
3975 
3976 
3977 
3978 /* IOCTL_COMMON_CQ_CREATE */
3979 typedef	struct
3980 {
3981 	union
3982 	{
3983 		struct
3984 		{
3985 #ifdef EMLXS_BIG_ENDIAN
3986 			uint16_t	Rsvd1;
3987 			uint16_t	NumPages;
3988 #endif
3989 #ifdef EMLXS_LITTLE_ENDIAN
3990 			uint16_t	NumPages;
3991 			uint16_t	Rsvd1;
3992 #endif
3993 			CQ_CONTEXT	CQContext;
3994 			BE_PHYS_ADDR	Pages[4];
3995 		} request;
3996 
3997 		struct
3998 		{
3999 #ifdef EMLXS_BIG_ENDIAN
4000 			uint16_t	Rsvd1;
4001 			uint16_t	CQId;
4002 #endif
4003 #ifdef EMLXS_LITTLE_ENDIAN
4004 			uint16_t	CQId;
4005 			uint16_t	Rsvd1;
4006 #endif
4007 		} response;
4008 	} params;
4009 
4010 } IOCTL_COMMON_CQ_CREATE;
4011 
4012 
4013 /* IOCTL_COMMON_CQ_CREATE_V2 */
4014 typedef	struct
4015 {
4016 	union
4017 	{
4018 		struct
4019 		{
4020 #ifdef EMLXS_BIG_ENDIAN
4021 			uint8_t		Rsvd1;
4022 			uint8_t		PageSize;
4023 			uint16_t	NumPages;
4024 #endif
4025 #ifdef EMLXS_LITTLE_ENDIAN
4026 			uint16_t	NumPages;
4027 			uint8_t		PageSize;
4028 			uint8_t		Rsvd1;
4029 #endif
4030 			CQ_CONTEXT_V2	CQContext;
4031 			BE_PHYS_ADDR	Pages[8];
4032 		} request;
4033 
4034 		struct
4035 		{
4036 #ifdef EMLXS_BIG_ENDIAN
4037 			uint16_t	Rsvd1;
4038 			uint16_t	CQId;
4039 #endif
4040 #ifdef EMLXS_LITTLE_ENDIAN
4041 			uint16_t	CQId;
4042 			uint16_t	Rsvd1;
4043 #endif
4044 		} response;
4045 	} params;
4046 
4047 } IOCTL_COMMON_CQ_CREATE_V2;
4048 
4049 #define	CQ_PAGE_SIZE_4K		0x01
4050 #define	CQ_PAGE_SIZE_8K		0x02
4051 #define	CQ_PAGE_SIZE_16K	0x04
4052 #define	CQ_PAGE_SIZE_32K	0x08
4053 #define	CQ_PAGE_SIZE_64K	0x10
4054 
4055 
4056 
4057 /* IOCTL_COMMON_MQ_CREATE */
4058 typedef	struct
4059 {
4060 	union
4061 	{
4062 		struct
4063 		{
4064 #ifdef EMLXS_BIG_ENDIAN
4065 			uint16_t	Rsvd1;
4066 			uint16_t	NumPages;
4067 #endif
4068 #ifdef EMLXS_LITTLE_ENDIAN
4069 			uint16_t	NumPages;
4070 			uint16_t	Rsvd1;
4071 #endif
4072 			MQ_CONTEXT	MQContext;
4073 			BE_PHYS_ADDR	Pages[8];
4074 		} request;
4075 
4076 		struct
4077 		{
4078 #ifdef EMLXS_BIG_ENDIAN
4079 			uint16_t	Rsvd1;
4080 			uint16_t	MQId;
4081 #endif
4082 #ifdef EMLXS_LITTLE_ENDIAN
4083 			uint16_t	MQId;
4084 			uint16_t	Rsvd1;
4085 #endif
4086 		} response;
4087 	} params;
4088 
4089 } IOCTL_COMMON_MQ_CREATE;
4090 
4091 
4092 /* IOCTL_COMMON_MQ_CREATE_EXT */
4093 typedef	struct
4094 {
4095 	union
4096 	{
4097 		struct
4098 		{
4099 #ifdef EMLXS_BIG_ENDIAN
4100 			uint16_t	rsvd0;
4101 			uint16_t	num_pages;
4102 #endif
4103 #ifdef EMLXS_LITTLE_ENDIAN
4104 			uint16_t	num_pages;
4105 			uint16_t	rsvd0;
4106 #endif
4107 			uint32_t	async_event_bitmap;
4108 
4109 #define	ASYNC_LINK_EVENT	0x00000002
4110 #define	ASYNC_FCF_EVENT		0x00000004
4111 #define	ASYNC_DCBX_EVENT	0x00000008
4112 #define	ASYNC_iSCSI_EVENT	0x00000010
4113 #define	ASYNC_GROUP5_EVENT	0x00000020
4114 #define	ASYNC_FC_EVENT		0x00010000
4115 #define	ASYNC_PORT_EVENT	0x00020000
4116 #define	ASYNC_VF_EVENT		0x00040000
4117 #define	ASYNC_MR_EVENT		0x00080000
4118 
4119 			MQ_CONTEXT	context;
4120 			BE_PHYS_ADDR	pages[8];
4121 		} request;
4122 
4123 		struct
4124 		{
4125 #ifdef EMLXS_BIG_ENDIAN
4126 			uint16_t	rsvd0;
4127 			uint16_t	MQId;
4128 #endif
4129 #ifdef EMLXS_LITTLE_ENDIAN
4130 			uint16_t	MQId;
4131 			uint16_t	rsvd0;
4132 #endif
4133 		} response;
4134 
4135 	} params;
4136 
4137 } IOCTL_COMMON_MQ_CREATE_EXT;
4138 
4139 
4140 /* IOCTL_COMMON_MQ_CREATE_EXT_V1 */
4141 typedef	struct
4142 {
4143 	union
4144 	{
4145 		struct
4146 		{
4147 #ifdef EMLXS_BIG_ENDIAN
4148 			uint16_t	CQId;
4149 			uint16_t	num_pages;
4150 #endif
4151 #ifdef EMLXS_LITTLE_ENDIAN
4152 			uint16_t	num_pages;
4153 			uint16_t	CQId;
4154 #endif
4155 			uint32_t	async_event_bitmap;
4156 
4157 			MQ_CONTEXT_V1	context;
4158 			BE_PHYS_ADDR	pages[8];
4159 		} request;
4160 
4161 		struct
4162 		{
4163 #ifdef EMLXS_BIG_ENDIAN
4164 			uint16_t	rsvd0;
4165 			uint16_t	MQId;
4166 #endif
4167 #ifdef EMLXS_LITTLE_ENDIAN
4168 			uint16_t	MQId;
4169 			uint16_t	rsvd0;
4170 #endif
4171 		} response;
4172 
4173 	} params;
4174 
4175 } IOCTL_COMMON_MQ_CREATE_EXT_V1;
4176 
4177 
4178 /* IOCTL_FCOE_RQ_CREATE */
4179 typedef	struct
4180 {
4181 	union
4182 	{
4183 		struct
4184 		{
4185 #ifdef EMLXS_BIG_ENDIAN
4186 			uint16_t	Rsvd0;
4187 			uint16_t	NumPages;
4188 #endif
4189 #ifdef EMLXS_LITTLE_ENDIAN
4190 			uint16_t	NumPages;
4191 			uint16_t	Rsvd0;
4192 #endif
4193 			RQ_CONTEXT	RQContext;
4194 			BE_PHYS_ADDR	Pages[8];
4195 		} request;
4196 
4197 		struct
4198 		{
4199 #ifdef EMLXS_BIG_ENDIAN
4200 			uint16_t	Rsvd1;
4201 			uint16_t	RQId;
4202 #endif
4203 #ifdef EMLXS_LITTLE_ENDIAN
4204 			uint16_t	RQId;
4205 			uint16_t	Rsvd1;
4206 #endif
4207 		} response;
4208 
4209 	} params;
4210 
4211 } IOCTL_FCOE_RQ_CREATE;
4212 
4213 
4214 /* IOCTL_FCOE_RQ_CREATE_V1 */
4215 typedef	struct
4216 {
4217 	union
4218 	{
4219 		struct
4220 		{
4221 #ifdef EMLXS_BIG_ENDIAN
4222 			uint32_t 	DNB:1;
4223 			uint32_t 	DFD:1;
4224 			uint32_t 	DIM:1;
4225 			uint32_t	Rsvd0:13;
4226 			uint32_t	NumPages:16;
4227 #endif
4228 #ifdef EMLXS_LITTLE_ENDIAN
4229 			uint32_t	NumPages:16;
4230 			uint32_t	Rsvd0:13;
4231 			uint32_t 	DIM:1;
4232 			uint32_t 	DFD:1;
4233 			uint32_t 	DNB:1;
4234 #endif
4235 			RQ_CONTEXT_V1	RQContext;
4236 			BE_PHYS_ADDR	Pages[8];
4237 		} request;
4238 
4239 		struct
4240 		{
4241 #ifdef EMLXS_BIG_ENDIAN
4242 			uint16_t	Rsvd1;
4243 			uint16_t	RQId;
4244 #endif
4245 #ifdef EMLXS_LITTLE_ENDIAN
4246 			uint16_t	RQId;
4247 			uint16_t	Rsvd1;
4248 #endif
4249 		} response;
4250 
4251 	} params;
4252 
4253 } IOCTL_FCOE_RQ_CREATE_V1;
4254 
4255 
4256 /* IOCTL_FCOE_WQ_CREATE */
4257 typedef	struct
4258 {
4259 	union
4260 	{
4261 		struct
4262 		{
4263 #ifdef EMLXS_BIG_ENDIAN
4264 			uint16_t	CQId;
4265 			uint16_t	NumPages;
4266 #endif
4267 #ifdef EMLXS_LITTLE_ENDIAN
4268 			uint16_t	NumPages;
4269 			uint16_t	CQId;
4270 #endif
4271 			BE_PHYS_ADDR	Pages[4];
4272 		} request;
4273 
4274 		struct
4275 		{
4276 #ifdef EMLXS_BIG_ENDIAN
4277 			uint16_t	Rsvd0;
4278 			uint16_t	WQId;
4279 #endif
4280 #ifdef EMLXS_LITTLE_ENDIAN
4281 			uint16_t	WQId;
4282 			uint16_t	Rsvd0;
4283 #endif
4284 		} response;
4285 
4286 	} params;
4287 
4288 } IOCTL_FCOE_WQ_CREATE;
4289 
4290 
4291 /* IOCTL_FCOE_WQ_CREATE_V1 */
4292 typedef	struct
4293 {
4294 	union
4295 	{
4296 		struct
4297 		{
4298 #ifdef EMLXS_BIG_ENDIAN
4299 			uint16_t	CQId;
4300 			uint16_t	NumPages;
4301 
4302 			uint32_t	WqeCnt:16;
4303 			uint32_t	Rsvd1:4;
4304 			uint32_t	WqeSize:4;
4305 			uint32_t	PageSize:8;
4306 #endif
4307 #ifdef EMLXS_LITTLE_ENDIAN
4308 			uint16_t	NumPages;
4309 			uint16_t	CQId;
4310 
4311 			uint32_t	PageSize:8;
4312 			uint32_t	WqeSize:4;
4313 			uint32_t	Rsvd1:4;
4314 			uint32_t	WqeCnt:16;
4315 #endif
4316 			uint32_t	Rsvd:2;
4317 			BE_PHYS_ADDR	Pages[4];
4318 		} request;
4319 
4320 		struct
4321 		{
4322 #ifdef EMLXS_BIG_ENDIAN
4323 			uint16_t	Rsvd0;
4324 			uint16_t	WQId;
4325 #endif
4326 #ifdef EMLXS_LITTLE_ENDIAN
4327 			uint16_t	WQId;
4328 			uint16_t	Rsvd0;
4329 #endif
4330 		} response;
4331 
4332 	} params;
4333 
4334 } IOCTL_FCOE_WQ_CREATE_V1;
4335 
4336 /* WqeSize */
4337 #define	WQE_SIZE_64_BYTES	0x05
4338 #define	WQE_SIZE_128_BYTES	0x06
4339 
4340 /* PageSize */
4341 #define	WQ_PAGE_SIZE_4K		0x01
4342 #define	WQ_PAGE_SIZE_8K		0x02
4343 #define	WQ_PAGE_SIZE_16K	0x04
4344 #define	WQ_PAGE_SIZE_32K	0x08
4345 #define	WQ_PAGE_SIZE_64K	0x10
4346 
4347 
4348 
4349 /* IOCTL_FCOE_CFG_POST_SGL_PAGES */
4350 typedef	struct _FCOE_SGL_PAGES
4351 {
4352 	BE_PHYS_ADDR	sgl_page0;	/* 1st page per XRI */
4353 	BE_PHYS_ADDR	sgl_page1;	/* 2nd page per XRI */
4354 
4355 } FCOE_SGL_PAGES;
4356 
4357 typedef	struct
4358 {
4359 	union
4360 	{
4361 		struct
4362 		{
4363 #ifdef EMLXS_BIG_ENDIAN
4364 			uint16_t	xri_count;
4365 			uint16_t	xri_start;
4366 #endif
4367 #ifdef EMLXS_LITTLE_ENDIAN
4368 			uint16_t	xri_start;
4369 			uint16_t	xri_count;
4370 #endif
4371 			FCOE_SGL_PAGES	pages[1];
4372 		} request;
4373 
4374 		struct
4375 		{
4376 			uint32_t	rsvd0;
4377 		} response;
4378 
4379 	} params;
4380 
4381 	uint32_t	rsvd0[2];
4382 
4383 } IOCTL_FCOE_CFG_POST_SGL_PAGES;
4384 
4385 
4386 /* IOCTL_FCOE_POST_HDR_TEMPLATES */
4387 typedef struct _IOCTL_FCOE_POST_HDR_TEMPLATES
4388 {
4389 	union
4390 	{
4391 		struct
4392 		{
4393 #ifdef EMLXS_BIG_ENDIAN
4394 			uint16_t	num_pages;
4395 			uint16_t	rpi_offset;
4396 #endif
4397 #ifdef EMLXS_LITTLE_ENDIAN
4398 			uint16_t	rpi_offset;
4399 			uint16_t	num_pages;
4400 #endif
4401 			BE_PHYS_ADDR	pages[32];
4402 
4403 		}request;
4404 
4405 	}params;
4406 
4407 } IOCTL_FCOE_POST_HDR_TEMPLATES;
4408 
4409 
4410 
4411 #define	EMLXS_IOCTL_DCBX_MODE_CEE	0	/* Mapped to FIP mode */
4412 #define	EMLXS_IOCTL_DCBX_MODE_CIN	1	/* Mapped to nonFIP mode */
4413 
4414 /* IOCTL_DCBX_GET_DCBX_MODE */
4415 typedef struct _IOCTL_DCBX_GET_DCBX_MODE
4416 {
4417 	union
4418 	{
4419 		struct
4420 		{
4421 #ifdef EMLXS_BIG_ENDIAN
4422 			uint8_t		rsvd0[3];
4423 			uint8_t		port_num;
4424 #endif
4425 #ifdef EMLXS_LITTLE_ENDIAN
4426 			uint8_t		port_num;
4427 			uint8_t		rsvd0[3];
4428 #endif
4429 		} request;
4430 
4431 		struct
4432 		{
4433 #ifdef EMLXS_BIG_ENDIAN
4434 			uint8_t		rsvd1[3];
4435 			uint8_t		dcbx_mode;
4436 #endif
4437 #ifdef EMLXS_LITTLE_ENDIAN
4438 			uint8_t		dcbx_mode;
4439 			uint8_t		rsvd1[3];
4440 #endif
4441 		} response;
4442 
4443 	} params;
4444 
4445 } IOCTL_DCBX_GET_DCBX_MODE;
4446 
4447 
4448 /* IOCTL_DCBX_SET_DCBX_MODE */
4449 typedef struct _IOCTL_DCBX_SET_DCBX_MODE
4450 {
4451 	union
4452 	{
4453 		struct
4454 		{
4455 #ifdef EMLXS_BIG_ENDIAN
4456 			uint8_t		rsvd0[2];
4457 			uint8_t		dcbx_mode;
4458 			uint8_t		port_num;
4459 #endif
4460 #ifdef EMLXS_LITTLE_ENDIAN
4461 			uint8_t		port_num;
4462 			uint8_t		dcbx_mode;
4463 			uint8_t		rsvd0[2];
4464 #endif
4465 		} request;
4466 
4467 		struct
4468 		{
4469 			uint32_t	rsvd1;
4470 		} response;
4471 
4472 	} params;
4473 
4474 } IOCTL_DCBX_SET_DCBX_MODE;
4475 
4476 
4477 /* IOCTL_COMMON_GET_CNTL_ATTRIB */
4478 typedef	struct
4479 {
4480 	char		flashrom_version_string[32];
4481 	char		manufacturer_name[32];
4482 	char		rsvd0[28];
4483 	uint32_t	default_extended_timeout;
4484 	char		controller_model_number[32];
4485 	char		controller_description[64];
4486 	char		controller_serial_number[32];
4487 	char		ip_version_string[32];
4488 	char		firmware_version_string[32];
4489 	char		bios_version_string[32];
4490 	char		redboot_version_string[32];
4491 	char		driver_version_string[32];
4492 	char		fw_on_flash_version_string[32];
4493 	uint32_t	functionalities_supported;
4494 	uint16_t	max_cdblength;
4495 	uint8_t		asic_revision;
4496 	uint8_t		generational_guid[16];
4497 	uint8_t		hba_port_count;
4498 	uint16_t	default_link_down_timeout;
4499 	uint8_t		iscsi_ver_min_max;
4500 	uint8_t		multifunction_device;
4501 	uint8_t		cache_valid;
4502 	uint8_t		hba_status;
4503 	uint8_t		max_domains_supported;
4504 	uint8_t		phy_port;
4505 	uint32_t	firmware_post_status;
4506 	uint32_t	hba_mtu[2];
4507 
4508 } MGMT_HBA_ATTRIB;
4509 
4510 typedef	struct
4511 {
4512 	MGMT_HBA_ATTRIB		hba_attribs;
4513 	uint16_t		pci_vendor_id;
4514 	uint16_t		pci_device_id;
4515 	uint16_t		pci_sub_vendor_id;
4516 	uint16_t		pci_sub_system_id;
4517 	uint8_t			pci_bus_number;
4518 	uint8_t			pci_device_number;
4519 	uint8_t			pci_function_number;
4520 	uint8_t			interface_type;
4521 	uint64_t		unique_identifier;
4522 
4523 } MGMT_CONTROLLER_ATTRIB;
4524 
4525 typedef	struct
4526 {
4527 	union
4528 	{
4529 		struct
4530 		{
4531 			uint32_t rsvd0;
4532 		} request;
4533 
4534 		struct
4535 		{
4536 			MGMT_CONTROLLER_ATTRIB cntl_attributes_info;
4537 		} response;
4538 
4539 	} params;
4540 
4541 } IOCTL_COMMON_GET_CNTL_ATTRIB;
4542 
4543 
4544 typedef	union
4545 {
4546 	IOCTL_COMMON_NOP		NOPVar;
4547 	IOCTL_FCOE_WQ_CREATE		WQCreateVar;
4548 	IOCTL_FCOE_WQ_CREATE_V1		WQCreateVar1;
4549 	IOCTL_FCOE_RQ_CREATE		RQCreateVar;
4550 	IOCTL_FCOE_RQ_CREATE_V1		RQCreateVar1;
4551 	IOCTL_COMMON_EQ_CREATE		EQCreateVar;
4552 	IOCTL_COMMON_CQ_CREATE		CQCreateVar;
4553 	IOCTL_COMMON_CQ_CREATE_V2	CQCreateVar2;
4554 	IOCTL_COMMON_MQ_CREATE		MQCreateVar;
4555 	IOCTL_COMMON_MQ_CREATE_EXT	MQCreateExtVar;
4556 	IOCTL_COMMON_MQ_CREATE_EXT_V1	MQCreateExtVar1;
4557 	IOCTL_FCOE_CFG_POST_SGL_PAGES	PostSGLVar;
4558 	IOCTL_COMMON_GET_CNTL_ATTRIB	GetCntlAttributesVar;
4559 	IOCTL_FCOE_READ_FCF_TABLE	ReadFCFTableVar;
4560 	IOCTL_FCOE_ADD_FCF_TABLE	AddFCFTableVar;
4561 	IOCTL_FCOE_REDISCOVER_FCF_TABLE	RediscoverFCFTableVar;
4562 	IOCTL_COMMON_FLASHROM		FlashRomVar;
4563 	IOCTL_COMMON_MANAGE_FAT		FATVar;
4564 	IOCTL_DCBX_GET_DCBX_MODE	GetDCBX;
4565 	IOCTL_DCBX_SET_DCBX_MODE	SetDCBX;
4566 	IOCTL_COMMON_SLI4_PARAMS	Sli4ParamVar;
4567 	IOCTL_COMMON_EXTENTS		ExtentsVar;
4568 	IOCTL_COMMON_GET_PHY_DETAILS	PHYDetailsVar;
4569 	IOCTL_COMMON_GET_PORT_NAME	PortNameVar;
4570 	IOCTL_COMMON_GET_PORT_NAME_V1	PortNameVar1;
4571 	IOCTL_COMMON_WRITE_OBJECT	WriteObjVar;
4572 	IOCTL_COMMON_BOOT_CFG		BootCfgVar;
4573 
4574 } IOCTL_VARIANTS;
4575 
4576 /* Structure for MB Command SLI_CONFIG(0x9b) */
4577 /* Good for SLI4 only */
4578 
4579 typedef struct
4580 {
4581 	be_req_hdr_t	be;
4582 	BE_PHYS_ADDR	payload;
4583 } SLI_CONFIG_VAR;
4584 
4585 #define	IOCTL_HEADER_SZ	(4 * sizeof (uint32_t))
4586 
4587 
4588 typedef union
4589 {
4590 	uint32_t		varWords[63];
4591 	READ_NV_VAR		varRDnvp;	/* cmd = x02 (READ_NVPARMS) */
4592 	INIT_LINK_VAR		varInitLnk;	/* cmd = x05 (INIT_LINK) */
4593 	CONFIG_LINK		varCfgLnk;	/* cmd = x07 (CONFIG_LINK) */
4594 	READ_REV4_VAR		varRdRev4;	/* cmd = x11 (READ_REV) */
4595 	READ_LNK_VAR		varRdLnk;	/* cmd = x12 (READ_LNK_STAT) */
4596 	DUMP4_VAR		varDmp4;	/* cmd = x17 (DUMP) */
4597 	UPDATE_CFG_VAR		varUpdateCfg;	/* cmd = x1b (update Cfg) */
4598 	BIU_DIAG_VAR		varBIUdiag;	/* cmd = x84 (RUN_BIU_DIAG64) */
4599 	READ_SPARM_VAR		varRdSparm;	/* cmd = x8D (READ_SPARM64) */
4600 	REG_FCFI_VAR		varRegFCFI;	/* cmd = xA0 (REG_FCFI) */
4601 	UNREG_FCFI_VAR		varUnRegFCFI;	/* cmd = xA2 (UNREG_FCFI) */
4602 	READ_LA_VAR		varReadLA;	/* cmd = x95 (READ_LA64) */
4603 	READ_CONFIG4_VAR	varRdConfig4;	/* cmd = x0B (READ_CONFIG) */
4604 	RESUME_RPI_VAR		varResumeRPI;	/* cmd = x9E (RESUME_RPI) */
4605 	REG_LOGIN_VAR		varRegLogin;	/* cmd = x93 (REG_RPI) */
4606 	UNREG_LOGIN_VAR		varUnregLogin;	/* cmd = x14 (UNREG_RPI) */
4607 	REG_VPI_VAR		varRegVPI4;	/* cmd = x96 (REG_VPI) */
4608 	UNREG_VPI_VAR4		varUnRegVPI4;	/* cmd = x97 (UNREG_VPI) */
4609 	REG_VFI_VAR		varRegVFI4;	/* cmd = x9F (REG_VFI) */
4610 	UNREG_VFI_VAR		varUnRegVFI4;	/* cmd = xA1 (UNREG_VFI) */
4611 	REQUEST_FEATURES_VAR	varReqFeatures;	/* cmd = x9D (REQ_FEATURES) */
4612 	SLI_CONFIG_VAR		varSLIConfig;	/* cmd = x9B (SLI_CONFIG) */
4613 	INIT_VPI_VAR		varInitVPI4;	/* cmd = xA3 (INIT_VPI) */
4614 	INIT_VFI_VAR		varInitVFI4;	/* cmd = xA4 (INIT_VFI) */
4615 
4616 } MAILVARIANTS4;		/* Used for SLI-4 */
4617 
4618 #define	MAILBOX_CMD_SLI4_BSIZE	256
4619 #define	MAILBOX_CMD_SLI4_WSIZE	64
4620 
4621 #define	MAILBOX_CMD_MAX_BSIZE	256
4622 #define	MAILBOX_CMD_MAX_WSIZE	64
4623 
4624 
4625 typedef volatile struct
4626 {
4627 #ifdef EMLXS_BIG_ENDIAN
4628 	uint16_t	mbxStatus;
4629 	uint8_t		mbxCommand;
4630 	uint8_t		mbxReserved:6;
4631 	uint8_t		mbxHc:1;
4632 	uint8_t		mbxOwner:1;	/* Low order bit first word */
4633 #endif
4634 #ifdef EMLXS_LITTLE_ENDIAN
4635 	uint8_t		mbxOwner:1;	/* Low order bit first word */
4636 	uint8_t		mbxHc:1;
4637 	uint8_t		mbxReserved:6;
4638 	uint8_t		mbxCommand;
4639 	uint16_t	mbxStatus;
4640 #endif
4641 	MAILVARIANTS4	un;		/* 252 bytes */
4642 } MAILBOX4;				/* Used for SLI-4 */
4643 
4644 /*
4645  * End Structure Definitions for Mailbox Commands
4646  */
4647 
4648 
4649 typedef struct emlxs_mbq
4650 {
4651 	volatile uint32_t	mbox[MAILBOX_CMD_MAX_WSIZE];
4652 	struct emlxs_mbq	*next;
4653 
4654 	/* Defferred handling pointers */
4655 	void			*nonembed;	/* ptr to data buffer */
4656 						/* structure */
4657 	void			*bp;		/* ptr to data buffer */
4658 						/* structure */
4659 	void			*sbp;		/* ptr to emlxs_buf_t */
4660 						/* structure */
4661 	void			*ubp;		/* ptr to fc_unsol_buf_t */
4662 						/* structure */
4663 	void			*iocbq;		/* ptr to IOCBQ structure */
4664 	void			*context;	/* ptr to mbox context data */
4665 	void			*port;		/* Sending port */
4666 	uint32_t		flag;
4667 
4668 #define	MBQ_POOL_ALLOCATED	0x00000001
4669 #define	MBQ_PASSTHRU		0x00000002
4670 #define	MBQ_EMBEDDED		0x00000004
4671 #define	MBQ_BOOTSTRAP		0x00000008
4672 #define	MBQ_COMPLETED		0x00010000	/* Used for MBX_SLEEP */
4673 #define	MBQ_INIT_MASK		0x0000ffff
4674 
4675 #ifdef MBOX_EXT_SUPPORT
4676 	uint8_t			*extbuf;	/* ptr to mailbox ext buffer */
4677 	uint32_t		extsize;	/* size of mailbox ext buffer */
4678 #endif /* MBOX_EXT_SUPPORT */
4679 	uint32_t		(*mbox_cmpl)();
4680 } emlxs_mbq_t;
4681 typedef emlxs_mbq_t MAILBOXQ;
4682 
4683 
4684 /* We currently do not support IOCBs in SLI1 mode */
4685 typedef struct
4686 {
4687 	MAILBOX		mbx;
4688 #ifdef MBOX_EXT_SUPPORT
4689 	uint8_t		mbxExt[MBOX_EXTENSION_SIZE];
4690 #endif /* MBOX_EXT_SUPPORT */
4691 	uint8_t		pad[(SLI_SLIM1_SIZE -
4692 				(sizeof (MAILBOX) + MBOX_EXTENSION_SIZE))];
4693 } SLIM1;
4694 
4695 
4696 typedef struct
4697 {
4698 	MAILBOX		mbx;
4699 #ifdef MBOX_EXT_SUPPORT
4700 	uint8_t		mbxExt[MBOX_EXTENSION_SIZE];
4701 #endif /* MBOX_EXT_SUPPORT */
4702 	PCB		pcb;
4703 	uint8_t		IOCBs[SLI_IOCB_MAX_SIZE];
4704 } SLIM2;
4705 
4706 
4707 /* def for new 2MB Flash (Pegasus ...) */
4708 #define	MBX_LOAD_AREA		0x81
4709 #define	MBX_LOAD_EXP_ROM	0x9C
4710 
4711 #define	FILE_TYPE_AWC		0xE1A01001
4712 #define	FILE_TYPE_DWC		0xE1A02002
4713 #define	FILE_TYPE_BWC		0xE1A03003
4714 
4715 #define	AREA_ID_MASK		0xFFFFFF0F
4716 #define	AREA_ID_AWC		0x00000001
4717 #define	AREA_ID_DWC		0x00000002
4718 #define	AREA_ID_BWC		0x00000003
4719 
4720 #define	CMD_START_ERASE		1
4721 #define	CMD_CONTINUE_ERASE	2
4722 #define	CMD_DOWNLOAD		3
4723 #define	CMD_END_DOWNLOAD	4
4724 
4725 #define	RSP_ERASE_STARTED	1
4726 #define	RSP_ERASE_COMPLETE	2
4727 #define	RSP_DOWNLOAD_MORE	3
4728 #define	RSP_DOWNLOAD_DONE	4
4729 
4730 #define	EROM_CMD_FIND_IMAGE	8
4731 #define	EROM_CMD_CONTINUE_ERASE	9
4732 #define	EROM_CMD_COPY		10
4733 
4734 #define	EROM_RSP_ERASE_STARTED	8
4735 #define	EROM_RSP_ERASE_COMPLETE	9
4736 #define	EROM_RSP_COPY_MORE	10
4737 #define	EROM_RSP_COPY_DONE	11
4738 
4739 #define	ALLext			1
4740 #define	DWCext			2
4741 #define	BWCext			3
4742 
4743 #define	NO_ALL			0
4744 #define	ALL_WITHOUT_BWC		1
4745 #define	ALL_WITH_BWC		2
4746 
4747 #define	KERNEL_START_ADDRESS	0x000000
4748 #define	DOWNLOAD_START_ADDRESS	0x040000
4749 #define	EXP_ROM_START_ADDRESS	0x180000
4750 #define	SCRATCH_START_ADDRESS	0x1C0000
4751 #define	CONFIG_START_ADDRESS	0x1E0000
4752 
4753 
4754 typedef struct SliAifHdr
4755 {
4756 	uint32_t	CompressBr;
4757 	uint32_t	RelocBr;
4758 	uint32_t	ZinitBr;
4759 	uint32_t	EntryBr;
4760 	uint32_t	Area_ID;
4761 	uint32_t	RoSize;
4762 	uint32_t	RwSize;
4763 	uint32_t	DbgSize;
4764 	uint32_t	ZinitSize;
4765 	uint32_t	DbgType;
4766 	uint32_t	ImageBase;
4767 	uint32_t	Area_Size;
4768 	uint32_t	AddressMode;
4769 	uint32_t	DataBase;
4770 	uint32_t	AVersion;
4771 	uint32_t	Spare2;
4772 	uint32_t	DebugSwi;
4773 	uint32_t	ZinitCode[15];
4774 } AIF_HDR, *PAIF_HDR;
4775 
4776 typedef struct ImageHdr
4777 {
4778 	uint32_t	BlockSize;
4779 	PROG_ID		Id;
4780 	uint32_t	Flags;
4781 	uint32_t	EntryAdr;
4782 	uint32_t	InitAdr;
4783 	uint32_t	ExitAdr;
4784 	uint32_t	ImageBase;
4785 	uint32_t	ImageSize;
4786 	uint32_t	ZinitSize;
4787 	uint32_t	RelocSize;
4788 	uint32_t	HdrCks;
4789 } IMAGE_HDR, *PIMAGE_HDR;
4790 
4791 
4792 
4793 typedef struct
4794 {
4795 	PROG_ID		prog_id;
4796 #ifdef EMLXS_BIG_ENDIAN
4797 	uint32_t	pci_cfg_rsvd:27;
4798 	uint32_t	use_hdw_def:1;
4799 	uint32_t	pci_cfg_sel:3;
4800 	uint32_t	pci_cfg_lookup_sel:1;
4801 #endif
4802 #ifdef EMLXS_LITTLE_ENDIAN
4803 	uint32_t	pci_cfg_lookup_sel:1;
4804 	uint32_t	pci_cfg_sel:3;
4805 	uint32_t	use_hdw_def:1;
4806 	uint32_t	pci_cfg_rsvd:27;
4807 #endif
4808 	union
4809 	{
4810 		PROG_ID		boot_bios_id;
4811 		uint32_t	boot_bios_wd[2];
4812 	} u0;
4813 	PROG_ID		sli1_prog_id;
4814 	PROG_ID		sli2_prog_id;
4815 	PROG_ID		sli3_prog_id;
4816 	PROG_ID		sli4_prog_id;
4817 	union
4818 	{
4819 		PROG_ID		EROM_prog_id;
4820 		uint32_t	EROM_prog_wd[2];
4821 	} u1;
4822 } WAKE_UP_PARMS, *PWAKE_UP_PARMS;
4823 
4824 
4825 #define	PROG_DESCR_STR_LEN	24
4826 #define	MAX_LOAD_ENTRY		32
4827 
4828 typedef struct
4829 {
4830 	uint32_t	next;
4831 	uint32_t	prev;
4832 	uint32_t	start_adr;
4833 	uint32_t	len;
4834 	union
4835 	{
4836 		PROG_ID		id;
4837 		uint32_t	wd[2];
4838 	} un;
4839 	uint8_t		prog_descr[PROG_DESCR_STR_LEN];
4840 } LOAD_ENTRY;
4841 
4842 typedef struct
4843 {
4844 	uint32_t	head;
4845 	uint32_t	tail;
4846 	uint32_t	entry_cnt;
4847 	LOAD_ENTRY	load_entry[MAX_LOAD_ENTRY];
4848 } LOAD_LIST;
4849 
4850 #ifdef	__cplusplus
4851 }
4852 #endif
4853 
4854 #endif	/* _EMLXS_MBOX_H */
4855