xref: /freebsd/sys/dev/ocs_fc/sli4.h (revision 73577bf01de5c4677dc54d97f93310286c254780)
1 /*-
2  * Copyright (c) 2017 Broadcom. All rights reserved.
3  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions and the following disclaimer in the documentation
13  *    and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  * $FreeBSD$
32  */
33 
34 /**
35  * @file
36  * Define common SLI-4 structures and function prototypes.
37  */
38 
39 #ifndef _SLI4_H
40 #define _SLI4_H
41 
42 #include "ocs_os.h"
43 
44 #define SLI_PAGE_SIZE		(4096)
45 #define SLI_SUB_PAGE_MASK	(SLI_PAGE_SIZE - 1)
46 #define SLI_PAGE_SHIFT		12
47 #define SLI_ROUND_PAGE(b)	(((b) + SLI_SUB_PAGE_MASK) & ~SLI_SUB_PAGE_MASK)
48 
49 #define SLI4_BMBX_TIMEOUT_MSEC		30000
50 #define SLI4_FW_READY_TIMEOUT_MSEC	30000
51 
52 static inline uint32_t
53 sli_page_count(size_t bytes, uint32_t page_size)
54 {
55 	uint32_t	mask = page_size - 1;
56 	uint32_t	shift = 0;
57 
58 	switch (page_size) {
59 	case 4096:
60 		shift = 12;
61 		break;
62 	case 8192:
63 		shift = 13;
64 		break;
65 	case 16384:
66 		shift = 14;
67 		break;
68 	case 32768:
69 		shift = 15;
70 		break;
71 	case 65536:
72 		shift = 16;
73 		break;
74 	default:
75 		return 0;
76 	}
77 
78 	return (bytes + mask) >> shift;
79 }
80 
81 /*************************************************************************
82  * Common PCI configuration space register definitions
83  */
84 
85 #define SLI4_PCI_CLASS_REVISION		0x0008	/** register offset */
86 #define SLI4_PCI_REV_ID_SHIFT			0
87 #define SLI4_PCI_REV_ID_MASK			0xff
88 #define SLI4_PCI_CLASS_SHIFT			8
89 #define SLI4_PCI_CLASS_MASK			0xfff
90 
91 #define SLI4_PCI_SOFT_RESET_CSR		0x005c	/** register offset */
92 #define SLI4_PCI_SOFT_RESET_MASK		0x0080
93 
94 /*************************************************************************
95  * Common SLI-4 register offsets and field definitions
96  */
97 
98 /**
99  * @brief SLI_INTF - SLI Interface Definition Register
100  */
101 #define SLI4_INTF_REG			0x0058	/** register offset */
102 #define SLI4_INTF_VALID_SHIFT			29
103 #define SLI4_INTF_VALID_MASK			0x7
104 #define SLI4_INTF_VALID				0x6
105 #define SLI4_INTF_IF_TYPE_SHIFT			12
106 #define SLI4_INTF_IF_TYPE_MASK			0xf
107 #define SLI4_INTF_SLI_FAMILY_SHIFT		8
108 #define SLI4_INTF_SLI_FAMILY_MASK		0xf
109 #define SLI4_INTF_SLI_REVISION_SHIFT		4
110 #define SLI4_INTF_SLI_REVISION_MASK		0xf
111 #define SLI4_FAMILY_CHECK_ASIC_TYPE		0xf
112 
113 #define SLI4_IF_TYPE_BE3_SKH_PF		0
114 #define SLI4_IF_TYPE_BE3_SKH_VF		1
115 #define SLI4_IF_TYPE_LANCER_FC_ETH	2
116 #define SLI4_IF_TYPE_LANCER_RDMA	3
117 #define SLI4_MAX_IF_TYPES		4
118 
119 /**
120  * @brief ASIC_ID - SLI ASIC Type and Revision Register
121  */
122 #define SLI4_ASIC_ID_REG			0x009c /* register offset */
123 #define SLI4_ASIC_REV_SHIFT			0
124 #define SLI4_ASIC_REV_MASK			0xf
125 #define SLI4_ASIC_VER_SHIFT			4
126 #define SLI4_ASIC_VER_MASK			0xf
127 #define SLI4_ASIC_GEN_SHIFT			8
128 #define SLI4_ASIC_GEN_MASK			0xff
129 #define SLI4_ASIC_GEN_BE2			0x00
130 #define SLI4_ASIC_GEN_BE3			0x03
131 #define SLI4_ASIC_GEN_SKYHAWK			0x04
132 #define SLI4_ASIC_GEN_CORSAIR			0x05
133 #define SLI4_ASIC_GEN_LANCER			0x0b
134 
135 /**
136  * @brief BMBX - Bootstrap Mailbox Register
137  */
138 #define SLI4_BMBX_REG			0x0160	/* register offset */
139 #define SLI4_BMBX_MASK_HI			0x3
140 #define SLI4_BMBX_MASK_LO			0xf
141 #define SLI4_BMBX_RDY				BIT(0)
142 #define SLI4_BMBX_HI				BIT(1)
143 #define SLI4_BMBX_WRITE_HI(r)			((ocs_addr32_hi(r) & ~SLI4_BMBX_MASK_HI) | \
144 								SLI4_BMBX_HI)
145 #define SLI4_BMBX_WRITE_LO(r)			(((ocs_addr32_hi(r) & SLI4_BMBX_MASK_HI) << 30) | \
146 								(((r) & ~SLI4_BMBX_MASK_LO) >> 2))
147 
148 #define SLI4_BMBX_SIZE			256
149 
150 /**
151  * @brief EQCQ_DOORBELL - EQ and CQ Doorbell Register
152  */
153 #define SLI4_EQCQ_DOORBELL_REG		0x120
154 #define SLI4_EQCQ_DOORBELL_CI			BIT(9)
155 #define SLI4_EQCQ_DOORBELL_QT			BIT(10)
156 #define SLI4_EQCQ_DOORBELL_ARM			BIT(29)
157 #define SLI4_EQCQ_DOORBELL_SE			BIT(31)
158 #define SLI4_EQCQ_NUM_SHIFT			16
159 #define SLI4_EQCQ_NUM_MASK			0x01ff
160 #define SLI4_EQCQ_EQ_ID_MASK			0x3fff
161 #define SLI4_EQCQ_CQ_ID_MASK			0x7fff
162 #define SLI4_EQCQ_EQ_ID_MASK_LO			0x01ff
163 #define SLI4_EQCQ_CQ_ID_MASK_LO			0x03ff
164 #define SLI4_EQCQ_EQCQ_ID_MASK_HI		0xf800
165 
166 /**
167  * @brief SLIPORT_CONTROL - SLI Port Control Register
168  */
169 #define SLI4_SLIPORT_CONTROL_REG	0x0408
170 #define SLI4_SLIPORT_CONTROL_END		BIT(30)
171 #define SLI4_SLIPORT_CONTROL_LITTLE_ENDIAN	(0)
172 #define SLI4_SLIPORT_CONTROL_BIG_ENDIAN		BIT(30)
173 #define SLI4_SLIPORT_CONTROL_IP			BIT(27)
174 #define SLI4_SLIPORT_CONTROL_IDIS		BIT(22)
175 #define SLI4_SLIPORT_CONTROL_FDD		BIT(31)
176 
177 /**
178  * @brief SLI4_SLIPORT_ERROR1 - SLI Port Error Register
179  */
180 #define SLI4_SLIPORT_ERROR1		0x040c
181 
182 /**
183  * @brief SLI4_SLIPORT_ERROR2 - SLI Port Error Register
184  */
185 #define SLI4_SLIPORT_ERROR2		0x0410
186 
187 /**
188  * @brief User error registers
189  */
190 #define SLI4_UERR_STATUS_LOW_REG		0xA0
191 #define SLI4_UERR_STATUS_HIGH_REG		0xA4
192 #define SLI4_UERR_MASK_LOW_REG			0xA8
193 #define SLI4_UERR_MASK_HIGH_REG			0xAC
194 
195 /**
196  * @brief Registers for generating software UE (BE3)
197  */
198 #define SLI4_SW_UE_CSR1			0x138
199 #define SLI4_SW_UE_CSR2			0x1FFFC
200 
201 /**
202  * @brief Registers for generating software UE (Skyhawk)
203  */
204 #define SLI4_SW_UE_REG			0x5C 	/* register offset */
205 
206 static inline uint32_t sli_eq_doorbell(uint16_t n_popped, uint16_t id, uint8_t arm)
207 {
208 	uint32_t	reg = 0;
209 #if BYTE_ORDER == LITTLE_ENDIAN
210 	struct {
211 		uint32_t	eq_id_lo:9,
212 				ci:1,			/* clear interrupt */
213 				qt:1,			/* queue type */
214 				eq_id_hi:5,
215 				number_popped:13,
216 				arm:1,
217 				:1,
218 				se:1;
219 	} * eq_doorbell = (void *)&reg;
220 #else
221 #error big endian version not defined
222 #endif
223 
224 	eq_doorbell->eq_id_lo = id & SLI4_EQCQ_EQ_ID_MASK_LO;
225 	eq_doorbell->qt = 1;	/* EQ is type 1 (section 2.2.3.3 SLI Arch) */
226 	eq_doorbell->eq_id_hi = (id >> 9) & 0x1f;
227 	eq_doorbell->number_popped = n_popped;
228 	eq_doorbell->arm = arm;
229 	eq_doorbell->ci = TRUE;
230 
231 	return reg;
232 }
233 
234 static inline uint32_t sli_cq_doorbell(uint16_t n_popped, uint16_t id, uint8_t arm)
235 {
236 	uint32_t	reg = 0;
237 #if BYTE_ORDER == LITTLE_ENDIAN
238 	struct {
239 		uint32_t	cq_id_lo:10,
240 				qt:1,			/* queue type */
241 				cq_id_hi:5,
242 				number_popped:13,
243 				arm:1,
244 				:1,
245 				se:1;
246 	} * cq_doorbell = (void *)&reg;
247 #else
248 #error big endian version not defined
249 #endif
250 
251 	cq_doorbell->cq_id_lo = id & SLI4_EQCQ_CQ_ID_MASK_LO;
252 	cq_doorbell->qt = 0;	/* CQ is type 0 (section 2.2.3.3 SLI Arch) */
253 	cq_doorbell->cq_id_hi = (id >> 10) & 0x1f;
254 	cq_doorbell->number_popped = n_popped;
255 	cq_doorbell->arm = arm;
256 
257 	return reg;
258 }
259 
260 /**
261  * @brief MQ_DOORBELL - MQ Doorbell Register
262  */
263 #define SLI4_MQ_DOORBELL_REG		0x0140	/* register offset */
264 #define SLI4_MQ_DOORBELL_NUM_SHIFT		16
265 #define SLI4_MQ_DOORBELL_NUM_MASK		0x3fff
266 #define SLI4_MQ_DOORBELL_ID_MASK		0xffff
267 #define SLI4_MQ_DOORBELL(n, i)			((((n) & SLI4_MQ_DOORBELL_NUM_MASK) << SLI4_MQ_DOORBELL_NUM_SHIFT) | \
268 						  ((i) & SLI4_MQ_DOORBELL_ID_MASK))
269 
270 /**
271  * @brief RQ_DOORBELL - RQ Doorbell Register
272  */
273 #define SLI4_RQ_DOORBELL_REG		0x0a0	/* register offset */
274 #define SLI4_RQ_DOORBELL_NUM_SHIFT		16
275 #define SLI4_RQ_DOORBELL_NUM_MASK		0x3fff
276 #define SLI4_RQ_DOORBELL_ID_MASK		0xffff
277 #define SLI4_RQ_DOORBELL(n, i)			((((n) & SLI4_RQ_DOORBELL_NUM_MASK) << SLI4_RQ_DOORBELL_NUM_SHIFT) | \
278 						  ((i) & SLI4_RQ_DOORBELL_ID_MASK))
279 
280 /**
281  * @brief WQ_DOORBELL - WQ Doorbell Register
282  */
283 #define SLI4_IO_WQ_DOORBELL_REG		0x040	/* register offset */
284 #define SLI4_WQ_DOORBELL_IDX_SHIFT		16
285 #define SLI4_WQ_DOORBELL_IDX_MASK		0x00ff
286 #define SLI4_WQ_DOORBELL_NUM_SHIFT		24
287 #define SLI4_WQ_DOORBELL_NUM_MASK		0x00ff
288 #define SLI4_WQ_DOORBELL_ID_MASK		0xffff
289 #define SLI4_WQ_DOORBELL(n, x, i)		((((n) & SLI4_WQ_DOORBELL_NUM_MASK) << SLI4_WQ_DOORBELL_NUM_SHIFT) | \
290 						 (((x) & SLI4_WQ_DOORBELL_IDX_MASK) << SLI4_WQ_DOORBELL_IDX_SHIFT) | \
291 						  ((i) & SLI4_WQ_DOORBELL_ID_MASK))
292 
293 /**
294  * @brief SLIPORT_SEMAPHORE - SLI Port Host and Port Status Register
295  */
296 #define SLI4_PORT_SEMAPHORE_REG_0	0x00ac	/** register offset Interface Type 0 + 1 */
297 #define SLI4_PORT_SEMAPHORE_REG_1	0x0180	/** register offset Interface Type 0 + 1 */
298 #define SLI4_PORT_SEMAPHORE_REG_23	0x0400	/** register offset Interface Type 2 + 3 */
299 #define SLI4_PORT_SEMAPHORE_PORT_MASK		0x0000ffff
300 #define SLI4_PORT_SEMAPHORE_PORT(r)		((r) & SLI4_PORT_SEMAPHORE_PORT_MASK)
301 #define SLI4_PORT_SEMAPHORE_HOST_MASK		0x00ff0000
302 #define SLI4_PORT_SEMAPHORE_HOST_SHIFT		16
303 #define SLI4_PORT_SEMAPHORE_HOST(r)		(((r) & SLI4_PORT_SEMAPHORE_HOST_MASK) >> \
304 								SLI4_PORT_SEMAPHORE_HOST_SHIFT)
305 #define SLI4_PORT_SEMAPHORE_SCR2		BIT(26)	/** scratch area 2 */
306 #define SLI4_PORT_SEMAPHORE_SCR1		BIT(27)	/** scratch area 1 */
307 #define SLI4_PORT_SEMAPHORE_IPC			BIT(28)	/** IP conflict */
308 #define SLI4_PORT_SEMAPHORE_NIP			BIT(29)	/** no IP address */
309 #define SLI4_PORT_SEMAPHORE_SFI			BIT(30)	/** secondary firmware image used */
310 #define SLI4_PORT_SEMAPHORE_PERR		BIT(31)	/** POST fatal error */
311 
312 #define SLI4_PORT_SEMAPHORE_STATUS_POST_READY	0xc000
313 #define SLI4_PORT_SEMAPHORE_STATUS_UNRECOV_ERR	0xf000
314 #define SLI4_PORT_SEMAPHORE_STATUS_ERR_MASK	0xf000
315 #define SLI4_PORT_SEMAPHORE_IN_ERR(r)		(SLI4_PORT_SEMAPHORE_STATUS_UNRECOV_ERR == ((r) & \
316 								SLI4_PORT_SEMAPHORE_STATUS_ERR_MASK))
317 
318 /**
319  * @brief SLIPORT_STATUS - SLI Port Status Register
320  */
321 
322 #define SLI4_PORT_STATUS_REG_23		0x0404	/** register offset Interface Type 2 + 3 */
323 #define SLI4_PORT_STATUS_FDP			BIT(21)	/** function specific dump present */
324 #define SLI4_PORT_STATUS_RDY			BIT(23)	/** ready */
325 #define SLI4_PORT_STATUS_RN			BIT(24)	/** reset needed */
326 #define SLI4_PORT_STATUS_DIP			BIT(25)	/** dump present */
327 #define SLI4_PORT_STATUS_OTI			BIT(29) /** over temp indicator */
328 #define SLI4_PORT_STATUS_END			BIT(30)	/** endianness */
329 #define SLI4_PORT_STATUS_ERR			BIT(31)	/** SLI port error */
330 #define SLI4_PORT_STATUS_READY(r)		((r) & SLI4_PORT_STATUS_RDY)
331 #define SLI4_PORT_STATUS_ERROR(r)		((r) & SLI4_PORT_STATUS_ERR)
332 #define SLI4_PORT_STATUS_DUMP_PRESENT(r)	((r) & SLI4_PORT_STATUS_DIP)
333 #define SLI4_PORT_STATUS_FDP_PRESENT(r)		((r) & SLI4_PORT_STATUS_FDP)
334 
335 #define SLI4_PHSDEV_CONTROL_REG_23		0x0414	/** register offset Interface Type 2 + 3 */
336 #define SLI4_PHYDEV_CONTROL_DRST		BIT(0)	/** physical device reset */
337 #define SLI4_PHYDEV_CONTROL_FRST		BIT(1)	/** firmware reset */
338 #define SLI4_PHYDEV_CONTROL_DD			BIT(2)	/** diagnostic dump */
339 #define SLI4_PHYDEV_CONTROL_FRL_MASK		0x000000f0
340 #define SLI4_PHYDEV_CONTROL_FRL_SHIFT		4
341 #define SLI4_PHYDEV_CONTROL_FRL(r)		(((r) & SLI4_PHYDEV_CONTROL_FRL_MASK) >> \
342 								SLI4_PHYDEV_CONTROL_FRL_SHIFT_SHIFT)
343 
344 /*************************************************************************
345  * SLI-4 mailbox command formats and definitions
346  */
347 
348 typedef struct sli4_mbox_command_header_s {
349 #if BYTE_ORDER == LITTLE_ENDIAN
350 	uint32_t	:8,
351 			command:8,
352 			status:16;	/** Port writes to indicate success / fail */
353 #else
354 #error big endian version not defined
355 #endif
356 } sli4_mbox_command_header_t;
357 
358 #define SLI4_MBOX_COMMAND_CONFIG_LINK	0x07
359 #define SLI4_MBOX_COMMAND_DUMP		0x17
360 #define SLI4_MBOX_COMMAND_DOWN_LINK	0x06
361 #define SLI4_MBOX_COMMAND_INIT_LINK	0x05
362 #define SLI4_MBOX_COMMAND_INIT_VFI	0xa3
363 #define SLI4_MBOX_COMMAND_INIT_VPI	0xa4
364 #define SLI4_MBOX_COMMAND_POST_XRI	0xa7
365 #define SLI4_MBOX_COMMAND_RELEASE_XRI	0xac
366 #define SLI4_MBOX_COMMAND_READ_CONFIG	0x0b
367 #define SLI4_MBOX_COMMAND_READ_STATUS	0x0e
368 #define SLI4_MBOX_COMMAND_READ_NVPARMS	0x02
369 #define SLI4_MBOX_COMMAND_READ_REV	0x11
370 #define SLI4_MBOX_COMMAND_READ_LNK_STAT	0x12
371 #define SLI4_MBOX_COMMAND_READ_SPARM64	0x8d
372 #define SLI4_MBOX_COMMAND_READ_TOPOLOGY	0x95
373 #define SLI4_MBOX_COMMAND_REG_FCFI	0xa0
374 #define SLI4_MBOX_COMMAND_REG_FCFI_MRQ	0xaf
375 #define SLI4_MBOX_COMMAND_REG_RPI	0x93
376 #define SLI4_MBOX_COMMAND_REG_RX_RQ	0xa6
377 #define SLI4_MBOX_COMMAND_REG_VFI	0x9f
378 #define SLI4_MBOX_COMMAND_REG_VPI	0x96
379 #define SLI4_MBOX_COMMAND_REQUEST_FEATURES 0x9d
380 #define SLI4_MBOX_COMMAND_SLI_CONFIG	0x9b
381 #define SLI4_MBOX_COMMAND_UNREG_FCFI	0xa2
382 #define SLI4_MBOX_COMMAND_UNREG_RPI	0x14
383 #define SLI4_MBOX_COMMAND_UNREG_VFI	0xa1
384 #define SLI4_MBOX_COMMAND_UNREG_VPI	0x97
385 #define SLI4_MBOX_COMMAND_WRITE_NVPARMS	0x03
386 #define SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY	0xAD
387 #define SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY_HP       0xAE
388 
389 #define SLI4_MBOX_STATUS_SUCCESS	0x0000
390 #define SLI4_MBOX_STATUS_FAILURE	0x0001
391 #define SLI4_MBOX_STATUS_RPI_NOT_REG	0x1400
392 
393 /**
394  * @brief Buffer Descriptor Entry (BDE)
395  */
396 typedef struct sli4_bde_s {
397 #if BYTE_ORDER == LITTLE_ENDIAN
398 	uint32_t	buffer_length:24,
399 			bde_type:8;
400 	union {
401 		struct {
402 			uint32_t	buffer_address_low;
403 			uint32_t	buffer_address_high;
404 		} data;
405 		struct {
406 			uint32_t	offset;
407 			uint32_t	rsvd2;
408 		} imm;
409 		struct {
410 			uint32_t	sgl_segment_address_low;
411 			uint32_t	sgl_segment_address_high;
412 		} blp;
413 	} u;
414 #else
415 #error big endian version not defined
416 #endif
417 } sli4_bde_t;
418 
419 #define SLI4_BDE_TYPE_BDE_64		0x00	/** Generic 64-bit data */
420 #define SLI4_BDE_TYPE_BDE_IMM		0x01	/** Immediate data */
421 #define SLI4_BDE_TYPE_BLP		0x40	/** Buffer List Pointer */
422 
423 /**
424  * @brief Scatter-Gather Entry (SGE)
425  */
426 typedef struct sli4_sge_s {
427 #if BYTE_ORDER == LITTLE_ENDIAN
428 	uint32_t	buffer_address_high;
429 	uint32_t	buffer_address_low;
430 	uint32_t	data_offset:27,
431 			sge_type:4,
432 			last:1;
433 	uint32_t	buffer_length;
434 #else
435 #error big endian version not defined
436 #endif
437 } sli4_sge_t;
438 
439 /**
440  * @brief T10 DIF Scatter-Gather Entry (SGE)
441  */
442 typedef struct sli4_dif_sge_s {
443 #if BYTE_ORDER == LITTLE_ENDIAN
444 	uint32_t	buffer_address_high;
445 	uint32_t	buffer_address_low;
446 	uint32_t	:27,
447 			sge_type:4,
448 			last:1;
449 	uint32_t	:32;
450 #else
451 #error big endian version not defined
452 #endif
453 } sli4_dif_sge_t;
454 
455 /**
456  * @brief T10 DIF Seed Scatter-Gather Entry (SGE)
457  */
458 typedef struct sli4_diseed_sge_s {
459 #if BYTE_ORDER == LITTLE_ENDIAN
460 	uint32_t	ref_tag_cmp;
461 	uint32_t	ref_tag_repl;
462 	uint32_t	app_tag_repl:16,
463 			:2,
464 			hs:1,
465 			ws:1,
466 			ic:1,
467 			ics:1,
468 			atrt:1,
469 			at:1,
470 			fwd_app_tag:1,
471 			repl_app_tag:1,
472 			head_insert:1,
473 			sge_type:4,
474 			last:1;
475 	uint32_t	app_tag_cmp:16,
476 			dif_blk_size:3,
477 			auto_incr_ref_tag:1,
478 			check_app_tag:1,
479 			check_ref_tag:1,
480 			check_crc:1,
481 			new_ref_tag:1,
482 			dif_op_rx:4,
483 			dif_op_tx:4;
484 #else
485 #error big endian version not defined
486 #endif
487 } sli4_diseed_sge_t;
488 
489 /**
490  * @brief List Segment Pointer Scatter-Gather Entry (SGE)
491  */
492 typedef struct sli4_lsp_sge_s {
493 #if BYTE_ORDER == LITTLE_ENDIAN
494 	uint32_t	buffer_address_high;
495 	uint32_t	buffer_address_low;
496 	uint32_t	:27,
497 			sge_type:4,
498 			last:1;
499 	uint32_t	segment_length:24,
500 			:8;
501 #else
502 #error big endian version not defined
503 #endif
504 } sli4_lsp_sge_t;
505 
506 #define SLI4_SGE_MAX_RESERVED			3
507 
508 #define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CRC     0x00
509 #define SLI4_SGE_DIF_OP_IN_CRC_OUT_NODIF     0x01
510 #define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CHKSUM  0x02
511 #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_NODIF  0x03
512 #define SLI4_SGE_DIF_OP_IN_CRC_OUT_CRC       0x04
513 #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_CHKSUM 0x05
514 #define SLI4_SGE_DIF_OP_IN_CRC_OUT_CHKSUM    0x06
515 #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_CRC    0x07
516 #define SLI4_SGE_DIF_OP_IN_RAW_OUT_RAW       0x08
517 
518 #define SLI4_SGE_TYPE_DATA		0x00
519 #define SLI4_SGE_TYPE_CHAIN		0x03	/** Skyhawk only */
520 #define SLI4_SGE_TYPE_DIF		0x04	/** Data Integrity Field */
521 #define SLI4_SGE_TYPE_LSP		0x05	/** List Segment Pointer */
522 #define SLI4_SGE_TYPE_PEDIF		0x06	/** Post Encryption Engine DIF */
523 #define SLI4_SGE_TYPE_PESEED		0x07	/** Post Encryption Engine DIF Seed */
524 #define SLI4_SGE_TYPE_DISEED		0x08	/** DIF Seed */
525 #define SLI4_SGE_TYPE_ENC		0x09	/** Encryption */
526 #define SLI4_SGE_TYPE_ATM		0x0a	/** DIF Application Tag Mask */
527 #define SLI4_SGE_TYPE_SKIP		0x0c	/** SKIP */
528 
529 #define OCS_MAX_SGE_SIZE		0x80000000 /* Maximum data allowed in a SGE */
530 
531 /**
532  * @brief CONFIG_LINK
533  */
534 typedef struct sli4_cmd_config_link_s {
535 	sli4_mbox_command_header_t	hdr;
536 #if BYTE_ORDER == LITTLE_ENDIAN
537 	uint32_t	maxbbc:8,	/** Max buffer-to-buffer credit */
538 			:24;
539 	uint32_t	alpa:8,
540 			n_port_id:16,
541 			:8;
542 	uint32_t	rsvd3;
543 	uint32_t	e_d_tov;
544 	uint32_t	lp_tov;
545 	uint32_t	r_a_tov;
546 	uint32_t	r_t_tov;
547 	uint32_t	al_tov;
548 	uint32_t	rsvd9;
549 	uint32_t	:8,
550 			bbscn:4,	/** buffer-to-buffer state change number */
551 			cscn:1,		/** configure BBSCN */
552 			:19;
553 #else
554 #error big endian version not defined
555 #endif
556 } sli4_cmd_config_link_t;
557 
558 /**
559  * @brief DUMP Type 4
560  */
561 #define SLI4_WKI_TAG_SAT_TEM 0x1040
562 typedef struct sli4_cmd_dump4_s {
563 	sli4_mbox_command_header_t	hdr;
564 #if BYTE_ORDER == LITTLE_ENDIAN
565 	uint32_t	type:4,
566 			:28;
567 	uint32_t	wki_selection:16,
568 			:16;
569 	uint32_t	resv;
570 	uint32_t	returned_byte_cnt;
571 	uint32_t	resp_data[59];
572 #else
573 #error big endian version not defined
574 #endif
575 } sli4_cmd_dump4_t;
576 
577 /**
578  * @brief FW_INITIALIZE - initialize a SLI port
579  *
580  * @note This command uses a different format than all others.
581  */
582 
583 extern const uint8_t sli4_fw_initialize[8];
584 
585 /**
586  * @brief FW_DEINITIALIZE - deinitialize a SLI port
587  *
588  * @note This command uses a different format than all others.
589  */
590 
591 extern const uint8_t sli4_fw_deinitialize[8];
592 
593 /**
594  * @brief INIT_LINK - initialize the link for a FC/FCoE port
595  */
596 typedef struct sli4_cmd_init_link_flags_s {
597 	uint32_t	loopback:1,
598 			topology:2,
599 			#define FC_TOPOLOGY_FCAL	0
600 			#define FC_TOPOLOGY_P2P		1
601 			:3,
602 			unfair:1,
603 			skip_lirp_lilp:1,
604 			gen_loop_validity_check:1,
605 			skip_lisa:1,
606 			enable_topology_failover:1,
607 			fixed_speed:1,
608 			:3,
609 			select_hightest_al_pa:1,
610 			:16; 	/* pad to 32 bits */
611 } sli4_cmd_init_link_flags_t;
612 
613 #define SLI4_INIT_LINK_F_LOOP_BACK	BIT(0)
614 #define SLI4_INIT_LINK_F_UNFAIR		BIT(6)
615 #define SLI4_INIT_LINK_F_NO_LIRP	BIT(7)
616 #define SLI4_INIT_LINK_F_LOOP_VALID_CHK	BIT(8)
617 #define SLI4_INIT_LINK_F_NO_LISA	BIT(9)
618 #define SLI4_INIT_LINK_F_FAIL_OVER	BIT(10)
619 #define SLI4_INIT_LINK_F_NO_AUTOSPEED	BIT(11)
620 #define SLI4_INIT_LINK_F_PICK_HI_ALPA	BIT(15)
621 
622 #define SLI4_INIT_LINK_F_P2P_ONLY	1
623 #define SLI4_INIT_LINK_F_FCAL_ONLY	2
624 
625 #define SLI4_INIT_LINK_F_FCAL_FAIL_OVER	0
626 #define SLI4_INIT_LINK_F_P2P_FAIL_OVER	1
627 
628 typedef struct sli4_cmd_init_link_s {
629 	sli4_mbox_command_header_t	hdr;
630 #if BYTE_ORDER == LITTLE_ENDIAN
631 	uint32_t	selective_reset_al_pa:8,
632 			:24;
633 	sli4_cmd_init_link_flags_t link_flags;
634 	uint32_t	link_speed_selection_code;
635 			#define FC_LINK_SPEED_1G		1
636 			#define FC_LINK_SPEED_2G		2
637 			#define FC_LINK_SPEED_AUTO_1_2		3
638 			#define FC_LINK_SPEED_4G		4
639 			#define FC_LINK_SPEED_AUTO_4_1		5
640 			#define FC_LINK_SPEED_AUTO_4_2		6
641 			#define FC_LINK_SPEED_AUTO_4_2_1	7
642 			#define FC_LINK_SPEED_8G		8
643 			#define FC_LINK_SPEED_AUTO_8_1		9
644 			#define FC_LINK_SPEED_AUTO_8_2		10
645 			#define FC_LINK_SPEED_AUTO_8_2_1	11
646 			#define FC_LINK_SPEED_AUTO_8_4		12
647 			#define FC_LINK_SPEED_AUTO_8_4_1	13
648 			#define FC_LINK_SPEED_AUTO_8_4_2	14
649 			#define FC_LINK_SPEED_10G		16
650 			#define FC_LINK_SPEED_16G		17
651 			#define FC_LINK_SPEED_AUTO_16_8_4	18
652 			#define FC_LINK_SPEED_AUTO_16_8		19
653 			#define FC_LINK_SPEED_32G		20
654 			#define FC_LINK_SPEED_AUTO_32_16_8	21
655 			#define FC_LINK_SPEED_AUTO_32_16	22
656 #else
657 #error big endian version not defined
658 #endif
659 } sli4_cmd_init_link_t;
660 
661 /**
662  * @brief INIT_VFI - initialize the VFI resource
663  */
664 typedef struct sli4_cmd_init_vfi_s {
665 	sli4_mbox_command_header_t	hdr;
666 #if BYTE_ORDER == LITTLE_ENDIAN
667 	uint32_t	vfi:16,
668 			:12,
669 			vp:1,
670 			vf:1,
671 			vt:1,
672 			vr:1;
673 	uint32_t	fcfi:16,
674 			vpi:16;
675 	uint32_t	vf_id:13,
676 			pri:3,
677 			:16;
678 	uint32_t	:24,
679 			hop_count:8;
680 #else
681 #error big endian version not defined
682 #endif
683 } sli4_cmd_init_vfi_t;
684 
685 /**
686  * @brief INIT_VPI - initialize the VPI resource
687  */
688 typedef struct sli4_cmd_init_vpi_s {
689 	sli4_mbox_command_header_t	hdr;
690 #if BYTE_ORDER == LITTLE_ENDIAN
691 	uint32_t	vpi:16,
692 			vfi:16;
693 #else
694 #error big endian version not defined
695 #endif
696 } sli4_cmd_init_vpi_t;
697 
698 /**
699  * @brief POST_XRI - post XRI resources to the SLI Port
700  */
701 typedef struct sli4_cmd_post_xri_s {
702 	sli4_mbox_command_header_t	hdr;
703 #if BYTE_ORDER == LITTLE_ENDIAN
704 	uint32_t	xri_base:16,
705 			xri_count:12,
706 			enx:1,
707 			dl:1,
708 			di:1,
709 			val:1;
710 #else
711 #error big endian version not defined
712 #endif
713 } sli4_cmd_post_xri_t;
714 
715 /**
716  * @brief RELEASE_XRI - Release XRI resources from the SLI Port
717  */
718 typedef struct sli4_cmd_release_xri_s {
719 	sli4_mbox_command_header_t	hdr;
720 #if BYTE_ORDER == LITTLE_ENDIAN
721 	uint32_t	released_xri_count:5,
722 			:11,
723 			xri_count:5,
724 			:11;
725 	struct {
726 		uint32_t	xri_tag0:16,
727 				xri_tag1:16;
728 	} xri_tbl[62];
729 #else
730 #error big endian version not defined
731 #endif
732 } sli4_cmd_release_xri_t;
733 
734 /**
735  * @brief READ_CONFIG - read SLI port configuration parameters
736  */
737 typedef struct sli4_cmd_read_config_s {
738 	sli4_mbox_command_header_t	hdr;
739 } sli4_cmd_read_config_t;
740 
741 typedef struct sli4_res_read_config_s {
742 	sli4_mbox_command_header_t	hdr;
743 #if BYTE_ORDER == LITTLE_ENDIAN
744 	uint32_t	:31,
745 			ext:1;		/** Resource Extents */
746 	uint32_t	:24,
747 			topology:8;
748 	uint32_t	rsvd3;
749 	uint32_t	e_d_tov:16,
750 			:16;
751 	uint32_t	rsvd5;
752 	uint32_t	r_a_tov:16,
753 			:16;
754 	uint32_t	rsvd7;
755 	uint32_t	rsvd8;
756 	uint32_t	lmt:16,		/** Link Module Type */
757 			:16;
758 	uint32_t	rsvd10;
759 	uint32_t	rsvd11;
760 	uint32_t	xri_base:16,
761 			xri_count:16;
762 	uint32_t	rpi_base:16,
763 			rpi_count:16;
764 	uint32_t	vpi_base:16,
765 			vpi_count:16;
766 	uint32_t	vfi_base:16,
767 			vfi_count:16;
768 	uint32_t	:16,
769 			fcfi_count:16;
770 	uint32_t	rq_count:16,
771 			eq_count:16;
772 	uint32_t	wq_count:16,
773 			cq_count:16;
774 	uint32_t	pad[45];
775 #else
776 #error big endian version not defined
777 #endif
778 } sli4_res_read_config_t;
779 
780 #define SLI4_READ_CFG_TOPO_FCOE			0x0	/** FCoE topology */
781 #define SLI4_READ_CFG_TOPO_FC			0x1	/** FC topology unknown */
782 #define SLI4_READ_CFG_TOPO_FC_DA		0x2	/** FC Direct Attach (non FC-AL) topology */
783 #define SLI4_READ_CFG_TOPO_FC_AL		0x3	/** FC-AL topology */
784 
785 /**
786  * @brief READ_NVPARMS - read SLI port configuration parameters
787  */
788 typedef struct sli4_cmd_read_nvparms_s {
789 	sli4_mbox_command_header_t	hdr;
790 #if BYTE_ORDER == LITTLE_ENDIAN
791 	uint32_t	rsvd1;
792 	uint32_t	rsvd2;
793 	uint32_t	rsvd3;
794 	uint32_t	rsvd4;
795 	uint8_t		wwpn[8];
796 	uint8_t		wwnn[8];
797 	uint32_t	hard_alpa:8,
798 			preferred_d_id:24;
799 #else
800 #error big endian version not defined
801 #endif
802 } sli4_cmd_read_nvparms_t;
803 
804 /**
805  * @brief WRITE_NVPARMS - write SLI port configuration parameters
806  */
807 typedef struct sli4_cmd_write_nvparms_s {
808 	sli4_mbox_command_header_t	hdr;
809 #if BYTE_ORDER == LITTLE_ENDIAN
810 	uint32_t	rsvd1;
811 	uint32_t	rsvd2;
812 	uint32_t	rsvd3;
813 	uint32_t	rsvd4;
814 	uint8_t		wwpn[8];
815 	uint8_t		wwnn[8];
816 	uint32_t	hard_alpa:8,
817 			preferred_d_id:24;
818 #else
819 #error big endian version not defined
820 #endif
821 } sli4_cmd_write_nvparms_t;
822 
823 /**
824  * @brief READ_REV - read the Port revision levels
825  */
826 typedef struct sli4_cmd_read_rev_s {
827 	sli4_mbox_command_header_t	hdr;
828 #if BYTE_ORDER == LITTLE_ENDIAN
829 	uint32_t	:16,
830 			sli_level:4,
831 			fcoem:1,
832 			ceev:2,
833 			:6,
834 			vpd:1,
835 			:2;
836 	uint32_t	first_hw_revision;
837 	uint32_t	second_hw_revision;
838 	uint32_t	rsvd4;
839 	uint32_t	third_hw_revision;
840 	uint32_t	fc_ph_low:8,
841 			fc_ph_high:8,
842 			feature_level_low:8,
843 			feature_level_high:8;
844 	uint32_t	rsvd7;
845 	uint32_t	first_fw_id;
846 	char		first_fw_name[16];
847 	uint32_t	second_fw_id;
848 	char		second_fw_name[16];
849 	uint32_t	rsvd18[30];
850 	uint32_t	available_length:24,
851 			:8;
852 	uint32_t	physical_address_low;
853 	uint32_t	physical_address_high;
854 	uint32_t	returned_vpd_length;
855 	uint32_t	actual_vpd_length;
856 #else
857 #error big endian version not defined
858 #endif
859 } sli4_cmd_read_rev_t;
860 
861 /**
862  * @brief READ_SPARM64 - read the Port service parameters
863  */
864 typedef struct sli4_cmd_read_sparm64_s {
865 	sli4_mbox_command_header_t	hdr;
866 #if BYTE_ORDER == LITTLE_ENDIAN
867 	uint32_t	rsvd1;
868 	uint32_t	rsvd2;
869 	sli4_bde_t	bde_64;
870 	uint32_t	vpi:16,
871 			:16;
872 	uint32_t	port_name_start:16,
873 			port_name_length:16;
874 	uint32_t	node_name_start:16,
875 			node_name_length:16;
876 #else
877 #error big endian version not defined
878 #endif
879 } sli4_cmd_read_sparm64_t;
880 
881 #define SLI4_READ_SPARM64_VPI_DEFAULT	0
882 #define SLI4_READ_SPARM64_VPI_SPECIAL	UINT16_MAX
883 
884 #define SLI4_READ_SPARM64_WWPN_OFFSET	(4 * sizeof(uint32_t))
885 #define SLI4_READ_SPARM64_WWNN_OFFSET	(SLI4_READ_SPARM64_WWPN_OFFSET + sizeof(uint64_t))
886 
887 typedef struct sli4_port_state_s {
888 #if BYTE_ORDER == LITTLE_ENDIAN
889 	uint32_t	nx_port_recv_state:2,
890 			nx_port_trans_state:2,
891 			nx_port_state_machine:4,
892 			link_speed:8,
893 			:14,
894 			tf:1,
895 			lu:1;
896 #else
897 #error big endian version not defined
898 #endif
899 } sli4_port_state_t;
900 
901 /**
902  * @brief READ_TOPOLOGY - read the link event information
903  */
904 typedef struct sli4_cmd_read_topology_s {
905 	sli4_mbox_command_header_t	hdr;
906 #if BYTE_ORDER == LITTLE_ENDIAN
907 	uint32_t	event_tag;
908 	uint32_t	attention_type:8,
909 			il:1,
910 			pb_recvd:1,
911 			:22;
912 	uint32_t	topology:8,
913 			lip_type:8,
914 			lip_al_ps:8,
915 			al_pa_granted:8;
916 	sli4_bde_t	bde_loop_map;
917 	sli4_port_state_t link_down;
918 	sli4_port_state_t link_current;
919 	uint32_t	max_bbc:8,
920 			init_bbc:8,
921 			bbscn:4,
922 			cbbscn:4,
923 			:8;
924 	uint32_t	r_t_tov:9,
925 			:3,
926 			al_tov:4,
927 			lp_tov:16;
928 	uint32_t	acquired_al_pa:8,
929 			:7,
930 			pb:1,
931 			specified_al_pa:16;
932 	uint32_t	initial_n_port_id:24,
933 			:8;
934 #else
935 #error big endian version not defined
936 #endif
937 } sli4_cmd_read_topology_t;
938 
939 #define SLI4_MIN_LOOP_MAP_BYTES	128
940 
941 #define SLI4_READ_TOPOLOGY_LINK_UP	0x1
942 #define SLI4_READ_TOPOLOGY_LINK_DOWN	0x2
943 #define SLI4_READ_TOPOLOGY_LINK_NO_ALPA	0x3
944 
945 #define SLI4_READ_TOPOLOGY_UNKNOWN	0x0
946 #define SLI4_READ_TOPOLOGY_NPORT	0x1
947 #define SLI4_READ_TOPOLOGY_FC_AL	0x2
948 
949 #define SLI4_READ_TOPOLOGY_SPEED_NONE	0x00
950 #define SLI4_READ_TOPOLOGY_SPEED_1G	0x04
951 #define SLI4_READ_TOPOLOGY_SPEED_2G	0x08
952 #define SLI4_READ_TOPOLOGY_SPEED_4G	0x10
953 #define SLI4_READ_TOPOLOGY_SPEED_8G	0x20
954 #define SLI4_READ_TOPOLOGY_SPEED_10G	0x40
955 #define SLI4_READ_TOPOLOGY_SPEED_16G	0x80
956 #define SLI4_READ_TOPOLOGY_SPEED_32G	0x90
957 
958 /**
959  * @brief REG_FCFI - activate a FC Forwarder
960  */
961 #define SLI4_CMD_REG_FCFI_NUM_RQ_CFG	4
962 typedef struct sli4_cmd_reg_fcfi_s {
963 	sli4_mbox_command_header_t	hdr;
964 #if BYTE_ORDER == LITTLE_ENDIAN
965 	uint32_t	fcf_index:16,
966 			fcfi:16;
967 	uint32_t	rq_id_1:16,
968 			rq_id_0:16;
969 	uint32_t	rq_id_3:16,
970 			rq_id_2:16;
971 	struct {
972 		uint32_t	r_ctl_mask:8,
973 				r_ctl_match:8,
974 				type_mask:8,
975 				type_match:8;
976 	} rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
977 	uint32_t	vlan_tag:12,
978 			vv:1,
979 			:19;
980 #else
981 #error big endian version not defined
982 #endif
983 } sli4_cmd_reg_fcfi_t;
984 
985 #define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG	4
986 #define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ	32
987 #define SLI4_CMD_REG_FCFI_SET_FCFI_MODE		0
988 #define SLI4_CMD_REG_FCFI_SET_MRQ_MODE		1
989 
990 typedef struct sli4_cmd_reg_fcfi_mrq_s {
991 	sli4_mbox_command_header_t	hdr;
992 #if BYTE_ORDER == LITTLE_ENDIAN
993 	uint32_t	fcf_index:16,
994 			fcfi:16;
995 
996 	uint32_t	rq_id_1:16,
997 			rq_id_0:16;
998 
999 	uint32_t	rq_id_3:16,
1000 			rq_id_2:16;
1001 
1002 	struct {
1003 		uint32_t	r_ctl_mask:8,
1004 				r_ctl_match:8,
1005 				type_mask:8,
1006 				type_match:8;
1007 	} rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
1008 
1009 	uint32_t	vlan_tag:12,
1010 			vv:1,
1011 			mode:1,
1012 			:18;
1013 
1014 	uint32_t	num_mrq_pairs:8,
1015 			mrq_filter_bitmask:4,
1016 			rq_selection_policy:4,
1017 			:16;
1018 #endif
1019 } sli4_cmd_reg_fcfi_mrq_t;
1020 
1021 /**
1022  * @brief REG_RPI - register a Remote Port Indicator
1023  */
1024 typedef struct sli4_cmd_reg_rpi_s {
1025 	sli4_mbox_command_header_t	hdr;
1026 #if BYTE_ORDER == LITTLE_ENDIAN
1027 	uint32_t	rpi:16,
1028 			:16;
1029 	uint32_t	remote_n_port_id:24,
1030 			upd:1,
1031 			:2,
1032 			etow:1,
1033 			:1,
1034 			terp:1,
1035 			:1,
1036 			ci:1;
1037 	sli4_bde_t	bde_64;
1038 	uint32_t	vpi:16,
1039 			:16;
1040 #else
1041 #error big endian version not defined
1042 #endif
1043 } sli4_cmd_reg_rpi_t;
1044 #define SLI4_REG_RPI_BUF_LEN			0x70
1045 
1046 /**
1047  * @brief REG_VFI - register a Virtual Fabric Indicator
1048  */
1049 typedef struct sli4_cmd_reg_vfi_s {
1050 	sli4_mbox_command_header_t	hdr;
1051 #if BYTE_ORDER == LITTLE_ENDIAN
1052 	uint32_t	vfi:16,
1053 			:12,
1054 			vp:1,
1055 			upd:1,
1056 			:2;
1057 	uint32_t	fcfi:16,
1058 			vpi:16;			/* vp=TRUE */
1059 	uint8_t		wwpn[8];		/* vp=TRUE */
1060 	sli4_bde_t	sparm;			/* either FLOGI or PLOGI */
1061 	uint32_t	e_d_tov;
1062 	uint32_t	r_a_tov;
1063 	uint32_t	local_n_port_id:24,	/* vp=TRUE */
1064 			:8;
1065 #else
1066 #error big endian version not defined
1067 #endif
1068 } sli4_cmd_reg_vfi_t;
1069 
1070 /**
1071  * @brief REG_VPI - register a Virtual Port Indicator
1072  */
1073 typedef struct sli4_cmd_reg_vpi_s {
1074 	sli4_mbox_command_header_t	hdr;
1075 #if BYTE_ORDER == LITTLE_ENDIAN
1076 	uint32_t	rsvd1;
1077 	uint32_t	local_n_port_id:24,
1078 			upd:1,
1079 			:7;
1080 	uint8_t		wwpn[8];
1081 	uint32_t	rsvd5;
1082 	uint32_t	vpi:16,
1083 			vfi:16;
1084 #else
1085 #error big endian version not defined
1086 #endif
1087 } sli4_cmd_reg_vpi_t;
1088 
1089 /**
1090  * @brief REQUEST_FEATURES - request / query SLI features
1091  */
1092 typedef union {
1093 #if BYTE_ORDER == LITTLE_ENDIAN
1094 	struct {
1095 		uint32_t	iaab:1,		/** inhibit auto-ABTS originator */
1096 				npiv:1,		/** NPIV support */
1097 				dif:1,		/** DIF/DIX support */
1098 				vf:1,		/** virtual fabric support */
1099 				fcpi:1,		/** FCP initiator support */
1100 				fcpt:1,		/** FCP target support */
1101 				fcpc:1,		/** combined FCP initiator/target */
1102 				:1,
1103 				rqd:1,		/** recovery qualified delay */
1104 				iaar:1,		/** inhibit auto-ABTS responder */
1105 				hlm:1,		/** High Login Mode */
1106 				perfh:1,	/** performance hints */
1107 				rxseq:1,	/** RX Sequence Coalescing */
1108 				rxri:1,		/** Release XRI variant of Coalescing */
1109 				dcl2:1,		/** Disable Class 2 */
1110 				rsco:1,		/** Receive Sequence Coalescing Optimizations */
1111 				mrqp:1,		/** Multi RQ Pair Mode Support */
1112 				:15;
1113 	} flag;
1114 	uint32_t	dword;
1115 #else
1116 #error big endian version not defined
1117 #endif
1118 } sli4_features_t;
1119 
1120 typedef struct sli4_cmd_request_features_s {
1121 	sli4_mbox_command_header_t	hdr;
1122 #if BYTE_ORDER == LITTLE_ENDIAN
1123 	uint32_t	qry:1,
1124 			:31;
1125 #else
1126 #error big endian version not defined
1127 #endif
1128 	sli4_features_t	command;
1129 	sli4_features_t	response;
1130 } sli4_cmd_request_features_t;
1131 
1132 /**
1133  * @brief SLI_CONFIG - submit a configuration command to Port
1134  *
1135  * Command is either embedded as part of the payload (embed) or located
1136  * in a separate memory buffer (mem)
1137  */
1138 
1139 typedef struct sli4_sli_config_pmd_s {
1140 	uint32_t	address_low;
1141 	uint32_t	address_high;
1142 	uint32_t	length:24,
1143 			:8;
1144 } sli4_sli_config_pmd_t;
1145 
1146 typedef struct sli4_cmd_sli_config_s {
1147 	sli4_mbox_command_header_t	hdr;
1148 #if BYTE_ORDER == LITTLE_ENDIAN
1149 	uint32_t	emb:1,
1150 			:2,
1151 			pmd_count:5,
1152 			:24;
1153 	uint32_t	payload_length;
1154 	uint32_t	rsvd3;
1155 	uint32_t	rsvd4;
1156 	uint32_t	rsvd5;
1157 	union {
1158 		uint8_t			embed[58 * sizeof(uint32_t)];
1159 		sli4_sli_config_pmd_t   mem;
1160 	} payload;
1161 #else
1162 #error big endian version not defined
1163 #endif
1164 } sli4_cmd_sli_config_t;
1165 
1166 /**
1167  * @brief READ_STATUS - read tx/rx status of a particular port
1168  *
1169  */
1170 
1171 typedef struct sli4_cmd_read_status_s {
1172 	sli4_mbox_command_header_t	hdr;
1173 #if BYTE_ORDER == LITTLE_ENDIAN
1174 	uint32_t	cc:1,
1175 			:31;
1176 	uint32_t	rsvd2;
1177 	uint32_t	transmit_kbyte_count;
1178 	uint32_t	receive_kbyte_count;
1179 	uint32_t	transmit_frame_count;
1180 	uint32_t	receive_frame_count;
1181 	uint32_t	transmit_sequence_count;
1182 	uint32_t	receive_sequence_count;
1183 	uint32_t	total_exchanges_originator;
1184 	uint32_t	total_exchanges_responder;
1185 	uint32_t	receive_p_bsy_count;
1186 	uint32_t	receive_f_bsy_count;
1187 	uint32_t	dropped_frames_due_to_no_rq_buffer_count;
1188 	uint32_t	empty_rq_timeout_count;
1189 	uint32_t	dropped_frames_due_to_no_xri_count;
1190 	uint32_t	empty_xri_pool_count;
1191 
1192 #else
1193 #error big endian version not defined
1194 #endif
1195 } sli4_cmd_read_status_t;
1196 
1197 /**
1198  * @brief READ_LNK_STAT - read link status of a particular port
1199  *
1200  */
1201 
1202 typedef struct sli4_cmd_read_link_stats_s {
1203 	sli4_mbox_command_header_t	hdr;
1204 #if BYTE_ORDER == LITTLE_ENDIAN
1205 	uint32_t	rec:1,
1206 			gec:1,
1207 			w02of:1,
1208 			w03of:1,
1209 			w04of:1,
1210 			w05of:1,
1211 			w06of:1,
1212 			w07of:1,
1213 			w08of:1,
1214 			w09of:1,
1215 			w10of:1,
1216 			w11of:1,
1217 			w12of:1,
1218 			w13of:1,
1219 			w14of:1,
1220 			w15of:1,
1221 			w16of:1,
1222 			w17of:1,
1223 			w18of:1,
1224 			w19of:1,
1225 			w20of:1,
1226 			w21of:1,
1227 			resv0:8,
1228 			clrc:1,
1229 			clof:1;
1230 	uint32_t	link_failure_error_count;
1231 	uint32_t	loss_of_sync_error_count;
1232 	uint32_t	loss_of_signal_error_count;
1233 	uint32_t	primitive_sequence_error_count;
1234 	uint32_t	invalid_transmission_word_error_count;
1235 	uint32_t	crc_error_count;
1236 	uint32_t	primitive_sequence_event_timeout_count;
1237 	uint32_t	elastic_buffer_overrun_error_count;
1238 	uint32_t	arbitration_fc_al_timout_count;
1239 	uint32_t	advertised_receive_bufftor_to_buffer_credit;
1240 	uint32_t	current_receive_buffer_to_buffer_credit;
1241 	uint32_t	advertised_transmit_buffer_to_buffer_credit;
1242 	uint32_t	current_transmit_buffer_to_buffer_credit;
1243 	uint32_t	received_eofa_count;
1244 	uint32_t	received_eofdti_count;
1245 	uint32_t	received_eofni_count;
1246 	uint32_t	received_soff_count;
1247 	uint32_t	received_dropped_no_aer_count;
1248 	uint32_t	received_dropped_no_available_rpi_resources_count;
1249 	uint32_t	received_dropped_no_available_xri_resources_count;
1250 
1251 #else
1252 #error big endian version not defined
1253 #endif
1254 } sli4_cmd_read_link_stats_t;
1255 
1256 /**
1257  * @brief Format a WQE with WQ_ID Association performance hint
1258  *
1259  * @par Description
1260  * PHWQ works by over-writing part of Word 10 in the WQE with the WQ ID.
1261  *
1262  * @param entry Pointer to the WQE.
1263  * @param q_id Queue ID.
1264  *
1265  * @return None.
1266  */
1267 static inline void
1268 sli_set_wq_id_association(void *entry, uint16_t q_id)
1269 {
1270 	uint32_t *wqe = entry;
1271 
1272 	/*
1273 	 * Set Word 10, bit 0 to zero
1274 	 * Set Word 10, bits 15:1 to the WQ ID
1275 	 */
1276 #if BYTE_ORDER == LITTLE_ENDIAN
1277 	wqe[10] &= ~0xffff;
1278 	wqe[10] |= q_id << 1;
1279 #else
1280 #error big endian version not defined
1281 #endif
1282 }
1283 
1284 /**
1285  * @brief UNREG_FCFI - unregister a FCFI
1286  */
1287 typedef struct sli4_cmd_unreg_fcfi_s {
1288 	sli4_mbox_command_header_t	hdr;
1289 	uint32_t	rsvd1;
1290 #if BYTE_ORDER == LITTLE_ENDIAN
1291 	uint32_t	fcfi:16,
1292 			:16;
1293 #else
1294 #error big endian version not defined
1295 #endif
1296 } sli4_cmd_unreg_fcfi_t;
1297 
1298 /**
1299  * @brief UNREG_RPI - unregister one or more RPI
1300  */
1301 typedef struct sli4_cmd_unreg_rpi_s {
1302 	sli4_mbox_command_header_t	hdr;
1303 #if BYTE_ORDER == LITTLE_ENDIAN
1304 	uint32_t	index:16,
1305 			:13,
1306 			dp:1,
1307 			ii:2;
1308 	uint32_t	destination_n_port_id:24,
1309 			:8;
1310 #else
1311 #error big endian version not defined
1312 #endif
1313 } sli4_cmd_unreg_rpi_t;
1314 
1315 #define SLI4_UNREG_RPI_II_RPI			0x0
1316 #define SLI4_UNREG_RPI_II_VPI			0x1
1317 #define SLI4_UNREG_RPI_II_VFI			0x2
1318 #define SLI4_UNREG_RPI_II_FCFI			0x3
1319 
1320 /**
1321  * @brief UNREG_VFI - unregister one or more VFI
1322  */
1323 typedef struct sli4_cmd_unreg_vfi_s {
1324 	sli4_mbox_command_header_t	hdr;
1325 #if BYTE_ORDER == LITTLE_ENDIAN
1326 	uint32_t	rsvd1;
1327 	uint32_t	index:16,
1328 			:14,
1329 			ii:2;
1330 #else
1331 #error big endian version not defined
1332 #endif
1333 } sli4_cmd_unreg_vfi_t;
1334 
1335 #define SLI4_UNREG_VFI_II_VFI			0x0
1336 #define SLI4_UNREG_VFI_II_FCFI			0x3
1337 
1338 enum {
1339 	SLI4_UNREG_TYPE_PORT,
1340 	SLI4_UNREG_TYPE_DOMAIN,
1341 	SLI4_UNREG_TYPE_FCF,
1342 	SLI4_UNREG_TYPE_ALL
1343 };
1344 
1345 /**
1346  * @brief UNREG_VPI - unregister one or more VPI
1347  */
1348 typedef struct sli4_cmd_unreg_vpi_s {
1349 	sli4_mbox_command_header_t	hdr;
1350 #if BYTE_ORDER == LITTLE_ENDIAN
1351 	uint32_t	rsvd1;
1352 	uint32_t	index:16,
1353 			:14,
1354 			ii:2;
1355 #else
1356 #error big endian version not defined
1357 #endif
1358 } sli4_cmd_unreg_vpi_t;
1359 
1360 #define SLI4_UNREG_VPI_II_VPI			0x0
1361 #define SLI4_UNREG_VPI_II_VFI			0x2
1362 #define SLI4_UNREG_VPI_II_FCFI			0x3
1363 
1364 /**
1365  * @brief AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature.
1366  */
1367 typedef struct sli4_cmd_config_auto_xfer_rdy_s {
1368 	sli4_mbox_command_header_t	hdr;
1369 #if BYTE_ORDER == LITTLE_ENDIAN
1370 	uint32_t	resv;
1371 	uint32_t	max_burst_len;
1372 #else
1373 #error big endian version not defined
1374 #endif
1375 } sli4_cmd_config_auto_xfer_rdy_t;
1376 
1377 typedef struct sli4_cmd_config_auto_xfer_rdy_hp_s {
1378         sli4_mbox_command_header_t      hdr;
1379 #if BYTE_ORDER == LITTLE_ENDIAN
1380         uint32_t        resv;
1381         uint32_t        max_burst_len;
1382         uint32_t        esoc:1,
1383                         :31;
1384         uint32_t        block_size:16,
1385                         :16;
1386 #else
1387 #error big endian version not defined
1388 #endif
1389 } sli4_cmd_config_auto_xfer_rdy_hp_t;
1390 
1391 /*************************************************************************
1392  * SLI-4 common configuration command formats and definitions
1393  */
1394 
1395 #define SLI4_CFG_STATUS_SUCCESS			0x00
1396 #define SLI4_CFG_STATUS_FAILED			0x01
1397 #define SLI4_CFG_STATUS_ILLEGAL_REQUEST		0x02
1398 #define SLI4_CFG_STATUS_ILLEGAL_FIELD		0x03
1399 
1400 #define SLI4_MGMT_STATUS_FLASHROM_READ_FAILED	0xcb
1401 
1402 #define SLI4_CFG_ADD_STATUS_NO_STATUS		0x00
1403 #define SLI4_CFG_ADD_STATUS_INVALID_OPCODE	0x1e
1404 
1405 /**
1406  * Subsystem values.
1407  */
1408 #define SLI4_SUBSYSTEM_COMMON			0x01
1409 #define SLI4_SUBSYSTEM_LOWLEVEL			0x0B
1410 #define SLI4_SUBSYSTEM_FCFCOE			0x0c
1411 #define SLI4_SUBSYSTEM_DMTF			0x11
1412 
1413 #define	SLI4_OPC_LOWLEVEL_SET_WATCHDOG		0X36
1414 
1415 /**
1416  * Common opcode (OPC) values.
1417  */
1418 #define SLI4_OPC_COMMON_FUNCTION_RESET			0x3d
1419 #define SLI4_OPC_COMMON_CREATE_CQ			0x0c
1420 #define SLI4_OPC_COMMON_CREATE_CQ_SET			0x1d
1421 #define SLI4_OPC_COMMON_DESTROY_CQ			0x36
1422 #define SLI4_OPC_COMMON_MODIFY_EQ_DELAY			0x29
1423 #define SLI4_OPC_COMMON_CREATE_EQ			0x0d
1424 #define SLI4_OPC_COMMON_DESTROY_EQ			0x37
1425 #define SLI4_OPC_COMMON_CREATE_MQ_EXT			0x5a
1426 #define SLI4_OPC_COMMON_DESTROY_MQ			0x35
1427 #define SLI4_OPC_COMMON_GET_CNTL_ATTRIBUTES		0x20
1428 #define SLI4_OPC_COMMON_NOP				0x21
1429 #define SLI4_OPC_COMMON_GET_RESOURCE_EXTENT_INFO	0x9a
1430 #define SLI4_OPC_COMMON_GET_SLI4_PARAMETERS		0xb5
1431 #define SLI4_OPC_COMMON_QUERY_FW_CONFIG			0x3a
1432 #define SLI4_OPC_COMMON_GET_PORT_NAME			0x4d
1433 
1434 #define SLI4_OPC_COMMON_WRITE_FLASHROM			0x07
1435 #define SLI4_OPC_COMMON_MANAGE_FAT			0x44
1436 #define SLI4_OPC_COMMON_READ_TRANSCEIVER_DATA		0x49
1437 #define SLI4_OPC_COMMON_GET_CNTL_ADDL_ATTRIBUTES	0x79
1438 #define SLI4_OPC_COMMON_GET_EXT_FAT_CAPABILITIES	0x7d
1439 #define SLI4_OPC_COMMON_SET_EXT_FAT_CAPABILITIES	0x7e
1440 #define SLI4_OPC_COMMON_EXT_FAT_CONFIGURE_SNAPSHOT	0x7f
1441 #define SLI4_OPC_COMMON_EXT_FAT_RETRIEVE_SNAPSHOT	0x80
1442 #define SLI4_OPC_COMMON_EXT_FAT_READ_STRING_TABLE	0x82
1443 #define SLI4_OPC_COMMON_GET_FUNCTION_CONFIG		0xa0
1444 #define SLI4_OPC_COMMON_GET_PROFILE_CONFIG		0xa4
1445 #define SLI4_OPC_COMMON_SET_PROFILE_CONFIG		0xa5
1446 #define SLI4_OPC_COMMON_GET_PROFILE_LIST		0xa6
1447 #define SLI4_OPC_COMMON_GET_ACTIVE_PROFILE		0xa7
1448 #define SLI4_OPC_COMMON_SET_ACTIVE_PROFILE		0xa8
1449 #define SLI4_OPC_COMMON_READ_OBJECT			0xab
1450 #define SLI4_OPC_COMMON_WRITE_OBJECT			0xac
1451 #define SLI4_OPC_COMMON_DELETE_OBJECT			0xae
1452 #define SLI4_OPC_COMMON_READ_OBJECT_LIST		0xad
1453 #define SLI4_OPC_COMMON_SET_DUMP_LOCATION		0xb8
1454 #define SLI4_OPC_COMMON_SET_FEATURES			0xbf
1455 #define SLI4_OPC_COMMON_GET_RECONFIG_LINK_INFO		0xc9
1456 #define SLI4_OPC_COMMON_SET_RECONFIG_LINK_ID		0xca
1457 
1458 /**
1459  * DMTF opcode (OPC) values.
1460  */
1461 #define SLI4_OPC_DMTF_EXEC_CLP_CMD			0x01
1462 
1463 /**
1464  * @brief Generic Command Request header
1465  */
1466 typedef struct sli4_req_hdr_s {
1467 #if BYTE_ORDER == LITTLE_ENDIAN
1468 	uint32_t	opcode:8,
1469 			subsystem:8,
1470 			:16;
1471 	uint32_t	timeout;
1472 	uint32_t	request_length;
1473 	uint32_t	version:8,
1474 			:24;
1475 #else
1476 #error big endian version not defined
1477 #endif
1478 } sli4_req_hdr_t;
1479 
1480 /**
1481  * @brief Generic Command Response header
1482  */
1483 typedef struct sli4_res_hdr_s {
1484 #if BYTE_ORDER == LITTLE_ENDIAN
1485 	uint32_t	opcode:8,
1486 			subsystem:8,
1487 			:16;
1488 	uint32_t	status:8,
1489 			additional_status:8,
1490 			:16;
1491 	uint32_t	response_length;
1492 	uint32_t	actual_response_length;
1493 #else
1494 #error big endian version not defined
1495 #endif
1496 } sli4_res_hdr_t;
1497 
1498 /**
1499  * @brief COMMON_FUNCTION_RESET
1500  *
1501  * Resets the Port, returning it to a power-on state. This configuration
1502  * command does not have a payload and should set/expect the lengths to
1503  * be zero.
1504  */
1505 typedef struct sli4_req_common_function_reset_s {
1506 	sli4_req_hdr_t	hdr;
1507 } sli4_req_common_function_reset_t;
1508 
1509 typedef struct sli4_res_common_function_reset_s {
1510 	sli4_res_hdr_t	hdr;
1511 } sli4_res_common_function_reset_t;
1512 
1513 /**
1514  * @brief COMMON_CREATE_CQ_V0
1515  *
1516  * Create a Completion Queue.
1517  */
1518 typedef struct sli4_req_common_create_cq_v0_s {
1519 	sli4_req_hdr_t	hdr;
1520 #if BYTE_ORDER == LITTLE_ENDIAN
1521 	uint32_t	num_pages:16,
1522 			:16;
1523 	uint32_t	:12,
1524 			clswm:2,
1525 			nodelay:1,
1526 			:12,
1527 			cqecnt:2,
1528 			valid:1,
1529 			:1,
1530 			evt:1;
1531 	uint32_t	:22,
1532 			eq_id:8,
1533 			:1,
1534 			arm:1;
1535 	uint32_t	rsvd[2];
1536 	struct {
1537 		uint32_t	low;
1538 		uint32_t	high;
1539 	} page_physical_address[0];
1540 #else
1541 #error big endian version not defined
1542 #endif
1543 } sli4_req_common_create_cq_v0_t;
1544 
1545 /**
1546  * @brief COMMON_CREATE_CQ_V2
1547  *
1548  * Create a Completion Queue.
1549  */
1550 typedef struct sli4_req_common_create_cq_v2_s {
1551 	sli4_req_hdr_t	hdr;
1552 #if BYTE_ORDER == LITTLE_ENDIAN
1553 	uint32_t	num_pages:16,
1554 			page_size:8,
1555 			:8,
1556 	uint32_t	:12,
1557 			clswm:2,
1558 			nodelay:1,
1559 			autovalid:1,
1560 			:11,
1561 			cqecnt:2,
1562 			valid:1,
1563 			:1,
1564 			evt:1;
1565 	uint32_t	eq_id:16,
1566 			:15,
1567 			arm:1;
1568 	uint32_t	cqe_count:16,
1569 			:16;
1570 	uint32_t	rsvd[1];
1571 	struct {
1572 		uint32_t	low;
1573 		uint32_t	high;
1574 	} page_physical_address[0];
1575 #else
1576 #error big endian version not defined
1577 #endif
1578 } sli4_req_common_create_cq_v2_t;
1579 
1580 /**
1581  * @brief COMMON_CREATE_CQ_SET_V0
1582  *
1583  * Create a set of Completion Queues.
1584  */
1585 typedef struct sli4_req_common_create_cq_set_v0_s {
1586 	sli4_req_hdr_t	hdr;
1587 #if BYTE_ORDER == LITTLE_ENDIAN
1588 	uint32_t	num_pages:16,
1589 			page_size:8,
1590 			:8;
1591 	uint32_t	:12,
1592 			clswm:2,
1593 			nodelay:1,
1594 			autovalid:1,
1595 			rsvd:11,
1596 			cqecnt:2,
1597 			valid:1,
1598 			:1,
1599 			evt:1;
1600 	uint32_t	num_cq_req:16,
1601 			cqe_count:15,
1602 			arm:1;
1603 	uint16_t	eq_id[16];
1604 	struct {
1605 		uint32_t	low;
1606 		uint32_t	high;
1607 	} page_physical_address[0];
1608 #else
1609 #error big endian version not defined
1610 #endif
1611 } sli4_req_common_create_cq_set_v0_t;
1612 
1613 /**
1614  * CQE count.
1615  */
1616 #define SLI4_CQ_CNT_256			0
1617 #define SLI4_CQ_CNT_512			1
1618 #define SLI4_CQ_CNT_1024		2
1619 #define SLI4_CQ_CNT_LARGE		3
1620 
1621 #define SLI4_CQE_BYTES			(4 * sizeof(uint32_t))
1622 
1623 #define SLI4_COMMON_CREATE_CQ_V2_MAX_PAGES 8
1624 
1625 /**
1626  * @brief Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion
1627  */
1628 typedef struct sli4_res_common_create_queue_s {
1629 	sli4_res_hdr_t	hdr;
1630 #if BYTE_ORDER == LITTLE_ENDIAN
1631 	uint32_t q_id:16,
1632 		:8,
1633 		ulp:8;
1634 	uint32_t db_offset;
1635 	uint32_t db_rs:16,
1636 		 db_fmt:16;
1637 #else
1638 #error big endian version not defined
1639 #endif
1640 } sli4_res_common_create_queue_t;
1641 
1642 typedef struct sli4_res_common_create_queue_set_s {
1643 	sli4_res_hdr_t	hdr;
1644 #if BYTE_ORDER == LITTLE_ENDIAN
1645 	uint32_t q_id:16,
1646 		num_q_allocated:16;
1647 #else
1648 #error big endian version not defined
1649 #endif
1650 } sli4_res_common_create_queue_set_t;
1651 
1652 /**
1653  * @brief Common Destroy CQ
1654  */
1655 typedef struct sli4_req_common_destroy_cq_s {
1656 	sli4_req_hdr_t	hdr;
1657 #if BYTE_ORDER == LITTLE_ENDIAN
1658 	uint32_t	cq_id:16,
1659 			:16;
1660 #else
1661 #error big endian version not defined
1662 #endif
1663 } sli4_req_common_destroy_cq_t;
1664 
1665 /**
1666  * @brief COMMON_MODIFY_EQ_DELAY
1667  *
1668  * Modify the delay multiplier for EQs
1669  */
1670 typedef struct sli4_req_common_modify_eq_delay_s {
1671 	sli4_req_hdr_t	hdr;
1672 #if BYTE_ORDER == LITTLE_ENDIAN
1673 	uint32_t	num_eq;
1674 	struct {
1675 		uint32_t	eq_id;
1676 		uint32_t	phase;
1677 		uint32_t	delay_multiplier;
1678 	} eq_delay_record[8];
1679 #else
1680 #error big endian version not defined
1681 #endif
1682 } sli4_req_common_modify_eq_delay_t;
1683 
1684 /**
1685  * @brief COMMON_CREATE_EQ
1686  *
1687  * Create an Event Queue.
1688  */
1689 typedef struct sli4_req_common_create_eq_s {
1690 	sli4_req_hdr_t	hdr;
1691 #if BYTE_ORDER == LITTLE_ENDIAN
1692 	uint32_t	num_pages:16,
1693 			:16;
1694 	uint32_t	:29,
1695 			valid:1,
1696 			:1,
1697 			eqesz:1;
1698 	uint32_t	:26,
1699 			count:3,
1700 			:2,
1701 			arm:1;
1702 	uint32_t	:13,
1703 			delay_multiplier:10,
1704 			:9;
1705 	uint32_t	rsvd;
1706 	struct {
1707 		uint32_t	low;
1708 		uint32_t	high;
1709 	} page_address[8];
1710 #else
1711 #error big endian version not defined
1712 #endif
1713 } sli4_req_common_create_eq_t;
1714 
1715 #define SLI4_EQ_CNT_256			0
1716 #define SLI4_EQ_CNT_512			1
1717 #define SLI4_EQ_CNT_1024		2
1718 #define SLI4_EQ_CNT_2048		3
1719 #define SLI4_EQ_CNT_4096		4
1720 
1721 #define SLI4_EQE_SIZE_4			0
1722 #define SLI4_EQE_SIZE_16		1
1723 
1724 /**
1725  * @brief Common Destroy EQ
1726  */
1727 typedef struct sli4_req_common_destroy_eq_s {
1728 	sli4_req_hdr_t	hdr;
1729 #if BYTE_ORDER == LITTLE_ENDIAN
1730 	uint32_t	eq_id:16,
1731 			:16;
1732 #else
1733 #error big endian version not defined
1734 #endif
1735 } sli4_req_common_destroy_eq_t;
1736 
1737 /**
1738  * @brief COMMON_CREATE_MQ_EXT
1739  *
1740  * Create a Mailbox Queue; accommodate v0 and v1 forms.
1741  */
1742 typedef struct sli4_req_common_create_mq_ext_s {
1743 	sli4_req_hdr_t	hdr;
1744 #if BYTE_ORDER == LITTLE_ENDIAN
1745 	uint32_t	num_pages:16,
1746 			cq_id_v1:16;
1747 	uint32_t	async_event_bitmap;
1748 	uint32_t	async_cq_id_v1:16,
1749 			ring_size:4,
1750 			:2,
1751 			cq_id_v0:10;
1752 	uint32_t	:31,
1753 			val:1;
1754 	uint32_t	acqv:1,
1755 			async_cq_id_v0:10,
1756 			:21;
1757 	uint32_t	rsvd9;
1758 	struct {
1759 		uint32_t	low;
1760 		uint32_t	high;
1761 	} page_physical_address[8];
1762 #else
1763 #error big endian version not defined
1764 #endif
1765 } sli4_req_common_create_mq_ext_t;
1766 
1767 #define SLI4_MQE_SIZE_16		0x05
1768 #define SLI4_MQE_SIZE_32		0x06
1769 #define SLI4_MQE_SIZE_64		0x07
1770 #define SLI4_MQE_SIZE_128		0x08
1771 
1772 #define SLI4_ASYNC_EVT_LINK_STATE	BIT(1)
1773 #define SLI4_ASYNC_EVT_FCOE_FIP		BIT(2)
1774 #define SLI4_ASYNC_EVT_DCBX		BIT(3)
1775 #define SLI4_ASYNC_EVT_ISCSI		BIT(4)
1776 #define SLI4_ASYNC_EVT_GRP5		BIT(5)
1777 #define SLI4_ASYNC_EVT_FC		BIT(16)
1778 #define SLI4_ASYNC_EVT_SLI_PORT		BIT(17)
1779 #define SLI4_ASYNC_EVT_VF		BIT(18)
1780 #define SLI4_ASYNC_EVT_MR		BIT(19)
1781 
1782 #define SLI4_ASYNC_EVT_ALL	\
1783 		SLI4_ASYNC_EVT_LINK_STATE 	| \
1784 		SLI4_ASYNC_EVT_FCOE_FIP		| \
1785 		SLI4_ASYNC_EVT_DCBX		| \
1786 		SLI4_ASYNC_EVT_ISCSI		| \
1787 		SLI4_ASYNC_EVT_GRP5		| \
1788 		SLI4_ASYNC_EVT_FC		| \
1789 		SLI4_ASYNC_EVT_SLI_PORT		| \
1790 		SLI4_ASYNC_EVT_VF		|\
1791 		SLI4_ASYNC_EVT_MR
1792 
1793 #define SLI4_ASYNC_EVT_FC_FCOE \
1794 		SLI4_ASYNC_EVT_LINK_STATE	| \
1795 		SLI4_ASYNC_EVT_FCOE_FIP		| \
1796 		SLI4_ASYNC_EVT_GRP5		| \
1797 		SLI4_ASYNC_EVT_FC		| \
1798 		SLI4_ASYNC_EVT_SLI_PORT
1799 
1800 /**
1801  * @brief Common Destroy MQ
1802  */
1803 typedef struct sli4_req_common_destroy_mq_s {
1804 	sli4_req_hdr_t	hdr;
1805 #if BYTE_ORDER == LITTLE_ENDIAN
1806 	uint32_t	mq_id:16,
1807 			:16;
1808 #else
1809 #error big endian version not defined
1810 #endif
1811 } sli4_req_common_destroy_mq_t;
1812 
1813 /**
1814  * @brief COMMON_GET_CNTL_ATTRIBUTES
1815  *
1816  * Query for information about the SLI Port
1817  */
1818 typedef struct sli4_res_common_get_cntl_attributes_s {
1819 	sli4_res_hdr_t	hdr;
1820 #if BYTE_ORDER == LITTLE_ENDIAN
1821 	uint8_t		version_string[32];
1822 	uint8_t		manufacturer_name[32];
1823 	uint32_t	supported_modes;
1824 	uint32_t	eprom_version_lo:8,
1825 			eprom_version_hi:8,
1826 			:16;
1827 	uint32_t	mbx_data_structure_version;
1828 	uint32_t	ep_firmware_data_structure_version;
1829 	uint8_t		ncsi_version_string[12];
1830 	uint32_t	default_extended_timeout;
1831 	uint8_t		model_number[32];
1832 	uint8_t		description[64];
1833 	uint8_t		serial_number[32];
1834 	uint8_t		ip_version_string[32];
1835 	uint8_t		fw_version_string[32];
1836 	uint8_t		bios_version_string[32];
1837 	uint8_t		redboot_version_string[32];
1838 	uint8_t		driver_version_string[32];
1839 	uint8_t		fw_on_flash_version_string[32];
1840 	uint32_t	functionalities_supported;
1841 	uint32_t	max_cdb_length:16,
1842 			asic_revision:8,
1843 			generational_guid0:8;
1844 	uint32_t	generational_guid1_12[3];
1845 	uint32_t	generational_guid13:24,
1846 			hba_port_count:8;
1847 	uint32_t	default_link_down_timeout:16,
1848 			iscsi_version_min_max:8,
1849 			multifunctional_device:8;
1850 	uint32_t	cache_valid:8,
1851 			hba_status:8,
1852 			max_domains_supported:8,
1853 			port_number:6,
1854 			port_type:2;
1855 	uint32_t	firmware_post_status;
1856 	uint32_t	hba_mtu;
1857 	uint32_t	iscsi_features:8,
1858 			rsvd121:24;
1859 	uint32_t	pci_vendor_id:16,
1860 			pci_device_id:16;
1861 	uint32_t	pci_sub_vendor_id:16,
1862 			pci_sub_system_id:16;
1863 	uint32_t	pci_bus_number:8,
1864 			pci_device_number:8,
1865 			pci_function_number:8,
1866 			interface_type:8;
1867 	uint64_t	unique_identifier;
1868 	uint32_t	number_of_netfilters:8,
1869 			rsvd130:24;
1870 #else
1871 #error big endian version not defined
1872 #endif
1873 } sli4_res_common_get_cntl_attributes_t;
1874 
1875 /**
1876  * @brief COMMON_GET_CNTL_ATTRIBUTES
1877  *
1878  * This command queries the controller information from the Flash ROM.
1879  */
1880 typedef struct sli4_req_common_get_cntl_addl_attributes_s {
1881 	sli4_req_hdr_t	hdr;
1882 } sli4_req_common_get_cntl_addl_attributes_t;
1883 
1884 typedef struct sli4_res_common_get_cntl_addl_attributes_s {
1885 	sli4_res_hdr_t	hdr;
1886 	uint16_t	ipl_file_number;
1887 	uint8_t		ipl_file_version;
1888 	uint8_t		rsvd0;
1889 	uint8_t		on_die_temperature;
1890 	uint8_t		rsvd1[3];
1891 	uint32_t	driver_advanced_features_supported;
1892 	uint32_t	rsvd2[4];
1893 	char		fcoe_universal_bios_version[32];
1894 	char		fcoe_x86_bios_version[32];
1895 	char		fcoe_efi_bios_version[32];
1896 	char		fcoe_fcode_version[32];
1897 	char		uefi_bios_version[32];
1898 	char		uefi_nic_version[32];
1899 	char		uefi_fcode_version[32];
1900 	char		uefi_iscsi_version[32];
1901 	char		iscsi_x86_bios_version[32];
1902 	char		pxe_x86_bios_version[32];
1903 	uint8_t		fcoe_default_wwpn[8];
1904 	uint8_t		ext_phy_version[32];
1905 	uint8_t		fc_universal_bios_version[32];
1906 	uint8_t		fc_x86_bios_version[32];
1907 	uint8_t		fc_efi_bios_version[32];
1908 	uint8_t		fc_fcode_version[32];
1909 	uint8_t		ext_phy_crc_label[8];
1910 	uint8_t		ipl_file_name[16];
1911 	uint8_t		rsvd3[72];
1912 } sli4_res_common_get_cntl_addl_attributes_t;
1913 
1914 /**
1915  * @brief COMMON_NOP
1916  *
1917  * This command does not do anything; it only returns the payload in the completion.
1918  */
1919 typedef struct sli4_req_common_nop_s {
1920 	sli4_req_hdr_t	hdr;
1921 #if BYTE_ORDER == LITTLE_ENDIAN
1922 	uint32_t	context[2];
1923 #else
1924 #error big endian version not defined
1925 #endif
1926 } sli4_req_common_nop_t;
1927 
1928 typedef struct sli4_res_common_nop_s {
1929 	sli4_res_hdr_t	hdr;
1930 #if BYTE_ORDER == LITTLE_ENDIAN
1931 	uint32_t	context[2];
1932 #else
1933 #error big endian version not defined
1934 #endif
1935 } sli4_res_common_nop_t;
1936 
1937 /**
1938  * @brief COMMON_GET_RESOURCE_EXTENT_INFO
1939  */
1940 typedef struct sli4_req_common_get_resource_extent_info_s {
1941 	sli4_req_hdr_t	hdr;
1942 #if BYTE_ORDER == LITTLE_ENDIAN
1943 	uint32_t	resource_type:16,
1944 			:16;
1945 #else
1946 #error big endian version not defined
1947 #endif
1948 } sli4_req_common_get_resource_extent_info_t;
1949 
1950 #define SLI4_RSC_TYPE_ISCSI_INI_XRI	0x0c
1951 #define SLI4_RSC_TYPE_FCOE_VFI		0x20
1952 #define SLI4_RSC_TYPE_FCOE_VPI		0x21
1953 #define SLI4_RSC_TYPE_FCOE_RPI		0x22
1954 #define SLI4_RSC_TYPE_FCOE_XRI		0x23
1955 
1956 typedef struct sli4_res_common_get_resource_extent_info_s {
1957 	sli4_res_hdr_t	hdr;
1958 #if BYTE_ORDER == LITTLE_ENDIAN
1959 	uint32_t	resource_extent_count:16,
1960 			resource_extent_size:16;
1961 #else
1962 #error big endian version not defined
1963 #endif
1964 } sli4_res_common_get_resource_extent_info_t;
1965 
1966 #define SLI4_128BYTE_WQE_SUPPORT	0x02
1967 /**
1968  * @brief COMMON_GET_SLI4_PARAMETERS
1969  */
1970 typedef struct sli4_res_common_get_sli4_parameters_s {
1971 	sli4_res_hdr_t	hdr;
1972 #if BYTE_ORDER == LITTLE_ENDIAN
1973 	uint32_t	protocol_type:8,
1974 			:24;
1975 	uint32_t	ft:1,
1976 			:3,
1977 			sli_revision:4,
1978 			sli_family:4,
1979 			if_type:4,
1980 			sli_hint_1:8,
1981 			sli_hint_2:5,
1982 			:3;
1983 	uint32_t	eq_page_cnt:4,
1984 			:4,
1985 			eqe_sizes:4,
1986 			:4,
1987 			eq_page_sizes:8,
1988 			eqe_count_method:4,
1989 			:4;
1990 	uint32_t	eqe_count_mask:16,
1991 			:16;
1992 	uint32_t	cq_page_cnt:4,
1993 			:4,
1994 			cqe_sizes:4,
1995 			:2,
1996 			cqv:2,
1997 			cq_page_sizes:8,
1998 			cqe_count_method:4,
1999 			:4;
2000 	uint32_t	cqe_count_mask:16,
2001 			:16;
2002 	uint32_t	mq_page_cnt:4,
2003 			:10,
2004 			mqv:2,
2005 			mq_page_sizes:8,
2006 			mqe_count_method:4,
2007 			:4;
2008 	uint32_t	mqe_count_mask:16,
2009 			:16;
2010 	uint32_t	wq_page_cnt:4,
2011 			:4,
2012 			wqe_sizes:4,
2013 			:2,
2014 			wqv:2,
2015 			wq_page_sizes:8,
2016 			wqe_count_method:4,
2017 			:4;
2018 	uint32_t	wqe_count_mask:16,
2019 			:16;
2020 	uint32_t	rq_page_cnt:4,
2021 			:4,
2022 			rqe_sizes:4,
2023 			:2,
2024 			rqv:2,
2025 			rq_page_sizes:8,
2026 			rqe_count_method:4,
2027 			:4;
2028 	uint32_t	rqe_count_mask:16,
2029 			:12,
2030 			rq_db_window:4;
2031 	uint32_t	fcoe:1,
2032 			ext:1,
2033 			hdrr:1,
2034 			sglr:1,
2035 			fbrr:1,
2036 			areg:1,
2037 			tgt:1,
2038 			terp:1,
2039 			assi:1,
2040 			wchn:1,
2041 			tcca:1,
2042 			trty:1,
2043 			trir:1,
2044 			phoff:1,
2045 			phon:1,
2046 			phwq:1,			/** Performance Hint WQ_ID Association */
2047 			boundary_4ga:1,
2048 			rxc:1,
2049 			hlm:1,
2050 			ipr:1,
2051 			rxri:1,
2052 			sglc:1,
2053 			timm:1,
2054 			tsmm:1,
2055 			:1,
2056 			oas:1,
2057 			lc:1,
2058 			agxf:1,
2059 			loopback_scope:4;
2060 	uint32_t	sge_supported_length;
2061 	uint32_t	sgl_page_cnt:4,
2062 			:4,
2063 			sgl_page_sizes:8,
2064 			sgl_pp_align:8,
2065 			:8;
2066 	uint32_t	min_rq_buffer_size:16,
2067 			:16;
2068 	uint32_t	max_rq_buffer_size;
2069 	uint32_t	physical_xri_max:16,
2070 			physical_rpi_max:16;
2071 	uint32_t	physical_vpi_max:16,
2072 			physical_vfi_max:16;
2073 	uint32_t	rsvd19;
2074 	uint32_t	frag_num_field_offset:16,	/* dword 20 */
2075 			frag_num_field_size:16;
2076 	uint32_t	sgl_index_field_offset:16,	/* dword 21 */
2077 			sgl_index_field_size:16;
2078 	uint32_t	chain_sge_initial_value_lo;	/* dword 22 */
2079 	uint32_t	chain_sge_initial_value_hi;	/* dword 23 */
2080 #else
2081 #error big endian version not defined
2082 #endif
2083 } sli4_res_common_get_sli4_parameters_t;
2084 
2085 /**
2086  * @brief COMMON_QUERY_FW_CONFIG
2087  *
2088  * This command retrieves firmware configuration parameters and adapter
2089  * resources available to the driver.
2090  */
2091 typedef struct sli4_req_common_query_fw_config_s {
2092 	sli4_req_hdr_t	hdr;
2093 } sli4_req_common_query_fw_config_t;
2094 
2095 #define SLI4_FUNCTION_MODE_FCOE_INI_MODE 0x40
2096 #define SLI4_FUNCTION_MODE_FCOE_TGT_MODE 0x80
2097 #define SLI4_FUNCTION_MODE_DUA_MODE      0x800
2098 
2099 #define SLI4_ULP_MODE_FCOE_INI           0x40
2100 #define SLI4_ULP_MODE_FCOE_TGT           0x80
2101 
2102 typedef struct sli4_res_common_query_fw_config_s {
2103 	sli4_res_hdr_t	hdr;
2104 	uint32_t	config_number;
2105 	uint32_t	asic_rev;
2106 	uint32_t	physical_port;
2107 	uint32_t	function_mode;
2108 	uint32_t	ulp0_mode;
2109 	uint32_t	ulp0_nic_wqid_base;
2110 	uint32_t	ulp0_nic_wq_total; /* Dword 10 */
2111 	uint32_t	ulp0_toe_wqid_base;
2112 	uint32_t	ulp0_toe_wq_total;
2113 	uint32_t	ulp0_toe_rqid_base;
2114 	uint32_t	ulp0_toe_rq_total;
2115 	uint32_t	ulp0_toe_defrqid_base;
2116 	uint32_t	ulp0_toe_defrq_total;
2117 	uint32_t	ulp0_lro_rqid_base;
2118 	uint32_t	ulp0_lro_rq_total;
2119 	uint32_t	ulp0_iscsi_icd_base;
2120 	uint32_t	ulp0_iscsi_icd_total; /* Dword 20 */
2121 	uint32_t	ulp1_mode;
2122 	uint32_t	ulp1_nic_wqid_base;
2123 	uint32_t	ulp1_nic_wq_total;
2124 	uint32_t	ulp1_toe_wqid_base;
2125 	uint32_t	ulp1_toe_wq_total;
2126 	uint32_t	ulp1_toe_rqid_base;
2127 	uint32_t	ulp1_toe_rq_total;
2128 	uint32_t	ulp1_toe_defrqid_base;
2129 	uint32_t	ulp1_toe_defrq_total;
2130 	uint32_t	ulp1_lro_rqid_base;  /* Dword 30 */
2131 	uint32_t	ulp1_lro_rq_total;
2132 	uint32_t	ulp1_iscsi_icd_base;
2133 	uint32_t	ulp1_iscsi_icd_total;
2134 	uint32_t	function_capabilities;
2135 	uint32_t	ulp0_cq_base;
2136 	uint32_t	ulp0_cq_total;
2137 	uint32_t	ulp0_eq_base;
2138 	uint32_t	ulp0_eq_total;
2139 	uint32_t	ulp0_iscsi_chain_icd_base;
2140 	uint32_t	ulp0_iscsi_chain_icd_total;  /* Dword 40 */
2141 	uint32_t	ulp1_iscsi_chain_icd_base;
2142 	uint32_t	ulp1_iscsi_chain_icd_total;
2143 } sli4_res_common_query_fw_config_t;
2144 
2145 /**
2146  * @brief COMMON_GET_PORT_NAME
2147  */
2148 typedef struct sli4_req_common_get_port_name_s {
2149 	sli4_req_hdr_t	hdr;
2150 #if BYTE_ORDER == LITTLE_ENDIAN
2151 	uint32_t	pt:2,		/* only COMMON_GET_PORT_NAME_V1 */
2152 			:30;
2153 #else
2154 #error big endian version not defined
2155 #endif
2156 } sli4_req_common_get_port_name_t;
2157 
2158 typedef struct sli4_res_common_get_port_name_s {
2159 	sli4_res_hdr_t	hdr;
2160 	char		port_name[4];
2161 } sli4_res_common_get_port_name_t;
2162 
2163 /**
2164  * @brief COMMON_WRITE_FLASHROM
2165  */
2166 typedef struct sli4_req_common_write_flashrom_s {
2167 	sli4_req_hdr_t	hdr;
2168 #if BYTE_ORDER == LITTLE_ENDIAN
2169 	uint32_t	flash_rom_access_opcode;
2170 	uint32_t	flash_rom_access_operation_type;
2171 	uint32_t	data_buffer_size;
2172 	uint32_t	offset;
2173 	uint8_t		data_buffer[4];
2174 #else
2175 #error big endian version not defined
2176 #endif
2177 } sli4_req_common_write_flashrom_t;
2178 
2179 #define SLI4_MGMT_FLASHROM_OPCODE_FLASH			0x01
2180 #define SLI4_MGMT_FLASHROM_OPCODE_SAVE			0x02
2181 #define SLI4_MGMT_FLASHROM_OPCODE_CLEAR			0x03
2182 #define SLI4_MGMT_FLASHROM_OPCODE_REPORT		0x04
2183 #define SLI4_MGMT_FLASHROM_OPCODE_IMAGE_INFO		0x05
2184 #define SLI4_MGMT_FLASHROM_OPCODE_IMAGE_CRC		0x06
2185 #define SLI4_MGMT_FLASHROM_OPCODE_OFFSET_BASED_FLASH	0x07
2186 #define SLI4_MGMT_FLASHROM_OPCODE_OFFSET_BASED_SAVE	0x08
2187 #define SLI4_MGMT_PHY_FLASHROM_OPCODE_FLASH		0x09
2188 #define SLI4_MGMT_PHY_FLASHROM_OPCODE_SAVE		0x0a
2189 
2190 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ISCSI		0x00
2191 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_REDBOOT		0x01
2192 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_BIOS		0x02
2193 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_PXE_BIOS		0x03
2194 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_CODE_CONTROL	0x04
2195 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_IPSEC_CFG		0x05
2196 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_INIT_DATA		0x06
2197 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ROM_OFFSET	0x07
2198 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_BIOS		0x08
2199 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ISCSI_BAK		0x09
2200 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_ACT		0x0a
2201 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_BAK		0x0b
2202 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_CODE_CTRL_P	0x0c
2203 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_NCSI		0x0d
2204 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_NIC		0x0e
2205 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_DCBX		0x0f
2206 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_PXE_BIOS_CFG	0x10
2207 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ALL_CFG_DATA	0x11
2208 
2209 /**
2210  * @brief COMMON_MANAGE_FAT
2211  */
2212 typedef struct sli4_req_common_manage_fat_s {
2213 	sli4_req_hdr_t	hdr;
2214 #if BYTE_ORDER == LITTLE_ENDIAN
2215 	uint32_t	fat_operation;
2216 	uint32_t	read_log_offset;
2217 	uint32_t	read_log_length;
2218 	uint32_t	data_buffer_size;
2219 	uint32_t	data_buffer;		/* response only */
2220 #else
2221 #error big endian version not defined
2222 #endif
2223 } sli4_req_common_manage_fat_t;
2224 
2225 /**
2226  * @brief COMMON_GET_EXT_FAT_CAPABILITIES
2227  */
2228 typedef struct sli4_req_common_get_ext_fat_capabilities_s {
2229 	sli4_req_hdr_t	hdr;
2230 #if BYTE_ORDER == LITTLE_ENDIAN
2231 	uint32_t	parameter_type;
2232 #else
2233 #error big endian version not defined
2234 #endif
2235 } sli4_req_common_get_ext_fat_capabilities_t;
2236 
2237 /**
2238  * @brief COMMON_SET_EXT_FAT_CAPABILITIES
2239  */
2240 typedef struct sli4_req_common_set_ext_fat_capabilities_s {
2241 	sli4_req_hdr_t	hdr;
2242 #if BYTE_ORDER == LITTLE_ENDIAN
2243 	uint32_t	maximum_log_entries;
2244 	uint32_t	log_entry_size;
2245 	uint32_t	logging_type:8,
2246 			maximum_logging_functions:8,
2247 			maximum_logging_ports:8,
2248 			:8;
2249 	uint32_t	supported_modes;
2250 	uint32_t	number_modules;
2251 	uint32_t	debug_module[14];
2252 #else
2253 #error big endian version not defined
2254 #endif
2255 } sli4_req_common_set_ext_fat_capabilities_t;
2256 
2257 /**
2258  * @brief COMMON_EXT_FAT_CONFIGURE_SNAPSHOT
2259  */
2260 typedef struct sli4_req_common_ext_fat_configure_snapshot_s {
2261 	sli4_req_hdr_t	hdr;
2262 #if BYTE_ORDER == LITTLE_ENDIAN
2263 	uint32_t	total_log_entries;
2264 #else
2265 #error big endian version not defined
2266 #endif
2267 } sli4_req_common_ext_fat_configure_snapshot_t;
2268 
2269 /**
2270  * @brief COMMON_EXT_FAT_RETRIEVE_SNAPSHOT
2271  */
2272 typedef struct sli4_req_common_ext_fat_retrieve_snapshot_s {
2273 	sli4_req_hdr_t	hdr;
2274 #if BYTE_ORDER == LITTLE_ENDIAN
2275 	uint32_t	snapshot_mode;
2276 	uint32_t	start_index;
2277 	uint32_t	number_log_entries;
2278 #else
2279 #error big endian version not defined
2280 #endif
2281 } sli4_req_common_ext_fat_retrieve_snapshot_t;
2282 
2283 typedef struct sli4_res_common_ext_fat_retrieve_snapshot_s {
2284 	sli4_res_hdr_t	hdr;
2285 #if BYTE_ORDER == LITTLE_ENDIAN
2286 	uint32_t	number_log_entries;
2287 	uint32_t	version:8,
2288 			physical_port:8,
2289 			function_id:16;
2290 	uint32_t	trace_level;
2291 	uint32_t	module_mask[2];
2292 	uint32_t	trace_table_index;
2293 	uint32_t	timestamp;
2294 	uint8_t		string_data[16];
2295 	uint32_t	data[6];
2296 #else
2297 #error big endian version not defined
2298 #endif
2299 } sli4_res_common_ext_fat_retrieve_snapshot_t;
2300 
2301 /**
2302  * @brief COMMON_EXT_FAT_READ_STRING_TABLE
2303  */
2304 typedef struct sli4_req_common_ext_fat_read_string_table_s {
2305 	sli4_req_hdr_t	hdr;
2306 #if BYTE_ORDER == LITTLE_ENDIAN
2307 	uint32_t	byte_offset;
2308 	uint32_t	number_bytes;
2309 #else
2310 #error big endian version not defined
2311 #endif
2312 } sli4_req_common_ext_fat_read_string_table_t;
2313 
2314 typedef struct sli4_res_common_ext_fat_read_string_table_s {
2315 	sli4_res_hdr_t	hdr;
2316 #if BYTE_ORDER == LITTLE_ENDIAN
2317 	uint32_t	number_returned_bytes;
2318 	uint32_t	number_remaining_bytes;
2319 	uint32_t	table_data0:8,
2320 			:24;
2321 	uint8_t		table_data[0];
2322 #else
2323 #error big endian version not defined
2324 #endif
2325 } sli4_res_common_ext_fat_read_string_table_t;
2326 
2327 /**
2328  * @brief COMMON_READ_TRANSCEIVER_DATA
2329  *
2330  * This command reads SFF transceiver data(Format is defined
2331  * by the SFF-8472 specification).
2332  */
2333 typedef struct sli4_req_common_read_transceiver_data_s {
2334 	sli4_req_hdr_t	hdr;
2335 #if BYTE_ORDER == LITTLE_ENDIAN
2336 	uint32_t	page_number;
2337 	uint32_t	port;
2338 #else
2339 #error big endian version not defined
2340 #endif
2341 } sli4_req_common_read_transceiver_data_t;
2342 
2343 typedef struct sli4_res_common_read_transceiver_data_s {
2344 	sli4_res_hdr_t	hdr;
2345 #if BYTE_ORDER == LITTLE_ENDIAN
2346 	uint32_t	page_number;
2347 	uint32_t	port;
2348 	uint32_t	page_data[32];
2349 	uint32_t	page_data_2[32];
2350 #else
2351 #error big endian version not defined
2352 #endif
2353 } sli4_res_common_read_transceiver_data_t;
2354 
2355 /**
2356  * @brief COMMON_READ_OBJECT
2357  */
2358 typedef struct sli4_req_common_read_object_s {
2359 	sli4_req_hdr_t	hdr;
2360 #if BYTE_ORDER == LITTLE_ENDIAN
2361 	uint32_t	desired_read_length:24,
2362 			:8;
2363 	uint32_t	read_offset;
2364 	uint8_t		object_name[104];
2365 	uint32_t	host_buffer_descriptor_count;
2366 	sli4_bde_t	host_buffer_descriptor[0];
2367 #else
2368 #error big endian version not defined
2369 #endif
2370 } sli4_req_common_read_object_t;
2371 
2372 typedef struct sli4_res_common_read_object_s {
2373 	sli4_res_hdr_t	hdr;
2374 #if BYTE_ORDER == LITTLE_ENDIAN
2375 	uint32_t	actual_read_length;
2376 	uint32_t	resv:31,
2377 			eof:1;
2378 #else
2379 #error big endian version not defined
2380 #endif
2381 } sli4_res_common_read_object_t;
2382 
2383 /**
2384  * @brief COMMON_WRITE_OBJECT
2385  */
2386 typedef struct sli4_req_common_write_object_s {
2387 	sli4_req_hdr_t	hdr;
2388 #if BYTE_ORDER == LITTLE_ENDIAN
2389 	uint32_t	desired_write_length:24,
2390 			:6,
2391 			noc:1,
2392 			eof:1;
2393 	uint32_t	write_offset;
2394 	uint8_t		object_name[104];
2395 	uint32_t	host_buffer_descriptor_count;
2396 	sli4_bde_t	host_buffer_descriptor[0];
2397 #else
2398 #error big endian version not defined
2399 #endif
2400 } sli4_req_common_write_object_t;
2401 
2402 typedef struct sli4_res_common_write_object_s {
2403 	sli4_res_hdr_t	hdr;
2404 #if BYTE_ORDER == LITTLE_ENDIAN
2405 	uint32_t	actual_write_length;
2406 	uint32_t	change_status:8,
2407 			:24;
2408 #else
2409 #error big endian version not defined
2410 #endif
2411 } sli4_res_common_write_object_t;
2412 
2413 /**
2414  * @brief COMMON_DELETE_OBJECT
2415  */
2416 typedef struct sli4_req_common_delete_object_s {
2417 	sli4_req_hdr_t	hdr;
2418 #if BYTE_ORDER == LITTLE_ENDIAN
2419 	uint32_t	rsvd4;
2420 	uint32_t	rsvd5;
2421 	uint8_t		object_name[104];
2422 #else
2423 #error big endian version not defined
2424 #endif
2425 } sli4_req_common_delete_object_t;
2426 
2427 /**
2428  * @brief COMMON_READ_OBJECT_LIST
2429  */
2430 typedef struct sli4_req_common_read_object_list_s {
2431 	sli4_req_hdr_t	hdr;
2432 #if BYTE_ORDER == LITTLE_ENDIAN
2433 	uint32_t	desired_read_length:24,
2434 			:8;
2435 	uint32_t	read_offset;
2436 	uint8_t		object_name[104];
2437 	uint32_t	host_buffer_descriptor_count;
2438 	sli4_bde_t	host_buffer_descriptor[0];
2439 #else
2440 #error big endian version not defined
2441 #endif
2442 } sli4_req_common_read_object_list_t;
2443 
2444 /**
2445  * @brief COMMON_SET_DUMP_LOCATION
2446  */
2447 typedef struct sli4_req_common_set_dump_location_s {
2448 	sli4_req_hdr_t	hdr;
2449 #if BYTE_ORDER == LITTLE_ENDIAN
2450 	uint32_t	buffer_length:24,
2451 			:5,
2452 			fdb:1,
2453 			blp:1,
2454 			qry:1;
2455 	uint32_t	buf_addr_low;
2456 	uint32_t	buf_addr_high;
2457 #else
2458 #error big endian version not defined
2459 #endif
2460 } sli4_req_common_set_dump_location_t;
2461 
2462 typedef struct sli4_res_common_set_dump_location_s {
2463 	sli4_res_hdr_t	hdr;
2464 #if BYTE_ORDER == LITTLE_ENDIAN
2465 	uint32_t	buffer_length:24,
2466 			:8;
2467 #else
2468 #error big endian version not defined
2469 #endif
2470 }sli4_res_common_set_dump_location_t;
2471 
2472 /**
2473  * @brief COMMON_SET_SET_FEATURES
2474  */
2475 #define SLI4_SET_FEATURES_DIF_SEED			0x01
2476 #define SLI4_SET_FEATURES_XRI_TIMER			0x03
2477 #define SLI4_SET_FEATURES_MAX_PCIE_SPEED		0x04
2478 #define SLI4_SET_FEATURES_FCTL_CHECK			0x05
2479 #define SLI4_SET_FEATURES_FEC				0x06
2480 #define SLI4_SET_FEATURES_PCIE_RECV_DETECT		0x07
2481 #define SLI4_SET_FEATURES_DIF_MEMORY_MODE		0x08
2482 #define SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE	0x09
2483 #define SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS		0x0A
2484 #define SLI4_SET_FEATURES_SET_CONFIG_AUTO_XFER_RDY_T10PI	0x0C
2485 #define SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE	0x0D
2486 #define SLI4_SET_FEATURES_SET_FTD_XFER_HINT		0x0F
2487 #define SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK		0x11
2488 
2489 typedef struct sli4_req_common_set_features_s {
2490 	sli4_req_hdr_t	hdr;
2491 #if BYTE_ORDER == LITTLE_ENDIAN
2492 	uint32_t	feature;
2493 	uint32_t	param_len;
2494 	uint32_t	params[8];
2495 #else
2496 #error big endian version not defined
2497 #endif
2498 } sli4_req_common_set_features_t;
2499 
2500 typedef struct sli4_req_common_set_features_dif_seed_s {
2501 #if BYTE_ORDER == LITTLE_ENDIAN
2502 	uint32_t	seed:16,
2503 		:16;
2504 #else
2505 #error big endian version not defined
2506 #endif
2507 } sli4_req_common_set_features_dif_seed_t;
2508 
2509 typedef struct sli4_req_common_set_features_t10_pi_mem_model_s {
2510 #if BYTE_ORDER == LITTLE_ENDIAN
2511 	uint32_t	tmm:1,
2512 		:31;
2513 #else
2514 #error big endian version not defined
2515 #endif
2516 } sli4_req_common_set_features_t10_pi_mem_model_t;
2517 
2518 typedef struct sli4_req_common_set_features_multirq_s {
2519 #if BYTE_ORDER == LITTLE_ENDIAN
2520 	uint32_t	isr:1,			/*<< Include Sequence Reporting */
2521 			agxfe:1,		/*<< Auto Generate XFER-RDY Feature Enabled */
2522 			:30;
2523 	uint32_t	num_rqs:8,
2524 			rq_select_policy:4,
2525 			:20;
2526 #else
2527 #error big endian version not defined
2528 #endif
2529 } sli4_req_common_set_features_multirq_t;
2530 
2531 typedef struct sli4_req_common_set_features_xfer_rdy_t10pi_s {
2532 #if BYTE_ORDER == LITTLE_ENDIAN
2533 	uint32_t	rtc:1,
2534 			atv:1,
2535 			tmm:1,
2536 			:1,
2537 			p_type:3,
2538 			blk_size:3,
2539 			:22;
2540 	uint32_t	app_tag:16,
2541 			:16;
2542 #else
2543 #error big endian version not defined
2544 #endif
2545 } sli4_req_common_set_features_xfer_rdy_t10pi_t;
2546 
2547 typedef struct sli4_req_common_set_features_health_check_s {
2548 #if BYTE_ORDER == LITTLE_ENDIAN
2549 	uint32_t	hck:1,
2550 			qry:1,
2551 			:30;
2552 #else
2553 #error big endian version not defined
2554 #endif
2555 } sli4_req_common_set_features_health_check_t;
2556 
2557 typedef struct sli4_req_common_set_features_set_fdt_xfer_hint_s {
2558 #if BYTE_ORDER == LITTLE_ENDIAN
2559 	uint32_t	fdt_xfer_hint;
2560 #else
2561 #error big endian version not defined
2562 #endif
2563 } sli4_req_common_set_features_set_fdt_xfer_hint_t;
2564 
2565 /**
2566  * @brief DMTF_EXEC_CLP_CMD
2567  */
2568 typedef struct sli4_req_dmtf_exec_clp_cmd_s {
2569 	sli4_req_hdr_t	hdr;
2570 #if BYTE_ORDER == LITTLE_ENDIAN
2571 	uint32_t	cmd_buf_length;
2572 	uint32_t	resp_buf_length;
2573 	uint32_t	cmd_buf_addr_low;
2574 	uint32_t	cmd_buf_addr_high;
2575 	uint32_t	resp_buf_addr_low;
2576 	uint32_t	resp_buf_addr_high;
2577 #else
2578 #error big endian version not defined
2579 #endif
2580 } sli4_req_dmtf_exec_clp_cmd_t;
2581 
2582 typedef struct sli4_res_dmtf_exec_clp_cmd_s {
2583 	sli4_res_hdr_t	hdr;
2584 #if BYTE_ORDER == LITTLE_ENDIAN
2585 	uint32_t	:32;
2586 	uint32_t	resp_length;
2587 	uint32_t	:32;
2588 	uint32_t	:32;
2589 	uint32_t	:32;
2590 	uint32_t	:32;
2591 	uint32_t	clp_status;
2592 	uint32_t	clp_detailed_status;
2593 #else
2594 #error big endian version not defined
2595 #endif
2596 } sli4_res_dmtf_exec_clp_cmd_t;
2597 
2598 /**
2599  * @brief Resource descriptor
2600  */
2601 
2602 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_PCIE	0x50
2603 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_NIC	0x51
2604 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_ISCSI	0x52
2605 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_FCFCOE	0x53
2606 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_RDMA	0x54
2607 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_PORT	0x55
2608 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_ISAP	0x56
2609 
2610 #define SLI4_PROTOCOL_NIC_TOE			0x01
2611 #define SLI4_PROTOCOL_ISCSI			0x02
2612 #define SLI4_PROTOCOL_FCOE			0x04
2613 #define SLI4_PROTOCOL_NIC_TOE_RDMA		0x08
2614 #define SLI4_PROTOCOL_FC			0x10
2615 #define SLI4_PROTOCOL_DEFAULT			0xff
2616 
2617 typedef struct sli4_resource_descriptor_v1_s {
2618 	uint32_t	descriptor_type:8,
2619 			descriptor_length:8,
2620 			:16;
2621 	uint32_t	type_specific[0];
2622 } sli4_resource_descriptor_v1_t;
2623 
2624 typedef struct sli4_pcie_resource_descriptor_v1_s {
2625 	uint32_t	descriptor_type:8,
2626 			descriptor_length:8,
2627 			:14,
2628 			imm:1,
2629 			nosv:1;
2630 	uint32_t	:16,
2631 			pf_number:10,
2632 			:6;
2633 	uint32_t        rsvd1;
2634 	uint32_t        sriov_state:8,
2635 			pf_state:8,
2636 			pf_type:8,
2637 			:8;
2638 	uint32_t        number_of_vfs:16,
2639 			:16;
2640 	uint32_t        mission_roles:8,
2641 			:19,
2642 			pchg:1,
2643 			schg:1,
2644 			xchg:1,
2645 			xrom:2;
2646 	uint32_t        rsvd2[16];
2647 } sli4_pcie_resource_descriptor_v1_t;
2648 
2649 typedef struct sli4_isap_resource_descriptor_v1_s {
2650 	uint32_t        descriptor_type:8,
2651 			descriptor_length:8,
2652 			:16;
2653 	uint32_t        iscsi_tgt:1,
2654 			iscsi_ini:1,
2655 			iscsi_dif:1,
2656 			:29;
2657 	uint32_t        rsvd1[3];
2658 	uint32_t        fcoe_tgt:1,
2659 			fcoe_ini:1,
2660 			fcoe_dif:1,
2661 			:29;
2662 	uint32_t        rsvd2[7];
2663 	uint32_t        mc_type0:8,
2664 			mc_type1:8,
2665 			mc_type2:8,
2666 			mc_type3:8;
2667 	uint32_t        rsvd3[3];
2668 } sli4_isap_resouce_descriptor_v1_t;
2669 
2670 /**
2671  * @brief COMMON_GET_FUNCTION_CONFIG
2672  */
2673 typedef struct sli4_req_common_get_function_config_s {
2674 	sli4_req_hdr_t  hdr;
2675 } sli4_req_common_get_function_config_t;
2676 
2677 typedef struct sli4_res_common_get_function_config_s {
2678 	sli4_res_hdr_t  hdr;
2679 #if BYTE_ORDER == LITTLE_ENDIAN
2680 	uint32_t        desc_count;
2681 	uint32_t        desc[54];
2682 #else
2683 #error big endian version not defined
2684 #endif
2685 } sli4_res_common_get_function_config_t;
2686 
2687 /**
2688  * @brief COMMON_GET_PROFILE_CONFIG
2689  */
2690 typedef struct sli4_req_common_get_profile_config_s {
2691 	sli4_req_hdr_t  hdr;
2692 	uint32_t        profile_id:8,
2693 			typ:2,
2694 			:22;
2695 } sli4_req_common_get_profile_config_t;
2696 
2697 typedef struct sli4_res_common_get_profile_config_s {
2698 	sli4_res_hdr_t  hdr;
2699 #if BYTE_ORDER == LITTLE_ENDIAN
2700 	uint32_t        desc_count;
2701 	uint32_t        desc[0];
2702 #else
2703 #error big endian version not defined
2704 #endif
2705 } sli4_res_common_get_profile_config_t;
2706 
2707 /**
2708  * @brief COMMON_SET_PROFILE_CONFIG
2709  */
2710 typedef struct sli4_req_common_set_profile_config_s {
2711 	sli4_req_hdr_t  hdr;
2712 	uint32_t        profile_id:8,
2713 			:23,
2714 			isap:1;
2715 	uint32_t        desc_count;
2716 	uint32_t        desc[0];
2717 } sli4_req_common_set_profile_config_t;
2718 
2719 typedef struct sli4_res_common_set_profile_config_s {
2720 	sli4_res_hdr_t  hdr;
2721 #if BYTE_ORDER == LITTLE_ENDIAN
2722 #else
2723 #error big endian version not defined
2724 #endif
2725 } sli4_res_common_set_profile_config_t;
2726 
2727 /**
2728  * @brief Profile Descriptor for profile functions
2729  */
2730 typedef struct sli4_profile_descriptor_s {
2731 #if BYTE_ORDER == LITTLE_ENDIAN
2732 	uint32_t        profile_id:8,
2733 			:8,
2734 			profile_index:8,
2735 			:8;
2736 	uint32_t        profile_description[128];
2737 #else
2738 #error big endian version not defined
2739 #endif
2740 } sli4_profile_descriptor_t;
2741 
2742 /* We don't know in advance how many descriptors there are.  We have
2743    to pick a number that we think will be big enough and ask for that
2744    many. */
2745 
2746 #define MAX_PRODUCT_DESCRIPTORS 40
2747 
2748 /**
2749  * @brief COMMON_GET_PROFILE_LIST
2750  */
2751 typedef struct sli4_req_common_get_profile_list_s {
2752 	sli4_req_hdr_t  hdr;
2753 #if BYTE_ORDER == LITTLE_ENDIAN
2754 	uint32_t        start_profile_index:8,
2755 			:24;
2756 #else
2757 #error big endian version not defined
2758 #endif
2759 } sli4_req_common_get_profile_list_t;
2760 
2761 typedef struct sli4_res_common_get_profile_list_s {
2762 	sli4_res_hdr_t  hdr;
2763 #if BYTE_ORDER == LITTLE_ENDIAN
2764 	uint32_t        profile_descriptor_count;
2765 	sli4_profile_descriptor_t profile_descriptor[MAX_PRODUCT_DESCRIPTORS];
2766 #else
2767 #error big endian version not defined
2768 #endif
2769 } sli4_res_common_get_profile_list_t;
2770 
2771 /**
2772  * @brief COMMON_GET_ACTIVE_PROFILE
2773  */
2774 typedef struct sli4_req_common_get_active_profile_s {
2775 	sli4_req_hdr_t  hdr;
2776 } sli4_req_common_get_active_profile_t;
2777 
2778 typedef struct sli4_res_common_get_active_profile_s {
2779 	sli4_res_hdr_t  hdr;
2780 #if BYTE_ORDER == LITTLE_ENDIAN
2781 	uint32_t        active_profile_id:8,
2782 			:8,
2783 			next_profile_id:8,
2784 			:8;
2785 #else
2786 #error big endian version not defined
2787 #endif
2788 } sli4_res_common_get_active_profile_t;
2789 
2790 /**
2791  * @brief COMMON_SET_ACTIVE_PROFILE
2792  */
2793 typedef struct sli4_req_common_set_active_profile_s {
2794 	sli4_req_hdr_t  hdr;
2795 #if BYTE_ORDER == LITTLE_ENDIAN
2796 	uint32_t        active_profile_id:8,
2797 			:23,
2798 			fd:1;
2799 #else
2800 #error big endian version not defined
2801 #endif
2802 } sli4_req_common_set_active_profile_t;
2803 
2804 typedef struct sli4_res_common_set_active_profile_s {
2805 	sli4_res_hdr_t  hdr;
2806 } sli4_res_common_set_active_profile_t;
2807 
2808 /**
2809  * @brief Link Config Descriptor for link config functions
2810  */
2811 typedef struct sli4_link_config_descriptor_s {
2812 #if BYTE_ORDER == LITTLE_ENDIAN
2813 	uint32_t        link_config_id:8,
2814 			:24;
2815 	uint32_t        config_description[8];
2816 #else
2817 #error big endian version not defined
2818 #endif
2819 } sli4_link_config_descriptor_t;
2820 
2821 #define MAX_LINK_CONFIG_DESCRIPTORS 10
2822 
2823 /**
2824  * @brief COMMON_GET_RECONFIG_LINK_INFO
2825  */
2826 typedef struct sli4_req_common_get_reconfig_link_info_s {
2827 	sli4_req_hdr_t  hdr;
2828 #if BYTE_ORDER == LITTLE_ENDIAN
2829 #else
2830 #error big endian version not defined
2831 #endif
2832 } sli4_req_common_get_reconfig_link_info_t;
2833 
2834 typedef struct sli4_res_common_get_reconfig_link_info_s {
2835 	sli4_res_hdr_t  hdr;
2836 #if BYTE_ORDER == LITTLE_ENDIAN
2837 	uint32_t	active_link_config_id:8,
2838 			:8,
2839 			next_link_config_id:8,
2840 			:8;
2841 	uint32_t	link_configuration_descriptor_count;
2842 	sli4_link_config_descriptor_t	desc[MAX_LINK_CONFIG_DESCRIPTORS];
2843 #else
2844 #error big endian version not defined
2845 #endif
2846 } sli4_res_common_get_reconfig_link_info_t;
2847 
2848 /**
2849  * @brief COMMON_SET_RECONFIG_LINK_ID
2850  */
2851 typedef struct sli4_req_common_set_reconfig_link_id_s {
2852 	sli4_req_hdr_t  hdr;
2853 #if BYTE_ORDER == LITTLE_ENDIAN
2854 	uint32_t	next_link_config_id:8,
2855 			:23,
2856 			fd:1;
2857 #else
2858 #error big endian version not defined
2859 #endif
2860 } sli4_req_common_set_reconfig_link_id_t;
2861 
2862 typedef struct sli4_res_common_set_reconfig_link_id_s {
2863 	sli4_res_hdr_t  hdr;
2864 #if BYTE_ORDER == LITTLE_ENDIAN
2865 #else
2866 #error big endian version not defined
2867 #endif
2868 } sli4_res_common_set_reconfig_link_id_t;
2869 
2870 typedef struct sli4_req_lowlevel_set_watchdog_s {
2871 	sli4_req_hdr_t	hdr;
2872 #if BYTE_ORDER == LITTLE_ENDIAN
2873 	uint32_t	watchdog_timeout:16,
2874 			:16;
2875 #else
2876 #error big endian version not defined
2877 #endif
2878 
2879 } sli4_req_lowlevel_set_watchdog_t;
2880 
2881 typedef struct sli4_res_lowlevel_set_watchdog_s {
2882 	sli4_res_hdr_t	hdr;
2883 #if BYTE_ORDER == LITTLE_ENDIAN
2884 	uint32_t	rsvd;
2885 #else
2886 #error big endian version not defined
2887 #endif
2888 } sli4_res_lowlevel_set_watchdog_t;
2889 
2890 /**
2891  * @brief Event Queue Entry
2892  */
2893 typedef struct sli4_eqe_s {
2894 #if BYTE_ORDER == LITTLE_ENDIAN
2895 	uint32_t	vld:1,		/** valid */
2896 			major_code:3,
2897 			minor_code:12,
2898 			resource_id:16;
2899 #else
2900 #error big endian version not defined
2901 #endif
2902 } sli4_eqe_t;
2903 
2904 #define SLI4_MAJOR_CODE_STANDARD	0
2905 #define SLI4_MAJOR_CODE_SENTINEL	1
2906 
2907 /**
2908  * @brief Mailbox Completion Queue Entry
2909  *
2910  * A CQE generated on the completion of a MQE from a MQ.
2911  */
2912 typedef struct sli4_mcqe_s {
2913 #if BYTE_ORDER == LITTLE_ENDIAN
2914 	uint32_t	completion_status:16, /** values are protocol specific */
2915 			extended_status:16;
2916 	uint32_t	mqe_tag_low;
2917 	uint32_t	mqe_tag_high;
2918 	uint32_t	:27,
2919 			con:1,		/** consumed - command now being executed */
2920 			cmp:1,		/** completed - command still executing if clear */
2921 			:1,
2922 			ae:1,		/** async event - this is an ACQE */
2923 			val:1;		/** valid - contents of CQE are valid */
2924 #else
2925 #error big endian version not defined
2926 #endif
2927 } sli4_mcqe_t;
2928 
2929 /**
2930  * @brief Asynchronous Completion Queue Entry
2931  *
2932  * A CQE generated asynchronously in response to the link or other internal events.
2933  */
2934 typedef struct sli4_acqe_s {
2935 #if BYTE_ORDER == LITTLE_ENDIAN
2936 	uint32_t	event_data[3];
2937 	uint32_t	:8,
2938 			event_code:8,
2939 			event_type:8,	/** values are protocol specific */
2940 			:6,
2941 			ae:1,		/** async event - this is an ACQE */
2942 			val:1;		/** valid - contents of CQE are valid */
2943 #else
2944 #error big endian version not defined
2945 #endif
2946 } sli4_acqe_t;
2947 
2948 #define SLI4_ACQE_EVENT_CODE_LINK_STATE		0x01
2949 #define SLI4_ACQE_EVENT_CODE_FCOE_FIP		0x02
2950 #define SLI4_ACQE_EVENT_CODE_DCBX		0x03
2951 #define SLI4_ACQE_EVENT_CODE_ISCSI		0x04
2952 #define SLI4_ACQE_EVENT_CODE_GRP_5		0x05
2953 #define SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT	0x10
2954 #define SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT	0x11
2955 #define SLI4_ACQE_EVENT_CODE_VF_EVENT		0x12
2956 #define SLI4_ACQE_EVENT_CODE_MR_EVENT		0x13
2957 
2958 /**
2959  * @brief Register name enums
2960  */
2961 typedef enum {
2962 	SLI4_REG_BMBX,
2963 	SLI4_REG_EQCQ_DOORBELL,
2964 	SLI4_REG_FCOE_RQ_DOORBELL,
2965 	SLI4_REG_IO_WQ_DOORBELL,
2966 	SLI4_REG_MQ_DOORBELL,
2967 	SLI4_REG_PHYSDEV_CONTROL,
2968 	SLI4_REG_SLIPORT_CONTROL,
2969 	SLI4_REG_SLIPORT_ERROR1,
2970 	SLI4_REG_SLIPORT_ERROR2,
2971 	SLI4_REG_SLIPORT_SEMAPHORE,
2972 	SLI4_REG_SLIPORT_STATUS,
2973 	SLI4_REG_UERR_MASK_HI,
2974 	SLI4_REG_UERR_MASK_LO,
2975 	SLI4_REG_UERR_STATUS_HI,
2976 	SLI4_REG_UERR_STATUS_LO,
2977 	SLI4_REG_SW_UE_CSR1,
2978 	SLI4_REG_SW_UE_CSR2,
2979 	SLI4_REG_MAX			/* must be last */
2980 } sli4_regname_e;
2981 
2982 typedef struct sli4_reg_s {
2983 	uint32_t	rset;
2984 	uint32_t	off;
2985 } sli4_reg_t;
2986 
2987 typedef enum {
2988 	SLI_QTYPE_EQ,
2989 	SLI_QTYPE_CQ,
2990 	SLI_QTYPE_MQ,
2991 	SLI_QTYPE_WQ,
2992 	SLI_QTYPE_RQ,
2993 	SLI_QTYPE_MAX,			/* must be last */
2994 } sli4_qtype_e;
2995 
2996 #define SLI_USER_MQ_COUNT	1	/** User specified max mail queues */
2997 #define SLI_MAX_CQ_SET_COUNT	16
2998 #define SLI_MAX_RQ_SET_COUNT	16
2999 
3000 typedef enum {
3001 	SLI_QENTRY_ASYNC,
3002 	SLI_QENTRY_MQ,
3003 	SLI_QENTRY_RQ,
3004 	SLI_QENTRY_WQ,
3005 	SLI_QENTRY_WQ_RELEASE,
3006 	SLI_QENTRY_OPT_WRITE_CMD,
3007 	SLI_QENTRY_OPT_WRITE_DATA,
3008 	SLI_QENTRY_XABT,
3009 	SLI_QENTRY_MAX			/* must be last */
3010 } sli4_qentry_e;
3011 
3012 typedef struct sli4_queue_s {
3013 	/* Common to all queue types */
3014 	ocs_dma_t	dma;
3015 	ocs_lock_t	lock;
3016 	uint32_t	index;		/** current host entry index */
3017 	uint16_t	size;		/** entry size */
3018 	uint16_t	length;		/** number of entries */
3019 	uint16_t	n_posted;	/** number entries posted */
3020 	uint16_t	id;		/** Port assigned xQ_ID */
3021 	uint16_t	ulp;		/** ULP assigned to this queue */
3022 	uint32_t	doorbell_offset;/** The offset for the doorbell */
3023 	uint16_t	doorbell_rset;	/** register set for the doorbell */
3024 	uint8_t		type;		/** queue type ie EQ, CQ, ... */
3025 	uint32_t	proc_limit;	/** limit number of CQE processed per iteration */
3026 	uint32_t	posted_limit;	/** number of CQE/EQE to process before ringing doorbell */
3027 	uint32_t	max_num_processed;
3028 	time_t		max_process_time;
3029 
3030 	/* Type specific gunk */
3031 	union {
3032 		uint32_t	r_idx;	/** "read" index (MQ only) */
3033 		struct {
3034 			uint32_t	is_mq:1,/** CQ contains MQ/Async completions */
3035 					is_hdr:1,/** is a RQ for packet headers */
3036 					rq_batch:1;/** RQ index incremented by 8 */
3037 		} flag;
3038 	} u;
3039 } sli4_queue_t;
3040 
3041 static inline void
3042 sli_queue_lock(sli4_queue_t *q)
3043 {
3044 	ocs_lock(&q->lock);
3045 }
3046 
3047 static inline void
3048 sli_queue_unlock(sli4_queue_t *q)
3049 {
3050 	ocs_unlock(&q->lock);
3051 }
3052 
3053 #define SLI4_QUEUE_DEFAULT_CQ	UINT16_MAX /** Use the default CQ */
3054 
3055 #define SLI4_QUEUE_RQ_BATCH	8
3056 
3057 typedef enum {
3058 	SLI4_CB_LINK,
3059 	SLI4_CB_FIP,
3060 	SLI4_CB_MAX			/* must be last */
3061 } sli4_callback_e;
3062 
3063 typedef enum {
3064 	SLI_LINK_STATUS_UP,
3065 	SLI_LINK_STATUS_DOWN,
3066 	SLI_LINK_STATUS_NO_ALPA,
3067 	SLI_LINK_STATUS_MAX,
3068 } sli4_link_status_e;
3069 
3070 typedef enum {
3071 	SLI_LINK_TOPO_NPORT = 1,	/** fabric or point-to-point */
3072 	SLI_LINK_TOPO_LOOP,
3073 	SLI_LINK_TOPO_LOOPBACK_INTERNAL,
3074 	SLI_LINK_TOPO_LOOPBACK_EXTERNAL,
3075 	SLI_LINK_TOPO_NONE,
3076 	SLI_LINK_TOPO_MAX,
3077 } sli4_link_topology_e;
3078 
3079 /* TODO do we need both sli4_port_type_e & sli4_link_medium_e */
3080 typedef enum {
3081 	SLI_LINK_MEDIUM_ETHERNET,
3082 	SLI_LINK_MEDIUM_FC,
3083 	SLI_LINK_MEDIUM_MAX,
3084 } sli4_link_medium_e;
3085 
3086 typedef struct sli4_link_event_s {
3087 	sli4_link_status_e	status;		/* link up/down */
3088 	sli4_link_topology_e	topology;
3089 	sli4_link_medium_e	medium;		/* Ethernet / FC */
3090 	uint32_t		speed;		/* Mbps */
3091 	uint8_t			*loop_map;
3092 	uint32_t		fc_id;
3093 } sli4_link_event_t;
3094 
3095 /**
3096  * @brief Fields retrieved from skyhawk that used used to build chained SGL
3097  */
3098 typedef struct sli4_sgl_chaining_params_s {
3099 	uint8_t		chaining_capable;
3100 	uint16_t	frag_num_field_offset;
3101 	uint16_t	sgl_index_field_offset;
3102 	uint64_t	frag_num_field_mask;
3103 	uint64_t	sgl_index_field_mask;
3104 	uint32_t	chain_sge_initial_value_lo;
3105 	uint32_t	chain_sge_initial_value_hi;
3106 } sli4_sgl_chaining_params_t;
3107 
3108 typedef struct sli4_fip_event_s {
3109 	uint32_t	type;
3110 	uint32_t	index;		/* FCF index or UINT32_MAX if invalid */
3111 } sli4_fip_event_t;
3112 
3113 typedef enum {
3114 	SLI_RSRC_FCOE_VFI,
3115 	SLI_RSRC_FCOE_VPI,
3116 	SLI_RSRC_FCOE_RPI,
3117 	SLI_RSRC_FCOE_XRI,
3118 	SLI_RSRC_FCOE_FCFI,
3119 	SLI_RSRC_MAX			/* must be last */
3120 } sli4_resource_e;
3121 
3122 typedef enum {
3123 	SLI4_PORT_TYPE_FC,
3124 	SLI4_PORT_TYPE_NIC,
3125 	SLI4_PORT_TYPE_MAX		/* must be last */
3126 } sli4_port_type_e;
3127 
3128 typedef enum {
3129 	SLI4_ASIC_TYPE_BE3 = 1,
3130 	SLI4_ASIC_TYPE_SKYHAWK,
3131 	SLI4_ASIC_TYPE_LANCER,
3132 	SLI4_ASIC_TYPE_CORSAIR,
3133 	SLI4_ASIC_TYPE_LANCERG6,
3134 } sli4_asic_type_e;
3135 
3136 typedef enum {
3137 	SLI4_ASIC_REV_FPGA = 1,
3138 	SLI4_ASIC_REV_A0,
3139 	SLI4_ASIC_REV_A1,
3140 	SLI4_ASIC_REV_A2,
3141 	SLI4_ASIC_REV_A3,
3142 	SLI4_ASIC_REV_B0,
3143 	SLI4_ASIC_REV_B1,
3144 	SLI4_ASIC_REV_C0,
3145 	SLI4_ASIC_REV_D0,
3146 } sli4_asic_rev_e;
3147 
3148 typedef struct sli4_s {
3149 	ocs_os_handle_t	os;
3150 	sli4_port_type_e port_type;
3151 
3152 	uint32_t	sli_rev;	/* SLI revision number */
3153 	uint32_t	sli_family;
3154 	uint32_t	if_type;	/* SLI Interface type */
3155 
3156 	sli4_asic_type_e asic_type;	/*<< ASIC type */
3157 	sli4_asic_rev_e asic_rev;	/*<< ASIC revision */
3158 	uint32_t	physical_port;
3159 
3160 	struct {
3161 		uint16_t		e_d_tov;
3162 		uint16_t		r_a_tov;
3163 		uint16_t		max_qcount[SLI_QTYPE_MAX];
3164 		uint32_t		max_qentries[SLI_QTYPE_MAX];
3165 		uint16_t		count_mask[SLI_QTYPE_MAX];
3166 		uint16_t		count_method[SLI_QTYPE_MAX];
3167 		uint32_t		qpage_count[SLI_QTYPE_MAX];
3168 		uint16_t		link_module_type;
3169 		uint8_t			rq_batch;
3170 		uint16_t		rq_min_buf_size;
3171 		uint32_t		rq_max_buf_size;
3172 		uint8_t			topology;
3173 		uint8_t			wwpn[8];
3174 		uint8_t			wwnn[8];
3175 		uint32_t		fw_rev[2];
3176 		uint8_t			fw_name[2][16];
3177 		char			ipl_name[16];
3178 		uint32_t		hw_rev[3];
3179 		uint8_t			port_number;
3180 		char			port_name[2];
3181 		char			bios_version_string[32];
3182 		uint8_t			dual_ulp_capable;
3183 		uint8_t			is_ulp_fc[2];
3184 		/*
3185 		 * Tracks the port resources using extents metaphor. For
3186 		 * devices that don't implement extents (i.e.
3187 		 * has_extents == FALSE), the code models each resource as
3188 		 * a single large extent.
3189 		 */
3190 		struct {
3191 			uint32_t	number;	/* number of extents */
3192 			uint32_t	size;	/* number of elements in each extent */
3193 			uint32_t	n_alloc;/* number of elements allocated */
3194 			uint32_t	*base;
3195 			ocs_bitmap_t	*use_map;/* bitmap showing resources in use */
3196 			uint32_t	map_size;/* number of bits in bitmap */
3197 		} extent[SLI_RSRC_MAX];
3198 		sli4_features_t		features;
3199 		uint32_t		has_extents:1,
3200 					auto_reg:1,
3201 					auto_xfer_rdy:1,
3202 					hdr_template_req:1,
3203 					perf_hint:1,
3204 					perf_wq_id_association:1,
3205 					cq_create_version:2,
3206 					mq_create_version:2,
3207 					high_login_mode:1,
3208 					sgl_pre_registered:1,
3209 					sgl_pre_registration_required:1,
3210 					t10_dif_inline_capable:1,
3211 					t10_dif_separate_capable:1;
3212 		uint32_t		sge_supported_length;
3213 		uint32_t		sgl_page_sizes;
3214 		uint32_t		max_sgl_pages;
3215 		sli4_sgl_chaining_params_t sgl_chaining_params;
3216 		size_t			wqe_size;
3217 	} config;
3218 
3219 	/*
3220 	 * Callback functions
3221 	 */
3222 	int32_t		(*link)(void *, void *);
3223 	void		*link_arg;
3224 	int32_t		(*fip)(void *, void *);
3225 	void		*fip_arg;
3226 
3227 	ocs_dma_t	bmbx;
3228 #if defined(OCS_INCLUDE_DEBUG)
3229 	/* Save pointer to physical memory descriptor for non-embedded SLI_CONFIG
3230 	 * commands for BMBX dumping purposes */
3231 	ocs_dma_t	*bmbx_non_emb_pmd;
3232 #endif
3233 
3234 	struct {
3235 		ocs_dma_t	data;
3236 		uint32_t	length;
3237 	} vpd;
3238 } sli4_t;
3239 
3240 /**
3241  * Get / set parameter functions
3242  */
3243 static inline uint32_t
3244 sli_get_max_rsrc(sli4_t *sli4, sli4_resource_e rsrc)
3245 {
3246 	if (rsrc >= SLI_RSRC_MAX) {
3247 		return 0;
3248 	}
3249 
3250 	return sli4->config.extent[rsrc].size;
3251 }
3252 
3253 static inline uint32_t
3254 sli_get_max_queue(sli4_t *sli4, sli4_qtype_e qtype)
3255 {
3256 	if (qtype >= SLI_QTYPE_MAX) {
3257 		return 0;
3258 	}
3259 	return sli4->config.max_qcount[qtype];
3260 }
3261 
3262 static inline uint32_t
3263 sli_get_max_qentries(sli4_t *sli4, sli4_qtype_e qtype)
3264 {
3265 
3266 	return sli4->config.max_qentries[qtype];
3267 }
3268 
3269 static inline uint32_t
3270 sli_get_max_sge(sli4_t *sli4)
3271 {
3272 	return sli4->config.sge_supported_length;
3273 }
3274 
3275 static inline uint32_t
3276 sli_get_max_sgl(sli4_t *sli4)
3277 {
3278 
3279 	if (sli4->config.sgl_page_sizes != 1) {
3280 		ocs_log_test(sli4->os, "unsupported SGL page sizes %#x\n",
3281 				sli4->config.sgl_page_sizes);
3282 		return 0;
3283 	}
3284 
3285 	return ((sli4->config.max_sgl_pages * SLI_PAGE_SIZE) / sizeof(sli4_sge_t));
3286 }
3287 
3288 static inline sli4_link_medium_e
3289 sli_get_medium(sli4_t *sli4)
3290 {
3291 	switch (sli4->config.topology) {
3292 	case SLI4_READ_CFG_TOPO_FCOE:
3293 		return SLI_LINK_MEDIUM_ETHERNET;
3294 	case SLI4_READ_CFG_TOPO_FC:
3295 	case SLI4_READ_CFG_TOPO_FC_DA:
3296 	case SLI4_READ_CFG_TOPO_FC_AL:
3297 		return SLI_LINK_MEDIUM_FC;
3298 	default:
3299 		return SLI_LINK_MEDIUM_MAX;
3300 	}
3301 }
3302 
3303 static inline void
3304 sli_skh_chain_sge_build(sli4_t *sli4, sli4_sge_t *sge, uint32_t xri_index, uint32_t frag_num, uint32_t offset)
3305 {
3306 	sli4_sgl_chaining_params_t *cparms = &sli4->config.sgl_chaining_params;
3307 
3308 	ocs_memset(sge, 0, sizeof(*sge));
3309 	sge->sge_type = SLI4_SGE_TYPE_CHAIN;
3310 	sge->buffer_address_high = (uint32_t)cparms->chain_sge_initial_value_hi;
3311 	sge->buffer_address_low =
3312 		(uint32_t)((cparms->chain_sge_initial_value_lo |
3313 			    (((uintptr_t)(xri_index & cparms->sgl_index_field_mask)) <<
3314 			     cparms->sgl_index_field_offset) |
3315 			    (((uintptr_t)(frag_num & cparms->frag_num_field_mask)) <<
3316 			     cparms->frag_num_field_offset)  |
3317 			    offset) >> 3);
3318 }
3319 
3320 static inline uint32_t
3321 sli_get_sli_rev(sli4_t *sli4)
3322 {
3323 	return sli4->sli_rev;
3324 }
3325 
3326 static inline uint32_t
3327 sli_get_sli_family(sli4_t *sli4)
3328 {
3329 	return sli4->sli_family;
3330 }
3331 
3332 static inline uint32_t
3333 sli_get_if_type(sli4_t *sli4)
3334 {
3335 	return sli4->if_type;
3336 }
3337 
3338 static inline void *
3339 sli_get_wwn_port(sli4_t *sli4)
3340 {
3341 	return sli4->config.wwpn;
3342 }
3343 
3344 static inline void *
3345 sli_get_wwn_node(sli4_t *sli4)
3346 {
3347 	return sli4->config.wwnn;
3348 }
3349 
3350 static inline void *
3351 sli_get_vpd(sli4_t *sli4)
3352 {
3353 	return sli4->vpd.data.virt;
3354 }
3355 
3356 static inline uint32_t
3357 sli_get_vpd_len(sli4_t *sli4)
3358 {
3359 	return sli4->vpd.length;
3360 }
3361 
3362 static inline uint32_t
3363 sli_get_fw_revision(sli4_t *sli4, uint32_t which)
3364 {
3365 	return sli4->config.fw_rev[which];
3366 }
3367 
3368 static inline void *
3369 sli_get_fw_name(sli4_t *sli4, uint32_t which)
3370 {
3371 	return sli4->config.fw_name[which];
3372 }
3373 
3374 static inline char *
3375 sli_get_ipl_name(sli4_t *sli4)
3376 {
3377 	return sli4->config.ipl_name;
3378 }
3379 
3380 static inline uint32_t
3381 sli_get_hw_revision(sli4_t *sli4, uint32_t which)
3382 {
3383 	return sli4->config.hw_rev[which];
3384 }
3385 
3386 static inline uint32_t
3387 sli_get_auto_xfer_rdy_capable(sli4_t *sli4)
3388 {
3389 	return sli4->config.auto_xfer_rdy;
3390 }
3391 
3392 static inline uint32_t
3393 sli_get_dif_capable(sli4_t *sli4)
3394 {
3395 	return sli4->config.features.flag.dif;
3396 }
3397 
3398 static inline uint32_t
3399 sli_is_dif_inline_capable(sli4_t *sli4)
3400 {
3401 	return sli_get_dif_capable(sli4) && sli4->config.t10_dif_inline_capable;
3402 }
3403 
3404 static inline uint32_t
3405 sli_is_dif_separate_capable(sli4_t *sli4)
3406 {
3407 	return sli_get_dif_capable(sli4) && sli4->config.t10_dif_separate_capable;
3408 }
3409 
3410 static inline uint32_t
3411 sli_get_is_dual_ulp_capable(sli4_t *sli4)
3412 {
3413 	return sli4->config.dual_ulp_capable;
3414 }
3415 
3416 static inline uint32_t
3417 sli_get_is_sgl_chaining_capable(sli4_t *sli4)
3418 {
3419 	return sli4->config.sgl_chaining_params.chaining_capable;
3420 }
3421 
3422 static inline uint32_t
3423 sli_get_is_ulp_enabled(sli4_t *sli4, uint16_t ulp)
3424 {
3425 	return sli4->config.is_ulp_fc[ulp];
3426 }
3427 
3428 static inline uint32_t
3429 sli_get_hlm_capable(sli4_t *sli4)
3430 {
3431 	return sli4->config.features.flag.hlm;
3432 }
3433 
3434 static inline int32_t
3435 sli_set_hlm(sli4_t *sli4, uint32_t value)
3436 {
3437 	if (value && !sli4->config.features.flag.hlm) {
3438 		ocs_log_test(sli4->os, "HLM not supported\n");
3439 		return -1;
3440 	}
3441 
3442 	sli4->config.high_login_mode = value != 0 ? TRUE : FALSE;
3443 
3444 	return 0;
3445 }
3446 
3447 static inline uint32_t
3448 sli_get_hlm(sli4_t *sli4)
3449 {
3450 	return sli4->config.high_login_mode;
3451 }
3452 
3453 static inline uint32_t
3454 sli_get_sgl_preregister_required(sli4_t *sli4)
3455 {
3456 	return sli4->config.sgl_pre_registration_required;
3457 }
3458 
3459 static inline uint32_t
3460 sli_get_sgl_preregister(sli4_t *sli4)
3461 {
3462 	return sli4->config.sgl_pre_registered;
3463 }
3464 
3465 static inline int32_t
3466 sli_set_sgl_preregister(sli4_t *sli4, uint32_t value)
3467 {
3468 	if ((value == 0) && sli4->config.sgl_pre_registration_required) {
3469 		ocs_log_test(sli4->os, "SGL pre-registration required\n");
3470 		return -1;
3471 	}
3472 
3473 	sli4->config.sgl_pre_registered = value != 0 ? TRUE : FALSE;
3474 
3475 	return 0;
3476 }
3477 
3478 static inline sli4_asic_type_e
3479 sli_get_asic_type(sli4_t *sli4)
3480 {
3481 	return sli4->asic_type;
3482 }
3483 
3484 static inline sli4_asic_rev_e
3485 sli_get_asic_rev(sli4_t *sli4)
3486 {
3487 	return sli4->asic_rev;
3488 }
3489 
3490 static inline int32_t
3491 sli_set_topology(sli4_t *sli4, uint32_t value)
3492 {
3493 	int32_t	rc = 0;
3494 
3495 	switch (value) {
3496 	case SLI4_READ_CFG_TOPO_FCOE:
3497 	case SLI4_READ_CFG_TOPO_FC:
3498 	case SLI4_READ_CFG_TOPO_FC_DA:
3499 	case SLI4_READ_CFG_TOPO_FC_AL:
3500 		sli4->config.topology = value;
3501 		break;
3502 	default:
3503 		ocs_log_test(sli4->os, "unsupported topology %#x\n", value);
3504 		rc = -1;
3505 	}
3506 
3507 	return rc;
3508 }
3509 
3510 static inline uint16_t
3511 sli_get_link_module_type(sli4_t *sli4)
3512 {
3513 	return sli4->config.link_module_type;
3514 }
3515 
3516 static inline char *
3517 sli_get_portnum(sli4_t *sli4)
3518 {
3519 	return sli4->config.port_name;
3520 }
3521 
3522 static inline char *
3523 sli_get_bios_version_string(sli4_t *sli4)
3524 {
3525 	return sli4->config.bios_version_string;
3526 }
3527 
3528 static inline uint32_t
3529 sli_convert_mask_to_count(uint32_t method, uint32_t mask)
3530 {
3531 	uint32_t count = 0;
3532 
3533 	if (method) {
3534 		count = 1 << ocs_lg2(mask);
3535 		count *= 16;
3536 	} else {
3537 		count = mask;
3538 	}
3539 
3540 	return count;
3541 }
3542 
3543 /**
3544  * @brief Common Create Queue function prototype
3545  */
3546 typedef int32_t (*sli4_create_q_fn_t)(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t);
3547 
3548 /**
3549  * @brief Common Destroy Queue function prototype
3550  */
3551 typedef int32_t (*sli4_destroy_q_fn_t)(sli4_t *, void *, size_t, uint16_t);
3552 
3553 /****************************************************************************
3554  * Function prototypes
3555  */
3556 extern int32_t sli_cmd_config_auto_xfer_rdy(sli4_t *, void *, size_t, uint32_t);
3557 extern int32_t sli_cmd_config_auto_xfer_rdy_hp(sli4_t *, void *, size_t, uint32_t, uint32_t, uint32_t);
3558 extern int32_t sli_cmd_config_link(sli4_t *, void *, size_t);
3559 extern int32_t sli_cmd_down_link(sli4_t *, void *, size_t);
3560 extern int32_t sli_cmd_dump_type4(sli4_t *, void *, size_t, uint16_t);
3561 extern int32_t sli_cmd_common_read_transceiver_data(sli4_t *, void *, size_t, uint32_t, ocs_dma_t *);
3562 extern int32_t sli_cmd_read_link_stats(sli4_t *, void *, size_t,uint8_t, uint8_t, uint8_t);
3563 extern int32_t sli_cmd_read_status(sli4_t *sli4, void *buf, size_t size, uint8_t clear_counters);
3564 extern int32_t sli_cmd_init_link(sli4_t *, void *, size_t, uint32_t, uint8_t);
3565 extern int32_t sli_cmd_init_vfi(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t);
3566 extern int32_t sli_cmd_init_vpi(sli4_t *, void *, size_t, uint16_t, uint16_t);
3567 extern int32_t sli_cmd_post_xri(sli4_t *, void *, size_t,  uint16_t, uint16_t);
3568 extern int32_t sli_cmd_release_xri(sli4_t *, void *, size_t,  uint8_t);
3569 extern int32_t sli_cmd_read_sparm64(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t);
3570 extern int32_t sli_cmd_read_topology(sli4_t *, void *, size_t, ocs_dma_t *);
3571 extern int32_t sli_cmd_read_nvparms(sli4_t *, void *, size_t);
3572 extern int32_t sli_cmd_write_nvparms(sli4_t *, void *, size_t, uint8_t *, uint8_t *, uint8_t, uint32_t);
3573 typedef struct {
3574 	uint16_t rq_id;
3575 	uint8_t r_ctl_mask;
3576 	uint8_t r_ctl_match;
3577 	uint8_t type_mask;
3578 	uint8_t type_match;
3579 } sli4_cmd_rq_cfg_t;
3580 extern int32_t sli_cmd_reg_fcfi(sli4_t *, void *, size_t, uint16_t,
3581 				sli4_cmd_rq_cfg_t rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG], uint16_t);
3582 extern int32_t sli_cmd_reg_fcfi_mrq(sli4_t *, void *, size_t, uint8_t, uint16_t, uint16_t, uint8_t, uint8_t , uint16_t, sli4_cmd_rq_cfg_t *);
3583 
3584 extern int32_t sli_cmd_reg_rpi(sli4_t *, void *, size_t, uint32_t, uint16_t, uint16_t, ocs_dma_t *, uint8_t, uint8_t);
3585 extern int32_t sli_cmd_reg_vfi(sli4_t *, void *, size_t, ocs_domain_t *);
3586 extern int32_t sli_cmd_reg_vpi(sli4_t *, void *, size_t, ocs_sli_port_t *, uint8_t);
3587 extern int32_t sli_cmd_sli_config(sli4_t *, void *, size_t, uint32_t, ocs_dma_t *);
3588 extern int32_t sli_cmd_unreg_fcfi(sli4_t *, void *, size_t, uint16_t);
3589 extern int32_t sli_cmd_unreg_rpi(sli4_t *, void *, size_t, uint16_t, sli4_resource_e, uint32_t);
3590 extern int32_t sli_cmd_unreg_vfi(sli4_t *, void *, size_t, ocs_domain_t *, uint32_t);
3591 extern int32_t sli_cmd_unreg_vpi(sli4_t *, void *, size_t, uint16_t, uint32_t);
3592 extern int32_t sli_cmd_common_nop(sli4_t *, void *, size_t, uint64_t);
3593 extern int32_t sli_cmd_common_get_resource_extent_info(sli4_t *, void *, size_t, uint16_t);
3594 extern int32_t sli_cmd_common_get_sli4_parameters(sli4_t *, void *, size_t);
3595 extern int32_t sli_cmd_common_write_object(sli4_t *, void *, size_t,
3596 		uint16_t, uint16_t, uint32_t, uint32_t, char *, ocs_dma_t *);
3597 extern int32_t sli_cmd_common_delete_object(sli4_t *, void *, size_t, char *);
3598 extern int32_t sli_cmd_common_read_object(sli4_t *, void *, size_t, uint32_t,
3599 		uint32_t, char *, ocs_dma_t *);
3600 extern int32_t sli_cmd_dmtf_exec_clp_cmd(sli4_t *sli4, void *buf, size_t size,
3601 		ocs_dma_t *cmd,
3602 		ocs_dma_t *resp);
3603 extern int32_t sli_cmd_common_set_dump_location(sli4_t *sli4, void *buf, size_t size,
3604 						uint8_t query, uint8_t is_buffer_list,
3605 						ocs_dma_t *buffer, uint8_t fdb);
3606 extern int32_t sli_cmd_common_set_features(sli4_t *, void *, size_t, uint32_t, uint32_t, void*);
3607 extern int32_t sli_cmd_common_get_profile_list(sli4_t *sli4, void *buf,
3608 		size_t size, uint32_t start_profile_index, ocs_dma_t *dma);
3609 extern int32_t sli_cmd_common_get_active_profile(sli4_t *sli4, void *buf,
3610 		size_t size);
3611 extern int32_t sli_cmd_common_set_active_profile(sli4_t *sli4, void *buf,
3612 		size_t size,
3613 		uint32_t fd,
3614 		uint32_t active_profile_id);
3615 extern int32_t sli_cmd_common_get_reconfig_link_info(sli4_t *sli4, void *buf,
3616 		size_t size, ocs_dma_t *dma);
3617 extern int32_t sli_cmd_common_set_reconfig_link_id(sli4_t *sli4, void *buf,
3618 		size_t size, ocs_dma_t *dma,
3619 		uint32_t fd, uint32_t active_link_config_id);
3620 extern int32_t sli_cmd_common_get_function_config(sli4_t *sli4, void *buf,
3621 		size_t size);
3622 extern int32_t sli_cmd_common_get_profile_config(sli4_t *sli4, void *buf,
3623 		size_t size, ocs_dma_t *dma);
3624 extern int32_t sli_cmd_common_set_profile_config(sli4_t *sli4, void *buf,
3625 		size_t size, ocs_dma_t *dma,
3626 		uint8_t profile_id, uint32_t descriptor_count,
3627 		uint8_t isap);
3628 
3629 extern int32_t sli_cqe_mq(void *);
3630 extern int32_t sli_cqe_async(sli4_t *, void *);
3631 
3632 extern int32_t sli_setup(sli4_t *, ocs_os_handle_t, sli4_port_type_e);
3633 extern void sli_calc_max_qentries(sli4_t *sli4);
3634 extern int32_t sli_init(sli4_t *);
3635 extern int32_t sli_reset(sli4_t *);
3636 extern int32_t sli_fw_reset(sli4_t *);
3637 extern int32_t sli_teardown(sli4_t *);
3638 extern int32_t sli_callback(sli4_t *, sli4_callback_e, void *, void *);
3639 extern int32_t sli_bmbx_command(sli4_t *);
3640 extern int32_t __sli_queue_init(sli4_t *, sli4_queue_t *, uint32_t, size_t, uint32_t, uint32_t);
3641 extern int32_t __sli_create_queue(sli4_t *, sli4_queue_t *);
3642 extern int32_t sli_eq_modify_delay(sli4_t *sli4, sli4_queue_t *eq, uint32_t num_eq, uint32_t shift, uint32_t delay_mult);
3643 extern int32_t sli_queue_alloc(sli4_t *, uint32_t, sli4_queue_t *, uint32_t, sli4_queue_t *, uint16_t);
3644 extern int32_t sli_cq_alloc_set(sli4_t *, sli4_queue_t *qs[], uint32_t, uint32_t, sli4_queue_t *eqs[]);
3645 extern int32_t sli_get_queue_entry_size(sli4_t *, uint32_t);
3646 extern int32_t sli_queue_free(sli4_t *, sli4_queue_t *, uint32_t, uint32_t);
3647 extern int32_t sli_queue_reset(sli4_t *, sli4_queue_t *);
3648 extern int32_t sli_queue_is_empty(sli4_t *, sli4_queue_t *);
3649 extern int32_t sli_queue_eq_arm(sli4_t *, sli4_queue_t *, uint8_t);
3650 extern int32_t sli_queue_arm(sli4_t *, sli4_queue_t *, uint8_t);
3651 extern int32_t _sli_queue_write(sli4_t *, sli4_queue_t *, uint8_t *);
3652 extern int32_t sli_queue_write(sli4_t *, sli4_queue_t *, uint8_t *);
3653 extern int32_t sli_queue_read(sli4_t *, sli4_queue_t *, uint8_t *);
3654 extern int32_t sli_queue_index(sli4_t *, sli4_queue_t *);
3655 extern int32_t _sli_queue_poke(sli4_t *, sli4_queue_t *, uint32_t, uint8_t *);
3656 extern int32_t sli_queue_poke(sli4_t *, sli4_queue_t *, uint32_t, uint8_t *);
3657 extern int32_t sli_resource_alloc(sli4_t *, sli4_resource_e, uint32_t *, uint32_t *);
3658 extern int32_t sli_resource_free(sli4_t *, sli4_resource_e, uint32_t);
3659 extern int32_t sli_resource_reset(sli4_t *, sli4_resource_e);
3660 extern int32_t sli_eq_parse(sli4_t *, uint8_t *, uint16_t *);
3661 extern int32_t sli_cq_parse(sli4_t *, sli4_queue_t *, uint8_t *, sli4_qentry_e *, uint16_t *);
3662 
3663 extern int32_t sli_raise_ue(sli4_t *, uint8_t);
3664 extern int32_t sli_dump_is_ready(sli4_t *);
3665 extern int32_t sli_dump_is_present(sli4_t *);
3666 extern int32_t sli_reset_required(sli4_t *);
3667 extern int32_t sli_fw_error_status(sli4_t *);
3668 extern int32_t sli_fw_ready(sli4_t *);
3669 extern uint32_t sli_reg_read(sli4_t *, sli4_regname_e);
3670 extern void sli_reg_write(sli4_t *, sli4_regname_e, uint32_t);
3671 extern int32_t sli_link_is_configurable(sli4_t *);
3672 
3673 #include "ocs_fcp.h"
3674 
3675 /**
3676  * @brief Maximum value for a FCFI
3677  *
3678  * Note that although most commands provide a 16 bit field for the FCFI,
3679  * the FC/FCoE Asynchronous Recived CQE format only provides 6 bits for
3680  * the returned FCFI. Then effectively, the FCFI cannot be larger than
3681  * 1 << 6 or 64.
3682  */
3683 #define SLI4_MAX_FCFI	64
3684 
3685 /**
3686  * @brief Maximum value for FCF index
3687  *
3688  * The SLI-4 specification uses a 16 bit field in most places for the FCF
3689  * index, but practically, this value will be much smaller. Arbitrarily
3690  * limit the max FCF index to match the max FCFI value.
3691  */
3692 #define SLI4_MAX_FCF_INDEX	SLI4_MAX_FCFI
3693 
3694 /*************************************************************************
3695  * SLI-4 FC/FCoE mailbox command formats and definitions.
3696  */
3697 
3698 /**
3699  * FC/FCoE opcode (OPC) values.
3700  */
3701 #define SLI4_OPC_FCOE_WQ_CREATE			0x1
3702 #define SLI4_OPC_FCOE_WQ_DESTROY		0x2
3703 #define SLI4_OPC_FCOE_POST_SGL_PAGES		0x3
3704 #define SLI4_OPC_FCOE_RQ_CREATE			0x5
3705 #define SLI4_OPC_FCOE_RQ_DESTROY		0x6
3706 #define SLI4_OPC_FCOE_READ_FCF_TABLE		0x8
3707 #define SLI4_OPC_FCOE_POST_HDR_TEMPLATES	0xb
3708 #define SLI4_OPC_FCOE_REDISCOVER_FCF		0x10
3709 
3710 /* Use the default CQ associated with the WQ */
3711 #define SLI4_CQ_DEFAULT 0xffff
3712 
3713 typedef struct sli4_physical_page_descriptor_s {
3714 	uint32_t	low;
3715 	uint32_t	high;
3716 } sli4_physical_page_descriptor_t;
3717 
3718 /**
3719  * @brief FCOE_WQ_CREATE
3720  *
3721  * Create a Work Queue for FC/FCoE use.
3722  */
3723 #define SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES	4
3724 
3725 typedef struct sli4_req_fcoe_wq_create_s {
3726 	sli4_req_hdr_t	hdr;
3727 #if BYTE_ORDER == LITTLE_ENDIAN
3728 	uint32_t	num_pages:8,
3729 			dua:1,
3730 			:7,
3731 			cq_id:16;
3732 	sli4_physical_page_descriptor_t page_physical_address[SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES];
3733 	uint32_t	bqu:1,
3734 			:7,
3735 			ulp:8,
3736 			:16;
3737 #else
3738 #error big endian version not defined
3739 #endif
3740 } sli4_req_fcoe_wq_create_t;
3741 
3742 /**
3743  * @brief FCOE_WQ_CREATE_V1
3744  *
3745  * Create a version 1 Work Queue for FC/FCoE use.
3746  */
3747 typedef struct sli4_req_fcoe_wq_create_v1_s {
3748 	sli4_req_hdr_t	hdr;
3749 #if BYTE_ORDER == LITTLE_ENDIAN
3750 	uint32_t	num_pages:16,
3751 			cq_id:16;
3752 	uint32_t	page_size:8,
3753 			wqe_size:4,
3754 			:4,
3755 			wqe_count:16;
3756 	uint32_t	rsvd6;
3757 	sli4_physical_page_descriptor_t page_physical_address[8];
3758 #else
3759 #error big endian version not defined
3760 #endif
3761 } sli4_req_fcoe_wq_create_v1_t;
3762 
3763 #define SLI4_FCOE_WQ_CREATE_V1_MAX_PAGES	8
3764 
3765 /**
3766  * @brief FCOE_WQ_DESTROY
3767  *
3768  * Destroy an FC/FCoE Work Queue.
3769  */
3770 typedef struct sli4_req_fcoe_wq_destroy_s {
3771 	sli4_req_hdr_t	hdr;
3772 #if BYTE_ORDER == LITTLE_ENDIAN
3773 	uint32_t	wq_id:16,
3774 			:16;
3775 #else
3776 #error big endian version not defined
3777 #endif
3778 } sli4_req_fcoe_wq_destroy_t;
3779 
3780 /**
3781  * @brief FCOE_POST_SGL_PAGES
3782  *
3783  * Register the scatter gather list (SGL) memory and associate it with an XRI.
3784  */
3785 typedef struct sli4_req_fcoe_post_sgl_pages_s {
3786 	sli4_req_hdr_t	hdr;
3787 #if BYTE_ORDER == LITTLE_ENDIAN
3788 	uint32_t	xri_start:16,
3789 			xri_count:16;
3790 	struct {
3791 		uint32_t	page0_low;
3792 		uint32_t	page0_high;
3793 		uint32_t	page1_low;
3794 		uint32_t	page1_high;
3795 	} page_set[10];
3796 #else
3797 #error big endian version not defined
3798 #endif
3799 } sli4_req_fcoe_post_sgl_pages_t;
3800 
3801 /**
3802  * @brief FCOE_RQ_CREATE
3803  *
3804  * Create a Receive Queue for FC/FCoE use.
3805  */
3806 typedef struct sli4_req_fcoe_rq_create_s {
3807 	sli4_req_hdr_t	hdr;
3808 #if BYTE_ORDER == LITTLE_ENDIAN
3809 	uint32_t	num_pages:16,
3810 			dua:1,
3811 			bqu:1,
3812 			:6,
3813 			ulp:8;
3814 	uint32_t	:16,
3815 			rqe_count:4,
3816 			:12;
3817 	uint32_t	rsvd6;
3818 	uint32_t	buffer_size:16,
3819 			cq_id:16;
3820 	uint32_t	rsvd8;
3821 	sli4_physical_page_descriptor_t page_physical_address[8];
3822 #else
3823 #error big endian version not defined
3824 #endif
3825 } sli4_req_fcoe_rq_create_t;
3826 
3827 #define SLI4_FCOE_RQ_CREATE_V0_MAX_PAGES	8
3828 #define SLI4_FCOE_RQ_CREATE_V0_MIN_BUF_SIZE	128
3829 #define SLI4_FCOE_RQ_CREATE_V0_MAX_BUF_SIZE	2048
3830 
3831 /**
3832  * @brief FCOE_RQ_CREATE_V1
3833  *
3834  * Create a version 1 Receive Queue for FC/FCoE use.
3835  */
3836 typedef struct sli4_req_fcoe_rq_create_v1_s {
3837 	sli4_req_hdr_t	hdr;
3838 #if BYTE_ORDER == LITTLE_ENDIAN
3839 	uint32_t	num_pages:16,
3840 			:13,
3841 			dim:1,
3842 			dfd:1,
3843 			dnb:1;
3844 	uint32_t	page_size:8,
3845 			rqe_size:4,
3846 			:4,
3847 			rqe_count:16;
3848 	uint32_t	rsvd6;
3849 	uint32_t	:16,
3850 			cq_id:16;
3851 	uint32_t	buffer_size;
3852 	sli4_physical_page_descriptor_t page_physical_address[8];
3853 #else
3854 #error big endian version not defined
3855 #endif
3856 } sli4_req_fcoe_rq_create_v1_t;
3857 
3858 /**
3859  * @brief FCOE_RQ_CREATE_V2
3860  *
3861  * Create a version 2 Receive Queue for FC/FCoE use.
3862  */
3863 typedef struct sli4_req_fcoe_rq_create_v2_s {
3864 	sli4_req_hdr_t	hdr;
3865 #if BYTE_ORDER == LITTLE_ENDIAN
3866 	uint32_t	num_pages:16,
3867 			rq_count:8,
3868 			:5,
3869 			dim:1,
3870 			dfd:1,
3871 			dnb:1;
3872 	uint32_t	page_size:8,
3873 			rqe_size:4,
3874 			:4,
3875 			rqe_count:16;
3876 	uint32_t	hdr_buffer_size:16,
3877 			payload_buffer_size:16;
3878 	uint32_t	base_cq_id:16,
3879 			:16;
3880 	uint32_t	rsvd;
3881 	sli4_physical_page_descriptor_t page_physical_address[0];
3882 #else
3883 #error big endian version not defined
3884 #endif
3885 } sli4_req_fcoe_rq_create_v2_t;
3886 
3887 #define SLI4_FCOE_RQ_CREATE_V1_MAX_PAGES	8
3888 #define SLI4_FCOE_RQ_CREATE_V1_MIN_BUF_SIZE	64
3889 #define SLI4_FCOE_RQ_CREATE_V1_MAX_BUF_SIZE	2048
3890 
3891 #define SLI4_FCOE_RQE_SIZE_8			0x2
3892 #define SLI4_FCOE_RQE_SIZE_16			0x3
3893 #define SLI4_FCOE_RQE_SIZE_32			0x4
3894 #define SLI4_FCOE_RQE_SIZE_64			0x5
3895 #define SLI4_FCOE_RQE_SIZE_128			0x6
3896 
3897 #define SLI4_FCOE_RQ_PAGE_SIZE_4096		0x1
3898 #define SLI4_FCOE_RQ_PAGE_SIZE_8192		0x2
3899 #define SLI4_FCOE_RQ_PAGE_SIZE_16384		0x4
3900 #define SLI4_FCOE_RQ_PAGE_SIZE_32768		0x8
3901 #define SLI4_FCOE_RQ_PAGE_SIZE_64536		0x10
3902 
3903 #define SLI4_FCOE_RQE_SIZE			8
3904 
3905 /**
3906  * @brief FCOE_RQ_DESTROY
3907  *
3908  * Destroy an FC/FCoE Receive Queue.
3909  */
3910 typedef struct sli4_req_fcoe_rq_destroy_s {
3911 	sli4_req_hdr_t	hdr;
3912 #if BYTE_ORDER == LITTLE_ENDIAN
3913 	uint32_t	rq_id:16,
3914 			:16;
3915 #else
3916 #error big endian version not defined
3917 #endif
3918 } sli4_req_fcoe_rq_destroy_t;
3919 
3920 /**
3921  * @brief FCOE_READ_FCF_TABLE
3922  *
3923  * Retrieve a FCF database (also known as a table) entry created by the SLI Port
3924  * during FIP discovery.
3925  */
3926 typedef struct sli4_req_fcoe_read_fcf_table_s {
3927 	sli4_req_hdr_t	hdr;
3928 #if BYTE_ORDER == LITTLE_ENDIAN
3929 	uint32_t	fcf_index:16,
3930 			:16;
3931 #else
3932 #error big endian version not defined
3933 #endif
3934 } sli4_req_fcoe_read_fcf_table_t;
3935 
3936 /* A FCF index of -1 on the request means return the first valid entry */
3937 #define SLI4_FCOE_FCF_TABLE_FIRST		(UINT16_MAX)
3938 
3939 /**
3940  * @brief FCF table entry
3941  *
3942  * This is the information returned by the FCOE_READ_FCF_TABLE command.
3943  */
3944 typedef struct sli4_fcf_entry_s {
3945 #if BYTE_ORDER == LITTLE_ENDIAN
3946 	uint32_t	max_receive_size;
3947 	uint32_t	fip_keep_alive;
3948 	uint32_t	fip_priority;
3949 	uint8_t		fcf_mac_address[6];
3950 	uint8_t		fcf_available;
3951 	uint8_t		mac_address_provider;
3952 	uint8_t		fabric_name_id[8];
3953 	uint8_t		fc_map[3];
3954 	uint8_t		val:1,
3955 			fc:1,
3956 			:5,
3957 			sol:1;
3958 	uint32_t	fcf_index:16,
3959 			fcf_state:16;
3960 	uint8_t		vlan_bitmap[512];
3961 	uint8_t		switch_name[8];
3962 #else
3963 #error big endian version not defined
3964 #endif
3965 } sli4_fcf_entry_t;
3966 
3967 /**
3968  * @brief FCOE_READ_FCF_TABLE response.
3969  */
3970 typedef struct sli4_res_fcoe_read_fcf_table_s {
3971 	sli4_res_hdr_t	hdr;
3972 #if BYTE_ORDER == LITTLE_ENDIAN
3973 	uint32_t	event_tag;
3974 	uint32_t	next_index:16,
3975 			:16;
3976 	sli4_fcf_entry_t fcf_entry;
3977 #else
3978 #error big endian version not defined
3979 #endif
3980 } sli4_res_fcoe_read_fcf_table_t;
3981 
3982 /* A next FCF index of -1 in the response means this is the last valid entry */
3983 #define SLI4_FCOE_FCF_TABLE_LAST		(UINT16_MAX)
3984 
3985 /**
3986  * @brief FCOE_POST_HDR_TEMPLATES
3987  */
3988 typedef struct sli4_req_fcoe_post_hdr_templates_s {
3989 	sli4_req_hdr_t	hdr;
3990 #if BYTE_ORDER == LITTLE_ENDIAN
3991 	uint32_t	rpi_offset:16,
3992 			page_count:16;
3993 	sli4_physical_page_descriptor_t page_descriptor[0];
3994 #else
3995 #error big endian version not defined
3996 #endif
3997 } sli4_req_fcoe_post_hdr_templates_t;
3998 
3999 #define SLI4_FCOE_HDR_TEMPLATE_SIZE	64
4000 
4001 /**
4002  * @brief FCOE_REDISCOVER_FCF
4003  */
4004 typedef struct sli4_req_fcoe_rediscover_fcf_s {
4005 	sli4_req_hdr_t	hdr;
4006 #if BYTE_ORDER == LITTLE_ENDIAN
4007 	uint32_t	fcf_count:16,
4008 			:16;
4009 	uint32_t	rsvd5;
4010 	uint16_t	fcf_index[16];
4011 #else
4012 #error big endian version not defined
4013 #endif
4014 } sli4_req_fcoe_rediscover_fcf_t;
4015 
4016 /**
4017  * Work Queue Entry (WQE) types.
4018  */
4019 #define SLI4_WQE_ABORT			0x0f
4020 #define SLI4_WQE_ELS_REQUEST64		0x8a
4021 #define SLI4_WQE_FCP_IBIDIR64		0xac
4022 #define SLI4_WQE_FCP_IREAD64		0x9a
4023 #define SLI4_WQE_FCP_IWRITE64		0x98
4024 #define SLI4_WQE_FCP_ICMND64		0x9c
4025 #define SLI4_WQE_FCP_TRECEIVE64		0xa1
4026 #define SLI4_WQE_FCP_CONT_TRECEIVE64	0xe5
4027 #define SLI4_WQE_FCP_TRSP64		0xa3
4028 #define SLI4_WQE_FCP_TSEND64		0x9f
4029 #define SLI4_WQE_GEN_REQUEST64		0xc2
4030 #define SLI4_WQE_SEND_FRAME		0xe1
4031 #define SLI4_WQE_XMIT_BCAST64		0X84
4032 #define SLI4_WQE_XMIT_BLS_RSP		0x97
4033 #define SLI4_WQE_ELS_RSP64		0x95
4034 #define SLI4_WQE_XMIT_SEQUENCE64	0x82
4035 #define SLI4_WQE_REQUEUE_XRI		0x93
4036 
4037 /**
4038  * WQE command types.
4039  */
4040 #define SLI4_CMD_FCP_IREAD64_WQE	0x00
4041 #define SLI4_CMD_FCP_ICMND64_WQE	0x00
4042 #define SLI4_CMD_FCP_IWRITE64_WQE	0x01
4043 #define SLI4_CMD_FCP_TRECEIVE64_WQE	0x02
4044 #define SLI4_CMD_FCP_TRSP64_WQE		0x03
4045 #define SLI4_CMD_FCP_TSEND64_WQE	0x07
4046 #define SLI4_CMD_GEN_REQUEST64_WQE	0x08
4047 #define SLI4_CMD_XMIT_BCAST64_WQE	0x08
4048 #define SLI4_CMD_XMIT_BLS_RSP64_WQE	0x08
4049 #define SLI4_CMD_ABORT_WQE		0x08
4050 #define SLI4_CMD_XMIT_SEQUENCE64_WQE	0x08
4051 #define SLI4_CMD_REQUEUE_XRI_WQE	0x0A
4052 #define SLI4_CMD_SEND_FRAME_WQE		0x0a
4053 
4054 #define SLI4_WQE_SIZE			0x05
4055 #define SLI4_WQE_EXT_SIZE		0x06
4056 
4057 #define SLI4_WQE_BYTES			(16 * sizeof(uint32_t))
4058 #define SLI4_WQE_EXT_BYTES		(32 * sizeof(uint32_t))
4059 
4060 /* Mask for ccp (CS_CTL) */
4061 #define SLI4_MASK_CCP	0xfe /* Upper 7 bits of CS_CTL is priority */
4062 
4063 /**
4064  * @brief Generic WQE
4065  */
4066 typedef struct sli4_generic_wqe_s {
4067 #if BYTE_ORDER == LITTLE_ENDIAN
4068 	uint32_t	cmd_spec0_5[6];
4069 	uint32_t	xri_tag:16,
4070 			context_tag:16;
4071 	uint32_t	:2,
4072 			ct:2,
4073 			:4,
4074 			command:8,
4075 			class:3,
4076 			:1,
4077 			pu:2,
4078 			:2,
4079 			timer:8;
4080 	uint32_t	abort_tag;
4081 	uint32_t	request_tag:16,
4082 			:16;
4083 	uint32_t	ebde_cnt:4,
4084 			:3,
4085 			len_loc:2,
4086 			qosd:1,
4087 			:1,
4088 			xbl:1,
4089 			hlm:1,
4090 			iod:1,
4091 			dbde:1,
4092 			wqes:1,
4093 			pri:3,
4094 			pv:1,
4095 			eat:1,
4096 			xc:1,
4097 			:1,
4098 			ccpe:1,
4099 			ccp:8;
4100 	uint32_t	cmd_type:4,
4101 			:3,
4102 			wqec:1,
4103 			:8,
4104 			cq_id:16;
4105 #else
4106 #error big endian version not defined
4107 #endif
4108 } sli4_generic_wqe_t;
4109 
4110 /**
4111  * @brief WQE used to abort exchanges.
4112  */
4113 typedef struct sli4_abort_wqe_s {
4114 #if BYTE_ORDER == LITTLE_ENDIAN
4115 	uint32_t	rsvd0;
4116 	uint32_t	rsvd1;
4117 	uint32_t	ext_t_tag;
4118 	uint32_t	ia:1,
4119 			ir:1,
4120 			:6,
4121 			criteria:8,
4122 			:16;
4123 	uint32_t	ext_t_mask;
4124 	uint32_t	t_mask;
4125 	uint32_t	xri_tag:16,
4126 			context_tag:16;
4127 	uint32_t	:2,
4128 			ct:2,
4129 			:4,
4130 			command:8,
4131 			class:3,
4132 			:1,
4133 			pu:2,
4134 			:2,
4135 			timer:8;
4136 	uint32_t	t_tag;
4137 	uint32_t	request_tag:16,
4138 			:16;
4139 	uint32_t	ebde_cnt:4,
4140 			:3,
4141 			len_loc:2,
4142 			qosd:1,
4143 			:1,
4144 			xbl:1,
4145 			:1,
4146 			iod:1,
4147 			dbde:1,
4148 			wqes:1,
4149 			pri:3,
4150 			pv:1,
4151 			eat:1,
4152 			xc:1,
4153 			:1,
4154 			ccpe:1,
4155 			ccp:8;
4156 	uint32_t	cmd_type:4,
4157 			:3,
4158 			wqec:1,
4159 			:8,
4160 			cq_id:16;
4161 #else
4162 #error big endian version not defined
4163 #endif
4164 } sli4_abort_wqe_t;
4165 
4166 #define SLI4_ABORT_CRITERIA_XRI_TAG		0x01
4167 #define SLI4_ABORT_CRITERIA_ABORT_TAG		0x02
4168 #define SLI4_ABORT_CRITERIA_REQUEST_TAG		0x03
4169 #define SLI4_ABORT_CRITERIA_EXT_ABORT_TAG	0x04
4170 
4171 typedef enum {
4172 	SLI_ABORT_XRI,
4173 	SLI_ABORT_ABORT_ID,
4174 	SLI_ABORT_REQUEST_ID,
4175 	SLI_ABORT_MAX,		/* must be last */
4176 } sli4_abort_type_e;
4177 
4178 /**
4179  * @brief WQE used to create an ELS request.
4180  */
4181 typedef struct sli4_els_request64_wqe_s {
4182 	sli4_bde_t	els_request_payload;
4183 #if BYTE_ORDER == LITTLE_ENDIAN
4184 	uint32_t	els_request_payload_length;
4185 	uint32_t	sid:24,
4186 			sp:1,
4187 			:7;
4188 	uint32_t	remote_id:24,
4189 			:8;
4190 	uint32_t	xri_tag:16,
4191 			context_tag:16;
4192 	uint32_t	:2,
4193 			ct:2,
4194 			:4,
4195 			command:8,
4196 			class:3,
4197 			ar:1,
4198 			pu:2,
4199 			:2,
4200 			timer:8;
4201 	uint32_t	abort_tag;
4202 	uint32_t	request_tag:16,
4203 			temporary_rpi:16;
4204 	uint32_t	ebde_cnt:4,
4205 			:3,
4206 			len_loc:2,
4207 			qosd:1,
4208 			:1,
4209 			xbl:1,
4210 			hlm:1,
4211 			iod:1,
4212 			dbde:1,
4213 			wqes:1,
4214 			pri:3,
4215 			pv:1,
4216 			eat:1,
4217 			xc:1,
4218 			:1,
4219 			ccpe:1,
4220 			ccp:8;
4221 	uint32_t	cmd_type:4,
4222 			els_id:3,
4223 			wqec:1,
4224 			:8,
4225 			cq_id:16;
4226 	sli4_bde_t	els_response_payload_bde;
4227 	uint32_t	max_response_payload_length;
4228 #else
4229 #error big endian version not defined
4230 #endif
4231 } sli4_els_request64_wqe_t;
4232 
4233 #define SLI4_ELS_REQUEST64_CONTEXT_RPI	0x0
4234 #define SLI4_ELS_REQUEST64_CONTEXT_VPI	0x1
4235 #define SLI4_ELS_REQUEST64_CONTEXT_VFI	0x2
4236 #define SLI4_ELS_REQUEST64_CONTEXT_FCFI	0x3
4237 
4238 #define SLI4_ELS_REQUEST64_CLASS_2	0x1
4239 #define SLI4_ELS_REQUEST64_CLASS_3	0x2
4240 
4241 #define SLI4_ELS_REQUEST64_DIR_WRITE	0x0
4242 #define SLI4_ELS_REQUEST64_DIR_READ	0x1
4243 
4244 #define SLI4_ELS_REQUEST64_OTHER	0x0
4245 #define SLI4_ELS_REQUEST64_LOGO		0x1
4246 #define SLI4_ELS_REQUEST64_FDISC	0x2
4247 #define SLI4_ELS_REQUEST64_FLOGIN	0x3
4248 #define SLI4_ELS_REQUEST64_PLOGI	0x4
4249 
4250 #define SLI4_ELS_REQUEST64_CMD_GEN		0x08
4251 #define SLI4_ELS_REQUEST64_CMD_NON_FABRIC	0x0c
4252 #define SLI4_ELS_REQUEST64_CMD_FABRIC		0x0d
4253 
4254 /**
4255  * @brief WQE used to create an FCP initiator no data command.
4256  */
4257 typedef struct sli4_fcp_icmnd64_wqe_s {
4258 	sli4_bde_t	bde;
4259 #if BYTE_ORDER == LITTLE_ENDIAN
4260 	uint32_t	payload_offset_length:16,
4261 			fcp_cmd_buffer_length:16;
4262 	uint32_t	rsvd4;
4263 	uint32_t	remote_n_port_id:24,
4264 			:8;
4265 	uint32_t	xri_tag:16,
4266 			context_tag:16;
4267 	uint32_t	dif:2,
4268 			ct:2,
4269 			bs:3,
4270 			:1,
4271 			command:8,
4272 			class:3,
4273 			:1,
4274 			pu:2,
4275 			erp:1,
4276 			lnk:1,
4277 			timer:8;
4278 	uint32_t	abort_tag;
4279 	uint32_t	request_tag:16,
4280 			:16;
4281 	uint32_t	ebde_cnt:4,
4282 			:3,
4283 			len_loc:2,
4284 			qosd:1,
4285 			:1,
4286 			xbl:1,
4287 			hlm:1,
4288 			iod:1,
4289 			dbde:1,
4290 			wqes:1,
4291 			pri:3,
4292 			pv:1,
4293 			eat:1,
4294 			xc:1,
4295 			:1,
4296 			ccpe:1,
4297 			ccp:8;
4298 	uint32_t	cmd_type:4,
4299 			:3,
4300 			wqec:1,
4301 			:8,
4302 			cq_id:16;
4303 	uint32_t	rsvd12;
4304 	uint32_t	rsvd13;
4305 	uint32_t	rsvd14;
4306 	uint32_t	rsvd15;
4307 #else
4308 #error big endian version not defined
4309 #endif
4310 } sli4_fcp_icmnd64_wqe_t;
4311 
4312 /**
4313  * @brief WQE used to create an FCP initiator read.
4314  */
4315 typedef struct sli4_fcp_iread64_wqe_s {
4316 	sli4_bde_t	bde;
4317 #if BYTE_ORDER == LITTLE_ENDIAN
4318 	uint32_t	payload_offset_length:16,
4319 			fcp_cmd_buffer_length:16;
4320 	uint32_t	total_transfer_length;
4321 	uint32_t	remote_n_port_id:24,
4322 			:8;
4323 	uint32_t	xri_tag:16,
4324 			context_tag:16;
4325 	uint32_t	dif:2,
4326 			ct:2,
4327 			bs:3,
4328 			:1,
4329 			command:8,
4330 			class:3,
4331 			:1,
4332 			pu:2,
4333 			erp:1,
4334 			lnk:1,
4335 			timer:8;
4336 	uint32_t	abort_tag;
4337 	uint32_t	request_tag:16,
4338 			:16;
4339 	uint32_t	ebde_cnt:4,
4340 			:3,
4341 			len_loc:2,
4342 			qosd:1,
4343 			:1,
4344 			xbl:1,
4345 			hlm:1,
4346 			iod:1,
4347 			dbde:1,
4348 			wqes:1,
4349 			pri:3,
4350 			pv:1,
4351 			eat:1,
4352 			xc:1,
4353 			:1,
4354 			ccpe:1,
4355 			ccp:8;
4356 	uint32_t	cmd_type:4,
4357 			:3,
4358 			wqec:1,
4359 			:8,
4360 			cq_id:16;
4361 	uint32_t	rsvd12;
4362 #else
4363 #error big endian version not defined
4364 #endif
4365 	sli4_bde_t	first_data_bde;	/* reserved if performance hints disabled */
4366 } sli4_fcp_iread64_wqe_t;
4367 
4368 /**
4369  * @brief WQE used to create an FCP initiator write.
4370  */
4371 typedef struct sli4_fcp_iwrite64_wqe_s {
4372 	sli4_bde_t	bde;
4373 #if BYTE_ORDER == LITTLE_ENDIAN
4374 	uint32_t	payload_offset_length:16,
4375 			fcp_cmd_buffer_length:16;
4376 	uint32_t	total_transfer_length;
4377 	uint32_t	initial_transfer_length;
4378 	uint32_t	xri_tag:16,
4379 			context_tag:16;
4380 	uint32_t	dif:2,
4381 			ct:2,
4382 			bs:3,
4383 			:1,
4384 			command:8,
4385 			class:3,
4386 			:1,
4387 			pu:2,
4388 			erp:1,
4389 			lnk:1,
4390 			timer:8;
4391 	uint32_t	abort_tag;
4392 	uint32_t	request_tag:16,
4393 			:16;
4394 	uint32_t	ebde_cnt:4,
4395 			:3,
4396 			len_loc:2,
4397 			qosd:1,
4398 			:1,
4399 			xbl:1,
4400 			hlm:1,
4401 			iod:1,
4402 			dbde:1,
4403 			wqes:1,
4404 			pri:3,
4405 			pv:1,
4406 			eat:1,
4407 			xc:1,
4408 			:1,
4409 			ccpe:1,
4410 			ccp:8;
4411 	uint32_t	cmd_type:4,
4412 			:3,
4413 			wqec:1,
4414 			:8,
4415 			cq_id:16;
4416 	uint32_t	remote_n_port_id:24,
4417 			:8;
4418 #else
4419 #error big endian version not defined
4420 #endif
4421 	sli4_bde_t	first_data_bde;
4422 } sli4_fcp_iwrite64_wqe_t;
4423 
4424 typedef struct sli4_fcp_128byte_wqe_s {
4425 	uint32_t dw[32];
4426 } sli4_fcp_128byte_wqe_t;
4427 
4428 /**
4429  * @brief WQE used to create an FCP target receive, and FCP target
4430  * receive continue.
4431  */
4432 typedef struct sli4_fcp_treceive64_wqe_s {
4433 	sli4_bde_t	bde;
4434 #if BYTE_ORDER == LITTLE_ENDIAN
4435 	uint32_t	payload_offset_length;
4436 	uint32_t	relative_offset;
4437 	/**
4438 	 * DWord 5 can either be the task retry identifier (HLM=0) or
4439 	 * the remote N_Port ID (HLM=1), or if implementing the Skyhawk
4440 	 * T10-PI workaround, the secondary xri tag
4441 	 */
4442 	union {
4443 		uint32_t	sec_xri_tag:16,
4444 				:16;
4445 		uint32_t	dword;
4446 	} dword5;
4447 	uint32_t	xri_tag:16,
4448 			context_tag:16;
4449 	uint32_t	dif:2,
4450 			ct:2,
4451 			bs:3,
4452 			:1,
4453 			command:8,
4454 			class:3,
4455 			ar:1,
4456 			pu:2,
4457 			conf:1,
4458 			lnk:1,
4459 			timer:8;
4460 	uint32_t	abort_tag;
4461 	uint32_t	request_tag:16,
4462 			remote_xid:16;
4463 	uint32_t	ebde_cnt:4,
4464 			:1,
4465 			app_id_valid:1,
4466 			:1,
4467 			len_loc:2,
4468 			qosd:1,
4469 			wchn:1,
4470 			xbl:1,
4471 			hlm:1,
4472 			iod:1,
4473 			dbde:1,
4474 			wqes:1,
4475 			pri:3,
4476 			pv:1,
4477 			eat:1,
4478 			xc:1,
4479 			sr:1,
4480 			ccpe:1,
4481 			ccp:8;
4482 	uint32_t	cmd_type:4,
4483 			:3,
4484 			wqec:1,
4485 			:8,
4486 			cq_id:16;
4487 	uint32_t	fcp_data_receive_length;
4488 
4489 #else
4490 #error big endian version not defined
4491 #endif
4492 	sli4_bde_t	first_data_bde; /* For performance hints */
4493 
4494 } sli4_fcp_treceive64_wqe_t;
4495 
4496 /**
4497  * @brief WQE used to create an FCP target response.
4498  */
4499 typedef struct sli4_fcp_trsp64_wqe_s {
4500 	sli4_bde_t	bde;
4501 #if BYTE_ORDER == LITTLE_ENDIAN
4502 	uint32_t	fcp_response_length;
4503 	uint32_t	rsvd4;
4504 	/**
4505 	 * DWord 5 can either be the task retry identifier (HLM=0) or
4506 	 * the remote N_Port ID (HLM=1)
4507 	 */
4508 	uint32_t	dword5;
4509 	uint32_t	xri_tag:16,
4510 			rpi:16;
4511 	uint32_t	:2,
4512 			ct:2,
4513 			dnrx:1,
4514 			:3,
4515 			command:8,
4516 			class:3,
4517 			ag:1,
4518 			pu:2,
4519 			conf:1,
4520 			lnk:1,
4521 			timer:8;
4522 	uint32_t	abort_tag;
4523 	uint32_t	request_tag:16,
4524 			remote_xid:16;
4525 	uint32_t	ebde_cnt:4,
4526 			:1,
4527 			app_id_valid:1,
4528 			:1,
4529 			len_loc:2,
4530 			qosd:1,
4531 			wchn:1,
4532 			xbl:1,
4533 			hlm:1,
4534 			iod:1,
4535 			dbde:1,
4536 			wqes:1,
4537 			pri:3,
4538 			pv:1,
4539 			eat:1,
4540 			xc:1,
4541 			sr:1,
4542 			ccpe:1,
4543 			ccp:8;
4544 	uint32_t	cmd_type:4,
4545 			:3,
4546 			wqec:1,
4547 			:8,
4548 			cq_id:16;
4549 	uint32_t	rsvd12;
4550 	uint32_t	rsvd13;
4551 	uint32_t	rsvd14;
4552 	uint32_t	rsvd15;
4553 #else
4554 #error big endian version not defined
4555 #endif
4556 } sli4_fcp_trsp64_wqe_t;
4557 
4558 /**
4559  * @brief WQE used to create an FCP target send (DATA IN).
4560  */
4561 typedef struct sli4_fcp_tsend64_wqe_s {
4562 	sli4_bde_t	bde;
4563 #if BYTE_ORDER == LITTLE_ENDIAN
4564 	uint32_t	payload_offset_length;
4565 	uint32_t	relative_offset;
4566 	/**
4567 	 * DWord 5 can either be the task retry identifier (HLM=0) or
4568 	 * the remote N_Port ID (HLM=1)
4569 	 */
4570 	uint32_t	dword5;
4571 	uint32_t	xri_tag:16,
4572 			rpi:16;
4573 	uint32_t	dif:2,
4574 			ct:2,
4575 			bs:3,
4576 			:1,
4577 			command:8,
4578 			class:3,
4579 			ar:1,
4580 			pu:2,
4581 			conf:1,
4582 			lnk:1,
4583 			timer:8;
4584 	uint32_t	abort_tag;
4585 	uint32_t	request_tag:16,
4586 			remote_xid:16;
4587 	uint32_t	ebde_cnt:4,
4588 			:1,
4589 			app_id_valid:1,
4590 			:1,
4591 			len_loc:2,
4592 			qosd:1,
4593 			wchn:1,
4594 			xbl:1,
4595 			hlm:1,
4596 			iod:1,
4597 			dbde:1,
4598 			wqes:1,
4599 			pri:3,
4600 			pv:1,
4601 			eat:1,
4602 			xc:1,
4603 			sr:1,
4604 			ccpe:1,
4605 			ccp:8;
4606 	uint32_t	cmd_type:4,
4607 			:3,
4608 			wqec:1,
4609 			:8,
4610 			cq_id:16;
4611 	uint32_t	fcp_data_transmit_length;
4612 
4613 #else
4614 #error big endian version not defined
4615 #endif
4616 	sli4_bde_t	first_data_bde; /* For performance hints */
4617 } sli4_fcp_tsend64_wqe_t;
4618 
4619 #define SLI4_IO_CONTINUATION		BIT(0)	/** The XRI associated with this IO is already active */
4620 #define SLI4_IO_AUTO_GOOD_RESPONSE	BIT(1)	/** Automatically generate a good RSP frame */
4621 #define SLI4_IO_NO_ABORT		BIT(2)
4622 #define SLI4_IO_DNRX			BIT(3)	/** Set the DNRX bit because no auto xref rdy buffer is posted */
4623 
4624 /* WQE DIF field contents */
4625 #define SLI4_DIF_DISABLED		0
4626 #define SLI4_DIF_PASS_THROUGH		1
4627 #define SLI4_DIF_STRIP			2
4628 #define SLI4_DIF_INSERT			3
4629 
4630 /**
4631  * @brief WQE used to create a general request.
4632  */
4633 typedef struct sli4_gen_request64_wqe_s {
4634 	sli4_bde_t	bde;
4635 #if BYTE_ORDER == LITTLE_ENDIAN
4636 	uint32_t	request_payload_length;
4637 	uint32_t	relative_offset;
4638 	uint32_t	:8,
4639 			df_ctl:8,
4640 			type:8,
4641 			r_ctl:8;
4642 	uint32_t	xri_tag:16,
4643 			context_tag:16;
4644 	uint32_t	:2,
4645 			ct:2,
4646 			:4,
4647 			command:8,
4648 			class:3,
4649 			:1,
4650 			pu:2,
4651 			:2,
4652 			timer:8;
4653 	uint32_t	abort_tag;
4654 	uint32_t	request_tag:16,
4655 			:16;
4656 	uint32_t	ebde_cnt:4,
4657 			:3,
4658 			len_loc:2,
4659 			qosd:1,
4660 			:1,
4661 			xbl:1,
4662 			hlm:1,
4663 			iod:1,
4664 			dbde:1,
4665 			wqes:1,
4666 			pri:3,
4667 			pv:1,
4668 			eat:1,
4669 			xc:1,
4670 			:1,
4671 			ccpe:1,
4672 			ccp:8;
4673 	uint32_t	cmd_type:4,
4674 			:3,
4675 			wqec:1,
4676 			:8,
4677 			cq_id:16;
4678 	uint32_t	remote_n_port_id:24,
4679 			:8;
4680 	uint32_t	rsvd13;
4681 	uint32_t	rsvd14;
4682 	uint32_t	max_response_payload_length;
4683 #else
4684 #error big endian version not defined
4685 #endif
4686 } sli4_gen_request64_wqe_t;
4687 
4688 /**
4689  * @brief WQE used to create a send frame request.
4690  */
4691 typedef struct sli4_send_frame_wqe_s {
4692 	sli4_bde_t	bde;
4693 #if BYTE_ORDER == LITTLE_ENDIAN
4694 	uint32_t	frame_length;
4695 	uint32_t	fc_header_0_1[2];
4696 	uint32_t	xri_tag:16,
4697 			context_tag:16;
4698 	uint32_t	:2,
4699 			ct:2,
4700 			:4,
4701 			command:8,
4702 			class:3,
4703 			:1,
4704 			pu:2,
4705 			:2,
4706 			timer:8;
4707 	uint32_t	abort_tag;
4708 	uint32_t	request_tag:16,
4709 			eof:8,
4710 			sof:8;
4711 	uint32_t	ebde_cnt:4,
4712 			:3,
4713 			lenloc:2,
4714 			qosd:1,
4715 			wchn:1,
4716 			xbl:1,
4717 			hlm:1,
4718 			iod:1,
4719 			dbde:1,
4720 			wqes:1,
4721 			pri:3,
4722 			pv:1,
4723 			eat:1,
4724 			xc:1,
4725 			:1,
4726 			ccpe:1,
4727 			ccp:8;
4728 	uint32_t	cmd_type:4,
4729 			:3,
4730 			wqec:1,
4731 			:8,
4732 			cq_id:16;
4733 	uint32_t	fc_header_2_5[4];
4734 #else
4735 #error big endian version not defined
4736 #endif
4737 } sli4_send_frame_wqe_t;
4738 
4739 /**
4740  * @brief WQE used to create a transmit sequence.
4741  */
4742 typedef struct sli4_xmit_sequence64_wqe_s {
4743 	sli4_bde_t	bde;
4744 #if BYTE_ORDER == LITTLE_ENDIAN
4745 	uint32_t	remote_n_port_id:24,
4746 			:8;
4747 	uint32_t	relative_offset;
4748 	uint32_t	:2,
4749 			si:1,
4750 			ft:1,
4751 			:2,
4752 			xo:1,
4753 			ls:1,
4754 			df_ctl:8,
4755 			type:8,
4756 			r_ctl:8;
4757 	uint32_t	xri_tag:16,
4758 			context_tag:16;
4759 	uint32_t	dif:2,
4760 			ct:2,
4761 			bs:3,
4762 			:1,
4763 			command:8,
4764 			class:3,
4765 			:1,
4766 			pu:2,
4767 			:2,
4768 			timer:8;
4769 	uint32_t	abort_tag;
4770 	uint32_t	request_tag:16,
4771 			remote_xid:16;
4772 	uint32_t	ebde_cnt:4,
4773 			:3,
4774 			len_loc:2,
4775 			qosd:1,
4776 			:1,
4777 			xbl:1,
4778 			hlm:1,
4779 			iod:1,
4780 			dbde:1,
4781 			wqes:1,
4782 			pri:3,
4783 			pv:1,
4784 			eat:1,
4785 			xc:1,
4786 			sr:1,
4787 			ccpe:1,
4788 			ccp:8;
4789 	uint32_t	cmd_type:4,
4790 			:3,
4791 			wqec:1,
4792 			:8,
4793 			cq_id:16;
4794 	uint32_t	sequence_payload_len;
4795 	uint32_t	rsvd13;
4796 	uint32_t	rsvd14;
4797 	uint32_t	rsvd15;
4798 #else
4799 #error big endian version not defined
4800 #endif
4801 } sli4_xmit_sequence64_wqe_t;
4802 
4803 /**
4804  * @brief WQE used unblock the specified XRI and to release it to the SLI Port's free pool.
4805  */
4806 typedef struct sli4_requeue_xri_wqe_s {
4807 	uint32_t	rsvd0;
4808 	uint32_t	rsvd1;
4809 	uint32_t	rsvd2;
4810 	uint32_t	rsvd3;
4811 	uint32_t	rsvd4;
4812 	uint32_t	rsvd5;
4813 #if BYTE_ORDER == LITTLE_ENDIAN
4814 	uint32_t	xri_tag:16,
4815 			context_tag:16;
4816 	uint32_t	:2,
4817 			ct:2,
4818 			:4,
4819 			command:8,
4820 			class:3,
4821 			:1,
4822 			pu:2,
4823 			:2,
4824 			timer:8;
4825 	uint32_t	rsvd8;
4826 	uint32_t	request_tag:16,
4827 			:16;
4828 	uint32_t	ebde_cnt:4,
4829 			:3,
4830 			len_loc:2,
4831 			qosd:1,
4832 			wchn:1,
4833 			xbl:1,
4834 			hlm:1,
4835 			iod:1,
4836 			dbde:1,
4837 			wqes:1,
4838 			pri:3,
4839 			pv:1,
4840 			eat:1,
4841 			xc:1,
4842 			:1,
4843 			ccpe:1,
4844 			ccp:8;
4845 	uint32_t	cmd_type:4,
4846 			:3,
4847 			wqec:1,
4848 			:8,
4849 			cq_id:16;
4850 	uint32_t	rsvd12;
4851 	uint32_t	rsvd13;
4852 	uint32_t	rsvd14;
4853 	uint32_t	rsvd15;
4854 #else
4855 #error big endian version not defined
4856 #endif
4857 } sli4_requeue_xri_wqe_t;
4858 
4859 /**
4860  * @brief WQE used to send a single frame sequence to broadcast address
4861  */
4862 typedef struct sli4_xmit_bcast64_wqe_s {
4863 	sli4_bde_t	sequence_payload;
4864 #if BYTE_ORDER == LITTLE_ENDIAN
4865 	uint32_t	sequence_payload_length;
4866 	uint32_t	rsvd4;
4867 	uint32_t	:8,
4868 			df_ctl:8,
4869 			type:8,
4870 			r_ctl:8;
4871 	uint32_t	xri_tag:16,
4872 			context_tag:16;
4873 	uint32_t	:2,
4874 			ct:2,
4875 			:4,
4876 			command:8,
4877 			class:3,
4878 			:1,
4879 			pu:2,
4880 			:2,
4881 			timer:8;
4882 	uint32_t	abort_tag;
4883 	uint32_t	request_tag:16,
4884 			temporary_rpi:16;
4885 	uint32_t	ebde_cnt:4,
4886 			:3,
4887 			len_loc:2,
4888 			qosd:1,
4889 			:1,
4890 			xbl:1,
4891 			hlm:1,
4892 			iod:1,
4893 			dbde:1,
4894 			wqes:1,
4895 			pri:3,
4896 			pv:1,
4897 			eat:1,
4898 			xc:1,
4899 			:1,
4900 			ccpe:1,
4901 			ccp:8;
4902 	uint32_t	cmd_type:4,
4903 			:3,
4904 			wqec:1,
4905 			:8,
4906 			cq_id:16;
4907 	uint32_t	rsvd12;
4908 	uint32_t	rsvd13;
4909 	uint32_t	rsvd14;
4910 	uint32_t	rsvd15;
4911 #else
4912 #error big endian version not defined
4913 #endif
4914 } sli4_xmit_bcast64_wqe_t;
4915 
4916 /**
4917  * @brief WQE used to create a BLS response.
4918  */
4919 typedef struct sli4_xmit_bls_rsp_wqe_s {
4920 #if BYTE_ORDER == LITTLE_ENDIAN
4921 	uint32_t	payload_word0;
4922 	uint32_t	rx_id:16,
4923 			ox_id:16;
4924 	uint32_t	high_seq_cnt:16,
4925 			low_seq_cnt:16;
4926 	uint32_t	rsvd3;
4927 	uint32_t	local_n_port_id:24,
4928 			:8;
4929 	uint32_t	remote_id:24,
4930 			:6,
4931 			ar:1,
4932 			xo:1;
4933 	uint32_t	xri_tag:16,
4934 			context_tag:16;
4935 	uint32_t	:2,
4936 			ct:2,
4937 			:4,
4938 			command:8,
4939 			class:3,
4940 			:1,
4941 			pu:2,
4942 			:2,
4943 			timer:8;
4944 	uint32_t	abort_tag;
4945 	uint32_t	request_tag:16,
4946 			:16;
4947 	uint32_t	ebde_cnt:4,
4948 			:3,
4949 			len_loc:2,
4950 			qosd:1,
4951 			:1,
4952 			xbl:1,
4953 			hlm:1,
4954 			iod:1,
4955 			dbde:1,
4956 			wqes:1,
4957 			pri:3,
4958 			pv:1,
4959 			eat:1,
4960 			xc:1,
4961 			:1,
4962 			ccpe:1,
4963 			ccp:8;
4964 	uint32_t	cmd_type:4,
4965 			:3,
4966 			wqec:1,
4967 			:8,
4968 			cq_id:16;
4969 	uint32_t	temporary_rpi:16,
4970 			:16;
4971 	uint32_t	rsvd13;
4972 	uint32_t	rsvd14;
4973 	uint32_t	rsvd15;
4974 #else
4975 #error big endian version not defined
4976 #endif
4977 } sli4_xmit_bls_rsp_wqe_t;
4978 
4979 typedef enum {
4980 	SLI_BLS_ACC,
4981 	SLI_BLS_RJT,
4982 	SLI_BLS_MAX
4983 } sli_bls_type_e;
4984 
4985 typedef struct sli_bls_payload_s {
4986 	sli_bls_type_e	type;
4987 	uint16_t	ox_id;
4988 	uint16_t	rx_id;
4989 	union {
4990 		struct {
4991 			uint32_t	seq_id_validity:8,
4992 					seq_id_last:8,
4993 					:16;
4994 			uint16_t	ox_id;
4995 			uint16_t	rx_id;
4996 			uint16_t	low_seq_cnt;
4997 			uint16_t	high_seq_cnt;
4998 		} acc;
4999 		struct {
5000 			uint32_t	vendor_unique:8,
5001 					reason_explanation:8,
5002 					reason_code:8,
5003 					:8;
5004 		} rjt;
5005 	} u;
5006 } sli_bls_payload_t;
5007 
5008 /**
5009  * @brief WQE used to create an ELS response.
5010  */
5011 typedef struct sli4_xmit_els_rsp64_wqe_s {
5012 	sli4_bde_t	els_response_payload;
5013 #if BYTE_ORDER == LITTLE_ENDIAN
5014 	uint32_t	els_response_payload_length;
5015 	uint32_t	s_id:24,
5016 			sp:1,
5017 			:7;
5018 	uint32_t	remote_id:24,
5019 			:8;
5020 	uint32_t	xri_tag:16,
5021 			context_tag:16;
5022 	uint32_t	:2,
5023 			ct:2,
5024 			:4,
5025 			command:8,
5026 			class:3,
5027 			:1,
5028 			pu:2,
5029 			:2,
5030 			timer:8;
5031 	uint32_t	abort_tag;
5032 	uint32_t	request_tag:16,
5033 			ox_id:16;
5034 	uint32_t	ebde_cnt:4,
5035 			:3,
5036 			len_loc:2,
5037 			qosd:1,
5038 			:1,
5039 			xbl:1,
5040 			hlm:1,
5041 			iod:1,
5042 			dbde:1,
5043 			wqes:1,
5044 			pri:3,
5045 			pv:1,
5046 			eat:1,
5047 			xc:1,
5048 			:1,
5049 			ccpe:1,
5050 			ccp:8;
5051 	uint32_t	cmd_type:4,
5052 			:3,
5053 			wqec:1,
5054 			:8,
5055 			cq_id:16;
5056 	uint32_t	temporary_rpi:16,
5057 			:16;
5058 	uint32_t	rsvd13;
5059 	uint32_t	rsvd14;
5060 	uint32_t	rsvd15;
5061 #else
5062 #error big endian version not defined
5063 #endif
5064 } sli4_xmit_els_rsp64_wqe_t;
5065 
5066 /**
5067  * @brief Asynchronouse Event: Link State ACQE.
5068  */
5069 typedef struct sli4_link_state_s {
5070 #if BYTE_ORDER == LITTLE_ENDIAN
5071 	uint32_t	link_number:6,
5072 			link_type:2,
5073 			port_link_status:8,
5074 			port_duplex:8,
5075 			port_speed:8;
5076 	uint32_t	port_fault:8,
5077 			:8,
5078 			logical_link_speed:16;
5079 	uint32_t	event_tag;
5080 	uint32_t	:8,
5081 			event_code:8,
5082 			event_type:8,	/** values are protocol specific */
5083 			:6,
5084 			ae:1,		/** async event - this is an ACQE */
5085 			val:1;		/** valid - contents of CQE are valid */
5086 #else
5087 #error big endian version not defined
5088 #endif
5089 } sli4_link_state_t;
5090 
5091 #define SLI4_LINK_ATTN_TYPE_LINK_UP		0x01
5092 #define SLI4_LINK_ATTN_TYPE_LINK_DOWN		0x02
5093 #define SLI4_LINK_ATTN_TYPE_NO_HARD_ALPA	0x03
5094 
5095 #define SLI4_LINK_ATTN_P2P			0x01
5096 #define SLI4_LINK_ATTN_FC_AL			0x02
5097 #define SLI4_LINK_ATTN_INTERNAL_LOOPBACK	0x03
5098 #define SLI4_LINK_ATTN_SERDES_LOOPBACK		0x04
5099 
5100 #define SLI4_LINK_ATTN_1G			0x01
5101 #define SLI4_LINK_ATTN_2G			0x02
5102 #define SLI4_LINK_ATTN_4G			0x04
5103 #define SLI4_LINK_ATTN_8G			0x08
5104 #define SLI4_LINK_ATTN_10G			0x0a
5105 #define SLI4_LINK_ATTN_16G			0x10
5106 
5107 #define SLI4_LINK_TYPE_ETHERNET			0x0
5108 #define SLI4_LINK_TYPE_FC			0x1
5109 
5110 /**
5111  * @brief Asynchronouse Event: FC Link Attention Event.
5112  */
5113 typedef struct sli4_link_attention_s {
5114 #if BYTE_ORDER == LITTLE_ENDIAN
5115 	uint32_t	link_number:8,
5116 			attn_type:8,
5117 			topology:8,
5118 			port_speed:8;
5119 	uint32_t	port_fault:8,
5120 			shared_link_status:8,
5121 			logical_link_speed:16;
5122 	uint32_t	event_tag;
5123 	uint32_t	:8,
5124 			event_code:8,
5125 			event_type:8,	/** values are protocol specific */
5126 			:6,
5127 			ae:1,		/** async event - this is an ACQE */
5128 			val:1;		/** valid - contents of CQE are valid */
5129 #else
5130 #error big endian version not defined
5131 #endif
5132 } sli4_link_attention_t;
5133 
5134 /**
5135  * @brief FC/FCoE event types.
5136  */
5137 #define SLI4_LINK_STATE_PHYSICAL		0x00
5138 #define SLI4_LINK_STATE_LOGICAL			0x01
5139 
5140 #define SLI4_FCOE_FIP_FCF_DISCOVERED		0x01
5141 #define SLI4_FCOE_FIP_FCF_TABLE_FULL		0x02
5142 #define SLI4_FCOE_FIP_FCF_DEAD			0x03
5143 #define SLI4_FCOE_FIP_FCF_CLEAR_VLINK		0x04
5144 #define SLI4_FCOE_FIP_FCF_MODIFIED		0x05
5145 
5146 #define SLI4_GRP5_QOS_SPEED			0x01
5147 
5148 #define SLI4_FC_EVENT_LINK_ATTENTION		0x01
5149 #define SLI4_FC_EVENT_SHARED_LINK_ATTENTION	0x02
5150 
5151 #define SLI4_PORT_SPEED_NO_LINK			0x0
5152 #define SLI4_PORT_SPEED_10_MBPS			0x1
5153 #define SLI4_PORT_SPEED_100_MBPS		0x2
5154 #define SLI4_PORT_SPEED_1_GBPS			0x3
5155 #define SLI4_PORT_SPEED_10_GBPS			0x4
5156 
5157 #define SLI4_PORT_DUPLEX_NONE			0x0
5158 #define SLI4_PORT_DUPLEX_HWF			0x1
5159 #define SLI4_PORT_DUPLEX_FULL			0x2
5160 
5161 #define SLI4_PORT_LINK_STATUS_PHYSICAL_DOWN	0x0
5162 #define SLI4_PORT_LINK_STATUS_PHYSICAL_UP	0x1
5163 #define SLI4_PORT_LINK_STATUS_LOGICAL_DOWN	0x2
5164 #define SLI4_PORT_LINK_STATUS_LOGICAL_UP	0x3
5165 
5166 /**
5167  * @brief Asynchronouse Event: FCoE/FIP ACQE.
5168  */
5169 typedef struct sli4_fcoe_fip_s {
5170 #if BYTE_ORDER == LITTLE_ENDIAN
5171 	uint32_t	event_information;
5172 	uint32_t	fcf_count:16,
5173 			fcoe_event_type:16;
5174 	uint32_t	event_tag;
5175 	uint32_t	:8,
5176 			event_code:8,
5177 			event_type:8,	/** values are protocol specific */
5178 			:6,
5179 			ae:1,		/** async event - this is an ACQE */
5180 			val:1;		/** valid - contents of CQE are valid */
5181 #else
5182 #error big endian version not defined
5183 #endif
5184 } sli4_fcoe_fip_t;
5185 
5186 /**
5187  * @brief FC/FCoE WQ completion queue entry.
5188  */
5189 typedef struct sli4_fc_wcqe_s {
5190 #if BYTE_ORDER == LITTLE_ENDIAN
5191 	uint32_t	hw_status:8,
5192 			status:8,
5193 			request_tag:16;
5194 	uint32_t	wqe_specific_1;
5195 	uint32_t	wqe_specific_2;
5196 	uint32_t	:15,
5197 			qx:1,
5198 			code:8,
5199 			pri:3,
5200 			pv:1,
5201 			xb:1,
5202 			:2,
5203 			vld:1;
5204 #else
5205 #error big endian version not defined
5206 #endif
5207 } sli4_fc_wcqe_t;
5208 
5209 /**
5210  * @brief FC/FCoE WQ consumed CQ queue entry.
5211  */
5212 typedef struct sli4_fc_wqec_s {
5213 #if BYTE_ORDER == LITTLE_ENDIAN
5214 	uint32_t	:32;
5215 	uint32_t	:32;
5216 	uint32_t	wqe_index:16,
5217 			wq_id:16;
5218 	uint32_t	:16,
5219 			code:8,
5220 			:7,
5221 			vld:1;
5222 #else
5223 #error big endian version not defined
5224 #endif
5225 } sli4_fc_wqec_t;
5226 
5227 /**
5228  * @brief FC/FCoE Completion Status Codes.
5229  */
5230 #define SLI4_FC_WCQE_STATUS_SUCCESS		0x00
5231 #define SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE	0x01
5232 #define SLI4_FC_WCQE_STATUS_REMOTE_STOP		0x02
5233 #define SLI4_FC_WCQE_STATUS_LOCAL_REJECT	0x03
5234 #define SLI4_FC_WCQE_STATUS_NPORT_RJT		0x04
5235 #define SLI4_FC_WCQE_STATUS_FABRIC_RJT		0x05
5236 #define SLI4_FC_WCQE_STATUS_NPORT_BSY		0x06
5237 #define SLI4_FC_WCQE_STATUS_FABRIC_BSY		0x07
5238 #define SLI4_FC_WCQE_STATUS_LS_RJT		0x09
5239 #define SLI4_FC_WCQE_STATUS_CMD_REJECT		0x0b
5240 #define SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK	0x0c
5241 #define SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED	0x11
5242 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED 0x12
5243 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC	0x13
5244 #define SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE	0x14
5245 #define SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE	0x15
5246 #define SLI4_FC_WCQE_STATUS_DI_ERROR		0x16
5247 #define SLI4_FC_WCQE_STATUS_BA_RJT		0x17
5248 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED 0x18
5249 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC	0x19
5250 #define SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT	0x1a
5251 #define SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST	0x1b
5252 
5253 /* driver generated status codes; better not overlap with chip's status codes! */
5254 #define SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT  0xff
5255 #define SLI4_FC_WCQE_STATUS_SHUTDOWN		0xfe
5256 #define SLI4_FC_WCQE_STATUS_DISPATCH_ERROR	0xfd
5257 
5258 /**
5259  * @brief DI_ERROR Extended Status
5260  */
5261 #define SLI4_FC_DI_ERROR_GE	(1 << 0) /* Guard Error */
5262 #define SLI4_FC_DI_ERROR_AE	(1 << 1) /* Application Tag Error */
5263 #define SLI4_FC_DI_ERROR_RE	(1 << 2) /* Reference Tag Error */
5264 #define SLI4_FC_DI_ERROR_TDPV	(1 << 3) /* Total Data Placed Valid */
5265 #define SLI4_FC_DI_ERROR_UDB	(1 << 4) /* Uninitialized DIF Block */
5266 #define SLI4_FC_DI_ERROR_EDIR   (1 << 5) /* Error direction */
5267 
5268 /**
5269  * @brief Local Reject Reason Codes.
5270  */
5271 #define SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE	0x01
5272 #define SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT	0x02
5273 #define SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR	0x03
5274 #define SLI4_FC_LOCAL_REJECT_INVALID_RPI	0x04
5275 #define SLI4_FC_LOCAL_REJECT_NO_XRI		0x05
5276 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND	0x06
5277 #define SLI4_FC_LOCAL_REJECT_XCHG_DROPPED	0x07
5278 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD	0x08
5279 #define SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH	0x0c
5280 #define SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED	0x0d
5281 #define SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED	0x0e
5282 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME	0x0f
5283 #define SLI4_FC_LOCAL_REJECT_NO_RESOURCES	0x11
5284 #define SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE	0x12
5285 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH	0x13
5286 #define SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE 0x14
5287 #define SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS	0x15
5288 #define SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED	0x16
5289 #define SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT	0x17
5290 #define SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE	0x18
5291 #define SLI4_FC_LOCAL_REJECT_LINK_DOWN		0x1a
5292 #define SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA	0x1b
5293 #define SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI	0x1c
5294 #define SLI4_FC_LOCAL_REJECT_OUT_OF_ORDER_DATA	0x1d
5295 #define SLI4_FC_LOCAL_REJECT_OUT_OF_ORDER_ACK	0x1e
5296 #define SLI4_FC_LOCAL_REJECT_DUP_FRAME		0x1f
5297 #define SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME	0x20
5298 #define SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS	0x21
5299 #define SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER	0x23
5300 #define SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED 0x24
5301 #define SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED 0x25
5302 #define SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE	0x28
5303 #define SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING	0x29
5304 #define SLI4_FC_LOCAL_REJECT_INVALID_VPI	0x2e
5305 #define SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF	0x30
5306 #define SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET	0x40
5307 #define SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET	0x41
5308 #define SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE	0x42
5309 #define SLI4_FC_LOCAL_REJECT_MISSING_SI		0x43
5310 #define SLI4_FC_LOCAL_REJECT_MISSING_ES		0x44
5311 #define SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER	0x45
5312 #define SLI4_FC_LOCAL_REJECT_SLER_FAILURE	0x46
5313 #define SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE 0x47
5314 #define SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR	0x48
5315 #define SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR 0x49
5316 #define SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR	0x4a
5317 #define SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR	0x4c
5318 #define SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR	0x4d
5319 #define SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR	0x4e
5320 
5321 typedef struct sli4_fc_async_rcqe_s {
5322 #if BYTE_ORDER == LITTLE_ENDIAN
5323 	uint32_t	:8,
5324 			status:8,
5325 			rq_element_index:12,
5326 			:4;
5327 	uint32_t	rsvd1;
5328 	uint32_t	fcfi:6,
5329 			rq_id:10,
5330 			payload_data_placement_length:16;
5331 	uint32_t	sof_byte:8,
5332 			eof_byte:8,
5333 			code:8,
5334 			header_data_placement_length:6,
5335 			:1,
5336 			vld:1;
5337 #else
5338 #error big endian version not defined
5339 #endif
5340 } sli4_fc_async_rcqe_t;
5341 
5342 typedef struct sli4_fc_async_rcqe_v1_s {
5343 #if BYTE_ORDER == LITTLE_ENDIAN
5344 	uint32_t	:8,
5345 			status:8,
5346 			rq_element_index:12,
5347 			:4;
5348 	uint32_t	fcfi:6,
5349 			:26;
5350 	uint32_t	rq_id:16,
5351 			payload_data_placement_length:16;
5352 	uint32_t	sof_byte:8,
5353 			eof_byte:8,
5354 			code:8,
5355 			header_data_placement_length:6,
5356 			:1,
5357 			vld:1;
5358 #else
5359 #error big endian version not defined
5360 #endif
5361 } sli4_fc_async_rcqe_v1_t;
5362 
5363 #define SLI4_FC_ASYNC_RQ_SUCCESS		0x10
5364 #define SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED	0x11
5365 #define SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED	0x12
5366 #define SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC	0x13
5367 #define SLI4_FC_ASYNC_RQ_DMA_FAILURE		0x14
5368 
5369 typedef struct sli4_fc_coalescing_rcqe_s {
5370 #if BYTE_ORDER == LITTLE_ENDIAN
5371 	uint32_t	:8,
5372 			status:8,
5373 			rq_element_index:12,
5374 			:4;
5375 	uint32_t	rsvd1;
5376 	uint32_t	rq_id:16,
5377 			sequence_reporting_placement_length:16;
5378 	uint32_t	:16,
5379 			code:8,
5380 			:7,
5381 			vld:1;
5382 #else
5383 #error big endian version not defined
5384 #endif
5385 } sli4_fc_coalescing_rcqe_t;
5386 
5387 #define SLI4_FC_COALESCE_RQ_SUCCESS		0x10
5388 #define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED	0x18
5389 
5390 typedef struct sli4_fc_optimized_write_cmd_cqe_s {
5391 #if BYTE_ORDER == LITTLE_ENDIAN
5392 	uint32_t	:8,
5393 			status:8,
5394 			rq_element_index:15,
5395 			iv:1;
5396 	uint32_t	fcfi:6,
5397 			:8,
5398 			oox:1,
5399 			agxr:1,
5400 			xri:16;
5401 	uint32_t	rq_id:16,
5402 			payload_data_placement_length:16;
5403 	uint32_t	rpi:16,
5404 			code:8,
5405 			header_data_placement_length:6,
5406 			:1,
5407 			vld:1;
5408 #else
5409 #error big endian version not defined
5410 #endif
5411 } sli4_fc_optimized_write_cmd_cqe_t;
5412 
5413 typedef struct sli4_fc_optimized_write_data_cqe_s {
5414 #if BYTE_ORDER == LITTLE_ENDIAN
5415 	uint32_t	hw_status:8,
5416 			status:8,
5417 			xri:16;
5418 	uint32_t	total_data_placed;
5419 	uint32_t	extended_status;
5420 	uint32_t	:16,
5421 			code:8,
5422 			pri:3,
5423 			pv:1,
5424 			xb:1,
5425 			rha:1,
5426 			:1,
5427 			vld:1;
5428 #else
5429 #error big endian version not defined
5430 #endif
5431 } sli4_fc_optimized_write_data_cqe_t;
5432 
5433 typedef struct sli4_fc_xri_aborted_cqe_s {
5434 #if BYTE_ORDER == LITTLE_ENDIAN
5435 	uint32_t	:8,
5436 			status:8,
5437 			:16;
5438 	uint32_t	extended_status;
5439 	uint32_t	xri:16,
5440 			remote_xid:16;
5441 	uint32_t	:16,
5442 			code:8,
5443 			xr:1,
5444 			:3,
5445 			eo:1,
5446 			br:1,
5447 			ia:1,
5448 			vld:1;
5449 #else
5450 #error big endian version not defined
5451 #endif
5452 } sli4_fc_xri_aborted_cqe_t;
5453 
5454 /**
5455  * Code definitions applicable to all FC/FCoE CQE types.
5456  */
5457 #define SLI4_CQE_CODE_OFFSET		14
5458 
5459 #define SLI4_CQE_CODE_WORK_REQUEST_COMPLETION	0x01
5460 #define SLI4_CQE_CODE_RELEASE_WQE		0x02
5461 #define SLI4_CQE_CODE_RQ_ASYNC			0x04
5462 #define SLI4_CQE_CODE_XRI_ABORTED		0x05
5463 #define SLI4_CQE_CODE_RQ_COALESCING		0x06
5464 #define SLI4_CQE_CODE_RQ_CONSUMPTION		0x07
5465 #define SLI4_CQE_CODE_MEASUREMENT_REPORTING	0x08
5466 #define SLI4_CQE_CODE_RQ_ASYNC_V1		0x09
5467 #define SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD	0x0B
5468 #define SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA	0x0C
5469 
5470 extern int32_t sli_fc_process_link_state(sli4_t *, void *);
5471 extern int32_t sli_fc_process_link_attention(sli4_t *, void *);
5472 extern int32_t sli_fc_cqe_parse(sli4_t *, sli4_queue_t *, uint8_t *, sli4_qentry_e *, uint16_t *);
5473 extern uint32_t sli_fc_response_length(sli4_t *, uint8_t *);
5474 extern uint32_t sli_fc_io_length(sli4_t *, uint8_t *);
5475 extern int32_t sli_fc_els_did(sli4_t *, uint8_t *, uint32_t *);
5476 extern uint32_t sli_fc_ext_status(sli4_t *, uint8_t *);
5477 extern int32_t sli_fc_rqe_rqid_and_index(sli4_t *, uint8_t *, uint16_t *, uint32_t *);
5478 extern int32_t sli_fc_process_fcoe(sli4_t *, void *);
5479 extern int32_t sli_cmd_fcoe_wq_create(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t);
5480 extern int32_t sli_cmd_fcoe_wq_create_v1(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t);
5481 extern int32_t sli_cmd_fcoe_wq_destroy(sli4_t *, void *, size_t, uint16_t);
5482 extern int32_t sli_cmd_fcoe_post_sgl_pages(sli4_t *, void *, size_t, uint16_t, uint32_t, ocs_dma_t **, ocs_dma_t **,
5483 ocs_dma_t *);
5484 extern int32_t sli_cmd_fcoe_rq_create(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t);
5485 extern int32_t sli_cmd_fcoe_rq_create_v1(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t);
5486 extern int32_t sli_cmd_fcoe_rq_destroy(sli4_t *, void *, size_t, uint16_t);
5487 extern int32_t sli_cmd_fcoe_read_fcf_table(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t);
5488 extern int32_t sli_cmd_fcoe_post_hdr_templates(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, ocs_dma_t *);
5489 extern int32_t sli_cmd_fcoe_rediscover_fcf(sli4_t *, void *, size_t, uint16_t);
5490 extern int32_t sli_fc_rq_alloc(sli4_t *, sli4_queue_t *, uint32_t, uint32_t, sli4_queue_t *, uint16_t, uint8_t);
5491 extern int32_t sli_fc_rq_set_alloc(sli4_t *, uint32_t, sli4_queue_t *[], uint32_t, uint32_t, uint32_t, uint32_t, uint16_t);
5492 extern uint32_t sli_fc_get_rpi_requirements(sli4_t *, uint32_t);
5493 extern int32_t sli_abort_wqe(sli4_t *, void *, size_t, sli4_abort_type_e, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t);
5494 
5495 extern int32_t sli_els_request64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint8_t, uint32_t, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *);
5496 extern int32_t sli_fcp_iread64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5497 extern int32_t sli_fcp_iwrite64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5498 extern int32_t sli_fcp_icmnd64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t);
5499 
5500 extern int32_t sli_fcp_treceive64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t);
5501 extern int32_t sli_fcp_trsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint32_t);
5502 extern int32_t sli_fcp_tsend64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t);
5503 extern int32_t sli_fcp_cont_treceive64_wqe(sli4_t *, void*, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t);
5504 extern int32_t sli_gen_request64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t,uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5505 extern int32_t sli_send_frame_wqe(sli4_t *sli4, void *buf, size_t size, uint8_t sof, uint8_t eof, uint32_t *hdr,
5506 				  ocs_dma_t *payload, uint32_t req_len, uint8_t timeout,
5507 				  uint16_t xri, uint16_t req_tag);
5508 extern int32_t sli_xmit_sequence64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5509 extern int32_t sli_xmit_bcast64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5510 extern int32_t sli_xmit_bls_rsp64_wqe(sli4_t *, void *, size_t, sli_bls_payload_t *, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t);
5511 extern int32_t sli_xmit_els_rsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t, uint32_t);
5512 extern int32_t sli_requeue_xri_wqe(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t);
5513 extern void sli4_cmd_lowlevel_set_watchdog(sli4_t *sli4, void *buf, size_t size, uint16_t timeout);
5514 
5515 /**
5516  * @ingroup sli_fc
5517  * @brief Retrieve the received header and payload length.
5518  *
5519  * @param sli4 SLI context.
5520  * @param cqe Pointer to the CQ entry.
5521  * @param len_hdr Pointer where the header length is written.
5522  * @param len_data Pointer where the payload length is written.
5523  *
5524  * @return Returns 0 on success, or a non-zero value on failure.
5525  */
5526 static inline int32_t
5527 sli_fc_rqe_length(sli4_t *sli4, void *cqe, uint32_t *len_hdr, uint32_t *len_data)
5528 {
5529 	sli4_fc_async_rcqe_t	*rcqe = cqe;
5530 
5531 	*len_hdr = *len_data = 0;
5532 
5533 	if (SLI4_FC_ASYNC_RQ_SUCCESS == rcqe->status) {
5534 		*len_hdr  = rcqe->header_data_placement_length;
5535 		*len_data = rcqe->payload_data_placement_length;
5536 		return 0;
5537 	} else {
5538 		return -1;
5539 	}
5540 }
5541 
5542 /**
5543  * @ingroup sli_fc
5544  * @brief Retrieve the received FCFI.
5545  *
5546  * @param sli4 SLI context.
5547  * @param cqe Pointer to the CQ entry.
5548  *
5549  * @return Returns the FCFI in the CQE. or UINT8_MAX if invalid CQE code.
5550  */
5551 static inline uint8_t
5552 sli_fc_rqe_fcfi(sli4_t *sli4, void *cqe)
5553 {
5554 	uint8_t code = ((uint8_t*)cqe)[SLI4_CQE_CODE_OFFSET];
5555 	uint8_t fcfi = UINT8_MAX;
5556 
5557 	switch(code) {
5558 	case SLI4_CQE_CODE_RQ_ASYNC: {
5559 		sli4_fc_async_rcqe_t *rcqe = cqe;
5560 		fcfi = rcqe->fcfi;
5561 		break;
5562 	}
5563 	case SLI4_CQE_CODE_RQ_ASYNC_V1: {
5564 		sli4_fc_async_rcqe_v1_t *rcqev1 = cqe;
5565 		fcfi = rcqev1->fcfi;
5566 		break;
5567 	}
5568 	case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: {
5569 		sli4_fc_optimized_write_cmd_cqe_t *opt_wr = cqe;
5570 		fcfi = opt_wr->fcfi;
5571 		break;
5572 	}
5573 	}
5574 
5575 	return fcfi;
5576 }
5577 
5578 extern const char *sli_fc_get_status_string(uint32_t status);
5579 
5580 #endif /* !_SLI4_H */
5581