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