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
27enum 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
53enum 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
61enum 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
75struct sli4_asic_entry_t {
76	u32 rev_id;
77	u32 family;
78};
79
80/* BMBX - Bootstrap Mailbox Register */
81#define SLI4_BMBX_REG		0x0160
82enum 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
90static inline u32
91sli_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
100static inline u32
101sli_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
112enum 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
124enum 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
144static inline u32
145sli_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
156static inline u32
157sli_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
170enum 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
177static inline u32
178sli_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
190enum 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
197static inline u32
198sli_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
211enum sli4_mq_e {
212	SLI4_MQ_ID_MASK		= 0xffff,
213
214	SLI4_MQ_NUM_SHIFT	= 16,
215	SLI4_MQ_NUM_MASK	= 0x3fff0000,
216};
217
218static inline u32
219sli_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
231enum 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
238static inline u32
239sli_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
251enum 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
261static inline u32
262sli_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
273enum 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 */
287enum 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
303struct sli4_reg {
304	u32	rset;
305	u32	off;
306};
307
308struct 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 */
317struct sli4_bufptr {
318	struct sli4_dmaaddr addr;
319	__le32 length;
320};
321
322/* Buffer Descriptor Entry (BDE) */
323enum sli4_bde_e {
324	SLI4_BDE_LEN_MASK	= 0x00ffffff,
325	SLI4_BDE_TYPE_MASK	= 0xff000000,
326};
327
328struct 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 */
341enum 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
354enum 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
374struct 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) */
382struct 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 */
390enum 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 */
417enum 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
434struct 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
446struct sli4_lsp_sge {
447	__le32		buffer_address_high;
448	__le32		buffer_address_low;
449	__le32		dw2_flags;
450	__le32		dw3_seglen;
451};
452
453enum sli4_eqe_e {
454	SLI4_EQE_VALID	= 1,
455	SLI4_EQE_MJCODE	= 0xe,
456	SLI4_EQE_MNCODE	= 0xfff0,
457};
458
459struct 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
470enum 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
480struct 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
488enum 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
493struct sli4_acqe {
494	__le32		event_data[3];
495	u8		rsvd12;
496	u8		event_code;
497	u8		event_type;
498	u8		ae_val;
499};
500
501enum 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
513enum 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
526enum 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
538enum 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 */
545enum sli4_cmd_version {
546	CMD_V0,
547	CMD_V1,
548	CMD_V2,
549};
550
551struct 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 */
561struct 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
589enum 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
601struct 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
615enum 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
628struct 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 */
641enum 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 */
656struct 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
666struct 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 */
673struct sli4_rqst_cmn_destroy_q {
674	struct sli4_rqst_hdr	hdr;
675	__le16	q_id;
676	__le16	rsvd;
677};
678
679struct sli4_rsp_cmn_destroy_q {
680	struct sli4_rsp_hdr	hdr;
681};
682
683/* Modify the delay multiplier for EQs */
684struct sli4_eqdelay_rec {
685	__le32  eq_id;
686	__le32  phase;
687	__le32  delay_multiplier;
688};
689
690struct 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
696struct sli4_rsp_cmn_modify_eq_delay {
697	struct sli4_rsp_hdr	hdr;
698};
699
700enum 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
714struct 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
725struct sli4_rsp_cmn_create_eq {
726	struct sli4_rsp_cmn_create_queue q_rsp;
727};
728
729/* EQ count */
730enum 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. */
745enum 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
757struct 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
770struct sli4_rsp_cmn_create_mq_ext {
771	struct sli4_rsp_cmn_create_queue q_rsp;
772};
773
774enum 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
781enum 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. */
797struct 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
808enum 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
830struct 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
845struct sli4_rsp_rq_create {
846	struct sli4_rsp_cmn_create_queue rsp;
847};
848
849enum 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
856struct 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
871struct sli4_rsp_rq_create_v1 {
872	struct sli4_rsp_cmn_create_queue rsp;
873};
874
875#define	SLI4_RQCREATEV2_DNB	0x80
876
877struct 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
893struct sli4_rsp_rq_create_v2 {
894	struct sli4_rsp_cmn_create_queue rsp;
895};
896
897#define SLI4_CQE_CODE_OFFSET	14
898
899enum 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
916struct 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
927struct sli4_rsp_wq_create {
928	struct sli4_rsp_cmn_create_queue rsp;
929};
930
931enum 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
942struct 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
957enum sli4_link_event_type {
958	SLI4_EVENT_LINK_ATTENTION		= 0x01,
959	SLI4_EVENT_SHARED_LINK_ATTENTION	= 0x02,
960};
961
962enum sli4_wcqe_flags {
963	SLI4_WCQE_XB = 0x10,
964	SLI4_WCQE_QX = 0x80,
965};
966
967struct 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 */
980struct 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. */
991enum 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 */
1028enum 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 */
1038enum 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 */
1046enum 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 */
1067enum 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 */
1093enum 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
1113struct 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. */
1133enum 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
1154struct 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
1180enum 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
1187enum 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. */
1195enum 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
1214struct 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. */
1240enum 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
1257struct 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. */
1286enum 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
1303struct 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. */
1339enum 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
1357struct 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
1383struct sli4_fcp_128byte_wqe {
1384	u32 dw[32];
1385};
1386
1387/* WQE used to create an FCP target receive */
1388enum 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
1406struct 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 */
1436enum 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
1449struct 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). */
1477enum 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
1495struct 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. */
1521enum 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
1530struct 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 */
1561enum 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
1572struct 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 */
1597enum 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
1613struct 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 */
1646enum sli4_requeue_wqe_flags {
1647	SLI4_REQU_XRI_WQE_XC	= 0x20,
1648	SLI4_REQU_XRI_WQE_QOSD	= 0x2,
1649};
1650
1651struct 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 */
1681enum 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
1689struct 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
1722enum sli_bls_type {
1723	SLI4_SLI_BLS_ACC,
1724	SLI4_SLI_BLS_RJT,
1725	SLI4_SLI_BLS_MAX
1726};
1727
1728struct 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
1754enum 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
1767struct 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 */
1796enum 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
1859enum 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
1866struct 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
1879struct 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
1894enum 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
1904struct 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
1919enum 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
1927struct 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
1943struct 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
1954struct 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
1966enum 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
1979enum 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
1987enum 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
2001static inline u32
2002sli_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
2014struct sli4_mbox_command_header {
2015	u8	resvd0;
2016	u8	command;
2017	__le16	status;	/* Port writes to indicate success/fail */
2018};
2019
2020enum 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
2052enum 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 */
2061enum sli4_cmd_config_link_flags {
2062	SLI4_CFG_LINK_BBSCN = 0xf00,
2063	SLI4_CFG_LINK_CSCN  = 0x1000,
2064};
2065
2066struct 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
2089struct 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 */
2100enum 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
2118enum 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
2148struct 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 */
2156enum 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
2168struct 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 */
2179struct 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 */
2186enum 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
2194struct 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 */
2201enum sli4_release_xri_flags {
2202	SLI4_RELEASE_XRI_REL_XRI_CNT	= 0x1f,
2203	SLI4_RELEASE_XRI_COUNT		= 0x1f,
2204};
2205
2206struct 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 */
2218struct sli4_cmd_read_config {
2219	struct sli4_mbox_command_header	hdr;
2220};
2221
2222enum sli4_read_cfg_resp_flags {
2223	SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000,	/* DW1 */
2224	SLI4_READ_CFG_RESP_TOPOLOGY	= 0xff000000,	/* DW2 */
2225};
2226
2227enum 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 */
2234enum 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
2245struct 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 */
2279enum sli4_read_nvparms_flags {
2280	SLI4_READ_NVPARAMS_HARD_ALPA	  = 0xff,
2281	SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,
2282};
2283
2284struct 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 */
2296struct 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 */
2308enum {
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
2317struct 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
2345struct 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 */
2359enum 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
2384struct 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
2407enum 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
2413enum sli4_read_topo {
2414	SLI4_READ_TOPO_UNKNOWN		= 0x0,
2415	SLI4_READ_TOPO_NON_FC_AL,
2416	SLI4_READ_TOPO_FC_AL,
2417};
2418
2419enum 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 */
2433struct 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
2440enum 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
2446struct 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
2464enum 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
2474struct 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
2488struct 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 */
2497enum 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
2505struct 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 */
2518enum 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
2525struct 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 */
2539enum sli4_reg_vpi {
2540	SLI4_REGVPI_LOCAL_N_PORTID	= 0xffffff,
2541	SLI4_REGVPI_UPD			= 0x1000000,
2542};
2543
2544struct 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 */
2555enum 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
2577struct 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 */
2590enum 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
2600struct 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
2614struct 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 */
2635enum 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
2662struct 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 */
2688static inline void
2689sli_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 */
2702struct 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 */
2710enum 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
2722struct 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 */
2730enum 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
2737struct sli4_cmd_unreg_vfi {
2738	struct sli4_mbox_command_header	hdr;
2739	__le32		rsvd0;
2740	__le16		index;
2741	__le16		dw2_flags;
2742};
2743
2744enum 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 */
2752enum 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
2760struct 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 */
2768struct 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
2776struct 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 */
2792enum 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 */
2804enum 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 */
2851struct sli4_rqst_cmn_function_reset {
2852	struct sli4_rqst_hdr	hdr;
2853};
2854
2855struct 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 */
2864enum sli4_cntrl_attr_flags {
2865	SLI4_CNTL_ATTR_PORTNUM	= 0x3f,
2866	SLI4_CNTL_ATTR_PORTTYPE	= 0xc0,
2867};
2868
2869struct 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 */
2927struct sli4_rqst_cmn_get_cntl_addl_attributes {
2928	struct sli4_rqst_hdr	hdr;
2929};
2930
2931struct 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 */
2967struct sli4_rqst_cmn_nop {
2968	struct sli4_rqst_hdr	hdr;
2969	__le32			context[2];
2970};
2971
2972struct sli4_rsp_cmn_nop {
2973	struct sli4_rsp_hdr	hdr;
2974	__le32			context[2];
2975};
2976
2977struct sli4_rqst_cmn_get_resource_extent_info {
2978	struct sli4_rqst_hdr	hdr;
2979	__le16	resource_type;
2980	__le16	rsvd16;
2981};
2982
2983enum 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
2990struct 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
3003enum 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
3075struct sli4_rqst_cmn_get_sli4_params {
3076	struct sli4_rqst_hdr	hdr;
3077};
3078
3079struct 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*/
3118enum sli4_port_types {
3119	SLI4_PORT_TYPE_ETH	= 0,
3120	SLI4_PORT_TYPE_FC	= 1,
3121};
3122
3123struct sli4_rqst_cmn_get_port_name {
3124	struct sli4_rqst_hdr	hdr;
3125	u8	port_type;
3126	u8	rsvd4[3];
3127};
3128
3129struct sli4_rsp_cmn_get_port_name {
3130	struct sli4_rsp_hdr	hdr;
3131	char	port_name[4];
3132};
3133
3134struct 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 */
3149struct sli4_rqst_cmn_read_transceiver_data {
3150	struct sli4_rqst_hdr	hdr;
3151	__le32			page_number;
3152	__le32			port;
3153};
3154
3155struct 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
3165struct 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
3176struct sli4_rsp_cmn_read_object {
3177	struct sli4_rsp_hdr	hdr;
3178	__le32			actual_read_length;
3179	__le32			eof_dword;
3180};
3181
3182enum 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
3188struct 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
3199struct sli4_rsp_cmn_write_object {
3200	struct sli4_rsp_hdr	hdr;
3201	__le32			actual_write_length;
3202	__le32			change_status_dword;
3203};
3204
3205struct 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
3214struct 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
3223enum 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
3230struct 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
3237struct sli4_rsp_cmn_set_dump_location {
3238	struct sli4_rsp_hdr	hdr;
3239	__le32			buffer_length_dword;
3240};
3241
3242enum sli4_dump_level {
3243	SLI4_DUMP_LEVEL_NONE,
3244	SLI4_CHIP_LEVEL_DUMP,
3245	SLI4_FUNC_DESC_DUMP,
3246};
3247
3248enum sli4_dump_state {
3249	SLI4_DUMP_STATE_NONE,
3250	SLI4_CHIP_DUMP_STATE_VALID,
3251	SLI4_FUNC_DUMP_STATE_VALID,
3252};
3253
3254enum 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
3262enum 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
3278struct sli4_rqst_cmn_set_features {
3279	struct sli4_rqst_hdr	hdr;
3280	__le32			feature;
3281	__le32			param_len;
3282	__le32			params[8];
3283};
3284
3285struct sli4_rqst_cmn_set_features_dif_seed {
3286	__le16		seed;
3287	__le16		rsvd16;
3288};
3289
3290enum 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
3298struct sli4_rqst_cmn_set_features_multirq {
3299	__le32		auto_gen_xfer_dword;
3300	__le32		num_rqs_dword;
3301};
3302
3303enum sli4_rqst_health_check_flags {
3304	SLI4_RQ_HEALTH_CHECK_ENABLE	= 0x1,
3305	SLI4_RQ_HEALTH_CHECK_QUERY	= 0x2,
3306};
3307
3308struct sli4_rqst_cmn_set_features_health_check {
3309	__le32		health_check_dword;
3310};
3311
3312struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {
3313	__le32		fdt_xfer_hint;
3314};
3315
3316struct 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
3326struct 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
3341struct sli4_rspource_descriptor_v1 {
3342	u8		descriptor_type;
3343	u8		descriptor_length;
3344	__le16		rsvd16;
3345	__le32		type_specific[];
3346};
3347
3348enum 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
3361struct 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
3377struct sli4_rqst_cmn_get_function_config {
3378	struct sli4_rqst_hdr  hdr;
3379};
3380
3381struct 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 */
3388struct 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
3396struct sli4_rqst_cmn_get_reconfig_link_info {
3397	struct sli4_rqst_hdr  hdr;
3398};
3399
3400struct 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
3411enum sli4_set_reconfig_link_flags {
3412	SLI4_SET_RECONFIG_LINKID_NEXT	= 0xff,
3413	SLI4_SET_RECONFIG_LINKID_FD	= 1u << 31,
3414};
3415
3416struct sli4_rqst_cmn_set_reconfig_link_id {
3417	struct sli4_rqst_hdr  hdr;
3418	__le32			dw4_flags;
3419};
3420
3421struct sli4_rsp_cmn_set_reconfig_link_id {
3422	struct sli4_rsp_hdr	hdr;
3423};
3424
3425struct sli4_rqst_lowlevel_set_watchdog {
3426	struct sli4_rqst_hdr	hdr;
3427	__le16			watchdog_timeout;
3428	__le16			rsvd18;
3429};
3430
3431struct sli4_rsp_lowlevel_set_watchdog {
3432	struct sli4_rsp_hdr	hdr;
3433	__le32			rsvd;
3434};
3435
3436/* FC opcode (OPC) values */
3437enum 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 */
3457struct 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
3469struct sli4_rsp_post_sgl_pages {
3470	struct sli4_rsp_hdr	hdr;
3471};
3472
3473struct 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
3482enum 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
3492enum sli4_callback {
3493	SLI4_CB_LINK,
3494	SLI4_CB_MAX,
3495};
3496
3497enum 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
3504enum 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
3513enum sli4_link_medium {
3514	SLI4_LINK_MEDIUM_ETHERNET,
3515	SLI4_LINK_MEDIUM_FC,
3516	SLI4_LINK_MEDIUM_MAX,
3517};
3518/******Driver specific structures******/
3519
3520struct 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*/
3549struct 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
3562struct 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
3577struct 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
3593struct 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
3609struct 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
3618enum 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
3627struct 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
3636struct 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
3644struct 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
3660struct 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
3721static inline void
3722sli_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
3734static inline u32
3735sli_get_max_sge(struct sli4 *sli4)
3736{
3737	return sli4->sge_supported_length;
3738}
3739
3740static inline u32
3741sli_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
3752static inline enum sli4_link_medium
3753sli_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
3765static inline u32
3766sli_get_lmt(struct sli4 *sli4)
3767{
3768	return sli4->link_module_type;
3769}
3770
3771static inline int
3772sli_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
3790static inline u32
3791sli_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
3805static inline u32
3806sli_reg_read_status(struct sli4 *sli)
3807{
3808	return readl(sli->reg[0] + SLI4_PORT_STATUS_REGOFF);
3809}
3810
3811static inline int
3812sli_fw_error_status(struct sli4 *sli4)
3813{
3814	return (sli_reg_read_status(sli4) & SLI4_PORT_STATUS_ERR) ? 1 : 0;
3815}
3816
3817static inline u32
3818sli_reg_read_err1(struct sli4 *sli)
3819{
3820	return readl(sli->reg[0] + SLI4_PORT_ERROR1);
3821}
3822
3823static inline u32
3824sli_reg_read_err2(struct sli4 *sli)
3825{
3826	return readl(sli->reg[0] + SLI4_PORT_ERROR2);
3827}
3828
3829static inline int
3830sli_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
3846static inline u8
3847sli_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 */
3879int
3880sli_cmd_config_link(struct sli4 *sli4, void *buf);
3881int
3882sli_cmd_down_link(struct sli4 *sli4, void *buf);
3883int
3884sli_cmd_dump_type4(struct sli4 *sli4, void *buf, u16 wki);
3885int
3886sli_cmd_common_read_transceiver_data(struct sli4 *sli4, void *buf,
3887				     u32 page_num, struct efc_dma *dma);
3888int
3889sli_cmd_read_link_stats(struct sli4 *sli4, void *buf, u8 req_stats,
3890			u8 clear_overflow_flags, u8 clear_all_counters);
3891int
3892sli_cmd_read_status(struct sli4 *sli4, void *buf, u8 clear);
3893int
3894sli_cmd_init_link(struct sli4 *sli4, void *buf, u32 speed,
3895		  u8 reset_alpa);
3896int
3897sli_cmd_init_vfi(struct sli4 *sli4, void *buf, u16 vfi, u16 fcfi,
3898		 u16 vpi);
3899int
3900sli_cmd_init_vpi(struct sli4 *sli4, void *buf, u16 vpi, u16 vfi);
3901int
3902sli_cmd_post_xri(struct sli4 *sli4, void *buf, u16 base, u16 cnt);
3903int
3904sli_cmd_release_xri(struct sli4 *sli4, void *buf, u8 num_xri);
3905int
3906sli_cmd_read_sparm64(struct sli4 *sli4, void *buf,
3907		     struct efc_dma *dma, u16 vpi);
3908int
3909sli_cmd_read_topology(struct sli4 *sli4, void *buf, struct efc_dma *dma);
3910int
3911sli_cmd_read_nvparms(struct sli4 *sli4, void *buf);
3912int
3913sli_cmd_write_nvparms(struct sli4 *sli4, void *buf, u8 *wwpn,
3914		      u8 *wwnn, u8 hard_alpa, u32 preferred_d_id);
3915int
3916sli_cmd_reg_fcfi(struct sli4 *sli4, void *buf, u16 index,
3917		 struct sli4_cmd_rq_cfg *rq_cfg);
3918int
3919sli_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);
3922int
3923sli_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);
3925int
3926sli_cmd_unreg_fcfi(struct sli4 *sli4, void *buf, u16 indicator);
3927int
3928sli_cmd_unreg_rpi(struct sli4 *sli4, void *buf, u16 indicator,
3929		  enum sli4_resource which, u32 fc_id);
3930int
3931sli_cmd_reg_vpi(struct sli4 *sli4, void *buf, u32 fc_id,
3932		__be64 sli_wwpn, u16 vpi, u16 vfi, bool update);
3933int
3934sli_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);
3937int
3938sli_cmd_unreg_vpi(struct sli4 *sli4, void *buf, u16 id, u32 type);
3939int
3940sli_cmd_unreg_vfi(struct sli4 *sli4, void *buf, u16 idx, u32 type);
3941int
3942sli_cmd_common_nop(struct sli4 *sli4, void *buf, uint64_t context);
3943int
3944sli_cmd_common_get_resource_extent_info(struct sli4 *sli4, void *buf,
3945					u16 rtype);
3946int
3947sli_cmd_common_get_sli4_parameters(struct sli4 *sli4, void *buf);
3948int
3949sli_cmd_common_write_object(struct sli4 *sli4, void *buf, u16 noc,
3950		u16 eof, u32 len, u32 offset, char *name, struct efc_dma *dma);
3951int
3952sli_cmd_common_delete_object(struct sli4 *sli4, void *buf, char *object_name);
3953int
3954sli_cmd_common_read_object(struct sli4 *sli4, void *buf,
3955		u32 length, u32 offset, char *name, struct efc_dma *dma);
3956int
3957sli_cmd_dmtf_exec_clp_cmd(struct sli4 *sli4, void *buf,
3958		struct efc_dma *cmd, struct efc_dma *resp);
3959int
3960sli_cmd_common_set_dump_location(struct sli4 *sli4, void *buf,
3961		bool query, bool is_buffer_list, struct efc_dma *dma, u8 fdb);
3962int
3963sli_cmd_common_set_features(struct sli4 *sli4, void *buf,
3964			    u32 feature, u32 param_len, void *parameter);
3965
3966int sli_cqe_mq(struct sli4 *sli4, void *buf);
3967int sli_cqe_async(struct sli4 *sli4, void *buf);
3968
3969int
3970sli_setup(struct sli4 *sli4, void *os, struct pci_dev *pdev, void __iomem *r[]);
3971void sli_calc_max_qentries(struct sli4 *sli4);
3972int sli_init(struct sli4 *sli4);
3973int sli_reset(struct sli4 *sli4);
3974int sli_fw_reset(struct sli4 *sli4);
3975void sli_teardown(struct sli4 *sli4);
3976int
3977sli_callback(struct sli4 *sli4, enum sli4_callback cb, void *func, void *arg);
3978int
3979sli_bmbx_command(struct sli4 *sli4);
3980int
3981__sli_queue_init(struct sli4 *sli4, struct sli4_queue *q, u32 qtype,
3982		 size_t size, u32 n_entries, u32 align);
3983int
3984__sli_create_queue(struct sli4 *sli4, struct sli4_queue *q);
3985int
3986sli_eq_modify_delay(struct sli4 *sli4, struct sli4_queue *eq, u32 num_eq,
3987		    u32 shift, u32 delay_mult);
3988int
3989sli_queue_alloc(struct sli4 *sli4, u32 qtype, struct sli4_queue *q,
3990		u32 n_entries, struct sli4_queue *assoc);
3991int
3992sli_cq_alloc_set(struct sli4 *sli4, struct sli4_queue *qs[], u32 num_cqs,
3993		 u32 n_entries, struct sli4_queue *eqs[]);
3994int
3995sli_get_queue_entry_size(struct sli4 *sli4, u32 qtype);
3996int
3997sli_queue_free(struct sli4 *sli4, struct sli4_queue *q, u32 destroy_queues,
3998	       u32 free_memory);
3999int
4000sli_queue_eq_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
4001int
4002sli_queue_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
4003
4004int
4005sli_wq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4006int
4007sli_mq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4008int
4009sli_rq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4010int
4011sli_eq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4012int
4013sli_cq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4014int
4015sli_mq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
4016int
4017sli_resource_alloc(struct sli4 *sli4, enum sli4_resource rtype, u32 *rid,
4018		   u32 *index);
4019int
4020sli_resource_free(struct sli4 *sli4, enum sli4_resource rtype, u32 rid);
4021int
4022sli_resource_reset(struct sli4 *sli4, enum sli4_resource rtype);
4023int
4024sli_eq_parse(struct sli4 *sli4, u8 *buf, u16 *cq_id);
4025int
4026sli_cq_parse(struct sli4 *sli4, struct sli4_queue *cq, u8 *cqe,
4027	     enum sli4_qentry *etype, u16 *q_id);
4028
4029int sli_raise_ue(struct sli4 *sli4, u8 dump);
4030int sli_dump_is_ready(struct sli4 *sli4);
4031bool sli_reset_required(struct sli4 *sli4);
4032bool sli_fw_ready(struct sli4 *sli4);
4033
4034int
4035sli_fc_process_link_attention(struct sli4 *sli4, void *acqe);
4036int
4037sli_fc_cqe_parse(struct sli4 *sli4, struct sli4_queue *cq,
4038		 u8 *cqe, enum sli4_qentry *etype,
4039		 u16 *rid);
4040u32 sli_fc_response_length(struct sli4 *sli4, u8 *cqe);
4041u32 sli_fc_io_length(struct sli4 *sli4, u8 *cqe);
4042int sli_fc_els_did(struct sli4 *sli4, u8 *cqe, u32 *d_id);
4043u32 sli_fc_ext_status(struct sli4 *sli4, u8 *cqe);
4044int
4045sli_fc_rqe_rqid_and_index(struct sli4 *sli4, u8 *cqe, u16 *rq_id, u32 *index);
4046int
4047sli_cmd_wq_create(struct sli4 *sli4, void *buf,
4048		  struct efc_dma *qmem, u16 cq_id);
4049int 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);
4052int
4053sli_cmd_post_hdr_templates(struct sli4 *sli4, void *buf,
4054		struct efc_dma *dma, u16 rpi, struct efc_dma *payload_dma);
4055int
4056sli_fc_rq_alloc(struct sli4 *sli4, struct sli4_queue *q, u32 n_entries,
4057		u32 buffer_size, struct sli4_queue *cq, bool is_hdr);
4058int
4059sli_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);
4061u32 sli_fc_get_rpi_requirements(struct sli4 *sli4, u32 n_rpi);
4062int
4063sli_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
4066int
4067sli_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
4071int
4072sli_xmit_els_rsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *rsp,
4073		       struct sli_els_params *params);
4074
4075int
4076sli_els_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4077		      struct sli_els_params *params);
4078
4079int
4080sli_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
4083int
4084sli_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
4089int
4090sli_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
4095int
4096sli_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);
4099int
4100sli_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
4104int
4105sli_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
4108int
4109sli_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);
4112int
4113sli_gen_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
4114		      struct sli_ct_params *params);
4115
4116int
4117sli_xmit_bls_rsp64_wqe(struct sli4 *sli4, void *buf,
4118		struct sli_bls_payload *payload, struct sli_bls_params *params);
4119
4120int
4121sli_xmit_sequence64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *payload,
4122			struct sli_ct_params *params);
4123
4124int
4125sli_requeue_xri_wqe(struct sli4 *sli4, void *buf, u16 xri, u16 tag, u16 cq_id);
4126void
4127sli4_cmd_lowlevel_set_watchdog(struct sli4 *sli4, void *buf, size_t size,
4128			       u16 timeout);
4129
4130const char *sli_fc_get_status_string(u32 status);
4131
4132#endif /* !_SLI4_H */
4133