xref: /openbmc/linux/drivers/scsi/elx/libefc_sli/sli4.h (revision 2a598d0b)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
4  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
5  *
6  */
7 
8 /*
9  * All common SLI-4 structures and function prototypes.
10  */
11 
12 #ifndef _SLI4_H
13 #define _SLI4_H
14 
15 #include <linux/pci.h>
16 #include <linux/delay.h>
17 #include "scsi/fc/fc_els.h"
18 #include "scsi/fc/fc_fs.h"
19 #include "../include/efc_common.h"
20 
21 /*************************************************************************
22  * Common SLI-4 register offsets and field definitions
23  */
24 
25 /* SLI_INTF - SLI Interface Definition Register */
26 #define SLI4_INTF_REG			0x0058
27 enum sli4_intf {
28 	SLI4_INTF_REV_SHIFT		= 4,
29 	SLI4_INTF_REV_MASK		= 0xf0,
30 
31 	SLI4_INTF_REV_S3		= 0x30,
32 	SLI4_INTF_REV_S4		= 0x40,
33 
34 	SLI4_INTF_FAMILY_SHIFT		= 8,
35 	SLI4_INTF_FAMILY_MASK		= 0x0f00,
36 
37 	SLI4_FAMILY_CHECK_ASIC_TYPE	= 0x0f00,
38 
39 	SLI4_INTF_IF_TYPE_SHIFT		= 12,
40 	SLI4_INTF_IF_TYPE_MASK		= 0xf000,
41 
42 	SLI4_INTF_IF_TYPE_2		= 0x2000,
43 	SLI4_INTF_IF_TYPE_6		= 0x6000,
44 
45 	SLI4_INTF_VALID_SHIFT		= 29,
46 	SLI4_INTF_VALID_MASK		= 0xe0000000,
47 
48 	SLI4_INTF_VALID_VALUE		= 0xc0000000,
49 };
50 
51 /* ASIC_ID - SLI ASIC Type and Revision Register */
52 #define SLI4_ASIC_ID_REG	0x009c
53 enum sli4_asic {
54 	SLI4_ASIC_GEN_SHIFT	= 8,
55 	SLI4_ASIC_GEN_MASK	= 0xff00,
56 	SLI4_ASIC_GEN_5		= 0x0b00,
57 	SLI4_ASIC_GEN_6		= 0x0c00,
58 	SLI4_ASIC_GEN_7		= 0x0d00,
59 };
60 
61 enum sli4_acic_revisions {
62 	SLI4_ASIC_REV_A0	= 0x00,
63 	SLI4_ASIC_REV_A1	= 0x01,
64 	SLI4_ASIC_REV_A2	= 0x02,
65 	SLI4_ASIC_REV_A3	= 0x03,
66 	SLI4_ASIC_REV_B0	= 0x10,
67 	SLI4_ASIC_REV_B1	= 0x11,
68 	SLI4_ASIC_REV_B2	= 0x12,
69 	SLI4_ASIC_REV_C0	= 0x20,
70 	SLI4_ASIC_REV_C1	= 0x21,
71 	SLI4_ASIC_REV_C2	= 0x22,
72 	SLI4_ASIC_REV_D0	= 0x30,
73 };
74 
75 struct sli4_asic_entry_t {
76 	u32 rev_id;
77 	u32 family;
78 };
79 
80 /* BMBX - Bootstrap Mailbox Register */
81 #define SLI4_BMBX_REG		0x0160
82 enum sli4_bmbx {
83 	SLI4_BMBX_MASK_HI	= 0x3,
84 	SLI4_BMBX_MASK_LO	= 0xf,
85 	SLI4_BMBX_RDY		= 1 << 0,
86 	SLI4_BMBX_HI		= 1 << 1,
87 	SLI4_BMBX_SIZE		= 256,
88 };
89 
90 static inline u32
91 sli_bmbx_write_hi(u64 addr) {
92 	u32 val;
93 
94 	val = upper_32_bits(addr) & ~SLI4_BMBX_MASK_HI;
95 	val |= SLI4_BMBX_HI;
96 
97 	return val;
98 }
99 
100 static inline u32
101 sli_bmbx_write_lo(u64 addr) {
102 	u32 val;
103 
104 	val = (upper_32_bits(addr) & SLI4_BMBX_MASK_HI) << 30;
105 	val |= ((addr) & ~SLI4_BMBX_MASK_LO) >> 2;
106 
107 	return val;
108 }
109 
110 /* SLIPORT_CONTROL - SLI Port Control Register */
111 #define SLI4_PORT_CTRL_REG	0x0408
112 enum sli4_port_ctrl {
113 	SLI4_PORT_CTRL_IP	= 1u << 27,
114 	SLI4_PORT_CTRL_IDIS	= 1u << 22,
115 	SLI4_PORT_CTRL_FDD	= 1u << 31,
116 };
117 
118 /* SLI4_SLIPORT_ERROR - SLI Port Error Register */
119 #define SLI4_PORT_ERROR1	0x040c
120 #define SLI4_PORT_ERROR2	0x0410
121 
122 /* EQCQ_DOORBELL - EQ and CQ Doorbell Register */
123 #define SLI4_EQCQ_DB_REG	0x120
124 enum sli4_eqcq_e {
125 	SLI4_EQ_ID_LO_MASK	= 0x01ff,
126 
127 	SLI4_CQ_ID_LO_MASK	= 0x03ff,
128 
129 	SLI4_EQCQ_CI_EQ		= 0x0200,
130 
131 	SLI4_EQCQ_QT_EQ		= 0x00000400,
132 	SLI4_EQCQ_QT_CQ		= 0x00000000,
133 
134 	SLI4_EQCQ_ID_HI_SHIFT	= 11,
135 	SLI4_EQCQ_ID_HI_MASK	= 0xf800,
136 
137 	SLI4_EQCQ_NUM_SHIFT	= 16,
138 	SLI4_EQCQ_NUM_MASK	= 0x1fff0000,
139 
140 	SLI4_EQCQ_ARM		= 0x20000000,
141 	SLI4_EQCQ_UNARM		= 0x00000000,
142 };
143 
144 static inline u32
145 sli_format_eq_db_data(u16 num_popped, u16 id, u32 arm) {
146 	u32 reg;
147 
148 	reg = (id & SLI4_EQ_ID_LO_MASK) | SLI4_EQCQ_QT_EQ;
149 	reg |= (((id) >> 9) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
150 	reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
151 	reg |= arm | SLI4_EQCQ_CI_EQ;
152 
153 	return reg;
154 }
155 
156 static inline u32
157 sli_format_cq_db_data(u16 num_popped, u16 id, u32 arm) {
158 	u32 reg;
159 
160 	reg = ((id) & SLI4_CQ_ID_LO_MASK) | SLI4_EQCQ_QT_CQ;
161 	reg |= (((id) >> 10) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
162 	reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
163 	reg |= arm;
164 
165 	return reg;
166 }
167 
168 /* EQ_DOORBELL - EQ Doorbell Register for IF_TYPE = 6*/
169 #define SLI4_IF6_EQ_DB_REG	0x120
170 enum sli4_eq_e {
171 	SLI4_IF6_EQ_ID_MASK	= 0x0fff,
172 
173 	SLI4_IF6_EQ_NUM_SHIFT	= 16,
174 	SLI4_IF6_EQ_NUM_MASK	= 0x1fff0000,
175 };
176 
177 static inline u32
178 sli_format_if6_eq_db_data(u16 num_popped, u16 id, u32 arm) {
179 	u32 reg;
180 
181 	reg = id & SLI4_IF6_EQ_ID_MASK;
182 	reg |= (num_popped << SLI4_IF6_EQ_NUM_SHIFT) & SLI4_IF6_EQ_NUM_MASK;
183 	reg |= arm;
184 
185 	return reg;
186 }
187 
188 /* CQ_DOORBELL - CQ Doorbell Register for IF_TYPE = 6 */
189 #define SLI4_IF6_CQ_DB_REG	0xc0
190 enum sli4_cq_e {
191 	SLI4_IF6_CQ_ID_MASK	= 0xffff,
192 
193 	SLI4_IF6_CQ_NUM_SHIFT	= 16,
194 	SLI4_IF6_CQ_NUM_MASK	= 0x1fff0000,
195 };
196 
197 static inline u32
198 sli_format_if6_cq_db_data(u16 num_popped, u16 id, u32 arm) {
199 	u32 reg;
200 
201 	reg = id & SLI4_IF6_CQ_ID_MASK;
202 	reg |= ((num_popped) << SLI4_IF6_CQ_NUM_SHIFT) & SLI4_IF6_CQ_NUM_MASK;
203 	reg |= arm;
204 
205 	return reg;
206 }
207 
208 /* MQ_DOORBELL - MQ Doorbell Register */
209 #define SLI4_MQ_DB_REG		0x0140
210 #define SLI4_IF6_MQ_DB_REG	0x0160
211 enum sli4_mq_e {
212 	SLI4_MQ_ID_MASK		= 0xffff,
213 
214 	SLI4_MQ_NUM_SHIFT	= 16,
215 	SLI4_MQ_NUM_MASK	= 0x3fff0000,
216 };
217 
218 static inline u32
219 sli_format_mq_db_data(u16 id) {
220 	u32 reg;
221 
222 	reg = id & SLI4_MQ_ID_MASK;
223 	reg |= (1 << SLI4_MQ_NUM_SHIFT) & SLI4_MQ_NUM_MASK;
224 
225 	return reg;
226 }
227 
228 /* RQ_DOORBELL - RQ Doorbell Register */
229 #define SLI4_RQ_DB_REG		0x0a0
230 #define SLI4_IF6_RQ_DB_REG	0x0080
231 enum sli4_rq_e {
232 	SLI4_RQ_DB_ID_MASK	= 0xffff,
233 
234 	SLI4_RQ_DB_NUM_SHIFT	= 16,
235 	SLI4_RQ_DB_NUM_MASK	= 0x3fff0000,
236 };
237 
238 static inline u32
239 sli_format_rq_db_data(u16 id) {
240 	u32 reg;
241 
242 	reg = id & SLI4_RQ_DB_ID_MASK;
243 	reg |= (1 << SLI4_RQ_DB_NUM_SHIFT) & SLI4_RQ_DB_NUM_MASK;
244 
245 	return reg;
246 }
247 
248 /* WQ_DOORBELL - WQ Doorbell Register */
249 #define SLI4_IO_WQ_DB_REG	0x040
250 #define SLI4_IF6_WQ_DB_REG	0x040
251 enum sli4_wq_e {
252 	SLI4_WQ_ID_MASK		= 0xffff,
253 
254 	SLI4_WQ_IDX_SHIFT	= 16,
255 	SLI4_WQ_IDX_MASK	= 0xff0000,
256 
257 	SLI4_WQ_NUM_SHIFT	= 24,
258 	SLI4_WQ_NUM_MASK	= 0x0ff00000,
259 };
260 
261 static inline u32
262 sli_format_wq_db_data(u16 id) {
263 	u32 reg;
264 
265 	reg = id & SLI4_WQ_ID_MASK;
266 	reg |= (1 << SLI4_WQ_NUM_SHIFT) & SLI4_WQ_NUM_MASK;
267 
268 	return reg;
269 }
270 
271 /* SLIPORT_STATUS - SLI Port Status Register */
272 #define SLI4_PORT_STATUS_REGOFF	0x0404
273 enum sli4_port_status {
274 	SLI4_PORT_STATUS_FDP	= 1u << 21,
275 	SLI4_PORT_STATUS_RDY	= 1u << 23,
276 	SLI4_PORT_STATUS_RN	= 1u << 24,
277 	SLI4_PORT_STATUS_DIP	= 1u << 25,
278 	SLI4_PORT_STATUS_OTI	= 1u << 29,
279 	SLI4_PORT_STATUS_ERR	= 1u << 31,
280 };
281 
282 #define SLI4_PHYDEV_CTRL_REG	0x0414
283 #define SLI4_PHYDEV_CTRL_FRST	(1 << 1)
284 #define SLI4_PHYDEV_CTRL_DD	(1 << 2)
285 
286 /* Register name enums */
287 enum sli4_regname_en {
288 	SLI4_REG_BMBX,
289 	SLI4_REG_EQ_DOORBELL,
290 	SLI4_REG_CQ_DOORBELL,
291 	SLI4_REG_RQ_DOORBELL,
292 	SLI4_REG_IO_WQ_DOORBELL,
293 	SLI4_REG_MQ_DOORBELL,
294 	SLI4_REG_PHYSDEV_CONTROL,
295 	SLI4_REG_PORT_CONTROL,
296 	SLI4_REG_PORT_ERROR1,
297 	SLI4_REG_PORT_ERROR2,
298 	SLI4_REG_PORT_SEMAPHORE,
299 	SLI4_REG_PORT_STATUS,
300 	SLI4_REG_UNKWOWN			/* must be last */
301 };
302 
303 struct sli4_reg {
304 	u32	rset;
305 	u32	off;
306 };
307 
308 struct sli4_dmaaddr {
309 	__le32 low;
310 	__le32 high;
311 };
312 
313 /*
314  * a 3-word Buffer Descriptor Entry with
315  * address 1st 2 words, length last word
316  */
317 struct sli4_bufptr {
318 	struct sli4_dmaaddr addr;
319 	__le32 length;
320 };
321 
322 /* Buffer Descriptor Entry (BDE) */
323 enum sli4_bde_e {
324 	SLI4_BDE_LEN_MASK	= 0x00ffffff,
325 	SLI4_BDE_TYPE_MASK	= 0xff000000,
326 };
327 
328 struct sli4_bde {
329 	__le32		bde_type_buflen;
330 	union {
331 		struct sli4_dmaaddr data;
332 		struct {
333 			__le32	offset;
334 			__le32	rsvd2;
335 		} imm;
336 		struct sli4_dmaaddr blp;
337 	} u;
338 };
339 
340 /* Buffer Descriptors */
341 enum sli4_bde_type {
342 	SLI4_BDE_TYPE_SHIFT	= 24,
343 	SLI4_BDE_TYPE_64	= 0x00,	/* Generic 64-bit data */
344 	SLI4_BDE_TYPE_IMM	= 0x01,	/* Immediate data */
345 	SLI4_BDE_TYPE_BLP	= 0x40,	/* Buffer List Pointer */
346 };
347 
348 #define SLI4_BDE_TYPE_VAL(type) \
349 	(SLI4_BDE_TYPE_##type << SLI4_BDE_TYPE_SHIFT)
350 
351 /* Scatter-Gather Entry (SGE) */
352 #define SLI4_SGE_MAX_RESERVED		3
353 
354 enum sli4_sge_type {
355 	/* DW2 */
356 	SLI4_SGE_DATA_OFFSET_MASK	= 0x07ffffff,
357 	/*DW2W1*/
358 	SLI4_SGE_TYPE_SHIFT		= 27,
359 	SLI4_SGE_TYPE_MASK		= 0x78000000,
360 	/*SGE Types*/
361 	SLI4_SGE_TYPE_DATA		= 0x00,
362 	SLI4_SGE_TYPE_DIF		= 0x04,	/* Data Integrity Field */
363 	SLI4_SGE_TYPE_LSP		= 0x05,	/* List Segment Pointer */
364 	SLI4_SGE_TYPE_PEDIF		= 0x06,	/* Post Encryption Engine DIF */
365 	SLI4_SGE_TYPE_PESEED		= 0x07,	/* Post Encryption DIF Seed */
366 	SLI4_SGE_TYPE_DISEED		= 0x08,	/* DIF Seed */
367 	SLI4_SGE_TYPE_ENC		= 0x09,	/* Encryption */
368 	SLI4_SGE_TYPE_ATM		= 0x0a,	/* DIF Application Tag Mask */
369 	SLI4_SGE_TYPE_SKIP		= 0x0c,	/* SKIP */
370 
371 	SLI4_SGE_LAST			= 1u << 31,
372 };
373 
374 struct sli4_sge {
375 	__le32		buffer_address_high;
376 	__le32		buffer_address_low;
377 	__le32		dw2_flags;
378 	__le32		buffer_length;
379 };
380 
381 /* T10 DIF Scatter-Gather Entry (SGE) */
382 struct sli4_dif_sge {
383 	__le32		buffer_address_high;
384 	__le32		buffer_address_low;
385 	__le32		dw2_flags;
386 	__le32		rsvd12;
387 };
388 
389 /* Data Integrity Seed (DISEED) SGE */
390 enum sli4_diseed_sge_flags {
391 	/* DW2W1 */
392 	SLI4_DISEED_SGE_HS		= 1 << 2,
393 	SLI4_DISEED_SGE_WS		= 1 << 3,
394 	SLI4_DISEED_SGE_IC		= 1 << 4,
395 	SLI4_DISEED_SGE_ICS		= 1 << 5,
396 	SLI4_DISEED_SGE_ATRT		= 1 << 6,
397 	SLI4_DISEED_SGE_AT		= 1 << 7,
398 	SLI4_DISEED_SGE_FAT		= 1 << 8,
399 	SLI4_DISEED_SGE_NA		= 1 << 9,
400 	SLI4_DISEED_SGE_HI		= 1 << 10,
401 
402 	/* DW3W1 */
403 	SLI4_DISEED_SGE_BS_MASK		= 0x0007,
404 	SLI4_DISEED_SGE_AI		= 1 << 3,
405 	SLI4_DISEED_SGE_ME		= 1 << 4,
406 	SLI4_DISEED_SGE_RE		= 1 << 5,
407 	SLI4_DISEED_SGE_CE		= 1 << 6,
408 	SLI4_DISEED_SGE_NR		= 1 << 7,
409 
410 	SLI4_DISEED_SGE_OP_RX_SHIFT	= 8,
411 	SLI4_DISEED_SGE_OP_RX_MASK	= 0x0f00,
412 	SLI4_DISEED_SGE_OP_TX_SHIFT	= 12,
413 	SLI4_DISEED_SGE_OP_TX_MASK	= 0xf000,
414 };
415 
416 /* Opcode values */
417 enum sli4_diseed_sge_opcodes {
418 	SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CRC,
419 	SLI4_DISEED_SGE_OP_IN_CRC_OUT_NODIF,
420 	SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CSUM,
421 	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_NODIF,
422 	SLI4_DISEED_SGE_OP_IN_CRC_OUT_CRC,
423 	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CSUM,
424 	SLI4_DISEED_SGE_OP_IN_CRC_OUT_CSUM,
425 	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CRC,
426 	SLI4_DISEED_SGE_OP_IN_RAW_OUT_RAW,
427 };
428 
429 #define SLI4_DISEED_SGE_OP_RX_VALUE(stype) \
430 	(SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_RX_SHIFT)
431 #define SLI4_DISEED_SGE_OP_TX_VALUE(stype) \
432 	(SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_TX_SHIFT)
433 
434 struct sli4_diseed_sge {
435 	__le32		ref_tag_cmp;
436 	__le32		ref_tag_repl;
437 	__le16		app_tag_repl;
438 	__le16		dw2w1_flags;
439 	__le16		app_tag_cmp;
440 	__le16		dw3w1_flags;
441 };
442 
443 /* List Segment Pointer Scatter-Gather Entry (SGE) */
444 #define SLI4_LSP_SGE_SEGLEN	0x00ffffff
445 
446 struct sli4_lsp_sge {
447 	__le32		buffer_address_high;
448 	__le32		buffer_address_low;
449 	__le32		dw2_flags;
450 	__le32		dw3_seglen;
451 };
452 
453 enum sli4_eqe_e {
454 	SLI4_EQE_VALID	= 1,
455 	SLI4_EQE_MJCODE	= 0xe,
456 	SLI4_EQE_MNCODE	= 0xfff0,
457 };
458 
459 struct sli4_eqe {
460 	__le16		dw0w0_flags;
461 	__le16		resource_id;
462 };
463 
464 #define SLI4_MAJOR_CODE_STANDARD	0
465 #define SLI4_MAJOR_CODE_SENTINEL	1
466 
467 /* Sentinel EQE indicating the EQ is full */
468 #define SLI4_EQE_STATUS_EQ_FULL		2
469 
470 enum sli4_mcqe_e {
471 	SLI4_MCQE_CONSUMED	= 1u << 27,
472 	SLI4_MCQE_COMPLETED	= 1u << 28,
473 	SLI4_MCQE_AE		= 1u << 30,
474 	SLI4_MCQE_VALID		= 1u << 31,
475 };
476 
477 /* Entry was consumed but not completed */
478 #define SLI4_MCQE_STATUS_NOT_COMPLETED	-2
479 
480 struct sli4_mcqe {
481 	__le16		completion_status;
482 	__le16		extended_status;
483 	__le32		mqe_tag_low;
484 	__le32		mqe_tag_high;
485 	__le32		dw3_flags;
486 };
487 
488 enum sli4_acqe_e {
489 	SLI4_ACQE_AE	= 1 << 6, /* async event - this is an ACQE */
490 	SLI4_ACQE_VAL	= 1 << 7, /* valid - contents of CQE are valid */
491 };
492 
493 struct sli4_acqe {
494 	__le32		event_data[3];
495 	u8		rsvd12;
496 	u8		event_code;
497 	u8		event_type;
498 	u8		ae_val;
499 };
500 
501 enum sli4_acqe_event_code {
502 	SLI4_ACQE_EVENT_CODE_LINK_STATE		= 0x01,
503 	SLI4_ACQE_EVENT_CODE_FIP		= 0x02,
504 	SLI4_ACQE_EVENT_CODE_DCBX		= 0x03,
505 	SLI4_ACQE_EVENT_CODE_ISCSI		= 0x04,
506 	SLI4_ACQE_EVENT_CODE_GRP_5		= 0x05,
507 	SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT	= 0x10,
508 	SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT	= 0x11,
509 	SLI4_ACQE_EVENT_CODE_VF_EVENT		= 0x12,
510 	SLI4_ACQE_EVENT_CODE_MR_EVENT		= 0x13,
511 };
512 
513 enum sli4_qtype {
514 	SLI4_QTYPE_EQ,
515 	SLI4_QTYPE_CQ,
516 	SLI4_QTYPE_MQ,
517 	SLI4_QTYPE_WQ,
518 	SLI4_QTYPE_RQ,
519 	SLI4_QTYPE_MAX,			/* must be last */
520 };
521 
522 #define SLI4_USER_MQ_COUNT	1
523 #define SLI4_MAX_CQ_SET_COUNT	16
524 #define SLI4_MAX_RQ_SET_COUNT	16
525 
526 enum sli4_qentry {
527 	SLI4_QENTRY_ASYNC,
528 	SLI4_QENTRY_MQ,
529 	SLI4_QENTRY_RQ,
530 	SLI4_QENTRY_WQ,
531 	SLI4_QENTRY_WQ_RELEASE,
532 	SLI4_QENTRY_OPT_WRITE_CMD,
533 	SLI4_QENTRY_OPT_WRITE_DATA,
534 	SLI4_QENTRY_XABT,
535 	SLI4_QENTRY_MAX			/* must be last */
536 };
537 
538 enum sli4_queue_flags {
539 	SLI4_QUEUE_FLAG_MQ	= 1 << 0,	/* CQ has MQ/Async completion */
540 	SLI4_QUEUE_FLAG_HDR	= 1 << 1,	/* RQ for packet headers */
541 	SLI4_QUEUE_FLAG_RQBATCH	= 1 << 2,	/* RQ index increment by 8 */
542 };
543 
544 /* Generic Command Request header */
545 enum sli4_cmd_version {
546 	CMD_V0,
547 	CMD_V1,
548 	CMD_V2,
549 };
550 
551 struct sli4_rqst_hdr {
552 	u8		opcode;
553 	u8		subsystem;
554 	__le16		rsvd2;
555 	__le32		timeout;
556 	__le32		request_length;
557 	__le32		dw3_version;
558 };
559 
560 /* Generic Command Response header */
561 struct sli4_rsp_hdr {
562 	u8		opcode;
563 	u8		subsystem;
564 	__le16		rsvd2;
565 	u8		status;
566 	u8		additional_status;
567 	__le16		rsvd6;
568 	__le32		response_length;
569 	__le32		actual_response_length;
570 };
571 
572 #define SLI4_QUEUE_RQ_BATCH	8
573 
574 #define SZ_DMAADDR		sizeof(struct sli4_dmaaddr)
575 #define SLI4_RQST_CMDSZ(stype)	sizeof(struct sli4_rqst_##stype)
576 
577 #define SLI4_RQST_PYLD_LEN(stype) \
578 		cpu_to_le32(sizeof(struct sli4_rqst_##stype) - \
579 			sizeof(struct sli4_rqst_hdr))
580 
581 #define SLI4_RQST_PYLD_LEN_VAR(stype, varpyld) \
582 		cpu_to_le32((sizeof(struct sli4_rqst_##stype) + \
583 			varpyld) - sizeof(struct sli4_rqst_hdr))
584 
585 #define SLI4_CFG_PYLD_LENGTH(stype) \
586 		max(sizeof(struct sli4_rqst_##stype), \
587 		sizeof(struct sli4_rsp_##stype))
588 
589 enum sli4_create_cqv2_e {
590 	/* DW5_flags values*/
591 	SLI4_CREATE_CQV2_CLSWM_MASK	= 0x00003000,
592 	SLI4_CREATE_CQV2_NODELAY	= 0x00004000,
593 	SLI4_CREATE_CQV2_AUTOVALID	= 0x00008000,
594 	SLI4_CREATE_CQV2_CQECNT_MASK	= 0x18000000,
595 	SLI4_CREATE_CQV2_VALID		= 0x20000000,
596 	SLI4_CREATE_CQV2_EVT		= 0x80000000,
597 	/* DW6W1_flags values*/
598 	SLI4_CREATE_CQV2_ARM		= 0x8000,
599 };
600 
601 struct sli4_rqst_cmn_create_cq_v2 {
602 	struct sli4_rqst_hdr	hdr;
603 	__le16			num_pages;
604 	u8			page_size;
605 	u8			rsvd19;
606 	__le32			dw5_flags;
607 	__le16			eq_id;
608 	__le16			dw6w1_arm;
609 	__le16			cqe_count;
610 	__le16			rsvd30;
611 	__le32			rsvd32;
612 	struct sli4_dmaaddr	page_phys_addr[];
613 };
614 
615 enum sli4_create_cqset_e {
616 	/* DW5_flags values*/
617 	SLI4_CREATE_CQSETV0_CLSWM_MASK	= 0x00003000,
618 	SLI4_CREATE_CQSETV0_NODELAY	= 0x00004000,
619 	SLI4_CREATE_CQSETV0_AUTOVALID	= 0x00008000,
620 	SLI4_CREATE_CQSETV0_CQECNT_MASK	= 0x18000000,
621 	SLI4_CREATE_CQSETV0_VALID	= 0x20000000,
622 	SLI4_CREATE_CQSETV0_EVT		= 0x80000000,
623 	/* DW5W1_flags values */
624 	SLI4_CREATE_CQSETV0_CQE_COUNT	= 0x7fff,
625 	SLI4_CREATE_CQSETV0_ARM		= 0x8000,
626 };
627 
628 struct sli4_rqst_cmn_create_cq_set_v0 {
629 	struct sli4_rqst_hdr	hdr;
630 	__le16			num_pages;
631 	u8			page_size;
632 	u8			rsvd19;
633 	__le32			dw5_flags;
634 	__le16			num_cq_req;
635 	__le16			dw6w1_flags;
636 	__le16			eq_id[16];
637 	struct sli4_dmaaddr	page_phys_addr[];
638 };
639 
640 /* CQE count */
641 enum sli4_cq_cnt {
642 	SLI4_CQ_CNT_256,
643 	SLI4_CQ_CNT_512,
644 	SLI4_CQ_CNT_1024,
645 	SLI4_CQ_CNT_LARGE,
646 };
647 
648 #define SLI4_CQ_CNT_SHIFT	27
649 #define SLI4_CQ_CNT_VAL(type)	(SLI4_CQ_CNT_##type << SLI4_CQ_CNT_SHIFT)
650 
651 #define SLI4_CQE_BYTES		(4 * sizeof(u32))
652 
653 #define SLI4_CREATE_CQV2_MAX_PAGES	8
654 
655 /* Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion */
656 struct sli4_rsp_cmn_create_queue {
657 	struct sli4_rsp_hdr	hdr;
658 	__le16	q_id;
659 	u8	rsvd18;
660 	u8	ulp;
661 	__le32	db_offset;
662 	__le16	db_rs;
663 	__le16	db_fmt;
664 };
665 
666 struct sli4_rsp_cmn_create_queue_set {
667 	struct sli4_rsp_hdr	hdr;
668 	__le16	q_id;
669 	__le16	num_q_allocated;
670 };
671 
672 /* Common Destroy Queue */
673 struct sli4_rqst_cmn_destroy_q {
674 	struct sli4_rqst_hdr	hdr;
675 	__le16	q_id;
676 	__le16	rsvd;
677 };
678 
679 struct sli4_rsp_cmn_destroy_q {
680 	struct sli4_rsp_hdr	hdr;
681 };
682 
683 /* Modify the delay multiplier for EQs */
684 struct sli4_eqdelay_rec {
685 	__le32  eq_id;
686 	__le32  phase;
687 	__le32  delay_multiplier;
688 };
689 
690 struct sli4_rqst_cmn_modify_eq_delay {
691 	struct sli4_rqst_hdr	hdr;
692 	__le32			num_eq;
693 	struct sli4_eqdelay_rec eq_delay_record[8];
694 };
695 
696 struct sli4_rsp_cmn_modify_eq_delay {
697 	struct sli4_rsp_hdr	hdr;
698 };
699 
700 enum sli4_create_cq_e {
701 	/* DW5 */
702 	SLI4_CREATE_EQ_AUTOVALID		= 1u << 28,
703 	SLI4_CREATE_EQ_VALID			= 1u << 29,
704 	SLI4_CREATE_EQ_EQESZ			= 1u << 31,
705 	/* DW6 */
706 	SLI4_CREATE_EQ_COUNT			= 7 << 26,
707 	SLI4_CREATE_EQ_ARM			= 1u << 31,
708 	/* DW7 */
709 	SLI4_CREATE_EQ_DELAYMULTI_SHIFT		= 13,
710 	SLI4_CREATE_EQ_DELAYMULTI_MASK		= 0x007fe000,
711 	SLI4_CREATE_EQ_DELAYMULTI		= 0x00040000,
712 };
713 
714 struct sli4_rqst_cmn_create_eq {
715 	struct sli4_rqst_hdr	hdr;
716 	__le16			num_pages;
717 	__le16			rsvd18;
718 	__le32			dw5_flags;
719 	__le32			dw6_flags;
720 	__le32			dw7_delaymulti;
721 	__le32			rsvd32;
722 	struct sli4_dmaaddr	page_address[8];
723 };
724 
725 struct sli4_rsp_cmn_create_eq {
726 	struct sli4_rsp_cmn_create_queue q_rsp;
727 };
728 
729 /* EQ count */
730 enum sli4_eq_cnt {
731 	SLI4_EQ_CNT_256,
732 	SLI4_EQ_CNT_512,
733 	SLI4_EQ_CNT_1024,
734 	SLI4_EQ_CNT_2048,
735 	SLI4_EQ_CNT_4096 = 3,
736 };
737 
738 #define SLI4_EQ_CNT_SHIFT	26
739 #define SLI4_EQ_CNT_VAL(type)	(SLI4_EQ_CNT_##type << SLI4_EQ_CNT_SHIFT)
740 
741 #define SLI4_EQE_SIZE_4		0
742 #define SLI4_EQE_SIZE_16	1
743 
744 /* Create a Mailbox Queue; accommodate v0 and v1 forms. */
745 enum sli4_create_mq_flags {
746 	/* DW6W1 */
747 	SLI4_CREATE_MQEXT_RINGSIZE	= 0xf,
748 	SLI4_CREATE_MQEXT_CQID_SHIFT	= 6,
749 	SLI4_CREATE_MQEXT_CQIDV0_MASK	= 0xffc0,
750 	/* DW7 */
751 	SLI4_CREATE_MQEXT_VAL		= 1u << 31,
752 	/* DW8 */
753 	SLI4_CREATE_MQEXT_ACQV		= 1u << 0,
754 	SLI4_CREATE_MQEXT_ASYNC_CQIDV0	= 0x7fe,
755 };
756 
757 struct sli4_rqst_cmn_create_mq_ext {
758 	struct sli4_rqst_hdr	hdr;
759 	__le16			num_pages;
760 	__le16			cq_id_v1;
761 	__le32			async_event_bitmap;
762 	__le16			async_cq_id_v1;
763 	__le16			dw6w1_flags;
764 	__le32			dw7_val;
765 	__le32			dw8_flags;
766 	__le32			rsvd36;
767 	struct sli4_dmaaddr	page_phys_addr[];
768 };
769 
770 struct sli4_rsp_cmn_create_mq_ext {
771 	struct sli4_rsp_cmn_create_queue q_rsp;
772 };
773 
774 enum sli4_mqe_size {
775 	SLI4_MQE_SIZE_16 = 0x05,
776 	SLI4_MQE_SIZE_32,
777 	SLI4_MQE_SIZE_64,
778 	SLI4_MQE_SIZE_128,
779 };
780 
781 enum sli4_async_evt {
782 	SLI4_ASYNC_EVT_LINK_STATE	= 1 << 1,
783 	SLI4_ASYNC_EVT_FIP		= 1 << 2,
784 	SLI4_ASYNC_EVT_GRP5		= 1 << 5,
785 	SLI4_ASYNC_EVT_FC		= 1 << 16,
786 	SLI4_ASYNC_EVT_SLI_PORT		= 1 << 17,
787 };
788 
789 #define	SLI4_ASYNC_EVT_FC_ALL \
790 		(SLI4_ASYNC_EVT_LINK_STATE	| \
791 		 SLI4_ASYNC_EVT_FIP		| \
792 		 SLI4_ASYNC_EVT_GRP5		| \
793 		 SLI4_ASYNC_EVT_FC		| \
794 		 SLI4_ASYNC_EVT_SLI_PORT)
795 
796 /* Create a Completion Queue. */
797 struct sli4_rqst_cmn_create_cq_v0 {
798 	struct sli4_rqst_hdr	hdr;
799 	__le16			num_pages;
800 	__le16			rsvd18;
801 	__le32			dw5_flags;
802 	__le32			dw6_flags;
803 	__le32			rsvd28;
804 	__le32			rsvd32;
805 	struct sli4_dmaaddr	page_phys_addr[];
806 };
807 
808 enum sli4_create_rq_e {
809 	SLI4_RQ_CREATE_DUA		= 0x1,
810 	SLI4_RQ_CREATE_BQU		= 0x2,
811 
812 	SLI4_RQE_SIZE			= 8,
813 	SLI4_RQE_SIZE_8			= 0x2,
814 	SLI4_RQE_SIZE_16		= 0x3,
815 	SLI4_RQE_SIZE_32		= 0x4,
816 	SLI4_RQE_SIZE_64		= 0x5,
817 	SLI4_RQE_SIZE_128		= 0x6,
818 
819 	SLI4_RQ_PAGE_SIZE_4096		= 0x1,
820 	SLI4_RQ_PAGE_SIZE_8192		= 0x2,
821 	SLI4_RQ_PAGE_SIZE_16384		= 0x4,
822 	SLI4_RQ_PAGE_SIZE_32768		= 0x8,
823 	SLI4_RQ_PAGE_SIZE_64536		= 0x10,
824 
825 	SLI4_RQ_CREATE_V0_MAX_PAGES	= 8,
826 	SLI4_RQ_CREATE_V0_MIN_BUF_SIZE	= 128,
827 	SLI4_RQ_CREATE_V0_MAX_BUF_SIZE	= 2048,
828 };
829 
830 struct sli4_rqst_rq_create {
831 	struct sli4_rqst_hdr	hdr;
832 	__le16			num_pages;
833 	u8			dua_bqu_byte;
834 	u8			ulp;
835 	__le16			rsvd16;
836 	u8			rqe_count_byte;
837 	u8			rsvd19;
838 	__le32			rsvd20;
839 	__le16			buffer_size;
840 	__le16			cq_id;
841 	__le32			rsvd28;
842 	struct sli4_dmaaddr	page_phys_addr[SLI4_RQ_CREATE_V0_MAX_PAGES];
843 };
844 
845 struct sli4_rsp_rq_create {
846 	struct sli4_rsp_cmn_create_queue rsp;
847 };
848 
849 enum sli4_create_rqv1_e {
850 	SLI4_RQ_CREATE_V1_DNB		= 0x80,
851 	SLI4_RQ_CREATE_V1_MAX_PAGES	= 8,
852 	SLI4_RQ_CREATE_V1_MIN_BUF_SIZE	= 64,
853 	SLI4_RQ_CREATE_V1_MAX_BUF_SIZE	= 2048,
854 };
855 
856 struct sli4_rqst_rq_create_v1 {
857 	struct sli4_rqst_hdr	hdr;
858 	__le16			num_pages;
859 	u8			rsvd14;
860 	u8			dim_dfd_dnb;
861 	u8			page_size;
862 	u8			rqe_size_byte;
863 	__le16			rqe_count;
864 	__le32			rsvd20;
865 	__le16			rsvd24;
866 	__le16			cq_id;
867 	__le32			buffer_size;
868 	struct sli4_dmaaddr	page_phys_addr[SLI4_RQ_CREATE_V1_MAX_PAGES];
869 };
870 
871 struct sli4_rsp_rq_create_v1 {
872 	struct sli4_rsp_cmn_create_queue rsp;
873 };
874 
875 #define	SLI4_RQCREATEV2_DNB	0x80
876 
877 struct sli4_rqst_rq_create_v2 {
878 	struct sli4_rqst_hdr	hdr;
879 	__le16			num_pages;
880 	u8			rq_count;
881 	u8			dim_dfd_dnb;
882 	u8			page_size;
883 	u8			rqe_size_byte;
884 	__le16			rqe_count;
885 	__le16			hdr_buffer_size;
886 	__le16			payload_buffer_size;
887 	__le16			base_cq_id;
888 	__le16			rsvd26;
889 	__le32			rsvd42;
890 	struct sli4_dmaaddr	page_phys_addr[];
891 };
892 
893 struct sli4_rsp_rq_create_v2 {
894 	struct sli4_rsp_cmn_create_queue rsp;
895 };
896 
897 #define SLI4_CQE_CODE_OFFSET	14
898 
899 enum sli4_cqe_code {
900 	SLI4_CQE_CODE_WORK_REQUEST_COMPLETION = 0x01,
901 	SLI4_CQE_CODE_RELEASE_WQE,
902 	SLI4_CQE_CODE_RSVD,
903 	SLI4_CQE_CODE_RQ_ASYNC,
904 	SLI4_CQE_CODE_XRI_ABORTED,
905 	SLI4_CQE_CODE_RQ_COALESCING,
906 	SLI4_CQE_CODE_RQ_CONSUMPTION,
907 	SLI4_CQE_CODE_MEASUREMENT_REPORTING,
908 	SLI4_CQE_CODE_RQ_ASYNC_V1,
909 	SLI4_CQE_CODE_RQ_COALESCING_V1,
910 	SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD,
911 	SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA,
912 };
913 
914 #define SLI4_WQ_CREATE_MAX_PAGES		8
915 
916 struct sli4_rqst_wq_create {
917 	struct sli4_rqst_hdr	hdr;
918 	__le16			num_pages;
919 	__le16			cq_id;
920 	u8			page_size;
921 	u8			wqe_size_byte;
922 	__le16			wqe_count;
923 	__le32			rsvd;
924 	struct	sli4_dmaaddr	page_phys_addr[SLI4_WQ_CREATE_MAX_PAGES];
925 };
926 
927 struct sli4_rsp_wq_create {
928 	struct sli4_rsp_cmn_create_queue rsp;
929 };
930 
931 enum sli4_link_attention_flags {
932 	SLI4_LNK_ATTN_TYPE_LINK_UP		= 0x01,
933 	SLI4_LNK_ATTN_TYPE_LINK_DOWN		= 0x02,
934 	SLI4_LNK_ATTN_TYPE_NO_HARD_ALPA		= 0x03,
935 
936 	SLI4_LNK_ATTN_P2P			= 0x01,
937 	SLI4_LNK_ATTN_FC_AL			= 0x02,
938 	SLI4_LNK_ATTN_INTERNAL_LOOPBACK		= 0x03,
939 	SLI4_LNK_ATTN_SERDES_LOOPBACK		= 0x04,
940 };
941 
942 struct sli4_link_attention {
943 	u8		link_number;
944 	u8		attn_type;
945 	u8		topology;
946 	u8		port_speed;
947 	u8		port_fault;
948 	u8		shared_link_status;
949 	__le16		logical_link_speed;
950 	__le32		event_tag;
951 	u8		rsvd12;
952 	u8		event_code;
953 	u8		event_type;
954 	u8		flags;
955 };
956 
957 enum sli4_link_event_type {
958 	SLI4_EVENT_LINK_ATTENTION		= 0x01,
959 	SLI4_EVENT_SHARED_LINK_ATTENTION	= 0x02,
960 };
961 
962 enum sli4_wcqe_flags {
963 	SLI4_WCQE_XB = 0x10,
964 	SLI4_WCQE_QX = 0x80,
965 };
966 
967 struct sli4_fc_wcqe {
968 	u8		hw_status;
969 	u8		status;
970 	__le16		request_tag;
971 	__le32		wqe_specific_1;
972 	__le32		wqe_specific_2;
973 	u8		rsvd12;
974 	u8		qx_byte;
975 	u8		code;
976 	u8		flags;
977 };
978 
979 /* FC WQ consumed CQ queue entry */
980 struct sli4_fc_wqec {
981 	__le32		rsvd0;
982 	__le32		rsvd1;
983 	__le16		wqe_index;
984 	__le16		wq_id;
985 	__le16		rsvd12;
986 	u8		code;
987 	u8		vld_byte;
988 };
989 
990 /* FC Completion Status Codes. */
991 enum sli4_wcqe_status {
992 	SLI4_FC_WCQE_STATUS_SUCCESS,
993 	SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE,
994 	SLI4_FC_WCQE_STATUS_REMOTE_STOP,
995 	SLI4_FC_WCQE_STATUS_LOCAL_REJECT,
996 	SLI4_FC_WCQE_STATUS_NPORT_RJT,
997 	SLI4_FC_WCQE_STATUS_FABRIC_RJT,
998 	SLI4_FC_WCQE_STATUS_NPORT_BSY,
999 	SLI4_FC_WCQE_STATUS_FABRIC_BSY,
1000 	SLI4_FC_WCQE_STATUS_RSVD,
1001 	SLI4_FC_WCQE_STATUS_LS_RJT,
1002 	SLI4_FC_WCQE_STATUS_RX_BUF_OVERRUN,
1003 	SLI4_FC_WCQE_STATUS_CMD_REJECT,
1004 	SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK,
1005 	SLI4_FC_WCQE_STATUS_RSVD1,
1006 	SLI4_FC_WCQE_STATUS_ELS_CMPLT_NO_AUTOREG,
1007 	SLI4_FC_WCQE_STATUS_RSVD2,
1008 	SLI4_FC_WCQE_STATUS_RQ_SUCCESS,
1009 	SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED,
1010 	SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED,
1011 	SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC,
1012 	SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE,
1013 	SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE,
1014 	SLI4_FC_WCQE_STATUS_DI_ERROR,
1015 	SLI4_FC_WCQE_STATUS_BA_RJT,
1016 	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED,
1017 	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC,
1018 	SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT,
1019 	SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST,
1020 
1021 	/* driver generated status codes */
1022 	SLI4_FC_WCQE_STATUS_DISPATCH_ERROR	= 0xfd,
1023 	SLI4_FC_WCQE_STATUS_SHUTDOWN		= 0xfe,
1024 	SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT	= 0xff,
1025 };
1026 
1027 /* DI_ERROR Extended Status */
1028 enum sli4_fc_di_error_status {
1029 	SLI4_FC_DI_ERROR_GE			= 1 << 0,
1030 	SLI4_FC_DI_ERROR_AE			= 1 << 1,
1031 	SLI4_FC_DI_ERROR_RE			= 1 << 2,
1032 	SLI4_FC_DI_ERROR_TDPV			= 1 << 3,
1033 	SLI4_FC_DI_ERROR_UDB			= 1 << 4,
1034 	SLI4_FC_DI_ERROR_EDIR			= 1 << 5,
1035 };
1036 
1037 /* WQE DIF field contents */
1038 enum sli4_dif_fields {
1039 	SLI4_DIF_DISABLED,
1040 	SLI4_DIF_PASS_THROUGH,
1041 	SLI4_DIF_STRIP,
1042 	SLI4_DIF_INSERT,
1043 };
1044 
1045 /* Work Queue Entry (WQE) types */
1046 enum sli4_wqe_types {
1047 	SLI4_WQE_ABORT				= 0x0f,
1048 	SLI4_WQE_ELS_REQUEST64			= 0x8a,
1049 	SLI4_WQE_FCP_IBIDIR64			= 0xac,
1050 	SLI4_WQE_FCP_IREAD64			= 0x9a,
1051 	SLI4_WQE_FCP_IWRITE64			= 0x98,
1052 	SLI4_WQE_FCP_ICMND64			= 0x9c,
1053 	SLI4_WQE_FCP_TRECEIVE64			= 0xa1,
1054 	SLI4_WQE_FCP_CONT_TRECEIVE64		= 0xe5,
1055 	SLI4_WQE_FCP_TRSP64			= 0xa3,
1056 	SLI4_WQE_FCP_TSEND64			= 0x9f,
1057 	SLI4_WQE_GEN_REQUEST64			= 0xc2,
1058 	SLI4_WQE_SEND_FRAME			= 0xe1,
1059 	SLI4_WQE_XMIT_BCAST64			= 0x84,
1060 	SLI4_WQE_XMIT_BLS_RSP			= 0x97,
1061 	SLI4_WQE_ELS_RSP64			= 0x95,
1062 	SLI4_WQE_XMIT_SEQUENCE64		= 0x82,
1063 	SLI4_WQE_REQUEUE_XRI			= 0x93,
1064 };
1065 
1066 /* WQE command types */
1067 enum sli4_wqe_cmds {
1068 	SLI4_CMD_FCP_IREAD64_WQE		= 0x00,
1069 	SLI4_CMD_FCP_ICMND64_WQE		= 0x00,
1070 	SLI4_CMD_FCP_IWRITE64_WQE		= 0x01,
1071 	SLI4_CMD_FCP_TRECEIVE64_WQE		= 0x02,
1072 	SLI4_CMD_FCP_TRSP64_WQE			= 0x03,
1073 	SLI4_CMD_FCP_TSEND64_WQE		= 0x07,
1074 	SLI4_CMD_GEN_REQUEST64_WQE		= 0x08,
1075 	SLI4_CMD_XMIT_BCAST64_WQE		= 0x08,
1076 	SLI4_CMD_XMIT_BLS_RSP64_WQE		= 0x08,
1077 	SLI4_CMD_ABORT_WQE			= 0x08,
1078 	SLI4_CMD_XMIT_SEQUENCE64_WQE		= 0x08,
1079 	SLI4_CMD_REQUEUE_XRI_WQE		= 0x0a,
1080 	SLI4_CMD_SEND_FRAME_WQE			= 0x0a,
1081 };
1082 
1083 #define SLI4_WQE_SIZE		0x05
1084 #define SLI4_WQE_EXT_SIZE	0x06
1085 
1086 #define SLI4_WQE_BYTES		(16 * sizeof(u32))
1087 #define SLI4_WQE_EXT_BYTES	(32 * sizeof(u32))
1088 
1089 /* Mask for ccp (CS_CTL) */
1090 #define SLI4_MASK_CCP		0xfe
1091 
1092 /* Generic WQE */
1093 enum sli4_gen_wqe_flags {
1094 	SLI4_GEN_WQE_EBDECNT	= 0xf,
1095 	SLI4_GEN_WQE_LEN_LOC	= 0x3 << 7,
1096 	SLI4_GEN_WQE_QOSD	= 1 << 9,
1097 	SLI4_GEN_WQE_XBL	= 1 << 11,
1098 	SLI4_GEN_WQE_HLM	= 1 << 12,
1099 	SLI4_GEN_WQE_IOD	= 1 << 13,
1100 	SLI4_GEN_WQE_DBDE	= 1 << 14,
1101 	SLI4_GEN_WQE_WQES	= 1 << 15,
1102 
1103 	SLI4_GEN_WQE_PRI	= 0x7,
1104 	SLI4_GEN_WQE_PV		= 1 << 3,
1105 	SLI4_GEN_WQE_EAT	= 1 << 4,
1106 	SLI4_GEN_WQE_XC		= 1 << 5,
1107 	SLI4_GEN_WQE_CCPE	= 1 << 7,
1108 
1109 	SLI4_GEN_WQE_CMDTYPE	= 0xf,
1110 	SLI4_GEN_WQE_WQEC	= 1 << 7,
1111 };
1112 
1113 struct sli4_generic_wqe {
1114 	__le32		cmd_spec0_5[6];
1115 	__le16		xri_tag;
1116 	__le16		context_tag;
1117 	u8		ct_byte;
1118 	u8		command;
1119 	u8		class_byte;
1120 	u8		timer;
1121 	__le32		abort_tag;
1122 	__le16		request_tag;
1123 	__le16		rsvd34;
1124 	__le16		dw10w0_flags;
1125 	u8		eat_xc_ccpe;
1126 	u8		ccp;
1127 	u8		cmdtype_wqec_byte;
1128 	u8		rsvd41;
1129 	__le16		cq_id;
1130 };
1131 
1132 /* WQE used to abort exchanges. */
1133 enum sli4_abort_wqe_flags {
1134 	SLI4_ABRT_WQE_IR	= 0x02,
1135 
1136 	SLI4_ABRT_WQE_EBDECNT	= 0xf,
1137 	SLI4_ABRT_WQE_LEN_LOC	= 0x3 << 7,
1138 	SLI4_ABRT_WQE_QOSD	= 1 << 9,
1139 	SLI4_ABRT_WQE_XBL	= 1 << 11,
1140 	SLI4_ABRT_WQE_IOD	= 1 << 13,
1141 	SLI4_ABRT_WQE_DBDE	= 1 << 14,
1142 	SLI4_ABRT_WQE_WQES	= 1 << 15,
1143 
1144 	SLI4_ABRT_WQE_PRI	= 0x7,
1145 	SLI4_ABRT_WQE_PV	= 1 << 3,
1146 	SLI4_ABRT_WQE_EAT	= 1 << 4,
1147 	SLI4_ABRT_WQE_XC	= 1 << 5,
1148 	SLI4_ABRT_WQE_CCPE	= 1 << 7,
1149 
1150 	SLI4_ABRT_WQE_CMDTYPE	= 0xf,
1151 	SLI4_ABRT_WQE_WQEC	= 1 << 7,
1152 };
1153 
1154 struct sli4_abort_wqe {
1155 	__le32		rsvd0;
1156 	__le32		rsvd4;
1157 	__le32		ext_t_tag;
1158 	u8		ia_ir_byte;
1159 	u8		criteria;
1160 	__le16		rsvd10;
1161 	__le32		ext_t_mask;
1162 	__le32		t_mask;
1163 	__le16		xri_tag;
1164 	__le16		context_tag;
1165 	u8		ct_byte;
1166 	u8		command;
1167 	u8		class_byte;
1168 	u8		timer;
1169 	__le32		t_tag;
1170 	__le16		request_tag;
1171 	__le16		rsvd34;
1172 	__le16		dw10w0_flags;
1173 	u8		eat_xc_ccpe;
1174 	u8		ccp;
1175 	u8		cmdtype_wqec_byte;
1176 	u8		rsvd41;
1177 	__le16		cq_id;
1178 };
1179 
1180 enum sli4_abort_criteria {
1181 	SLI4_ABORT_CRITERIA_XRI_TAG = 0x01,
1182 	SLI4_ABORT_CRITERIA_ABORT_TAG,
1183 	SLI4_ABORT_CRITERIA_REQUEST_TAG,
1184 	SLI4_ABORT_CRITERIA_EXT_ABORT_TAG,
1185 };
1186 
1187 enum sli4_abort_type {
1188 	SLI4_ABORT_XRI,
1189 	SLI4_ABORT_ABORT_ID,
1190 	SLI4_ABORT_REQUEST_ID,
1191 	SLI4_ABORT_MAX,		/* must be last */
1192 };
1193 
1194 /* WQE used to create an ELS request. */
1195 enum sli4_els_req_wqe_flags {
1196 	SLI4_REQ_WQE_QOSD		= 0x2,
1197 	SLI4_REQ_WQE_DBDE		= 0x40,
1198 	SLI4_REQ_WQE_XBL		= 0x8,
1199 	SLI4_REQ_WQE_XC			= 0x20,
1200 	SLI4_REQ_WQE_IOD		= 0x20,
1201 	SLI4_REQ_WQE_HLM		= 0x10,
1202 	SLI4_REQ_WQE_CCPE		= 0x80,
1203 	SLI4_REQ_WQE_EAT		= 0x10,
1204 	SLI4_REQ_WQE_WQES		= 0x80,
1205 	SLI4_REQ_WQE_PU_SHFT		= 4,
1206 	SLI4_REQ_WQE_CT_SHFT		= 2,
1207 	SLI4_REQ_WQE_CT			= 0xc,
1208 	SLI4_REQ_WQE_ELSID_SHFT		= 4,
1209 	SLI4_REQ_WQE_SP_SHFT		= 24,
1210 	SLI4_REQ_WQE_LEN_LOC_BIT1	= 0x80,
1211 	SLI4_REQ_WQE_LEN_LOC_BIT2	= 0x1,
1212 };
1213 
1214 struct sli4_els_request64_wqe {
1215 	struct sli4_bde	els_request_payload;
1216 	__le32		els_request_payload_length;
1217 	__le32		sid_sp_dword;
1218 	__le32		remote_id_dword;
1219 	__le16		xri_tag;
1220 	__le16		context_tag;
1221 	u8		ct_byte;
1222 	u8		command;
1223 	u8		class_byte;
1224 	u8		timer;
1225 	__le32		abort_tag;
1226 	__le16		request_tag;
1227 	__le16		temporary_rpi;
1228 	u8		len_loc1_byte;
1229 	u8		qosd_xbl_hlm_iod_dbde_wqes;
1230 	u8		eat_xc_ccpe;
1231 	u8		ccp;
1232 	u8		cmdtype_elsid_byte;
1233 	u8		rsvd41;
1234 	__le16		cq_id;
1235 	struct sli4_bde	els_response_payload_bde;
1236 	__le32		max_response_payload_length;
1237 };
1238 
1239 /* WQE used to create an FCP initiator no data command. */
1240 enum sli4_icmd_wqe_flags {
1241 	SLI4_ICMD_WQE_DBDE		= 0x40,
1242 	SLI4_ICMD_WQE_XBL		= 0x8,
1243 	SLI4_ICMD_WQE_XC		= 0x20,
1244 	SLI4_ICMD_WQE_IOD		= 0x20,
1245 	SLI4_ICMD_WQE_HLM		= 0x10,
1246 	SLI4_ICMD_WQE_CCPE		= 0x80,
1247 	SLI4_ICMD_WQE_EAT		= 0x10,
1248 	SLI4_ICMD_WQE_APPID		= 0x10,
1249 	SLI4_ICMD_WQE_WQES		= 0x80,
1250 	SLI4_ICMD_WQE_PU_SHFT		= 4,
1251 	SLI4_ICMD_WQE_CT_SHFT		= 2,
1252 	SLI4_ICMD_WQE_BS_SHFT		= 4,
1253 	SLI4_ICMD_WQE_LEN_LOC_BIT1	= 0x80,
1254 	SLI4_ICMD_WQE_LEN_LOC_BIT2	= 0x1,
1255 };
1256 
1257 struct sli4_fcp_icmnd64_wqe {
1258 	struct sli4_bde	bde;
1259 	__le16		payload_offset_length;
1260 	__le16		fcp_cmd_buffer_length;
1261 	__le32		rsvd12;
1262 	__le32		remote_n_port_id_dword;
1263 	__le16		xri_tag;
1264 	__le16		context_tag;
1265 	u8		dif_ct_bs_byte;
1266 	u8		command;
1267 	u8		class_pu_byte;
1268 	u8		timer;
1269 	__le32		abort_tag;
1270 	__le16		request_tag;
1271 	__le16		rsvd34;
1272 	u8		len_loc1_byte;
1273 	u8		qosd_xbl_hlm_iod_dbde_wqes;
1274 	u8		eat_xc_ccpe;
1275 	u8		ccp;
1276 	u8		cmd_type_byte;
1277 	u8		rsvd41;
1278 	__le16		cq_id;
1279 	__le32		rsvd44;
1280 	__le32		rsvd48;
1281 	__le32		rsvd52;
1282 	__le32		rsvd56;
1283 };
1284 
1285 /* WQE used to create an FCP initiator read. */
1286 enum sli4_ir_wqe_flags {
1287 	SLI4_IR_WQE_DBDE		= 0x40,
1288 	SLI4_IR_WQE_XBL			= 0x8,
1289 	SLI4_IR_WQE_XC			= 0x20,
1290 	SLI4_IR_WQE_IOD			= 0x20,
1291 	SLI4_IR_WQE_HLM			= 0x10,
1292 	SLI4_IR_WQE_CCPE		= 0x80,
1293 	SLI4_IR_WQE_EAT			= 0x10,
1294 	SLI4_IR_WQE_APPID		= 0x10,
1295 	SLI4_IR_WQE_WQES		= 0x80,
1296 	SLI4_IR_WQE_PU_SHFT		= 4,
1297 	SLI4_IR_WQE_CT_SHFT		= 2,
1298 	SLI4_IR_WQE_BS_SHFT		= 4,
1299 	SLI4_IR_WQE_LEN_LOC_BIT1	= 0x80,
1300 	SLI4_IR_WQE_LEN_LOC_BIT2	= 0x1,
1301 };
1302 
1303 struct sli4_fcp_iread64_wqe {
1304 	struct sli4_bde	bde;
1305 	__le16		payload_offset_length;
1306 	__le16		fcp_cmd_buffer_length;
1307 
1308 	__le32		total_transfer_length;
1309 
1310 	__le32		remote_n_port_id_dword;
1311 
1312 	__le16		xri_tag;
1313 	__le16		context_tag;
1314 
1315 	u8		dif_ct_bs_byte;
1316 	u8		command;
1317 	u8		class_pu_byte;
1318 	u8		timer;
1319 
1320 	__le32		abort_tag;
1321 
1322 	__le16		request_tag;
1323 	__le16		rsvd34;
1324 
1325 	u8		len_loc1_byte;
1326 	u8		qosd_xbl_hlm_iod_dbde_wqes;
1327 	u8		eat_xc_ccpe;
1328 	u8		ccp;
1329 
1330 	u8		cmd_type_byte;
1331 	u8		rsvd41;
1332 	__le16		cq_id;
1333 
1334 	__le32		rsvd44;
1335 	struct sli4_bde	first_data_bde;
1336 };
1337 
1338 /* WQE used to create an FCP initiator write. */
1339 enum sli4_iwr_wqe_flags {
1340 	SLI4_IWR_WQE_DBDE		= 0x40,
1341 	SLI4_IWR_WQE_XBL		= 0x8,
1342 	SLI4_IWR_WQE_XC			= 0x20,
1343 	SLI4_IWR_WQE_IOD		= 0x20,
1344 	SLI4_IWR_WQE_HLM		= 0x10,
1345 	SLI4_IWR_WQE_DNRX		= 0x10,
1346 	SLI4_IWR_WQE_CCPE		= 0x80,
1347 	SLI4_IWR_WQE_EAT		= 0x10,
1348 	SLI4_IWR_WQE_APPID		= 0x10,
1349 	SLI4_IWR_WQE_WQES		= 0x80,
1350 	SLI4_IWR_WQE_PU_SHFT		= 4,
1351 	SLI4_IWR_WQE_CT_SHFT		= 2,
1352 	SLI4_IWR_WQE_BS_SHFT		= 4,
1353 	SLI4_IWR_WQE_LEN_LOC_BIT1	= 0x80,
1354 	SLI4_IWR_WQE_LEN_LOC_BIT2	= 0x1,
1355 };
1356 
1357 struct sli4_fcp_iwrite64_wqe {
1358 	struct sli4_bde	bde;
1359 	__le16		payload_offset_length;
1360 	__le16		fcp_cmd_buffer_length;
1361 	__le16		total_transfer_length;
1362 	__le16		initial_transfer_length;
1363 	__le16		xri_tag;
1364 	__le16		context_tag;
1365 	u8		dif_ct_bs_byte;
1366 	u8		command;
1367 	u8		class_pu_byte;
1368 	u8		timer;
1369 	__le32		abort_tag;
1370 	__le16		request_tag;
1371 	__le16		rsvd34;
1372 	u8		len_loc1_byte;
1373 	u8		qosd_xbl_hlm_iod_dbde_wqes;
1374 	u8		eat_xc_ccpe;
1375 	u8		ccp;
1376 	u8		cmd_type_byte;
1377 	u8		rsvd41;
1378 	__le16		cq_id;
1379 	__le32		remote_n_port_id_dword;
1380 	struct sli4_bde	first_data_bde;
1381 };
1382 
1383 struct sli4_fcp_128byte_wqe {
1384 	u32 dw[32];
1385 };
1386 
1387 /* WQE used to create an FCP target receive */
1388 enum sli4_trcv_wqe_flags {
1389 	SLI4_TRCV_WQE_DBDE		= 0x40,
1390 	SLI4_TRCV_WQE_XBL		= 0x8,
1391 	SLI4_TRCV_WQE_AR		= 0x8,
1392 	SLI4_TRCV_WQE_XC		= 0x20,
1393 	SLI4_TRCV_WQE_IOD		= 0x20,
1394 	SLI4_TRCV_WQE_HLM		= 0x10,
1395 	SLI4_TRCV_WQE_DNRX		= 0x10,
1396 	SLI4_TRCV_WQE_CCPE		= 0x80,
1397 	SLI4_TRCV_WQE_EAT		= 0x10,
1398 	SLI4_TRCV_WQE_APPID		= 0x10,
1399 	SLI4_TRCV_WQE_WQES		= 0x80,
1400 	SLI4_TRCV_WQE_PU_SHFT		= 4,
1401 	SLI4_TRCV_WQE_CT_SHFT		= 2,
1402 	SLI4_TRCV_WQE_BS_SHFT		= 4,
1403 	SLI4_TRCV_WQE_LEN_LOC_BIT2	= 0x1,
1404 };
1405 
1406 struct sli4_fcp_treceive64_wqe {
1407 	struct sli4_bde	bde;
1408 	__le32		payload_offset_length;
1409 	__le32		relative_offset;
1410 	union {
1411 		__le16	sec_xri_tag;
1412 		__le16	rsvd;
1413 		__le32	dword;
1414 	} dword5;
1415 	__le16		xri_tag;
1416 	__le16		context_tag;
1417 	u8		dif_ct_bs_byte;
1418 	u8		command;
1419 	u8		class_ar_pu_byte;
1420 	u8		timer;
1421 	__le32		abort_tag;
1422 	__le16		request_tag;
1423 	__le16		remote_xid;
1424 	u8		lloc1_appid;
1425 	u8		qosd_xbl_hlm_iod_dbde_wqes;
1426 	u8		eat_xc_ccpe;
1427 	u8		ccp;
1428 	u8		cmd_type_byte;
1429 	u8		rsvd41;
1430 	__le16		cq_id;
1431 	__le32		fcp_data_receive_length;
1432 	struct sli4_bde	first_data_bde;
1433 };
1434 
1435 /* WQE used to create an FCP target response */
1436 enum sli4_trsp_wqe_flags {
1437 	SLI4_TRSP_WQE_AG	= 0x8,
1438 	SLI4_TRSP_WQE_DBDE	= 0x40,
1439 	SLI4_TRSP_WQE_XBL	= 0x8,
1440 	SLI4_TRSP_WQE_XC	= 0x20,
1441 	SLI4_TRSP_WQE_HLM	= 0x10,
1442 	SLI4_TRSP_WQE_DNRX	= 0x10,
1443 	SLI4_TRSP_WQE_CCPE	= 0x80,
1444 	SLI4_TRSP_WQE_EAT	= 0x10,
1445 	SLI4_TRSP_WQE_APPID	= 0x10,
1446 	SLI4_TRSP_WQE_WQES	= 0x80,
1447 };
1448 
1449 struct sli4_fcp_trsp64_wqe {
1450 	struct sli4_bde	bde;
1451 	__le32		fcp_response_length;
1452 	__le32		rsvd12;
1453 	__le32		dword5;
1454 	__le16		xri_tag;
1455 	__le16		rpi;
1456 	u8		ct_dnrx_byte;
1457 	u8		command;
1458 	u8		class_ag_byte;
1459 	u8		timer;
1460 	__le32		abort_tag;
1461 	__le16		request_tag;
1462 	__le16		remote_xid;
1463 	u8		lloc1_appid;
1464 	u8		qosd_xbl_hlm_dbde_wqes;
1465 	u8		eat_xc_ccpe;
1466 	u8		ccp;
1467 	u8		cmd_type_byte;
1468 	u8		rsvd41;
1469 	__le16		cq_id;
1470 	__le32		rsvd44;
1471 	__le32		rsvd48;
1472 	__le32		rsvd52;
1473 	__le32		rsvd56;
1474 };
1475 
1476 /* WQE used to create an FCP target send (DATA IN). */
1477 enum sli4_tsend_wqe_flags {
1478 	SLI4_TSEND_WQE_XBL	= 0x8,
1479 	SLI4_TSEND_WQE_DBDE	= 0x40,
1480 	SLI4_TSEND_WQE_IOD	= 0x20,
1481 	SLI4_TSEND_WQE_QOSD	= 0x2,
1482 	SLI4_TSEND_WQE_HLM	= 0x10,
1483 	SLI4_TSEND_WQE_PU_SHFT	= 4,
1484 	SLI4_TSEND_WQE_AR	= 0x8,
1485 	SLI4_TSEND_CT_SHFT	= 2,
1486 	SLI4_TSEND_BS_SHFT	= 4,
1487 	SLI4_TSEND_LEN_LOC_BIT2 = 0x1,
1488 	SLI4_TSEND_CCPE		= 0x80,
1489 	SLI4_TSEND_APPID_VALID	= 0x20,
1490 	SLI4_TSEND_WQES		= 0x80,
1491 	SLI4_TSEND_XC		= 0x20,
1492 	SLI4_TSEND_EAT		= 0x10,
1493 };
1494 
1495 struct sli4_fcp_tsend64_wqe {
1496 	struct sli4_bde	bde;
1497 	__le32		payload_offset_length;
1498 	__le32		relative_offset;
1499 	__le32		dword5;
1500 	__le16		xri_tag;
1501 	__le16		rpi;
1502 	u8		ct_byte;
1503 	u8		command;
1504 	u8		class_pu_ar_byte;
1505 	u8		timer;
1506 	__le32		abort_tag;
1507 	__le16		request_tag;
1508 	__le16		remote_xid;
1509 	u8		dw10byte0;
1510 	u8		ll_qd_xbl_hlm_iod_dbde;
1511 	u8		dw10byte2;
1512 	u8		ccp;
1513 	u8		cmd_type_byte;
1514 	u8		rsvd45;
1515 	__le16		cq_id;
1516 	__le32		fcp_data_transmit_length;
1517 	struct sli4_bde	first_data_bde;
1518 };
1519 
1520 /* WQE used to create a general request. */
1521 enum sli4_gen_req_wqe_flags {
1522 	SLI4_GEN_REQ64_WQE_XBL	= 0x8,
1523 	SLI4_GEN_REQ64_WQE_DBDE	= 0x40,
1524 	SLI4_GEN_REQ64_WQE_IOD	= 0x20,
1525 	SLI4_GEN_REQ64_WQE_QOSD	= 0x2,
1526 	SLI4_GEN_REQ64_WQE_HLM	= 0x10,
1527 	SLI4_GEN_REQ64_CT_SHFT	= 2,
1528 };
1529 
1530 struct sli4_gen_request64_wqe {
1531 	struct sli4_bde	bde;
1532 	__le32		request_payload_length;
1533 	__le32		relative_offset;
1534 	u8		rsvd17;
1535 	u8		df_ctl;
1536 	u8		type;
1537 	u8		r_ctl;
1538 	__le16		xri_tag;
1539 	__le16		context_tag;
1540 	u8		ct_byte;
1541 	u8		command;
1542 	u8		class_byte;
1543 	u8		timer;
1544 	__le32		abort_tag;
1545 	__le16		request_tag;
1546 	__le16		rsvd34;
1547 	u8		dw10flags0;
1548 	u8		dw10flags1;
1549 	u8		dw10flags2;
1550 	u8		ccp;
1551 	u8		cmd_type_byte;
1552 	u8		rsvd41;
1553 	__le16		cq_id;
1554 	__le32		remote_n_port_id_dword;
1555 	__le32		rsvd48;
1556 	__le32		rsvd52;
1557 	__le32		max_response_payload_length;
1558 };
1559 
1560 /* WQE used to create a send frame request */
1561 enum sli4_sf_wqe_flags {
1562 	SLI4_SF_WQE_DBDE	= 0x40,
1563 	SLI4_SF_PU		= 0x30,
1564 	SLI4_SF_CT		= 0xc,
1565 	SLI4_SF_QOSD		= 0x2,
1566 	SLI4_SF_LEN_LOC_BIT1	= 0x80,
1567 	SLI4_SF_LEN_LOC_BIT2	= 0x1,
1568 	SLI4_SF_XC		= 0x20,
1569 	SLI4_SF_XBL		= 0x8,
1570 };
1571 
1572 struct sli4_send_frame_wqe {
1573 	struct sli4_bde	bde;
1574 	__le32		frame_length;
1575 	__le32		fc_header_0_1[2];
1576 	__le16		xri_tag;
1577 	__le16		context_tag;
1578 	u8		ct_byte;
1579 	u8		command;
1580 	u8		dw7flags0;
1581 	u8		timer;
1582 	__le32		abort_tag;
1583 	__le16		request_tag;
1584 	u8		eof;
1585 	u8		sof;
1586 	u8		dw10flags0;
1587 	u8		dw10flags1;
1588 	u8		dw10flags2;
1589 	u8		ccp;
1590 	u8		cmd_type_byte;
1591 	u8		rsvd41;
1592 	__le16		cq_id;
1593 	__le32		fc_header_2_5[4];
1594 };
1595 
1596 /* WQE used to create a transmit sequence */
1597 enum sli4_seq_wqe_flags {
1598 	SLI4_SEQ_WQE_DBDE		= 0x4000,
1599 	SLI4_SEQ_WQE_XBL		= 0x800,
1600 	SLI4_SEQ_WQE_SI			= 0x4,
1601 	SLI4_SEQ_WQE_FT			= 0x8,
1602 	SLI4_SEQ_WQE_XO			= 0x40,
1603 	SLI4_SEQ_WQE_LS			= 0x80,
1604 	SLI4_SEQ_WQE_DIF		= 0x3,
1605 	SLI4_SEQ_WQE_BS			= 0x70,
1606 	SLI4_SEQ_WQE_PU			= 0x30,
1607 	SLI4_SEQ_WQE_HLM		= 0x1000,
1608 	SLI4_SEQ_WQE_IOD_SHIFT		= 13,
1609 	SLI4_SEQ_WQE_CT_SHIFT		= 2,
1610 	SLI4_SEQ_WQE_LEN_LOC_SHIFT	= 7,
1611 };
1612 
1613 struct sli4_xmit_sequence64_wqe {
1614 	struct sli4_bde	bde;
1615 	__le32		remote_n_port_id_dword;
1616 	__le32		relative_offset;
1617 	u8		dw5flags0;
1618 	u8		df_ctl;
1619 	u8		type;
1620 	u8		r_ctl;
1621 	__le16		xri_tag;
1622 	__le16		context_tag;
1623 	u8		dw7flags0;
1624 	u8		command;
1625 	u8		dw7flags1;
1626 	u8		timer;
1627 	__le32		abort_tag;
1628 	__le16		request_tag;
1629 	__le16		remote_xid;
1630 	__le16		dw10w0;
1631 	u8		dw10flags0;
1632 	u8		ccp;
1633 	u8		cmd_type_wqec_byte;
1634 	u8		rsvd45;
1635 	__le16		cq_id;
1636 	__le32		sequence_payload_len;
1637 	__le32		rsvd48;
1638 	__le32		rsvd52;
1639 	__le32		rsvd56;
1640 };
1641 
1642 /*
1643  * WQE used unblock the specified XRI and to release
1644  * it to the SLI Port's free pool.
1645  */
1646 enum sli4_requeue_wqe_flags {
1647 	SLI4_REQU_XRI_WQE_XC	= 0x20,
1648 	SLI4_REQU_XRI_WQE_QOSD	= 0x2,
1649 };
1650 
1651 struct sli4_requeue_xri_wqe {
1652 	__le32		rsvd0;
1653 	__le32		rsvd4;
1654 	__le32		rsvd8;
1655 	__le32		rsvd12;
1656 	__le32		rsvd16;
1657 	__le32		rsvd20;
1658 	__le16		xri_tag;
1659 	__le16		context_tag;
1660 	u8		ct_byte;
1661 	u8		command;
1662 	u8		class_byte;
1663 	u8		timer;
1664 	__le32		rsvd32;
1665 	__le16		request_tag;
1666 	__le16		rsvd34;
1667 	__le16		flags0;
1668 	__le16		flags1;
1669 	__le16		flags2;
1670 	u8		ccp;
1671 	u8		cmd_type_wqec_byte;
1672 	u8		rsvd42;
1673 	__le16		cq_id;
1674 	__le32		rsvd44;
1675 	__le32		rsvd48;
1676 	__le32		rsvd52;
1677 	__le32		rsvd56;
1678 };
1679 
1680 /* WQE used to create a BLS response */
1681 enum sli4_bls_rsp_wqe_flags {
1682 	SLI4_BLS_RSP_RID		= 0xffffff,
1683 	SLI4_BLS_RSP_WQE_AR		= 0x40000000,
1684 	SLI4_BLS_RSP_WQE_CT_SHFT	= 2,
1685 	SLI4_BLS_RSP_WQE_QOSD		= 0x2,
1686 	SLI4_BLS_RSP_WQE_HLM		= 0x10,
1687 };
1688 
1689 struct sli4_xmit_bls_rsp_wqe {
1690 	__le32		payload_word0;
1691 	__le16		rx_id;
1692 	__le16		ox_id;
1693 	__le16		high_seq_cnt;
1694 	__le16		low_seq_cnt;
1695 	__le32		rsvd12;
1696 	__le32		local_n_port_id_dword;
1697 	__le32		remote_id_dword;
1698 	__le16		xri_tag;
1699 	__le16		context_tag;
1700 	u8		dw8flags0;
1701 	u8		command;
1702 	u8		dw8flags1;
1703 	u8		timer;
1704 	__le32		abort_tag;
1705 	__le16		request_tag;
1706 	__le16		rsvd38;
1707 	u8		dw11flags0;
1708 	u8		dw11flags1;
1709 	u8		dw11flags2;
1710 	u8		ccp;
1711 	u8		dw12flags0;
1712 	u8		rsvd45;
1713 	__le16		cq_id;
1714 	__le16		temporary_rpi;
1715 	u8		rsvd50;
1716 	u8		rsvd51;
1717 	__le32		rsvd52;
1718 	__le32		rsvd56;
1719 	__le32		rsvd60;
1720 };
1721 
1722 enum sli_bls_type {
1723 	SLI4_SLI_BLS_ACC,
1724 	SLI4_SLI_BLS_RJT,
1725 	SLI4_SLI_BLS_MAX
1726 };
1727 
1728 struct sli_bls_payload {
1729 	enum sli_bls_type	type;
1730 	__le16			ox_id;
1731 	__le16			rx_id;
1732 	union {
1733 		struct {
1734 			u8	seq_id_validity;
1735 			u8	seq_id_last;
1736 			u8	rsvd2;
1737 			u8	rsvd3;
1738 			u16	ox_id;
1739 			u16	rx_id;
1740 			__le16	low_seq_cnt;
1741 			__le16	high_seq_cnt;
1742 		} acc;
1743 		struct {
1744 			u8	vendor_unique;
1745 			u8	reason_explanation;
1746 			u8	reason_code;
1747 			u8	rsvd3;
1748 		} rjt;
1749 	} u;
1750 };
1751 
1752 /* WQE used to create an ELS response */
1753 
1754 enum sli4_els_rsp_flags {
1755 	SLI4_ELS_SID		= 0xffffff,
1756 	SLI4_ELS_RID		= 0xffffff,
1757 	SLI4_ELS_DBDE		= 0x40,
1758 	SLI4_ELS_XBL		= 0x8,
1759 	SLI4_ELS_IOD		= 0x20,
1760 	SLI4_ELS_QOSD		= 0x2,
1761 	SLI4_ELS_XC		= 0x20,
1762 	SLI4_ELS_CT_OFFSET	= 0X2,
1763 	SLI4_ELS_SP		= 0X1000000,
1764 	SLI4_ELS_HLM		= 0X10,
1765 };
1766 
1767 struct sli4_xmit_els_rsp64_wqe {
1768 	struct sli4_bde	els_response_payload;
1769 	__le32		els_response_payload_length;
1770 	__le32		sid_dw;
1771 	__le32		rid_dw;
1772 	__le16		xri_tag;
1773 	__le16		context_tag;
1774 	u8		ct_byte;
1775 	u8		command;
1776 	u8		class_byte;
1777 	u8		timer;
1778 	__le32		abort_tag;
1779 	__le16		request_tag;
1780 	__le16		ox_id;
1781 	u8		flags1;
1782 	u8		flags2;
1783 	u8		flags3;
1784 	u8		flags4;
1785 	u8		cmd_type_wqec;
1786 	u8		rsvd34;
1787 	__le16		cq_id;
1788 	__le16		temporary_rpi;
1789 	__le16		rsvd38;
1790 	u32		rsvd40;
1791 	u32		rsvd44;
1792 	u32		rsvd48;
1793 };
1794 
1795 /* Local Reject Reason Codes */
1796 enum sli4_fc_local_rej_codes {
1797 	SLI4_FC_LOCAL_REJECT_UNKNOWN,
1798 	SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE,
1799 	SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT,
1800 	SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR,
1801 	SLI4_FC_LOCAL_REJECT_INVALID_RPI,
1802 	SLI4_FC_LOCAL_REJECT_NO_XRI,
1803 	SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND,
1804 	SLI4_FC_LOCAL_REJECT_XCHG_DROPPED,
1805 	SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD,
1806 	SLI4_FC_LOCAL_REJECT_RPI_SUSPENDED,
1807 	SLI4_FC_LOCAL_REJECT_RSVD,
1808 	SLI4_FC_LOCAL_REJECT_RSVD1,
1809 	SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH,
1810 	SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED,
1811 	SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED,
1812 	SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME,
1813 	SLI4_FC_LOCAL_REJECT_RSVD2,
1814 	SLI4_FC_LOCAL_REJECT_NO_RESOURCES, //0x11
1815 	SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE,
1816 	SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH,
1817 	SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE,
1818 	SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS,
1819 	SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED,
1820 	SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT,
1821 	SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE,
1822 	SLI4_FC_LOCAL_REJECT_RSVD3,
1823 	SLI4_FC_LOCAL_REJECT_LINK_DOWN,
1824 	SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA,
1825 	SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI,
1826 	SLI4_FC_LOCAL_REJECT_OUTOFORDER_DATA,
1827 	SLI4_FC_LOCAL_REJECT_OUTOFORDER_ACK,
1828 	SLI4_FC_LOCAL_REJECT_DUP_FRAME,
1829 	SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME, //0x20
1830 	SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS,
1831 	SLI4_FC_LOCAL_REJECT_RSVD4,
1832 	SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER,
1833 	SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED,
1834 	SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED,
1835 	SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE	= 0x28,
1836 	SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING,
1837 	SLI4_FC_LOCAL_REJECT_INVALID_VPI	= 0x2e,
1838 	SLI4_FC_LOCAL_REJECT_NO_FPORT_DETECTED,
1839 	SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF,
1840 	SLI4_FC_LOCAL_REJECT_RSVD5,
1841 	SLI4_FC_LOCAL_REJECT_INVALID_XRI,
1842 	SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET	= 0x40,
1843 	SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET,
1844 	SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE,
1845 	SLI4_FC_LOCAL_REJECT_MISSING_SI,
1846 	SLI4_FC_LOCAL_REJECT_MISSING_ES,
1847 	SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER,
1848 	SLI4_FC_LOCAL_REJECT_SLER_FAILURE,
1849 	SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE,
1850 	SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR,
1851 	SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR,
1852 	SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR,
1853 	SLI4_FC_LOCAL_REJECT_RSVD6,
1854 	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR,
1855 	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR,
1856 	SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR,
1857 };
1858 
1859 enum sli4_async_rcqe_flags {
1860 	SLI4_RACQE_RQ_EL_INDX	= 0xfff,
1861 	SLI4_RACQE_FCFI		= 0x3f,
1862 	SLI4_RACQE_HDPL		= 0x3f,
1863 	SLI4_RACQE_RQ_ID	= 0xffc0,
1864 };
1865 
1866 struct sli4_fc_async_rcqe {
1867 	u8		rsvd0;
1868 	u8		status;
1869 	__le16		rq_elmt_indx_word;
1870 	__le32		rsvd4;
1871 	__le16		fcfi_rq_id_word;
1872 	__le16		data_placement_length;
1873 	u8		sof_byte;
1874 	u8		eof_byte;
1875 	u8		code;
1876 	u8		hdpl_byte;
1877 };
1878 
1879 struct sli4_fc_async_rcqe_v1 {
1880 	u8		rsvd0;
1881 	u8		status;
1882 	__le16		rq_elmt_indx_word;
1883 	u8		fcfi_byte;
1884 	u8		rsvd5;
1885 	__le16		rsvd6;
1886 	__le16		rq_id;
1887 	__le16		data_placement_length;
1888 	u8		sof_byte;
1889 	u8		eof_byte;
1890 	u8		code;
1891 	u8		hdpl_byte;
1892 };
1893 
1894 enum sli4_fc_async_rq_status {
1895 	SLI4_FC_ASYNC_RQ_SUCCESS = 0x10,
1896 	SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED,
1897 	SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED,
1898 	SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC,
1899 	SLI4_FC_ASYNC_RQ_DMA_FAILURE,
1900 };
1901 
1902 #define SLI4_RCQE_RQ_EL_INDX	0xfff
1903 
1904 struct sli4_fc_coalescing_rcqe {
1905 	u8		rsvd0;
1906 	u8		status;
1907 	__le16		rq_elmt_indx_word;
1908 	__le32		rsvd4;
1909 	__le16		rq_id;
1910 	__le16		seq_placement_length;
1911 	__le16		rsvd14;
1912 	u8		code;
1913 	u8		vld_byte;
1914 };
1915 
1916 #define SLI4_FC_COALESCE_RQ_SUCCESS		0x10
1917 #define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED	0x18
1918 
1919 enum sli4_optimized_write_cmd_cqe_flags {
1920 	SLI4_OCQE_RQ_EL_INDX	= 0x7f,		/* DW0 bits 16:30 */
1921 	SLI4_OCQE_FCFI		= 0x3f,		/* DW1 bits 0:6 */
1922 	SLI4_OCQE_OOX		= 1 << 6,	/* DW1 bit 15 */
1923 	SLI4_OCQE_AGXR		= 1 << 7,	/* DW1 bit 16 */
1924 	SLI4_OCQE_HDPL		= 0x3f,		/* DW3 bits 24:29*/
1925 };
1926 
1927 struct sli4_fc_optimized_write_cmd_cqe {
1928 	u8		rsvd0;
1929 	u8		status;
1930 	__le16		w1;
1931 	u8		flags0;
1932 	u8		flags1;
1933 	__le16		xri;
1934 	__le16		rq_id;
1935 	__le16		data_placement_length;
1936 	__le16		rpi;
1937 	u8		code;
1938 	u8		hdpl_vld;
1939 };
1940 
1941 #define	SLI4_OCQE_XB		0x10
1942 
1943 struct sli4_fc_optimized_write_data_cqe {
1944 	u8		hw_status;
1945 	u8		status;
1946 	__le16		xri;
1947 	__le32		total_data_placed;
1948 	__le32		extended_status;
1949 	__le16		rsvd12;
1950 	u8		code;
1951 	u8		flags;
1952 };
1953 
1954 struct sli4_fc_xri_aborted_cqe {
1955 	u8		rsvd0;
1956 	u8		status;
1957 	__le16		rsvd2;
1958 	__le32		extended_status;
1959 	__le16		xri;
1960 	__le16		remote_xid;
1961 	__le16		rsvd12;
1962 	u8		code;
1963 	u8		flags;
1964 };
1965 
1966 enum sli4_generic_ctx {
1967 	SLI4_GENERIC_CONTEXT_RPI,
1968 	SLI4_GENERIC_CONTEXT_VPI,
1969 	SLI4_GENERIC_CONTEXT_VFI,
1970 	SLI4_GENERIC_CONTEXT_FCFI,
1971 };
1972 
1973 #define SLI4_GENERIC_CLASS_CLASS_2		0x1
1974 #define SLI4_GENERIC_CLASS_CLASS_3		0x2
1975 
1976 #define SLI4_ELS_REQUEST64_DIR_WRITE		0x0
1977 #define SLI4_ELS_REQUEST64_DIR_READ		0x1
1978 
1979 enum sli4_els_request {
1980 	SLI4_ELS_REQUEST64_OTHER,
1981 	SLI4_ELS_REQUEST64_LOGO,
1982 	SLI4_ELS_REQUEST64_FDISC,
1983 	SLI4_ELS_REQUEST64_FLOGIN,
1984 	SLI4_ELS_REQUEST64_PLOGI,
1985 };
1986 
1987 enum sli4_els_cmd_type {
1988 	SLI4_ELS_REQUEST64_CMD_GEN		= 0x08,
1989 	SLI4_ELS_REQUEST64_CMD_NON_FABRIC	= 0x0c,
1990 	SLI4_ELS_REQUEST64_CMD_FABRIC		= 0x0d,
1991 };
1992 
1993 #define SLI_PAGE_SIZE				SZ_4K
1994 
1995 #define SLI4_BMBX_TIMEOUT_MSEC			30000
1996 #define SLI4_FW_READY_TIMEOUT_MSEC		30000
1997 
1998 #define SLI4_BMBX_DELAY_US			1000	/* 1 ms */
1999 #define SLI4_INIT_PORT_DELAY_US			10000	/* 10 ms */
2000 
2001 static inline u32
2002 sli_page_count(size_t bytes, u32 page_size)
2003 {
2004 	if (!page_size)
2005 		return 0;
2006 
2007 	return (bytes + (page_size - 1)) >> __ffs(page_size);
2008 }
2009 
2010 /*************************************************************************
2011  * SLI-4 mailbox command formats and definitions
2012  */
2013 
2014 struct sli4_mbox_command_header {
2015 	u8	resvd0;
2016 	u8	command;
2017 	__le16	status;	/* Port writes to indicate success/fail */
2018 };
2019 
2020 enum sli4_mbx_cmd_value {
2021 	SLI4_MBX_CMD_CONFIG_LINK	= 0x07,
2022 	SLI4_MBX_CMD_DUMP		= 0x17,
2023 	SLI4_MBX_CMD_DOWN_LINK		= 0x06,
2024 	SLI4_MBX_CMD_INIT_LINK		= 0x05,
2025 	SLI4_MBX_CMD_INIT_VFI		= 0xa3,
2026 	SLI4_MBX_CMD_INIT_VPI		= 0xa4,
2027 	SLI4_MBX_CMD_POST_XRI		= 0xa7,
2028 	SLI4_MBX_CMD_RELEASE_XRI	= 0xac,
2029 	SLI4_MBX_CMD_READ_CONFIG	= 0x0b,
2030 	SLI4_MBX_CMD_READ_STATUS	= 0x0e,
2031 	SLI4_MBX_CMD_READ_NVPARMS	= 0x02,
2032 	SLI4_MBX_CMD_READ_REV		= 0x11,
2033 	SLI4_MBX_CMD_READ_LNK_STAT	= 0x12,
2034 	SLI4_MBX_CMD_READ_SPARM64	= 0x8d,
2035 	SLI4_MBX_CMD_READ_TOPOLOGY	= 0x95,
2036 	SLI4_MBX_CMD_REG_FCFI		= 0xa0,
2037 	SLI4_MBX_CMD_REG_FCFI_MRQ	= 0xaf,
2038 	SLI4_MBX_CMD_REG_RPI		= 0x93,
2039 	SLI4_MBX_CMD_REG_RX_RQ		= 0xa6,
2040 	SLI4_MBX_CMD_REG_VFI		= 0x9f,
2041 	SLI4_MBX_CMD_REG_VPI		= 0x96,
2042 	SLI4_MBX_CMD_RQST_FEATURES	= 0x9d,
2043 	SLI4_MBX_CMD_SLI_CONFIG		= 0x9b,
2044 	SLI4_MBX_CMD_UNREG_FCFI		= 0xa2,
2045 	SLI4_MBX_CMD_UNREG_RPI		= 0x14,
2046 	SLI4_MBX_CMD_UNREG_VFI		= 0xa1,
2047 	SLI4_MBX_CMD_UNREG_VPI		= 0x97,
2048 	SLI4_MBX_CMD_WRITE_NVPARMS	= 0x03,
2049 	SLI4_MBX_CMD_CFG_AUTO_XFER_RDY	= 0xad,
2050 };
2051 
2052 enum sli4_mbx_status {
2053 	SLI4_MBX_STATUS_SUCCESS		= 0x0000,
2054 	SLI4_MBX_STATUS_FAILURE		= 0x0001,
2055 	SLI4_MBX_STATUS_RPI_NOT_REG	= 0x1400,
2056 };
2057 
2058 /* CONFIG_LINK - configure link-oriented parameters,
2059  * such as default N_Port_ID address and various timers
2060  */
2061 enum sli4_cmd_config_link_flags {
2062 	SLI4_CFG_LINK_BBSCN = 0xf00,
2063 	SLI4_CFG_LINK_CSCN  = 0x1000,
2064 };
2065 
2066 struct sli4_cmd_config_link {
2067 	struct sli4_mbox_command_header	hdr;
2068 	u8		maxbbc;
2069 	u8		rsvd5;
2070 	u8		rsvd6;
2071 	u8		rsvd7;
2072 	u8		alpa;
2073 	__le16		n_port_id;
2074 	u8		rsvd11;
2075 	__le32		rsvd12;
2076 	__le32		e_d_tov;
2077 	__le32		lp_tov;
2078 	__le32		r_a_tov;
2079 	__le32		r_t_tov;
2080 	__le32		al_tov;
2081 	__le32		rsvd36;
2082 	__le32		bbscn_dword;
2083 };
2084 
2085 #define SLI4_DUMP4_TYPE		0xf
2086 
2087 #define SLI4_WKI_TAG_SAT_TEM	0x1040
2088 
2089 struct sli4_cmd_dump4 {
2090 	struct sli4_mbox_command_header	hdr;
2091 	__le32		type_dword;
2092 	__le16		wki_selection;
2093 	__le16		rsvd10;
2094 	__le32		rsvd12;
2095 	__le32		returned_byte_cnt;
2096 	__le32		resp_data[59];
2097 };
2098 
2099 /* INIT_LINK - initialize the link for a FC port */
2100 enum sli4_init_link_flags {
2101 	SLI4_INIT_LINK_F_LOOPBACK	= 1 << 0,
2102 
2103 	SLI4_INIT_LINK_F_P2P_ONLY	= 1 << 1,
2104 	SLI4_INIT_LINK_F_FCAL_ONLY	= 2 << 1,
2105 	SLI4_INIT_LINK_F_FCAL_FAIL_OVER	= 0 << 1,
2106 	SLI4_INIT_LINK_F_P2P_FAIL_OVER	= 1 << 1,
2107 
2108 	SLI4_INIT_LINK_F_UNFAIR		= 1 << 6,
2109 	SLI4_INIT_LINK_F_NO_LIRP	= 1 << 7,
2110 	SLI4_INIT_LINK_F_LOOP_VALID_CHK	= 1 << 8,
2111 	SLI4_INIT_LINK_F_NO_LISA	= 1 << 9,
2112 	SLI4_INIT_LINK_F_FAIL_OVER	= 1 << 10,
2113 	SLI4_INIT_LINK_F_FIXED_SPEED	= 1 << 11,
2114 	SLI4_INIT_LINK_F_PICK_HI_ALPA	= 1 << 15,
2115 
2116 };
2117 
2118 enum sli4_fc_link_speed {
2119 	SLI4_LINK_SPEED_1G = 1,
2120 	SLI4_LINK_SPEED_2G,
2121 	SLI4_LINK_SPEED_AUTO_1_2,
2122 	SLI4_LINK_SPEED_4G,
2123 	SLI4_LINK_SPEED_AUTO_4_1,
2124 	SLI4_LINK_SPEED_AUTO_4_2,
2125 	SLI4_LINK_SPEED_AUTO_4_2_1,
2126 	SLI4_LINK_SPEED_8G,
2127 	SLI4_LINK_SPEED_AUTO_8_1,
2128 	SLI4_LINK_SPEED_AUTO_8_2,
2129 	SLI4_LINK_SPEED_AUTO_8_2_1,
2130 	SLI4_LINK_SPEED_AUTO_8_4,
2131 	SLI4_LINK_SPEED_AUTO_8_4_1,
2132 	SLI4_LINK_SPEED_AUTO_8_4_2,
2133 	SLI4_LINK_SPEED_10G,
2134 	SLI4_LINK_SPEED_16G,
2135 	SLI4_LINK_SPEED_AUTO_16_8_4,
2136 	SLI4_LINK_SPEED_AUTO_16_8,
2137 	SLI4_LINK_SPEED_32G,
2138 	SLI4_LINK_SPEED_AUTO_32_16_8,
2139 	SLI4_LINK_SPEED_AUTO_32_16,
2140 	SLI4_LINK_SPEED_64G,
2141 	SLI4_LINK_SPEED_AUTO_64_32_16,
2142 	SLI4_LINK_SPEED_AUTO_64_32,
2143 	SLI4_LINK_SPEED_128G,
2144 	SLI4_LINK_SPEED_AUTO_128_64_32,
2145 	SLI4_LINK_SPEED_AUTO_128_64,
2146 };
2147 
2148 struct sli4_cmd_init_link {
2149 	struct sli4_mbox_command_header       hdr;
2150 	__le32	sel_reset_al_pa_dword;
2151 	__le32	flags0;
2152 	__le32	link_speed_sel_code;
2153 };
2154 
2155 /* INIT_VFI - initialize the VFI resource */
2156 enum sli4_init_vfi_flags {
2157 	SLI4_INIT_VFI_FLAG_VP	= 0x1000,
2158 	SLI4_INIT_VFI_FLAG_VF	= 0x2000,
2159 	SLI4_INIT_VFI_FLAG_VT	= 0x4000,
2160 	SLI4_INIT_VFI_FLAG_VR	= 0x8000,
2161 
2162 	SLI4_INIT_VFI_VFID	= 0x1fff,
2163 	SLI4_INIT_VFI_PRI	= 0xe000,
2164 
2165 	SLI4_INIT_VFI_HOP_COUNT = 0xff000000,
2166 };
2167 
2168 struct sli4_cmd_init_vfi {
2169 	struct sli4_mbox_command_header	hdr;
2170 	__le16		vfi;
2171 	__le16		flags0_word;
2172 	__le16		fcfi;
2173 	__le16		vpi;
2174 	__le32		vf_id_pri_dword;
2175 	__le32		hop_cnt_dword;
2176 };
2177 
2178 /* INIT_VPI - initialize the VPI resource */
2179 struct sli4_cmd_init_vpi {
2180 	struct sli4_mbox_command_header	hdr;
2181 	__le16		vpi;
2182 	__le16		vfi;
2183 };
2184 
2185 /* POST_XRI - post XRI resources to the SLI Port */
2186 enum sli4_post_xri_flags {
2187 	SLI4_POST_XRI_COUNT	= 0xfff,
2188 	SLI4_POST_XRI_FLAG_ENX	= 0x1000,
2189 	SLI4_POST_XRI_FLAG_DL	= 0x2000,
2190 	SLI4_POST_XRI_FLAG_DI	= 0x4000,
2191 	SLI4_POST_XRI_FLAG_VAL	= 0x8000,
2192 };
2193 
2194 struct sli4_cmd_post_xri {
2195 	struct sli4_mbox_command_header	hdr;
2196 	__le16		xri_base;
2197 	__le16		xri_count_flags;
2198 };
2199 
2200 /* RELEASE_XRI - Release XRI resources from the SLI Port */
2201 enum sli4_release_xri_flags {
2202 	SLI4_RELEASE_XRI_REL_XRI_CNT	= 0x1f,
2203 	SLI4_RELEASE_XRI_COUNT		= 0x1f,
2204 };
2205 
2206 struct sli4_cmd_release_xri {
2207 	struct sli4_mbox_command_header	hdr;
2208 	__le16		rel_xri_count_word;
2209 	__le16		xri_count_word;
2210 
2211 	struct {
2212 		__le16	xri_tag0;
2213 		__le16	xri_tag1;
2214 	} xri_tbl[62];
2215 };
2216 
2217 /* READ_CONFIG - read SLI port configuration parameters */
2218 struct sli4_cmd_read_config {
2219 	struct sli4_mbox_command_header	hdr;
2220 };
2221 
2222 enum sli4_read_cfg_resp_flags {
2223 	SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000,	/* DW1 */
2224 	SLI4_READ_CFG_RESP_TOPOLOGY	= 0xff000000,	/* DW2 */
2225 };
2226 
2227 enum sli4_read_cfg_topo {
2228 	SLI4_READ_CFG_TOPO_FC		= 0x1,	/* FC topology unknown */
2229 	SLI4_READ_CFG_TOPO_NON_FC_AL	= 0x2,	/* FC point-to-point or fabric */
2230 	SLI4_READ_CFG_TOPO_FC_AL	= 0x3,	/* FC-AL topology */
2231 };
2232 
2233 /* Link Module Type */
2234 enum sli4_read_cfg_lmt {
2235 	SLI4_LINK_MODULE_TYPE_1GB	= 0x0004,
2236 	SLI4_LINK_MODULE_TYPE_2GB	= 0x0008,
2237 	SLI4_LINK_MODULE_TYPE_4GB	= 0x0040,
2238 	SLI4_LINK_MODULE_TYPE_8GB	= 0x0080,
2239 	SLI4_LINK_MODULE_TYPE_16GB	= 0x0200,
2240 	SLI4_LINK_MODULE_TYPE_32GB	= 0x0400,
2241 	SLI4_LINK_MODULE_TYPE_64GB	= 0x0800,
2242 	SLI4_LINK_MODULE_TYPE_128GB	= 0x1000,
2243 };
2244 
2245 struct sli4_rsp_read_config {
2246 	struct sli4_mbox_command_header	hdr;
2247 	__le32		ext_dword;
2248 	__le32		topology_dword;
2249 	__le32		resvd8;
2250 	__le16		e_d_tov;
2251 	__le16		resvd14;
2252 	__le32		resvd16;
2253 	__le16		r_a_tov;
2254 	__le16		resvd22;
2255 	__le32		resvd24;
2256 	__le32		resvd28;
2257 	__le16		lmt;
2258 	__le16		resvd34;
2259 	__le32		resvd36;
2260 	__le32		resvd40;
2261 	__le16		xri_base;
2262 	__le16		xri_count;
2263 	__le16		rpi_base;
2264 	__le16		rpi_count;
2265 	__le16		vpi_base;
2266 	__le16		vpi_count;
2267 	__le16		vfi_base;
2268 	__le16		vfi_count;
2269 	__le16		resvd60;
2270 	__le16		fcfi_count;
2271 	__le16		rq_count;
2272 	__le16		eq_count;
2273 	__le16		wq_count;
2274 	__le16		cq_count;
2275 	__le32		pad[45];
2276 };
2277 
2278 /* READ_NVPARMS - read SLI port configuration parameters */
2279 enum sli4_read_nvparms_flags {
2280 	SLI4_READ_NVPARAMS_HARD_ALPA	  = 0xff,
2281 	SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,
2282 };
2283 
2284 struct sli4_cmd_read_nvparms {
2285 	struct sli4_mbox_command_header	hdr;
2286 	__le32		resvd0;
2287 	__le32		resvd4;
2288 	__le32		resvd8;
2289 	__le32		resvd12;
2290 	u8		wwpn[8];
2291 	u8		wwnn[8];
2292 	__le32		hard_alpa_d_id;
2293 };
2294 
2295 /* WRITE_NVPARMS - write SLI port configuration parameters */
2296 struct sli4_cmd_write_nvparms {
2297 	struct sli4_mbox_command_header	hdr;
2298 	__le32		resvd0;
2299 	__le32		resvd4;
2300 	__le32		resvd8;
2301 	__le32		resvd12;
2302 	u8		wwpn[8];
2303 	u8		wwnn[8];
2304 	__le32		hard_alpa_d_id;
2305 };
2306 
2307 /* READ_REV - read the Port revision levels */
2308 enum {
2309 	SLI4_READ_REV_FLAG_SLI_LEVEL	= 0xf,
2310 	SLI4_READ_REV_FLAG_FCOEM	= 0x10,
2311 	SLI4_READ_REV_FLAG_CEEV		= 0x60,
2312 	SLI4_READ_REV_FLAG_VPD		= 0x2000,
2313 
2314 	SLI4_READ_REV_AVAILABLE_LENGTH	= 0xffffff,
2315 };
2316 
2317 struct sli4_cmd_read_rev {
2318 	struct sli4_mbox_command_header	hdr;
2319 	__le16			resvd0;
2320 	__le16			flags0_word;
2321 	__le32			first_hw_rev;
2322 	__le32			second_hw_rev;
2323 	__le32			resvd12;
2324 	__le32			third_hw_rev;
2325 	u8			fc_ph_low;
2326 	u8			fc_ph_high;
2327 	u8			feature_level_low;
2328 	u8			feature_level_high;
2329 	__le32			resvd24;
2330 	__le32			first_fw_id;
2331 	u8			first_fw_name[16];
2332 	__le32			second_fw_id;
2333 	u8			second_fw_name[16];
2334 	__le32			rsvd18[30];
2335 	__le32			available_length_dword;
2336 	struct sli4_dmaaddr	hostbuf;
2337 	__le32			returned_vpd_length;
2338 	__le32			actual_vpd_length;
2339 };
2340 
2341 /* READ_SPARM64 - read the Port service parameters */
2342 #define SLI4_READ_SPARM64_WWPN_OFFSET	(4 * sizeof(u32))
2343 #define SLI4_READ_SPARM64_WWNN_OFFSET	(6 * sizeof(u32))
2344 
2345 struct sli4_cmd_read_sparm64 {
2346 	struct sli4_mbox_command_header hdr;
2347 	__le32			resvd0;
2348 	__le32			resvd4;
2349 	struct sli4_bde		bde_64;
2350 	__le16			vpi;
2351 	__le16			resvd22;
2352 	__le16			port_name_start;
2353 	__le16			port_name_len;
2354 	__le16			node_name_start;
2355 	__le16			node_name_len;
2356 };
2357 
2358 /* READ_TOPOLOGY - read the link event information */
2359 enum sli4_read_topo_e {
2360 	SLI4_READTOPO_ATTEN_TYPE	= 0xff,
2361 	SLI4_READTOPO_FLAG_IL		= 0x100,
2362 	SLI4_READTOPO_FLAG_PB_RECVD	= 0x200,
2363 
2364 	SLI4_READTOPO_LINKSTATE_RECV	= 0x3,
2365 	SLI4_READTOPO_LINKSTATE_TRANS	= 0xc,
2366 	SLI4_READTOPO_LINKSTATE_MACHINE	= 0xf0,
2367 	SLI4_READTOPO_LINKSTATE_SPEED	= 0xff00,
2368 	SLI4_READTOPO_LINKSTATE_TF	= 0x40000000,
2369 	SLI4_READTOPO_LINKSTATE_LU	= 0x80000000,
2370 
2371 	SLI4_READTOPO_SCN_BBSCN		= 0xf,
2372 	SLI4_READTOPO_SCN_CBBSCN	= 0xf0,
2373 
2374 	SLI4_READTOPO_R_T_TOV		= 0x1ff,
2375 	SLI4_READTOPO_AL_TOV		= 0xf000,
2376 
2377 	SLI4_READTOPO_PB_FLAG		= 0x80,
2378 
2379 	SLI4_READTOPO_INIT_N_PORTID	= 0xffffff,
2380 };
2381 
2382 #define SLI4_MIN_LOOP_MAP_BYTES	128
2383 
2384 struct sli4_cmd_read_topology {
2385 	struct sli4_mbox_command_header	hdr;
2386 	__le32			event_tag;
2387 	__le32			dw2_attentype;
2388 	u8			topology;
2389 	u8			lip_type;
2390 	u8			lip_al_ps;
2391 	u8			al_pa_granted;
2392 	struct sli4_bde		bde_loop_map;
2393 	__le32			linkdown_state;
2394 	__le32			currlink_state;
2395 	u8			max_bbc;
2396 	u8			init_bbc;
2397 	u8			scn_flags;
2398 	u8			rsvd39;
2399 	__le16			dw10w0_al_rt_tov;
2400 	__le16			lp_tov;
2401 	u8			acquired_al_pa;
2402 	u8			pb_flags;
2403 	__le16			specified_al_pa;
2404 	__le32			dw12_init_n_port_id;
2405 };
2406 
2407 enum sli4_read_topo_link {
2408 	SLI4_READ_TOPOLOGY_LINK_UP	= 0x1,
2409 	SLI4_READ_TOPOLOGY_LINK_DOWN,
2410 	SLI4_READ_TOPOLOGY_LINK_NO_ALPA,
2411 };
2412 
2413 enum sli4_read_topo {
2414 	SLI4_READ_TOPO_UNKNOWN		= 0x0,
2415 	SLI4_READ_TOPO_NON_FC_AL,
2416 	SLI4_READ_TOPO_FC_AL,
2417 };
2418 
2419 enum sli4_read_topo_speed {
2420 	SLI4_READ_TOPOLOGY_SPEED_NONE	= 0x00,
2421 	SLI4_READ_TOPOLOGY_SPEED_1G	= 0x04,
2422 	SLI4_READ_TOPOLOGY_SPEED_2G	= 0x08,
2423 	SLI4_READ_TOPOLOGY_SPEED_4G	= 0x10,
2424 	SLI4_READ_TOPOLOGY_SPEED_8G	= 0x20,
2425 	SLI4_READ_TOPOLOGY_SPEED_10G	= 0x40,
2426 	SLI4_READ_TOPOLOGY_SPEED_16G	= 0x80,
2427 	SLI4_READ_TOPOLOGY_SPEED_32G	= 0x90,
2428 	SLI4_READ_TOPOLOGY_SPEED_64G	= 0xa0,
2429 	SLI4_READ_TOPOLOGY_SPEED_128G	= 0xb0,
2430 };
2431 
2432 /* REG_FCFI - activate a FC Forwarder */
2433 struct sli4_cmd_reg_fcfi_rq_cfg {
2434 	u8	r_ctl_mask;
2435 	u8	r_ctl_match;
2436 	u8	type_mask;
2437 	u8	type_match;
2438 };
2439 
2440 enum sli4_regfcfi_tag {
2441 	SLI4_REGFCFI_VLAN_TAG		= 0xfff,
2442 	SLI4_REGFCFI_VLANTAG_VALID	= 0x1000,
2443 };
2444 
2445 #define SLI4_CMD_REG_FCFI_NUM_RQ_CFG	4
2446 struct sli4_cmd_reg_fcfi {
2447 	struct sli4_mbox_command_header	hdr;
2448 	__le16		fcf_index;
2449 	__le16		fcfi;
2450 	__le16		rqid1;
2451 	__le16		rqid0;
2452 	__le16		rqid3;
2453 	__le16		rqid2;
2454 	struct sli4_cmd_reg_fcfi_rq_cfg
2455 			rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
2456 	__le32		dw8_vlan;
2457 };
2458 
2459 #define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG	4
2460 #define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ	32
2461 #define SLI4_CMD_REG_FCFI_SET_FCFI_MODE		0
2462 #define SLI4_CMD_REG_FCFI_SET_MRQ_MODE		1
2463 
2464 enum sli4_reg_fcfi_mrq {
2465 	SLI4_REGFCFI_MRQ_VLAN_TAG	= 0xfff,
2466 	SLI4_REGFCFI_MRQ_VLANTAG_VALID	= 0x1000,
2467 	SLI4_REGFCFI_MRQ_MODE		= 0x2000,
2468 
2469 	SLI4_REGFCFI_MRQ_MASK_NUM_PAIRS	= 0xff,
2470 	SLI4_REGFCFI_MRQ_FILTER_BITMASK = 0xf00,
2471 	SLI4_REGFCFI_MRQ_RQ_SEL_POLICY	= 0xf000,
2472 };
2473 
2474 struct sli4_cmd_reg_fcfi_mrq {
2475 	struct sli4_mbox_command_header	hdr;
2476 	__le16		fcf_index;
2477 	__le16		fcfi;
2478 	__le16		rqid1;
2479 	__le16		rqid0;
2480 	__le16		rqid3;
2481 	__le16		rqid2;
2482 	struct sli4_cmd_reg_fcfi_rq_cfg
2483 			rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
2484 	__le32		dw8_vlan;
2485 	__le32		dw9_mrqflags;
2486 };
2487 
2488 struct sli4_cmd_rq_cfg {
2489 	__le16	rq_id;
2490 	u8	r_ctl_mask;
2491 	u8	r_ctl_match;
2492 	u8	type_mask;
2493 	u8	type_match;
2494 };
2495 
2496 /* REG_RPI - register a Remote Port Indicator */
2497 enum sli4_reg_rpi {
2498 	SLI4_REGRPI_REMOTE_N_PORTID	= 0xffffff,	/* DW2 */
2499 	SLI4_REGRPI_UPD			= 0x1000000,
2500 	SLI4_REGRPI_ETOW		= 0x8000000,
2501 	SLI4_REGRPI_TERP		= 0x20000000,
2502 	SLI4_REGRPI_CI			= 0x80000000,
2503 };
2504 
2505 struct sli4_cmd_reg_rpi {
2506 	struct sli4_mbox_command_header	hdr;
2507 	__le16			rpi;
2508 	__le16			rsvd2;
2509 	__le32			dw2_rportid_flags;
2510 	struct sli4_bde		bde_64;
2511 	__le16			vpi;
2512 	__le16			rsvd26;
2513 };
2514 
2515 #define SLI4_REG_RPI_BUF_LEN		0x70
2516 
2517 /* REG_VFI - register a Virtual Fabric Indicator */
2518 enum sli_reg_vfi {
2519 	SLI4_REGVFI_VP			= 0x1000,	/* DW1 */
2520 	SLI4_REGVFI_UPD			= 0x2000,
2521 
2522 	SLI4_REGVFI_LOCAL_N_PORTID	= 0xffffff,	/* DW10 */
2523 };
2524 
2525 struct sli4_cmd_reg_vfi {
2526 	struct sli4_mbox_command_header	hdr;
2527 	__le16			vfi;
2528 	__le16			dw0w1_flags;
2529 	__le16			fcfi;
2530 	__le16			vpi;
2531 	u8			wwpn[8];
2532 	struct sli4_bde		sparm;
2533 	__le32			e_d_tov;
2534 	__le32			r_a_tov;
2535 	__le32			dw10_lportid_flags;
2536 };
2537 
2538 /* REG_VPI - register a Virtual Port Indicator */
2539 enum sli4_reg_vpi {
2540 	SLI4_REGVPI_LOCAL_N_PORTID	= 0xffffff,
2541 	SLI4_REGVPI_UPD			= 0x1000000,
2542 };
2543 
2544 struct sli4_cmd_reg_vpi {
2545 	struct sli4_mbox_command_header	hdr;
2546 	__le32		rsvd0;
2547 	__le32		dw2_lportid_flags;
2548 	u8		wwpn[8];
2549 	__le32		rsvd12;
2550 	__le16		vpi;
2551 	__le16		vfi;
2552 };
2553 
2554 /* REQUEST_FEATURES - request / query SLI features */
2555 enum sli4_req_features_flags {
2556 	SLI4_REQFEAT_QRY	= 0x1,		/* Dw1 */
2557 
2558 	SLI4_REQFEAT_IAAB	= 1 << 0,	/* DW2 & DW3 */
2559 	SLI4_REQFEAT_NPIV	= 1 << 1,
2560 	SLI4_REQFEAT_DIF	= 1 << 2,
2561 	SLI4_REQFEAT_VF		= 1 << 3,
2562 	SLI4_REQFEAT_FCPI	= 1 << 4,
2563 	SLI4_REQFEAT_FCPT	= 1 << 5,
2564 	SLI4_REQFEAT_FCPC	= 1 << 6,
2565 	SLI4_REQFEAT_RSVD	= 1 << 7,
2566 	SLI4_REQFEAT_RQD	= 1 << 8,
2567 	SLI4_REQFEAT_IAAR	= 1 << 9,
2568 	SLI4_REQFEAT_HLM	= 1 << 10,
2569 	SLI4_REQFEAT_PERFH	= 1 << 11,
2570 	SLI4_REQFEAT_RXSEQ	= 1 << 12,
2571 	SLI4_REQFEAT_RXRI	= 1 << 13,
2572 	SLI4_REQFEAT_DCL2	= 1 << 14,
2573 	SLI4_REQFEAT_RSCO	= 1 << 15,
2574 	SLI4_REQFEAT_MRQP	= 1 << 16,
2575 };
2576 
2577 struct sli4_cmd_request_features {
2578 	struct sli4_mbox_command_header	hdr;
2579 	__le32		dw1_qry;
2580 	__le32		cmd;
2581 	__le32		resp;
2582 };
2583 
2584 /*
2585  * SLI_CONFIG - submit a configuration command to Port
2586  *
2587  * Command is either embedded as part of the payload (embed) or located
2588  * in a separate memory buffer (mem)
2589  */
2590 enum sli4_sli_config {
2591 	SLI4_SLICONF_EMB		= 0x1,		/* DW1 */
2592 	SLI4_SLICONF_PMDCMD_SHIFT	= 3,
2593 	SLI4_SLICONF_PMDCMD_MASK	= 0xf8,
2594 	SLI4_SLICONF_PMDCMD_VAL_1	= 8,
2595 	SLI4_SLICONF_PMDCNT		= 0xf8,
2596 
2597 	SLI4_SLICONF_PMD_LEN		= 0x00ffffff,
2598 };
2599 
2600 struct sli4_cmd_sli_config {
2601 	struct sli4_mbox_command_header	hdr;
2602 	__le32		dw1_flags;
2603 	__le32		payload_len;
2604 	__le32		rsvd12[3];
2605 	union {
2606 		u8 embed[58 * sizeof(u32)];
2607 		struct sli4_bufptr mem;
2608 	} payload;
2609 };
2610 
2611 /* READ_STATUS - read tx/rx status of a particular port */
2612 #define SLI4_READSTATUS_CLEAR_COUNTERS	0x1
2613 
2614 struct sli4_cmd_read_status {
2615 	struct sli4_mbox_command_header	hdr;
2616 	__le32		dw1_flags;
2617 	__le32		rsvd4;
2618 	__le32		trans_kbyte_cnt;
2619 	__le32		recv_kbyte_cnt;
2620 	__le32		trans_frame_cnt;
2621 	__le32		recv_frame_cnt;
2622 	__le32		trans_seq_cnt;
2623 	__le32		recv_seq_cnt;
2624 	__le32		tot_exchanges_orig;
2625 	__le32		tot_exchanges_resp;
2626 	__le32		recv_p_bsy_cnt;
2627 	__le32		recv_f_bsy_cnt;
2628 	__le32		no_rq_buf_dropped_frames_cnt;
2629 	__le32		empty_rq_timeout_cnt;
2630 	__le32		no_xri_dropped_frames_cnt;
2631 	__le32		empty_xri_pool_cnt;
2632 };
2633 
2634 /* READ_LNK_STAT - read link status of a particular port */
2635 enum sli4_read_link_stats_flags {
2636 	SLI4_READ_LNKSTAT_REC	= 1u << 0,
2637 	SLI4_READ_LNKSTAT_GEC	= 1u << 1,
2638 	SLI4_READ_LNKSTAT_W02OF	= 1u << 2,
2639 	SLI4_READ_LNKSTAT_W03OF	= 1u << 3,
2640 	SLI4_READ_LNKSTAT_W04OF	= 1u << 4,
2641 	SLI4_READ_LNKSTAT_W05OF	= 1u << 5,
2642 	SLI4_READ_LNKSTAT_W06OF	= 1u << 6,
2643 	SLI4_READ_LNKSTAT_W07OF	= 1u << 7,
2644 	SLI4_READ_LNKSTAT_W08OF	= 1u << 8,
2645 	SLI4_READ_LNKSTAT_W09OF	= 1u << 9,
2646 	SLI4_READ_LNKSTAT_W10OF = 1u << 10,
2647 	SLI4_READ_LNKSTAT_W11OF = 1u << 11,
2648 	SLI4_READ_LNKSTAT_W12OF	= 1u << 12,
2649 	SLI4_READ_LNKSTAT_W13OF	= 1u << 13,
2650 	SLI4_READ_LNKSTAT_W14OF	= 1u << 14,
2651 	SLI4_READ_LNKSTAT_W15OF	= 1u << 15,
2652 	SLI4_READ_LNKSTAT_W16OF	= 1u << 16,
2653 	SLI4_READ_LNKSTAT_W17OF	= 1u << 17,
2654 	SLI4_READ_LNKSTAT_W18OF	= 1u << 18,
2655 	SLI4_READ_LNKSTAT_W19OF	= 1u << 19,
2656 	SLI4_READ_LNKSTAT_W20OF	= 1u << 20,
2657 	SLI4_READ_LNKSTAT_W21OF	= 1u << 21,
2658 	SLI4_READ_LNKSTAT_CLRC	= 1u << 30,
2659 	SLI4_READ_LNKSTAT_CLOF	= 1u << 31,
2660 };
2661 
2662 struct sli4_cmd_read_link_stats {
2663 	struct sli4_mbox_command_header	hdr;
2664 	__le32	dw1_flags;
2665 	__le32	linkfail_errcnt;
2666 	__le32	losssync_errcnt;
2667 	__le32	losssignal_errcnt;
2668 	__le32	primseq_errcnt;
2669 	__le32	inval_txword_errcnt;
2670 	__le32	crc_errcnt;
2671 	__le32	primseq_eventtimeout_cnt;
2672 	__le32	elastic_bufoverrun_errcnt;
2673 	__le32	arbit_fc_al_timeout_cnt;
2674 	__le32	adv_rx_buftor_to_buf_credit;
2675 	__le32	curr_rx_buf_to_buf_credit;
2676 	__le32	adv_tx_buf_to_buf_credit;
2677 	__le32	curr_tx_buf_to_buf_credit;
2678 	__le32	rx_eofa_cnt;
2679 	__le32	rx_eofdti_cnt;
2680 	__le32	rx_eofni_cnt;
2681 	__le32	rx_soff_cnt;
2682 	__le32	rx_dropped_no_aer_cnt;
2683 	__le32	rx_dropped_no_avail_rpi_rescnt;
2684 	__le32	rx_dropped_no_avail_xri_rescnt;
2685 };
2686 
2687 /* Format a WQE with WQ_ID Association performance hint */
2688 static inline void
2689 sli_set_wq_id_association(void *entry, u16 q_id)
2690 {
2691 	u32 *wqe = entry;
2692 
2693 	/*
2694 	 * Set Word 10, bit 0 to zero
2695 	 * Set Word 10, bits 15:1 to the WQ ID
2696 	 */
2697 	wqe[10] &= ~0xffff;
2698 	wqe[10] |= q_id << 1;
2699 }
2700 
2701 /* UNREG_FCFI - unregister a FCFI */
2702 struct sli4_cmd_unreg_fcfi {
2703 	struct sli4_mbox_command_header	hdr;
2704 	__le32		rsvd0;
2705 	__le16		fcfi;
2706 	__le16		rsvd6;
2707 };
2708 
2709 /* UNREG_RPI - unregister one or more RPI */
2710 enum sli4_unreg_rpi {
2711 	SLI4_UNREG_RPI_DP	= 0x2000,
2712 	SLI4_UNREG_RPI_II_SHIFT	= 14,
2713 	SLI4_UNREG_RPI_II_MASK	= 0xc000,
2714 	SLI4_UNREG_RPI_II_RPI	= 0x0000,
2715 	SLI4_UNREG_RPI_II_VPI	= 0x4000,
2716 	SLI4_UNREG_RPI_II_VFI	= 0x8000,
2717 	SLI4_UNREG_RPI_II_FCFI	= 0xc000,
2718 
2719 	SLI4_UNREG_RPI_DEST_N_PORTID_MASK = 0x00ffffff,
2720 };
2721 
2722 struct sli4_cmd_unreg_rpi {
2723 	struct sli4_mbox_command_header	hdr;
2724 	__le16		index;
2725 	__le16		dw1w1_flags;
2726 	__le32		dw2_dest_n_portid;
2727 };
2728 
2729 /* UNREG_VFI - unregister one or more VFI */
2730 enum sli4_unreg_vfi {
2731 	SLI4_UNREG_VFI_II_SHIFT	= 14,
2732 	SLI4_UNREG_VFI_II_MASK	= 0xc000,
2733 	SLI4_UNREG_VFI_II_VFI	= 0x0000,
2734 	SLI4_UNREG_VFI_II_FCFI	= 0xc000,
2735 };
2736 
2737 struct sli4_cmd_unreg_vfi {
2738 	struct sli4_mbox_command_header	hdr;
2739 	__le32		rsvd0;
2740 	__le16		index;
2741 	__le16		dw2_flags;
2742 };
2743 
2744 enum sli4_unreg_type {
2745 	SLI4_UNREG_TYPE_PORT,
2746 	SLI4_UNREG_TYPE_DOMAIN,
2747 	SLI4_UNREG_TYPE_FCF,
2748 	SLI4_UNREG_TYPE_ALL
2749 };
2750 
2751 /* UNREG_VPI - unregister one or more VPI */
2752 enum sli4_unreg_vpi {
2753 	SLI4_UNREG_VPI_II_SHIFT	= 14,
2754 	SLI4_UNREG_VPI_II_MASK	= 0xc000,
2755 	SLI4_UNREG_VPI_II_VPI	= 0x0000,
2756 	SLI4_UNREG_VPI_II_VFI	= 0x8000,
2757 	SLI4_UNREG_VPI_II_FCFI	= 0xc000,
2758 };
2759 
2760 struct sli4_cmd_unreg_vpi {
2761 	struct sli4_mbox_command_header	hdr;
2762 	__le32		rsvd0;
2763 	__le16		index;
2764 	__le16		dw2w0_flags;
2765 };
2766 
2767 /* AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature */
2768 struct sli4_cmd_config_auto_xfer_rdy {
2769 	struct sli4_mbox_command_header	hdr;
2770 	__le32		rsvd0;
2771 	__le32		max_burst_len;
2772 };
2773 
2774 #define SLI4_CONFIG_AUTO_XFERRDY_BLKSIZE	0xffff
2775 
2776 struct sli4_cmd_config_auto_xfer_rdy_hp {
2777 	struct sli4_mbox_command_header	hdr;
2778 	__le32		rsvd0;
2779 	__le32		max_burst_len;
2780 	__le32		dw3_esoc_flags;
2781 	__le16		block_size;
2782 	__le16		rsvd14;
2783 };
2784 
2785 /*************************************************************************
2786  * SLI-4 common configuration command formats and definitions
2787  */
2788 
2789 /*
2790  * Subsystem values.
2791  */
2792 enum sli4_subsystem {
2793 	SLI4_SUBSYSTEM_COMMON	= 0x01,
2794 	SLI4_SUBSYSTEM_LOWLEVEL	= 0x0b,
2795 	SLI4_SUBSYSTEM_FC	= 0x0c,
2796 	SLI4_SUBSYSTEM_DMTF	= 0x11,
2797 };
2798 
2799 #define	SLI4_OPC_LOWLEVEL_SET_WATCHDOG		0X36
2800 
2801 /*
2802  * Common opcode (OPC) values.
2803  */
2804 enum sli4_cmn_opcode {
2805 	SLI4_CMN_FUNCTION_RESET		= 0x3d,
2806 	SLI4_CMN_CREATE_CQ		= 0x0c,
2807 	SLI4_CMN_CREATE_CQ_SET		= 0x1d,
2808 	SLI4_CMN_DESTROY_CQ		= 0x36,
2809 	SLI4_CMN_MODIFY_EQ_DELAY	= 0x29,
2810 	SLI4_CMN_CREATE_EQ		= 0x0d,
2811 	SLI4_CMN_DESTROY_EQ		= 0x37,
2812 	SLI4_CMN_CREATE_MQ_EXT		= 0x5a,
2813 	SLI4_CMN_DESTROY_MQ		= 0x35,
2814 	SLI4_CMN_GET_CNTL_ATTRIBUTES	= 0x20,
2815 	SLI4_CMN_NOP			= 0x21,
2816 	SLI4_CMN_GET_RSC_EXTENT_INFO	= 0x9a,
2817 	SLI4_CMN_GET_SLI4_PARAMS	= 0xb5,
2818 	SLI4_CMN_QUERY_FW_CONFIG	= 0x3a,
2819 	SLI4_CMN_GET_PORT_NAME		= 0x4d,
2820 
2821 	SLI4_CMN_WRITE_FLASHROM		= 0x07,
2822 	/* TRANSCEIVER Data */
2823 	SLI4_CMN_READ_TRANS_DATA	= 0x49,
2824 	SLI4_CMN_GET_CNTL_ADDL_ATTRS	= 0x79,
2825 	SLI4_CMN_GET_FUNCTION_CFG	= 0xa0,
2826 	SLI4_CMN_GET_PROFILE_CFG	= 0xa4,
2827 	SLI4_CMN_SET_PROFILE_CFG	= 0xa5,
2828 	SLI4_CMN_GET_PROFILE_LIST	= 0xa6,
2829 	SLI4_CMN_GET_ACTIVE_PROFILE	= 0xa7,
2830 	SLI4_CMN_SET_ACTIVE_PROFILE	= 0xa8,
2831 	SLI4_CMN_READ_OBJECT		= 0xab,
2832 	SLI4_CMN_WRITE_OBJECT		= 0xac,
2833 	SLI4_CMN_DELETE_OBJECT		= 0xae,
2834 	SLI4_CMN_READ_OBJECT_LIST	= 0xad,
2835 	SLI4_CMN_SET_DUMP_LOCATION	= 0xb8,
2836 	SLI4_CMN_SET_FEATURES		= 0xbf,
2837 	SLI4_CMN_GET_RECFG_LINK_INFO	= 0xc9,
2838 	SLI4_CMN_SET_RECNG_LINK_ID	= 0xca,
2839 };
2840 
2841 /* DMTF opcode (OPC) values */
2842 #define DMTF_EXEC_CLP_CMD 0x01
2843 
2844 /*
2845  * COMMON_FUNCTION_RESET
2846  *
2847  * Resets the Port, returning it to a power-on state. This configuration
2848  * command does not have a payload and should set/expect the lengths to
2849  * be zero.
2850  */
2851 struct sli4_rqst_cmn_function_reset {
2852 	struct sli4_rqst_hdr	hdr;
2853 };
2854 
2855 struct sli4_rsp_cmn_function_reset {
2856 	struct sli4_rsp_hdr	hdr;
2857 };
2858 
2859 /*
2860  * COMMON_GET_CNTL_ATTRIBUTES
2861  *
2862  * Query for information about the SLI Port
2863  */
2864 enum sli4_cntrl_attr_flags {
2865 	SLI4_CNTL_ATTR_PORTNUM	= 0x3f,
2866 	SLI4_CNTL_ATTR_PORTTYPE	= 0xc0,
2867 };
2868 
2869 struct sli4_rsp_cmn_get_cntl_attributes {
2870 	struct sli4_rsp_hdr	hdr;
2871 	u8		version_str[32];
2872 	u8		manufacturer_name[32];
2873 	__le32		supported_modes;
2874 	u8		eprom_version_lo;
2875 	u8		eprom_version_hi;
2876 	__le16		rsvd17;
2877 	__le32		mbx_ds_version;
2878 	__le32		ep_fw_ds_version;
2879 	u8		ncsi_version_str[12];
2880 	__le32		def_extended_timeout;
2881 	u8		model_number[32];
2882 	u8		description[64];
2883 	u8		serial_number[32];
2884 	u8		ip_version_str[32];
2885 	u8		fw_version_str[32];
2886 	u8		bios_version_str[32];
2887 	u8		redboot_version_str[32];
2888 	u8		driver_version_str[32];
2889 	u8		fw_on_flash_version_str[32];
2890 	__le32		functionalities_supported;
2891 	__le16		max_cdb_length;
2892 	u8		asic_revision;
2893 	u8		generational_guid0;
2894 	__le32		generational_guid1_12[3];
2895 	__le16		generational_guid13_14;
2896 	u8		generational_guid15;
2897 	u8		hba_port_count;
2898 	__le16		default_link_down_timeout;
2899 	u8		iscsi_version_min_max;
2900 	u8		multifunctional_device;
2901 	u8		cache_valid;
2902 	u8		hba_status;
2903 	u8		max_domains_supported;
2904 	u8		port_num_type_flags;
2905 	__le32		firmware_post_status;
2906 	__le32		hba_mtu;
2907 	u8		iscsi_features;
2908 	u8		rsvd121[3];
2909 	__le16		pci_vendor_id;
2910 	__le16		pci_device_id;
2911 	__le16		pci_sub_vendor_id;
2912 	__le16		pci_sub_system_id;
2913 	u8		pci_bus_number;
2914 	u8		pci_device_number;
2915 	u8		pci_function_number;
2916 	u8		interface_type;
2917 	__le64		unique_identifier;
2918 	u8		number_of_netfilters;
2919 	u8		rsvd122[3];
2920 };
2921 
2922 /*
2923  * COMMON_GET_CNTL_ATTRIBUTES
2924  *
2925  * This command queries the controller information from the Flash ROM.
2926  */
2927 struct sli4_rqst_cmn_get_cntl_addl_attributes {
2928 	struct sli4_rqst_hdr	hdr;
2929 };
2930 
2931 struct sli4_rsp_cmn_get_cntl_addl_attributes {
2932 	struct sli4_rsp_hdr	hdr;
2933 	__le16		ipl_file_number;
2934 	u8		ipl_file_version;
2935 	u8		rsvd4;
2936 	u8		on_die_temperature;
2937 	u8		rsvd5[3];
2938 	__le32		driver_advanced_features_supported;
2939 	__le32		rsvd7[4];
2940 	char		universal_bios_version[32];
2941 	char		x86_bios_version[32];
2942 	char		efi_bios_version[32];
2943 	char		fcode_version[32];
2944 	char		uefi_bios_version[32];
2945 	char		uefi_nic_version[32];
2946 	char		uefi_fcode_version[32];
2947 	char		uefi_iscsi_version[32];
2948 	char		iscsi_x86_bios_version[32];
2949 	char		pxe_x86_bios_version[32];
2950 	u8		default_wwpn[8];
2951 	u8		ext_phy_version[32];
2952 	u8		fc_universal_bios_version[32];
2953 	u8		fc_x86_bios_version[32];
2954 	u8		fc_efi_bios_version[32];
2955 	u8		fc_fcode_version[32];
2956 	u8		ext_phy_crc_label[8];
2957 	u8		ipl_file_name[16];
2958 	u8		rsvd139[72];
2959 };
2960 
2961 /*
2962  * COMMON_NOP
2963  *
2964  * This command does not do anything; it only returns
2965  * the payload in the completion.
2966  */
2967 struct sli4_rqst_cmn_nop {
2968 	struct sli4_rqst_hdr	hdr;
2969 	__le32			context[2];
2970 };
2971 
2972 struct sli4_rsp_cmn_nop {
2973 	struct sli4_rsp_hdr	hdr;
2974 	__le32			context[2];
2975 };
2976 
2977 struct sli4_rqst_cmn_get_resource_extent_info {
2978 	struct sli4_rqst_hdr	hdr;
2979 	__le16	resource_type;
2980 	__le16	rsvd16;
2981 };
2982 
2983 enum sli4_rsc_type {
2984 	SLI4_RSC_TYPE_VFI	= 0x20,
2985 	SLI4_RSC_TYPE_VPI	= 0x21,
2986 	SLI4_RSC_TYPE_RPI	= 0x22,
2987 	SLI4_RSC_TYPE_XRI	= 0x23,
2988 };
2989 
2990 struct sli4_rsp_cmn_get_resource_extent_info {
2991 	struct sli4_rsp_hdr	hdr;
2992 	__le16		resource_extent_count;
2993 	__le16		resource_extent_size;
2994 };
2995 
2996 #define SLI4_128BYTE_WQE_SUPPORT	0x02
2997 
2998 #define GET_Q_CNT_METHOD(m) \
2999 	(((m) & SLI4_PARAM_Q_CNT_MTHD_MASK) >> SLI4_PARAM_Q_CNT_MTHD_SHFT)
3000 #define GET_Q_CREATE_VERSION(v) \
3001 	(((v) & SLI4_PARAM_QV_MASK) >> SLI4_PARAM_QV_SHIFT)
3002 
3003 enum sli4_rsp_get_params_e {
3004 	/*GENERIC*/
3005 	SLI4_PARAM_Q_CNT_MTHD_SHFT	= 24,
3006 	SLI4_PARAM_Q_CNT_MTHD_MASK	= 0xf << 24,
3007 	SLI4_PARAM_QV_SHIFT		= 14,
3008 	SLI4_PARAM_QV_MASK		= 3 << 14,
3009 
3010 	/* DW4 */
3011 	SLI4_PARAM_PROTO_TYPE_MASK	= 0xff,
3012 	/* DW5 */
3013 	SLI4_PARAM_FT			= 1 << 0,
3014 	SLI4_PARAM_SLI_REV_MASK		= 0xf << 4,
3015 	SLI4_PARAM_SLI_FAM_MASK		= 0xf << 8,
3016 	SLI4_PARAM_IF_TYPE_MASK		= 0xf << 12,
3017 	SLI4_PARAM_SLI_HINT1_MASK	= 0xff << 16,
3018 	SLI4_PARAM_SLI_HINT2_MASK	= 0x1f << 24,
3019 	/* DW6 */
3020 	SLI4_PARAM_EQ_PAGE_CNT_MASK	= 0xf << 0,
3021 	SLI4_PARAM_EQE_SZS_MASK		= 0xf << 8,
3022 	SLI4_PARAM_EQ_PAGE_SZS_MASK	= 0xff << 16,
3023 	/* DW8 */
3024 	SLI4_PARAM_CQ_PAGE_CNT_MASK	= 0xf << 0,
3025 	SLI4_PARAM_CQE_SZS_MASK		= 0xf << 8,
3026 	SLI4_PARAM_CQ_PAGE_SZS_MASK	= 0xff << 16,
3027 	/* DW10 */
3028 	SLI4_PARAM_MQ_PAGE_CNT_MASK	= 0xf << 0,
3029 	SLI4_PARAM_MQ_PAGE_SZS_MASK	= 0xff << 16,
3030 	/* DW12 */
3031 	SLI4_PARAM_WQ_PAGE_CNT_MASK	= 0xf << 0,
3032 	SLI4_PARAM_WQE_SZS_MASK		= 0xf << 8,
3033 	SLI4_PARAM_WQ_PAGE_SZS_MASK	= 0xff << 16,
3034 	/* DW14 */
3035 	SLI4_PARAM_RQ_PAGE_CNT_MASK	= 0xf << 0,
3036 	SLI4_PARAM_RQE_SZS_MASK		= 0xf << 8,
3037 	SLI4_PARAM_RQ_PAGE_SZS_MASK	= 0xff << 16,
3038 	/* DW15W1*/
3039 	SLI4_PARAM_RQ_DB_WINDOW_MASK	= 0xf000,
3040 	/* DW16 */
3041 	SLI4_PARAM_FC			= 1 << 0,
3042 	SLI4_PARAM_EXT			= 1 << 1,
3043 	SLI4_PARAM_HDRR			= 1 << 2,
3044 	SLI4_PARAM_SGLR			= 1 << 3,
3045 	SLI4_PARAM_FBRR			= 1 << 4,
3046 	SLI4_PARAM_AREG			= 1 << 5,
3047 	SLI4_PARAM_TGT			= 1 << 6,
3048 	SLI4_PARAM_TERP			= 1 << 7,
3049 	SLI4_PARAM_ASSI			= 1 << 8,
3050 	SLI4_PARAM_WCHN			= 1 << 9,
3051 	SLI4_PARAM_TCCA			= 1 << 10,
3052 	SLI4_PARAM_TRTY			= 1 << 11,
3053 	SLI4_PARAM_TRIR			= 1 << 12,
3054 	SLI4_PARAM_PHOFF		= 1 << 13,
3055 	SLI4_PARAM_PHON			= 1 << 14,
3056 	SLI4_PARAM_PHWQ			= 1 << 15,
3057 	SLI4_PARAM_BOUND_4GA		= 1 << 16,
3058 	SLI4_PARAM_RXC			= 1 << 17,
3059 	SLI4_PARAM_HLM			= 1 << 18,
3060 	SLI4_PARAM_IPR			= 1 << 19,
3061 	SLI4_PARAM_RXRI			= 1 << 20,
3062 	SLI4_PARAM_SGLC			= 1 << 21,
3063 	SLI4_PARAM_TIMM			= 1 << 22,
3064 	SLI4_PARAM_TSMM			= 1 << 23,
3065 	SLI4_PARAM_OAS			= 1 << 25,
3066 	SLI4_PARAM_LC			= 1 << 26,
3067 	SLI4_PARAM_AGXF			= 1 << 27,
3068 	SLI4_PARAM_LOOPBACK_MASK	= 0xf << 28,
3069 	/* DW18 */
3070 	SLI4_PARAM_SGL_PAGE_CNT_MASK	= 0xf << 0,
3071 	SLI4_PARAM_SGL_PAGE_SZS_MASK	= 0xff << 8,
3072 	SLI4_PARAM_SGL_PP_ALIGN_MASK	= 0xff << 16,
3073 };
3074 
3075 struct sli4_rqst_cmn_get_sli4_params {
3076 	struct sli4_rqst_hdr	hdr;
3077 };
3078 
3079 struct sli4_rsp_cmn_get_sli4_params {
3080 	struct sli4_rsp_hdr	hdr;
3081 	__le32		dw4_protocol_type;
3082 	__le32		dw5_sli;
3083 	__le32		dw6_eq_page_cnt;
3084 	__le16		eqe_count_mask;
3085 	__le16		rsvd26;
3086 	__le32		dw8_cq_page_cnt;
3087 	__le16		cqe_count_mask;
3088 	__le16		rsvd34;
3089 	__le32		dw10_mq_page_cnt;
3090 	__le16		mqe_count_mask;
3091 	__le16		rsvd42;
3092 	__le32		dw12_wq_page_cnt;
3093 	__le16		wqe_count_mask;
3094 	__le16		rsvd50;
3095 	__le32		dw14_rq_page_cnt;
3096 	__le16		rqe_count_mask;
3097 	__le16		dw15w1_rq_db_window;
3098 	__le32		dw16_loopback_scope;
3099 	__le32		sge_supported_length;
3100 	__le32		dw18_sgl_page_cnt;
3101 	__le16		min_rq_buffer_size;
3102 	__le16		rsvd75;
3103 	__le32		max_rq_buffer_size;
3104 	__le16		physical_xri_max;
3105 	__le16		physical_rpi_max;
3106 	__le16		physical_vpi_max;
3107 	__le16		physical_vfi_max;
3108 	__le32		rsvd88;
3109 	__le16		frag_num_field_offset;
3110 	__le16		frag_num_field_size;
3111 	__le16		sgl_index_field_offset;
3112 	__le16		sgl_index_field_size;
3113 	__le32		chain_sge_initial_value_lo;
3114 	__le32		chain_sge_initial_value_hi;
3115 };
3116 
3117 /*Port Types*/
3118 enum sli4_port_types {
3119 	SLI4_PORT_TYPE_ETH	= 0,
3120 	SLI4_PORT_TYPE_FC	= 1,
3121 };
3122 
3123 struct sli4_rqst_cmn_get_port_name {
3124 	struct sli4_rqst_hdr	hdr;
3125 	u8	port_type;
3126 	u8	rsvd4[3];
3127 };
3128 
3129 struct sli4_rsp_cmn_get_port_name {
3130 	struct sli4_rsp_hdr	hdr;
3131 	char	port_name[4];
3132 };
3133 
3134 struct sli4_rqst_cmn_write_flashrom {
3135 	struct sli4_rqst_hdr	hdr;
3136 	__le32		flash_rom_access_opcode;
3137 	__le32		flash_rom_access_operation_type;
3138 	__le32		data_buffer_size;
3139 	__le32		offset;
3140 	u8		data_buffer[4];
3141 };
3142 
3143 /*
3144  * COMMON_READ_TRANSCEIVER_DATA
3145  *
3146  * This command reads SFF transceiver data(Format is defined
3147  * by the SFF-8472 specification).
3148  */
3149 struct sli4_rqst_cmn_read_transceiver_data {
3150 	struct sli4_rqst_hdr	hdr;
3151 	__le32			page_number;
3152 	__le32			port;
3153 };
3154 
3155 struct sli4_rsp_cmn_read_transceiver_data {
3156 	struct sli4_rsp_hdr	hdr;
3157 	__le32			page_number;
3158 	__le32			port;
3159 	u8			page_data[128];
3160 	u8			page_data_2[128];
3161 };
3162 
3163 #define SLI4_REQ_DESIRE_READLEN		0xffffff
3164 
3165 struct sli4_rqst_cmn_read_object {
3166 	struct sli4_rqst_hdr	hdr;
3167 	__le32			desired_read_length_dword;
3168 	__le32			read_offset;
3169 	u8			object_name[104];
3170 	__le32			host_buffer_descriptor_count;
3171 	struct sli4_bde		host_buffer_descriptor[];
3172 };
3173 
3174 #define RSP_COM_READ_OBJ_EOF		0x80000000
3175 
3176 struct sli4_rsp_cmn_read_object {
3177 	struct sli4_rsp_hdr	hdr;
3178 	__le32			actual_read_length;
3179 	__le32			eof_dword;
3180 };
3181 
3182 enum sli4_rqst_write_object_flags {
3183 	SLI4_RQ_DES_WRITE_LEN		= 0xffffff,
3184 	SLI4_RQ_DES_WRITE_LEN_NOC	= 0x40000000,
3185 	SLI4_RQ_DES_WRITE_LEN_EOF	= 0x80000000,
3186 };
3187 
3188 struct sli4_rqst_cmn_write_object {
3189 	struct sli4_rqst_hdr	hdr;
3190 	__le32			desired_write_len_dword;
3191 	__le32			write_offset;
3192 	u8			object_name[104];
3193 	__le32			host_buffer_descriptor_count;
3194 	struct sli4_bde		host_buffer_descriptor[];
3195 };
3196 
3197 #define	RSP_CHANGE_STATUS		0xff
3198 
3199 struct sli4_rsp_cmn_write_object {
3200 	struct sli4_rsp_hdr	hdr;
3201 	__le32			actual_write_length;
3202 	__le32			change_status_dword;
3203 };
3204 
3205 struct sli4_rqst_cmn_delete_object {
3206 	struct sli4_rqst_hdr	hdr;
3207 	__le32			rsvd4;
3208 	__le32			rsvd5;
3209 	u8			object_name[104];
3210 };
3211 
3212 #define SLI4_RQ_OBJ_LIST_READ_LEN	0xffffff
3213 
3214 struct sli4_rqst_cmn_read_object_list {
3215 	struct sli4_rqst_hdr	hdr;
3216 	__le32			desired_read_length_dword;
3217 	__le32			read_offset;
3218 	u8			object_name[104];
3219 	__le32			host_buffer_descriptor_count;
3220 	struct sli4_bde		host_buffer_descriptor[];
3221 };
3222 
3223 enum sli4_rqst_set_dump_flags {
3224 	SLI4_CMN_SET_DUMP_BUFFER_LEN	= 0xffffff,
3225 	SLI4_CMN_SET_DUMP_FDB		= 0x20000000,
3226 	SLI4_CMN_SET_DUMP_BLP		= 0x40000000,
3227 	SLI4_CMN_SET_DUMP_QRY		= 0x80000000,
3228 };
3229 
3230 struct sli4_rqst_cmn_set_dump_location {
3231 	struct sli4_rqst_hdr	hdr;
3232 	__le32			buffer_length_dword;
3233 	__le32			buf_addr_low;
3234 	__le32			buf_addr_high;
3235 };
3236 
3237 struct sli4_rsp_cmn_set_dump_location {
3238 	struct sli4_rsp_hdr	hdr;
3239 	__le32			buffer_length_dword;
3240 };
3241 
3242 enum sli4_dump_level {
3243 	SLI4_DUMP_LEVEL_NONE,
3244 	SLI4_CHIP_LEVEL_DUMP,
3245 	SLI4_FUNC_DESC_DUMP,
3246 };
3247 
3248 enum sli4_dump_state {
3249 	SLI4_DUMP_STATE_NONE,
3250 	SLI4_CHIP_DUMP_STATE_VALID,
3251 	SLI4_FUNC_DUMP_STATE_VALID,
3252 };
3253 
3254 enum sli4_dump_status {
3255 	SLI4_DUMP_READY_STATUS_NOT_READY,
3256 	SLI4_DUMP_READY_STATUS_DD_PRESENT,
3257 	SLI4_DUMP_READY_STATUS_FDB_PRESENT,
3258 	SLI4_DUMP_READY_STATUS_SKIP_DUMP,
3259 	SLI4_DUMP_READY_STATUS_FAILED = -1,
3260 };
3261 
3262 enum sli4_set_features {
3263 	SLI4_SET_FEATURES_DIF_SEED			= 0x01,
3264 	SLI4_SET_FEATURES_XRI_TIMER			= 0x03,
3265 	SLI4_SET_FEATURES_MAX_PCIE_SPEED		= 0x04,
3266 	SLI4_SET_FEATURES_FCTL_CHECK			= 0x05,
3267 	SLI4_SET_FEATURES_FEC				= 0x06,
3268 	SLI4_SET_FEATURES_PCIE_RECV_DETECT		= 0x07,
3269 	SLI4_SET_FEATURES_DIF_MEMORY_MODE		= 0x08,
3270 	SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE	= 0x09,
3271 	SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS		= 0x0a,
3272 	SLI4_SET_FEAT_CFG_AUTO_XFER_RDY_T10PI		= 0x0c,
3273 	SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE	= 0x0d,
3274 	SLI4_SET_FEATURES_SET_FTD_XFER_HINT		= 0x0f,
3275 	SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK		= 0x11,
3276 };
3277 
3278 struct sli4_rqst_cmn_set_features {
3279 	struct sli4_rqst_hdr	hdr;
3280 	__le32			feature;
3281 	__le32			param_len;
3282 	__le32			params[8];
3283 };
3284 
3285 struct sli4_rqst_cmn_set_features_dif_seed {
3286 	__le16		seed;
3287 	__le16		rsvd16;
3288 };
3289 
3290 enum sli4_rqst_set_mrq_features {
3291 	SLI4_RQ_MULTIRQ_ISR		 = 0x1,
3292 	SLI4_RQ_MULTIRQ_AUTOGEN_XFER_RDY = 0x2,
3293 
3294 	SLI4_RQ_MULTIRQ_NUM_RQS		 = 0xff,
3295 	SLI4_RQ_MULTIRQ_RQ_SELECT	 = 0xf00,
3296 };
3297 
3298 struct sli4_rqst_cmn_set_features_multirq {
3299 	__le32		auto_gen_xfer_dword;
3300 	__le32		num_rqs_dword;
3301 };
3302 
3303 enum sli4_rqst_health_check_flags {
3304 	SLI4_RQ_HEALTH_CHECK_ENABLE	= 0x1,
3305 	SLI4_RQ_HEALTH_CHECK_QUERY	= 0x2,
3306 };
3307 
3308 struct sli4_rqst_cmn_set_features_health_check {
3309 	__le32		health_check_dword;
3310 };
3311 
3312 struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {
3313 	__le32		fdt_xfer_hint;
3314 };
3315 
3316 struct sli4_rqst_dmtf_exec_clp_cmd {
3317 	struct sli4_rqst_hdr	hdr;
3318 	__le32			cmd_buf_length;
3319 	__le32			resp_buf_length;
3320 	__le32			cmd_buf_addr_low;
3321 	__le32			cmd_buf_addr_high;
3322 	__le32			resp_buf_addr_low;
3323 	__le32			resp_buf_addr_high;
3324 };
3325 
3326 struct sli4_rsp_dmtf_exec_clp_cmd {
3327 	struct sli4_rsp_hdr	hdr;
3328 	__le32			rsvd4;
3329 	__le32			resp_length;
3330 	__le32			rsvd6;
3331 	__le32			rsvd7;
3332 	__le32			rsvd8;
3333 	__le32			rsvd9;
3334 	__le32			clp_status;
3335 	__le32			clp_detailed_status;
3336 };
3337 
3338 #define SLI4_PROTOCOL_FC		0x10
3339 #define SLI4_PROTOCOL_DEFAULT		0xff
3340 
3341 struct sli4_rspource_descriptor_v1 {
3342 	u8		descriptor_type;
3343 	u8		descriptor_length;
3344 	__le16		rsvd16;
3345 	__le32		type_specific[];
3346 };
3347 
3348 enum sli4_pcie_desc_flags {
3349 	SLI4_PCIE_DESC_IMM		= 0x4000,
3350 	SLI4_PCIE_DESC_NOSV		= 0x8000,
3351 
3352 	SLI4_PCIE_DESC_PF_NO		= 0x3ff0000,
3353 
3354 	SLI4_PCIE_DESC_MISSN_ROLE	= 0xff,
3355 	SLI4_PCIE_DESC_PCHG		= 0x8000000,
3356 	SLI4_PCIE_DESC_SCHG		= 0x10000000,
3357 	SLI4_PCIE_DESC_XCHG		= 0x20000000,
3358 	SLI4_PCIE_DESC_XROM		= 0xc0000000
3359 };
3360 
3361 struct sli4_pcie_resource_descriptor_v1 {
3362 	u8		descriptor_type;
3363 	u8		descriptor_length;
3364 	__le16		imm_nosv_dword;
3365 	__le32		pf_number_dword;
3366 	__le32		rsvd3;
3367 	u8		sriov_state;
3368 	u8		pf_state;
3369 	u8		pf_type;
3370 	u8		rsvd4;
3371 	__le16		number_of_vfs;
3372 	__le16		rsvd5;
3373 	__le32		mission_roles_dword;
3374 	__le32		rsvd7[16];
3375 };
3376 
3377 struct sli4_rqst_cmn_get_function_config {
3378 	struct sli4_rqst_hdr  hdr;
3379 };
3380 
3381 struct sli4_rsp_cmn_get_function_config {
3382 	struct sli4_rsp_hdr	hdr;
3383 	__le32			desc_count;
3384 	__le32			desc[54];
3385 };
3386 
3387 /* Link Config Descriptor for link config functions */
3388 struct sli4_link_config_descriptor {
3389 	u8		link_config_id;
3390 	u8		rsvd1[3];
3391 	__le32		config_description[8];
3392 };
3393 
3394 #define MAX_LINK_DES	10
3395 
3396 struct sli4_rqst_cmn_get_reconfig_link_info {
3397 	struct sli4_rqst_hdr  hdr;
3398 };
3399 
3400 struct sli4_rsp_cmn_get_reconfig_link_info {
3401 	struct sli4_rsp_hdr	hdr;
3402 	u8			active_link_config_id;
3403 	u8			rsvd17;
3404 	u8			next_link_config_id;
3405 	u8			rsvd19;
3406 	__le32			link_configuration_descriptor_count;
3407 	struct sli4_link_config_descriptor
3408 				desc[MAX_LINK_DES];
3409 };
3410 
3411 enum sli4_set_reconfig_link_flags {
3412 	SLI4_SET_RECONFIG_LINKID_NEXT	= 0xff,
3413 	SLI4_SET_RECONFIG_LINKID_FD	= 1u << 31,
3414 };
3415 
3416 struct sli4_rqst_cmn_set_reconfig_link_id {
3417 	struct sli4_rqst_hdr  hdr;
3418 	__le32			dw4_flags;
3419 };
3420 
3421 struct sli4_rsp_cmn_set_reconfig_link_id {
3422 	struct sli4_rsp_hdr	hdr;
3423 };
3424 
3425 struct sli4_rqst_lowlevel_set_watchdog {
3426 	struct sli4_rqst_hdr	hdr;
3427 	__le16			watchdog_timeout;
3428 	__le16			rsvd18;
3429 };
3430 
3431 struct sli4_rsp_lowlevel_set_watchdog {
3432 	struct sli4_rsp_hdr	hdr;
3433 	__le32			rsvd;
3434 };
3435 
3436 /* FC opcode (OPC) values */
3437 enum sli4_fc_opcodes {
3438 	SLI4_OPC_WQ_CREATE		= 0x1,
3439 	SLI4_OPC_WQ_DESTROY		= 0x2,
3440 	SLI4_OPC_POST_SGL_PAGES		= 0x3,
3441 	SLI4_OPC_RQ_CREATE		= 0x5,
3442 	SLI4_OPC_RQ_DESTROY		= 0x6,
3443 	SLI4_OPC_READ_FCF_TABLE		= 0x8,
3444 	SLI4_OPC_POST_HDR_TEMPLATES	= 0xb,
3445 	SLI4_OPC_REDISCOVER_FCF		= 0x10,
3446 };
3447 
3448 /* Use the default CQ associated with the WQ */
3449 #define SLI4_CQ_DEFAULT 0xffff
3450 
3451 /*
3452  * POST_SGL_PAGES
3453  *
3454  * Register the scatter gather list (SGL) memory and
3455  * associate it with an XRI.
3456  */
3457 struct sli4_rqst_post_sgl_pages {
3458 	struct sli4_rqst_hdr	hdr;
3459 	__le16			xri_start;
3460 	__le16			xri_count;
3461 	struct {
3462 		__le32		page0_low;
3463 		__le32		page0_high;
3464 		__le32		page1_low;
3465 		__le32		page1_high;
3466 	} page_set[10];
3467 };
3468 
3469 struct sli4_rsp_post_sgl_pages {
3470 	struct sli4_rsp_hdr	hdr;
3471 };
3472 
3473 struct sli4_rqst_post_hdr_templates {
3474 	struct sli4_rqst_hdr	hdr;
3475 	__le16			rpi_offset;
3476 	__le16			page_count;
3477 	struct sli4_dmaaddr	page_descriptor[];
3478 };
3479 
3480 #define SLI4_HDR_TEMPLATE_SIZE		64
3481 
3482 enum sli4_io_flags {
3483 /* The XRI associated with this IO is already active */
3484 	SLI4_IO_CONTINUATION		= 1 << 0,
3485 /* Automatically generate a good RSP frame */
3486 	SLI4_IO_AUTO_GOOD_RESPONSE	= 1 << 1,
3487 	SLI4_IO_NO_ABORT		= 1 << 2,
3488 /* Set the DNRX bit because no auto xref rdy buffer is posted */
3489 	SLI4_IO_DNRX			= 1 << 3,
3490 };
3491 
3492 enum sli4_callback {
3493 	SLI4_CB_LINK,
3494 	SLI4_CB_MAX,
3495 };
3496 
3497 enum sli4_link_status {
3498 	SLI4_LINK_STATUS_UP,
3499 	SLI4_LINK_STATUS_DOWN,
3500 	SLI4_LINK_STATUS_NO_ALPA,
3501 	SLI4_LINK_STATUS_MAX,
3502 };
3503 
3504 enum sli4_link_topology {
3505 	SLI4_LINK_TOPO_NON_FC_AL = 1,
3506 	SLI4_LINK_TOPO_FC_AL,
3507 	SLI4_LINK_TOPO_LOOPBACK_INTERNAL,
3508 	SLI4_LINK_TOPO_LOOPBACK_EXTERNAL,
3509 	SLI4_LINK_TOPO_NONE,
3510 	SLI4_LINK_TOPO_MAX,
3511 };
3512 
3513 enum sli4_link_medium {
3514 	SLI4_LINK_MEDIUM_ETHERNET,
3515 	SLI4_LINK_MEDIUM_FC,
3516 	SLI4_LINK_MEDIUM_MAX,
3517 };
3518 /******Driver specific structures******/
3519 
3520 struct sli4_queue {
3521 	/* Common to all queue types */
3522 	struct efc_dma	dma;
3523 	spinlock_t	lock;		/* Lock to protect the doorbell register
3524 					 * writes and queue reads
3525 					 */
3526 	u32		index;		/* current host entry index */
3527 	u16		size;		/* entry size */
3528 	u16		length;		/* number of entries */
3529 	u16		n_posted;	/* number entries posted for CQ, EQ */
3530 	u16		id;		/* Port assigned xQ_ID */
3531 	u8		type;		/* queue type ie EQ, CQ, ... */
3532 	void __iomem    *db_regaddr;	/* register address for the doorbell */
3533 	u16		phase;		/* For if_type = 6, this value toggle
3534 					 * for each iteration of the queue,
3535 					 * a queue entry is valid when a cqe
3536 					 * valid bit matches this value
3537 					 */
3538 	u32		proc_limit;	/* limit CQE processed per iteration */
3539 	u32		posted_limit;	/* CQE/EQE process before ring db */
3540 	u32		max_num_processed;
3541 	u64		max_process_time;
3542 	union {
3543 		u32	r_idx;		/* "read" index (MQ only) */
3544 		u32	flag;
3545 	} u;
3546 };
3547 
3548 /* Parameters used to populate WQE*/
3549 struct sli_bls_params {
3550 	u32		s_id;
3551 	u32		d_id;
3552 	u16		ox_id;
3553 	u16		rx_id;
3554 	u32		rpi;
3555 	u32		vpi;
3556 	bool		rpi_registered;
3557 	u8		payload[12];
3558 	u16		xri;
3559 	u16		tag;
3560 };
3561 
3562 struct sli_els_params {
3563 	u32		s_id;
3564 	u32		d_id;
3565 	u16		ox_id;
3566 	u32		rpi;
3567 	u32		vpi;
3568 	bool		rpi_registered;
3569 	u32		xmit_len;
3570 	u32		rsp_len;
3571 	u8		timeout;
3572 	u8		cmd;
3573 	u16		xri;
3574 	u16		tag;
3575 };
3576 
3577 struct sli_ct_params {
3578 	u8		r_ctl;
3579 	u8		type;
3580 	u8		df_ctl;
3581 	u8		timeout;
3582 	u16		ox_id;
3583 	u32		d_id;
3584 	u32		rpi;
3585 	u32		vpi;
3586 	bool		rpi_registered;
3587 	u32		xmit_len;
3588 	u32		rsp_len;
3589 	u16		xri;
3590 	u16		tag;
3591 };
3592 
3593 struct sli_fcp_tgt_params {
3594 	u32		s_id;
3595 	u32		d_id;
3596 	u32		rpi;
3597 	u32		vpi;
3598 	u32		offset;
3599 	u16		ox_id;
3600 	u16		flags;
3601 	u8		cs_ctl;
3602 	u8		timeout;
3603 	u32		app_id;
3604 	u32		xmit_len;
3605 	u16		xri;
3606 	u16		tag;
3607 };
3608 
3609 struct sli4_link_event {
3610 	enum sli4_link_status	status;
3611 	enum sli4_link_topology	topology;
3612 	enum sli4_link_medium	medium;
3613 	u32			speed;
3614 	u8			*loop_map;
3615 	u32			fc_id;
3616 };
3617 
3618 enum sli4_resource {
3619 	SLI4_RSRC_VFI,
3620 	SLI4_RSRC_VPI,
3621 	SLI4_RSRC_RPI,
3622 	SLI4_RSRC_XRI,
3623 	SLI4_RSRC_FCFI,
3624 	SLI4_RSRC_MAX,
3625 };
3626 
3627 struct sli4_extent {
3628 	u32		number;
3629 	u32		size;
3630 	u32		n_alloc;
3631 	u32		*base;
3632 	unsigned long	*use_map;
3633 	u32		map_size;
3634 };
3635 
3636 struct sli4_queue_info {
3637 	u16	max_qcount[SLI4_QTYPE_MAX];
3638 	u32	max_qentries[SLI4_QTYPE_MAX];
3639 	u16	count_mask[SLI4_QTYPE_MAX];
3640 	u16	count_method[SLI4_QTYPE_MAX];
3641 	u32	qpage_count[SLI4_QTYPE_MAX];
3642 };
3643 
3644 struct sli4_params {
3645 	u8	has_extents;
3646 	u8	auto_reg;
3647 	u8	auto_xfer_rdy;
3648 	u8	hdr_template_req;
3649 	u8	perf_hint;
3650 	u8	perf_wq_id_association;
3651 	u8	cq_create_version;
3652 	u8	mq_create_version;
3653 	u8	high_login_mode;
3654 	u8	sgl_pre_registered;
3655 	u8	sgl_pre_reg_required;
3656 	u8	t10_dif_inline_capable;
3657 	u8	t10_dif_separate_capable;
3658 };
3659 
3660 struct sli4 {
3661 	void			*os;
3662 	struct pci_dev		*pci;
3663 	void __iomem		*reg[PCI_STD_NUM_BARS];
3664 
3665 	u32			sli_rev;
3666 	u32			sli_family;
3667 	u32			if_type;
3668 
3669 	u16			asic_type;
3670 	u16			asic_rev;
3671 
3672 	u16			e_d_tov;
3673 	u16			r_a_tov;
3674 	struct sli4_queue_info	qinfo;
3675 	u16			link_module_type;
3676 	u8			rq_batch;
3677 	u8			port_number;
3678 	char			port_name[2];
3679 	u16			rq_min_buf_size;
3680 	u32			rq_max_buf_size;
3681 	u8			topology;
3682 	u8			wwpn[8];
3683 	u8			wwnn[8];
3684 	u32			fw_rev[2];
3685 	u8			fw_name[2][16];
3686 	char			ipl_name[16];
3687 	u32			hw_rev[3];
3688 	char			modeldesc[64];
3689 	char			bios_version_string[32];
3690 	u32			wqe_size;
3691 	u32			vpd_length;
3692 	/*
3693 	 * Tracks the port resources using extents metaphor. For
3694 	 * devices that don't implement extents (i.e.
3695 	 * has_extents == FALSE), the code models each resource as
3696 	 * a single large extent.
3697 	 */
3698 	struct sli4_extent	ext[SLI4_RSRC_MAX];
3699 	u32			features;
3700 	struct sli4_params	params;
3701 	u32			sge_supported_length;
3702 	u32			sgl_page_sizes;
3703 	u32			max_sgl_pages;
3704 
3705 	/*
3706 	 * Callback functions
3707 	 */
3708 	int			(*link)(void *ctx, void *event);
3709 	void			*link_arg;
3710 
3711 	struct efc_dma		bmbx;
3712 
3713 	/* Save pointer to physical memory descriptor for non-embedded
3714 	 * SLI_CONFIG commands for BMBX dumping purposes
3715 	 */
3716 	struct efc_dma		*bmbx_non_emb_pmd;
3717 
3718 	struct efc_dma		vpd_data;
3719 };
3720 
3721 static inline void
3722 sli_cmd_fill_hdr(struct sli4_rqst_hdr *hdr, u8 opc, u8 sub, u32 ver, __le32 len)
3723 {
3724 	hdr->opcode = opc;
3725 	hdr->subsystem = sub;
3726 	hdr->dw3_version = cpu_to_le32(ver);
3727 	hdr->request_length = len;
3728 }
3729 
3730 /**
3731  * Get / set parameter functions
3732  */
3733 
3734 static inline u32
3735 sli_get_max_sge(struct sli4 *sli4)
3736 {
3737 	return sli4->sge_supported_length;
3738 }
3739 
3740 static inline u32
3741 sli_get_max_sgl(struct sli4 *sli4)
3742 {
3743 	if (sli4->sgl_page_sizes != 1) {
3744 		efc_log_err(sli4, "unsupported SGL page sizes %#x\n",
3745 			    sli4->sgl_page_sizes);
3746 		return 0;
3747 	}
3748 
3749 	return (sli4->max_sgl_pages * SLI_PAGE_SIZE) / sizeof(struct sli4_sge);
3750 }
3751 
3752 static inline enum sli4_link_medium
3753 sli_get_medium(struct sli4 *sli4)
3754 {
3755 	switch (sli4->topology) {
3756 	case SLI4_READ_CFG_TOPO_FC:
3757 	case SLI4_READ_CFG_TOPO_FC_AL:
3758 	case SLI4_READ_CFG_TOPO_NON_FC_AL:
3759 		return SLI4_LINK_MEDIUM_FC;
3760 	default:
3761 		return SLI4_LINK_MEDIUM_MAX;
3762 	}
3763 }
3764 
3765 static inline u32
3766 sli_get_lmt(struct sli4 *sli4)
3767 {
3768 	return sli4->link_module_type;
3769 }
3770 
3771 static inline int
3772 sli_set_topology(struct sli4 *sli4, u32 value)
3773 {
3774 	int	rc = 0;
3775 
3776 	switch (value) {
3777 	case SLI4_READ_CFG_TOPO_FC:
3778 	case SLI4_READ_CFG_TOPO_FC_AL:
3779 	case SLI4_READ_CFG_TOPO_NON_FC_AL:
3780 		sli4->topology = value;
3781 		break;
3782 	default:
3783 		efc_log_err(sli4, "unsupported topology %#x\n", value);
3784 		rc = -1;
3785 	}
3786 
3787 	return rc;
3788 }
3789 
3790 static inline u32
3791 sli_convert_mask_to_count(u32 method, u32 mask)
3792 {
3793 	u32 count = 0;
3794 
3795 	if (method) {
3796 		count = 1 << (31 - __builtin_clz(mask));
3797 		count *= 16;
3798 	} else {
3799 		count = mask;
3800 	}
3801 
3802 	return count;
3803 }
3804 
3805 static inline u32
3806 sli_reg_read_status(struct sli4 *sli)
3807 {
3808 	return readl(sli->reg[0] + SLI4_PORT_STATUS_REGOFF);
3809 }
3810 
3811 static inline int
3812 sli_fw_error_status(struct sli4 *sli4)
3813 {
3814 	return (sli_reg_read_status(sli4) & SLI4_PORT_STATUS_ERR) ? 1 : 0;
3815 }
3816 
3817 static inline u32
3818 sli_reg_read_err1(struct sli4 *sli)
3819 {
3820 	return readl(sli->reg[0] + SLI4_PORT_ERROR1);
3821 }
3822 
3823 static inline u32
3824 sli_reg_read_err2(struct sli4 *sli)
3825 {
3826 	return readl(sli->reg[0] + SLI4_PORT_ERROR2);
3827 }
3828 
3829 static inline int
3830 sli_fc_rqe_length(struct sli4 *sli4, void *cqe, u32 *len_hdr,
3831 		  u32 *len_data)
3832 {
3833 	struct sli4_fc_async_rcqe	*rcqe = cqe;
3834 
3835 	*len_hdr = *len_data = 0;
3836 
3837 	if (rcqe->status == SLI4_FC_ASYNC_RQ_SUCCESS) {
3838 		*len_hdr  = rcqe->hdpl_byte & SLI4_RACQE_HDPL;
3839 		*len_data = le16_to_cpu(rcqe->data_placement_length);
3840 		return 0;
3841 	} else {
3842 		return -1;
3843 	}
3844 }
3845 
3846 static inline u8
3847 sli_fc_rqe_fcfi(struct sli4 *sli4, void *cqe)
3848 {
3849 	u8 code = ((u8 *)cqe)[SLI4_CQE_CODE_OFFSET];
3850 	u8 fcfi = U8_MAX;
3851 
3852 	switch (code) {
3853 	case SLI4_CQE_CODE_RQ_ASYNC: {
3854 		struct sli4_fc_async_rcqe *rcqe = cqe;
3855 
3856 		fcfi = le16_to_cpu(rcqe->fcfi_rq_id_word) & SLI4_RACQE_FCFI;
3857 		break;
3858 	}
3859 	case SLI4_CQE_CODE_RQ_ASYNC_V1: {
3860 		struct sli4_fc_async_rcqe_v1 *rcqev1 = cqe;
3861 
3862 		fcfi = rcqev1->fcfi_byte & SLI4_RACQE_FCFI;
3863 		break;
3864 	}
3865 	case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: {
3866 		struct sli4_fc_optimized_write_cmd_cqe *opt_wr = cqe;
3867 
3868 		fcfi = opt_wr->flags0 & SLI4_OCQE_FCFI;
3869 		break;
3870 	}
3871 	}
3872 
3873 	return fcfi;
3874 }
3875 
3876 /****************************************************************************
3877  * Function prototypes
3878  */
3879 int
3880 sli_cmd_config_link(struct sli4 *sli4, void *buf);
3881 int
3882 sli_cmd_down_link(struct sli4 *sli4, void *buf);
3883 int
3884 sli_cmd_dump_type4(struct sli4 *sli4, void *buf, u16 wki);
3885 int
3886 sli_cmd_common_read_transceiver_data(struct sli4 *sli4, void *buf,
3887 				     u32 page_num, struct efc_dma *dma);
3888 int
3889 sli_cmd_read_link_stats(struct sli4 *sli4, void *buf, u8 req_stats,
3890 			u8 clear_overflow_flags, u8 clear_all_counters);
3891 int
3892 sli_cmd_read_status(struct sli4 *sli4, void *buf, u8 clear);
3893 int
3894 sli_cmd_init_link(struct sli4 *sli4, void *buf, u32 speed,
3895 		  u8 reset_alpa);
3896 int
3897 sli_cmd_init_vfi(struct sli4 *sli4, void *buf, u16 vfi, u16 fcfi,
3898 		 u16 vpi);
3899 int
3900 sli_cmd_init_vpi(struct sli4 *sli4, void *buf, u16 vpi, u16 vfi);
3901 int
3902 sli_cmd_post_xri(struct sli4 *sli4, void *buf, u16 base, u16 cnt);
3903 int
3904 sli_cmd_release_xri(struct sli4 *sli4, void *buf, u8 num_xri);
3905 int
3906 sli_cmd_read_sparm64(struct sli4 *sli4, void *buf,
3907 		     struct efc_dma *dma, u16 vpi);
3908 int
3909 sli_cmd_read_topology(struct sli4 *sli4, void *buf, struct efc_dma *dma);
3910 int
3911 sli_cmd_read_nvparms(struct sli4 *sli4, void *buf);
3912 int
3913 sli_cmd_write_nvparms(struct sli4 *sli4, void *buf, u8 *wwpn,
3914 		      u8 *wwnn, u8 hard_alpa, u32 preferred_d_id);
3915 int
3916 sli_cmd_reg_fcfi(struct sli4 *sli4, void *buf, u16 index,
3917 		 struct sli4_cmd_rq_cfg *rq_cfg);
3918 int
3919 sli_cmd_reg_fcfi_mrq(struct sli4 *sli4, void *buf, u8 mode, u16 index,
3920 		     u8 rq_selection_policy, u8 mrq_bit_mask, u16 num_mrqs,
3921 		     struct sli4_cmd_rq_cfg *rq_cfg);
3922 int
3923 sli_cmd_reg_rpi(struct sli4 *sli4, void *buf, u32 rpi, u32 vpi, u32 fc_id,
3924 		struct efc_dma *dma, u8 update, u8 enable_t10_pi);
3925 int
3926 sli_cmd_unreg_fcfi(struct sli4 *sli4, void *buf, u16 indicator);
3927 int
3928 sli_cmd_unreg_rpi(struct sli4 *sli4, void *buf, u16 indicator,
3929 		  enum sli4_resource which, u32 fc_id);
3930 int
3931 sli_cmd_reg_vpi(struct sli4 *sli4, void *buf, u32 fc_id,
3932 		__be64 sli_wwpn, u16 vpi, u16 vfi, bool update);
3933 int
3934 sli_cmd_reg_vfi(struct sli4 *sli4, void *buf, size_t size,
3935 		u16 vfi, u16 fcfi, struct efc_dma dma,
3936 		u16 vpi, __be64 sli_wwpn, u32 fc_id);
3937 int
3938 sli_cmd_unreg_vpi(struct sli4 *sli4, void *buf, u16 id, u32 type);
3939 int
3940 sli_cmd_unreg_vfi(struct sli4 *sli4, void *buf, u16 idx, u32 type);
3941 int
3942 sli_cmd_common_nop(struct sli4 *sli4, void *buf, uint64_t context);
3943 int
3944 sli_cmd_common_get_resource_extent_info(struct sli4 *sli4, void *buf,
3945 					u16 rtype);
3946 int
3947 sli_cmd_common_get_sli4_parameters(struct sli4 *sli4, void *buf);
3948 int
3949 sli_cmd_common_write_object(struct sli4 *sli4, void *buf, u16 noc,
3950 		u16 eof, u32 len, u32 offset, char *name, struct efc_dma *dma);
3951 int
3952 sli_cmd_common_delete_object(struct sli4 *sli4, void *buf, char *object_name);
3953 int
3954 sli_cmd_common_read_object(struct sli4 *sli4, void *buf,
3955 		u32 length, u32 offset, char *name, struct efc_dma *dma);
3956 int
3957 sli_cmd_dmtf_exec_clp_cmd(struct sli4 *sli4, void *buf,
3958 		struct efc_dma *cmd, struct efc_dma *resp);
3959 int
3960 sli_cmd_common_set_dump_location(struct sli4 *sli4, void *buf,
3961 		bool query, bool is_buffer_list, struct efc_dma *dma, u8 fdb);
3962 int
3963 sli_cmd_common_set_features(struct sli4 *sli4, void *buf,
3964 			    u32 feature, u32 param_len, void *parameter);
3965 
3966 int sli_cqe_mq(struct sli4 *sli4, void *buf);
3967 int sli_cqe_async(struct sli4 *sli4, void *buf);
3968 
3969 int
3970 sli_setup(struct sli4 *sli4, void *os, struct pci_dev *pdev, void __iomem *r[]);
3971 void sli_calc_max_qentries(struct sli4 *sli4);
3972 int sli_init(struct sli4 *sli4);
3973 int sli_reset(struct sli4 *sli4);
3974 int sli_fw_reset(struct sli4 *sli4);
3975 void sli_teardown(struct sli4 *sli4);
3976 int
3977 sli_callback(struct sli4 *sli4, enum sli4_callback cb, void *func, void *arg);
3978 int
3979 sli_bmbx_command(struct sli4 *sli4);
3980 int
3981 __sli_queue_init(struct sli4 *sli4, struct sli4_queue *q, u32 qtype,
3982 		 size_t size, u32 n_entries, u32 align);
3983 int
3984 __sli_create_queue(struct sli4 *sli4, struct sli4_queue *q);
3985 int
3986 sli_eq_modify_delay(struct sli4 *sli4, struct sli4_queue *eq, u32 num_eq,
3987 		    u32 shift, u32 delay_mult);
3988 int
3989 sli_queue_alloc(struct sli4 *sli4, u32 qtype, struct sli4_queue *q,
3990 		u32 n_entries, struct sli4_queue *assoc);
3991 int
3992 sli_cq_alloc_set(struct sli4 *sli4, struct sli4_queue *qs[], u32 num_cqs,
3993 		 u32 n_entries, struct sli4_queue *eqs[]);
3994 int
3995 sli_get_queue_entry_size(struct sli4 *sli4, u32 qtype);
3996 int
3997 sli_queue_free(struct sli4 *sli4, struct sli4_queue *q, u32 destroy_queues,
3998 	       u32 free_memory);
3999 int
4000 sli_queue_eq_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
4001 int
4002 sli_queue_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
4003 
4004 int
4005 sli_wq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4006 int
4007 sli_mq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4008 int
4009 sli_rq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4010 int
4011 sli_eq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4012 int
4013 sli_cq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4014 int
4015 sli_mq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4016 int
4017 sli_resource_alloc(struct sli4 *sli4, enum sli4_resource rtype, u32 *rid,
4018 		   u32 *index);
4019 int
4020 sli_resource_free(struct sli4 *sli4, enum sli4_resource rtype, u32 rid);
4021 int
4022 sli_resource_reset(struct sli4 *sli4, enum sli4_resource rtype);
4023 int
4024 sli_eq_parse(struct sli4 *sli4, u8 *buf, u16 *cq_id);
4025 int
4026 sli_cq_parse(struct sli4 *sli4, struct sli4_queue *cq, u8 *cqe,
4027 	     enum sli4_qentry *etype, u16 *q_id);
4028 
4029 int sli_raise_ue(struct sli4 *sli4, u8 dump);
4030 int sli_dump_is_ready(struct sli4 *sli4);
4031 bool sli_reset_required(struct sli4 *sli4);
4032 bool sli_fw_ready(struct sli4 *sli4);
4033 
4034 int
4035 sli_fc_process_link_attention(struct sli4 *sli4, void *acqe);
4036 int
4037 sli_fc_cqe_parse(struct sli4 *sli4, struct sli4_queue *cq,
4038 		 u8 *cqe, enum sli4_qentry *etype,
4039 		 u16 *rid);
4040 u32 sli_fc_response_length(struct sli4 *sli4, u8 *cqe);
4041 u32 sli_fc_io_length(struct sli4 *sli4, u8 *cqe);
4042 int sli_fc_els_did(struct sli4 *sli4, u8 *cqe, u32 *d_id);
4043 u32 sli_fc_ext_status(struct sli4 *sli4, u8 *cqe);
4044 int
4045 sli_fc_rqe_rqid_and_index(struct sli4 *sli4, u8 *cqe, u16 *rq_id, u32 *index);
4046 int
4047 sli_cmd_wq_create(struct sli4 *sli4, void *buf,
4048 		  struct efc_dma *qmem, u16 cq_id);
4049 int sli_cmd_post_sgl_pages(struct sli4 *sli4, void *buf, u16 xri,
4050 		u32 xri_count, struct efc_dma *page0[], struct efc_dma *page1[],
4051 		struct efc_dma *dma);
4052 int
4053 sli_cmd_post_hdr_templates(struct sli4 *sli4, void *buf,
4054 		struct efc_dma *dma, u16 rpi, struct efc_dma *payload_dma);
4055 int
4056 sli_fc_rq_alloc(struct sli4 *sli4, struct sli4_queue *q, u32 n_entries,
4057 		u32 buffer_size, struct sli4_queue *cq, bool is_hdr);
4058 int
4059 sli_fc_rq_set_alloc(struct sli4 *sli4, u32 num_rq_pairs, struct sli4_queue *q[],
4060 		u32 base_cq_id, u32 num, u32 hdr_buf_size, u32 data_buf_size);
4061 u32 sli_fc_get_rpi_requirements(struct sli4 *sli4, u32 n_rpi);
4062 int
4063 sli_abort_wqe(struct sli4 *sli4, void *buf, enum sli4_abort_type type,
4064 	      bool send_abts, u32 ids, u32 mask, u16 tag, u16 cq_id);
4065 
4066 int
4067 sli_send_frame_wqe(struct sli4 *sli4, void *buf, u8 sof, u8 eof,
4068 		   u32 *hdr, struct efc_dma *payload, u32 req_len, u8 timeout,
4069 		   u16 xri, u16 req_tag);
4070 
4071 int
4072 sli_xmit_els_rsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *rsp,
4073 		       struct sli_els_params *params);
4074 
4075 int
4076 sli_els_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4077 		      struct sli_els_params *params);
4078 
4079 int
4080 sli_fcp_icmnd64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl, u16 xri,
4081 		    u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 timeout);
4082 
4083 int
4084 sli_fcp_iread64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4085 		    u32 first_data_sge, u32 xfer_len, u16 xri,
4086 		    u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 dif, u8 bs,
4087 		    u8 timeout);
4088 
4089 int
4090 sli_fcp_iwrite64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4091 		     u32 first_data_sge, u32 xfer_len,
4092 		     u32 first_burst, u16 xri, u16 tag, u16 cq_id, u32 rpi,
4093 		     u32 rnode_fcid, u8 dif, u8 bs, u8 timeout);
4094 
4095 int
4096 sli_fcp_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
4097 		       u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
4098 		       struct sli_fcp_tgt_params *params);
4099 int
4100 sli_fcp_cont_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
4101 			    u32 first_data_sge, u16 sec_xri, u16 cq_id, u8 dif,
4102 			    u8 bs, struct sli_fcp_tgt_params *params);
4103 
4104 int
4105 sli_fcp_trsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4106 		   u16 cq_id, u8 port_owned, struct sli_fcp_tgt_params *params);
4107 
4108 int
4109 sli_fcp_tsend64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4110 		    u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
4111 		    struct sli_fcp_tgt_params *params);
4112 int
4113 sli_gen_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4114 		      struct sli_ct_params *params);
4115 
4116 int
4117 sli_xmit_bls_rsp64_wqe(struct sli4 *sli4, void *buf,
4118 		struct sli_bls_payload *payload, struct sli_bls_params *params);
4119 
4120 int
4121 sli_xmit_sequence64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *payload,
4122 			struct sli_ct_params *params);
4123 
4124 int
4125 sli_requeue_xri_wqe(struct sli4 *sli4, void *buf, u16 xri, u16 tag, u16 cq_id);
4126 void
4127 sli4_cmd_lowlevel_set_watchdog(struct sli4 *sli4, void *buf, size_t size,
4128 			       u16 timeout);
4129 
4130 const char *sli_fc_get_status_string(u32 status);
4131 
4132 #endif /* !_SLI4_H */
4133