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