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