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