Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
0004  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
0005  *
0006  */
0007 
0008 /*
0009  * All common SLI-4 structures and function prototypes.
0010  */
0011 
0012 #ifndef _SLI4_H
0013 #define _SLI4_H
0014 
0015 #include <linux/pci.h>
0016 #include <linux/delay.h>
0017 #include "scsi/fc/fc_els.h"
0018 #include "scsi/fc/fc_fs.h"
0019 #include "../include/efc_common.h"
0020 
0021 /*************************************************************************
0022  * Common SLI-4 register offsets and field definitions
0023  */
0024 
0025 /* SLI_INTF - SLI Interface Definition Register */
0026 #define SLI4_INTF_REG           0x0058
0027 enum sli4_intf {
0028     SLI4_INTF_REV_SHIFT     = 4,
0029     SLI4_INTF_REV_MASK      = 0xf0,
0030 
0031     SLI4_INTF_REV_S3        = 0x30,
0032     SLI4_INTF_REV_S4        = 0x40,
0033 
0034     SLI4_INTF_FAMILY_SHIFT      = 8,
0035     SLI4_INTF_FAMILY_MASK       = 0x0f00,
0036 
0037     SLI4_FAMILY_CHECK_ASIC_TYPE = 0x0f00,
0038 
0039     SLI4_INTF_IF_TYPE_SHIFT     = 12,
0040     SLI4_INTF_IF_TYPE_MASK      = 0xf000,
0041 
0042     SLI4_INTF_IF_TYPE_2     = 0x2000,
0043     SLI4_INTF_IF_TYPE_6     = 0x6000,
0044 
0045     SLI4_INTF_VALID_SHIFT       = 29,
0046     SLI4_INTF_VALID_MASK        = 0xe0000000,
0047 
0048     SLI4_INTF_VALID_VALUE       = 0xc0000000,
0049 };
0050 
0051 /* ASIC_ID - SLI ASIC Type and Revision Register */
0052 #define SLI4_ASIC_ID_REG    0x009c
0053 enum sli4_asic {
0054     SLI4_ASIC_GEN_SHIFT = 8,
0055     SLI4_ASIC_GEN_MASK  = 0xff00,
0056     SLI4_ASIC_GEN_5     = 0x0b00,
0057     SLI4_ASIC_GEN_6     = 0x0c00,
0058     SLI4_ASIC_GEN_7     = 0x0d00,
0059 };
0060 
0061 enum sli4_acic_revisions {
0062     SLI4_ASIC_REV_A0    = 0x00,
0063     SLI4_ASIC_REV_A1    = 0x01,
0064     SLI4_ASIC_REV_A2    = 0x02,
0065     SLI4_ASIC_REV_A3    = 0x03,
0066     SLI4_ASIC_REV_B0    = 0x10,
0067     SLI4_ASIC_REV_B1    = 0x11,
0068     SLI4_ASIC_REV_B2    = 0x12,
0069     SLI4_ASIC_REV_C0    = 0x20,
0070     SLI4_ASIC_REV_C1    = 0x21,
0071     SLI4_ASIC_REV_C2    = 0x22,
0072     SLI4_ASIC_REV_D0    = 0x30,
0073 };
0074 
0075 struct sli4_asic_entry_t {
0076     u32 rev_id;
0077     u32 family;
0078 };
0079 
0080 /* BMBX - Bootstrap Mailbox Register */
0081 #define SLI4_BMBX_REG       0x0160
0082 enum sli4_bmbx {
0083     SLI4_BMBX_MASK_HI   = 0x3,
0084     SLI4_BMBX_MASK_LO   = 0xf,
0085     SLI4_BMBX_RDY       = 1 << 0,
0086     SLI4_BMBX_HI        = 1 << 1,
0087     SLI4_BMBX_SIZE      = 256,
0088 };
0089 
0090 static inline u32
0091 sli_bmbx_write_hi(u64 addr) {
0092     u32 val;
0093 
0094     val = upper_32_bits(addr) & ~SLI4_BMBX_MASK_HI;
0095     val |= SLI4_BMBX_HI;
0096 
0097     return val;
0098 }
0099 
0100 static inline u32
0101 sli_bmbx_write_lo(u64 addr) {
0102     u32 val;
0103 
0104     val = (upper_32_bits(addr) & SLI4_BMBX_MASK_HI) << 30;
0105     val |= ((addr) & ~SLI4_BMBX_MASK_LO) >> 2;
0106 
0107     return val;
0108 }
0109 
0110 /* SLIPORT_CONTROL - SLI Port Control Register */
0111 #define SLI4_PORT_CTRL_REG  0x0408
0112 enum sli4_port_ctrl {
0113     SLI4_PORT_CTRL_IP   = 1u << 27,
0114     SLI4_PORT_CTRL_IDIS = 1u << 22,
0115     SLI4_PORT_CTRL_FDD  = 1u << 31,
0116 };
0117 
0118 /* SLI4_SLIPORT_ERROR - SLI Port Error Register */
0119 #define SLI4_PORT_ERROR1    0x040c
0120 #define SLI4_PORT_ERROR2    0x0410
0121 
0122 /* EQCQ_DOORBELL - EQ and CQ Doorbell Register */
0123 #define SLI4_EQCQ_DB_REG    0x120
0124 enum sli4_eqcq_e {
0125     SLI4_EQ_ID_LO_MASK  = 0x01ff,
0126 
0127     SLI4_CQ_ID_LO_MASK  = 0x03ff,
0128 
0129     SLI4_EQCQ_CI_EQ     = 0x0200,
0130 
0131     SLI4_EQCQ_QT_EQ     = 0x00000400,
0132     SLI4_EQCQ_QT_CQ     = 0x00000000,
0133 
0134     SLI4_EQCQ_ID_HI_SHIFT   = 11,
0135     SLI4_EQCQ_ID_HI_MASK    = 0xf800,
0136 
0137     SLI4_EQCQ_NUM_SHIFT = 16,
0138     SLI4_EQCQ_NUM_MASK  = 0x1fff0000,
0139 
0140     SLI4_EQCQ_ARM       = 0x20000000,
0141     SLI4_EQCQ_UNARM     = 0x00000000,
0142 };
0143 
0144 static inline u32
0145 sli_format_eq_db_data(u16 num_popped, u16 id, u32 arm) {
0146     u32 reg;
0147 
0148     reg = (id & SLI4_EQ_ID_LO_MASK) | SLI4_EQCQ_QT_EQ;
0149     reg |= (((id) >> 9) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
0150     reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
0151     reg |= arm | SLI4_EQCQ_CI_EQ;
0152 
0153     return reg;
0154 }
0155 
0156 static inline u32
0157 sli_format_cq_db_data(u16 num_popped, u16 id, u32 arm) {
0158     u32 reg;
0159 
0160     reg = ((id) & SLI4_CQ_ID_LO_MASK) | SLI4_EQCQ_QT_CQ;
0161     reg |= (((id) >> 10) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
0162     reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
0163     reg |= arm;
0164 
0165     return reg;
0166 }
0167 
0168 /* EQ_DOORBELL - EQ Doorbell Register for IF_TYPE = 6*/
0169 #define SLI4_IF6_EQ_DB_REG  0x120
0170 enum sli4_eq_e {
0171     SLI4_IF6_EQ_ID_MASK = 0x0fff,
0172 
0173     SLI4_IF6_EQ_NUM_SHIFT   = 16,
0174     SLI4_IF6_EQ_NUM_MASK    = 0x1fff0000,
0175 };
0176 
0177 static inline u32
0178 sli_format_if6_eq_db_data(u16 num_popped, u16 id, u32 arm) {
0179     u32 reg;
0180 
0181     reg = id & SLI4_IF6_EQ_ID_MASK;
0182     reg |= (num_popped << SLI4_IF6_EQ_NUM_SHIFT) & SLI4_IF6_EQ_NUM_MASK;
0183     reg |= arm;
0184 
0185     return reg;
0186 }
0187 
0188 /* CQ_DOORBELL - CQ Doorbell Register for IF_TYPE = 6 */
0189 #define SLI4_IF6_CQ_DB_REG  0xc0
0190 enum sli4_cq_e {
0191     SLI4_IF6_CQ_ID_MASK = 0xffff,
0192 
0193     SLI4_IF6_CQ_NUM_SHIFT   = 16,
0194     SLI4_IF6_CQ_NUM_MASK    = 0x1fff0000,
0195 };
0196 
0197 static inline u32
0198 sli_format_if6_cq_db_data(u16 num_popped, u16 id, u32 arm) {
0199     u32 reg;
0200 
0201     reg = id & SLI4_IF6_CQ_ID_MASK;
0202     reg |= ((num_popped) << SLI4_IF6_CQ_NUM_SHIFT) & SLI4_IF6_CQ_NUM_MASK;
0203     reg |= arm;
0204 
0205     return reg;
0206 }
0207 
0208 /* MQ_DOORBELL - MQ Doorbell Register */
0209 #define SLI4_MQ_DB_REG      0x0140
0210 #define SLI4_IF6_MQ_DB_REG  0x0160
0211 enum sli4_mq_e {
0212     SLI4_MQ_ID_MASK     = 0xffff,
0213 
0214     SLI4_MQ_NUM_SHIFT   = 16,
0215     SLI4_MQ_NUM_MASK    = 0x3fff0000,
0216 };
0217 
0218 static inline u32
0219 sli_format_mq_db_data(u16 id) {
0220     u32 reg;
0221 
0222     reg = id & SLI4_MQ_ID_MASK;
0223     reg |= (1 << SLI4_MQ_NUM_SHIFT) & SLI4_MQ_NUM_MASK;
0224 
0225     return reg;
0226 }
0227 
0228 /* RQ_DOORBELL - RQ Doorbell Register */
0229 #define SLI4_RQ_DB_REG      0x0a0
0230 #define SLI4_IF6_RQ_DB_REG  0x0080
0231 enum sli4_rq_e {
0232     SLI4_RQ_DB_ID_MASK  = 0xffff,
0233 
0234     SLI4_RQ_DB_NUM_SHIFT    = 16,
0235     SLI4_RQ_DB_NUM_MASK = 0x3fff0000,
0236 };
0237 
0238 static inline u32
0239 sli_format_rq_db_data(u16 id) {
0240     u32 reg;
0241 
0242     reg = id & SLI4_RQ_DB_ID_MASK;
0243     reg |= (1 << SLI4_RQ_DB_NUM_SHIFT) & SLI4_RQ_DB_NUM_MASK;
0244 
0245     return reg;
0246 }
0247 
0248 /* WQ_DOORBELL - WQ Doorbell Register */
0249 #define SLI4_IO_WQ_DB_REG   0x040
0250 #define SLI4_IF6_WQ_DB_REG  0x040
0251 enum sli4_wq_e {
0252     SLI4_WQ_ID_MASK     = 0xffff,
0253 
0254     SLI4_WQ_IDX_SHIFT   = 16,
0255     SLI4_WQ_IDX_MASK    = 0xff0000,
0256 
0257     SLI4_WQ_NUM_SHIFT   = 24,
0258     SLI4_WQ_NUM_MASK    = 0x0ff00000,
0259 };
0260 
0261 static inline u32
0262 sli_format_wq_db_data(u16 id) {
0263     u32 reg;
0264 
0265     reg = id & SLI4_WQ_ID_MASK;
0266     reg |= (1 << SLI4_WQ_NUM_SHIFT) & SLI4_WQ_NUM_MASK;
0267 
0268     return reg;
0269 }
0270 
0271 /* SLIPORT_STATUS - SLI Port Status Register */
0272 #define SLI4_PORT_STATUS_REGOFF 0x0404
0273 enum sli4_port_status {
0274     SLI4_PORT_STATUS_FDP    = 1u << 21,
0275     SLI4_PORT_STATUS_RDY    = 1u << 23,
0276     SLI4_PORT_STATUS_RN = 1u << 24,
0277     SLI4_PORT_STATUS_DIP    = 1u << 25,
0278     SLI4_PORT_STATUS_OTI    = 1u << 29,
0279     SLI4_PORT_STATUS_ERR    = 1u << 31,
0280 };
0281 
0282 #define SLI4_PHYDEV_CTRL_REG    0x0414
0283 #define SLI4_PHYDEV_CTRL_FRST   (1 << 1)
0284 #define SLI4_PHYDEV_CTRL_DD (1 << 2)
0285 
0286 /* Register name enums */
0287 enum sli4_regname_en {
0288     SLI4_REG_BMBX,
0289     SLI4_REG_EQ_DOORBELL,
0290     SLI4_REG_CQ_DOORBELL,
0291     SLI4_REG_RQ_DOORBELL,
0292     SLI4_REG_IO_WQ_DOORBELL,
0293     SLI4_REG_MQ_DOORBELL,
0294     SLI4_REG_PHYSDEV_CONTROL,
0295     SLI4_REG_PORT_CONTROL,
0296     SLI4_REG_PORT_ERROR1,
0297     SLI4_REG_PORT_ERROR2,
0298     SLI4_REG_PORT_SEMAPHORE,
0299     SLI4_REG_PORT_STATUS,
0300     SLI4_REG_UNKWOWN            /* must be last */
0301 };
0302 
0303 struct sli4_reg {
0304     u32 rset;
0305     u32 off;
0306 };
0307 
0308 struct sli4_dmaaddr {
0309     __le32 low;
0310     __le32 high;
0311 };
0312 
0313 /*
0314  * a 3-word Buffer Descriptor Entry with
0315  * address 1st 2 words, length last word
0316  */
0317 struct sli4_bufptr {
0318     struct sli4_dmaaddr addr;
0319     __le32 length;
0320 };
0321 
0322 /* Buffer Descriptor Entry (BDE) */
0323 enum sli4_bde_e {
0324     SLI4_BDE_LEN_MASK   = 0x00ffffff,
0325     SLI4_BDE_TYPE_MASK  = 0xff000000,
0326 };
0327 
0328 struct sli4_bde {
0329     __le32      bde_type_buflen;
0330     union {
0331         struct sli4_dmaaddr data;
0332         struct {
0333             __le32  offset;
0334             __le32  rsvd2;
0335         } imm;
0336         struct sli4_dmaaddr blp;
0337     } u;
0338 };
0339 
0340 /* Buffer Descriptors */
0341 enum sli4_bde_type {
0342     SLI4_BDE_TYPE_SHIFT = 24,
0343     SLI4_BDE_TYPE_64    = 0x00, /* Generic 64-bit data */
0344     SLI4_BDE_TYPE_IMM   = 0x01, /* Immediate data */
0345     SLI4_BDE_TYPE_BLP   = 0x40, /* Buffer List Pointer */
0346 };
0347 
0348 #define SLI4_BDE_TYPE_VAL(type) \
0349     (SLI4_BDE_TYPE_##type << SLI4_BDE_TYPE_SHIFT)
0350 
0351 /* Scatter-Gather Entry (SGE) */
0352 #define SLI4_SGE_MAX_RESERVED       3
0353 
0354 enum sli4_sge_type {
0355     /* DW2 */
0356     SLI4_SGE_DATA_OFFSET_MASK   = 0x07ffffff,
0357     /*DW2W1*/
0358     SLI4_SGE_TYPE_SHIFT     = 27,
0359     SLI4_SGE_TYPE_MASK      = 0x78000000,
0360     /*SGE Types*/
0361     SLI4_SGE_TYPE_DATA      = 0x00,
0362     SLI4_SGE_TYPE_DIF       = 0x04, /* Data Integrity Field */
0363     SLI4_SGE_TYPE_LSP       = 0x05, /* List Segment Pointer */
0364     SLI4_SGE_TYPE_PEDIF     = 0x06, /* Post Encryption Engine DIF */
0365     SLI4_SGE_TYPE_PESEED        = 0x07, /* Post Encryption DIF Seed */
0366     SLI4_SGE_TYPE_DISEED        = 0x08, /* DIF Seed */
0367     SLI4_SGE_TYPE_ENC       = 0x09, /* Encryption */
0368     SLI4_SGE_TYPE_ATM       = 0x0a, /* DIF Application Tag Mask */
0369     SLI4_SGE_TYPE_SKIP      = 0x0c, /* SKIP */
0370 
0371     SLI4_SGE_LAST           = 1u << 31,
0372 };
0373 
0374 struct sli4_sge {
0375     __le32      buffer_address_high;
0376     __le32      buffer_address_low;
0377     __le32      dw2_flags;
0378     __le32      buffer_length;
0379 };
0380 
0381 /* T10 DIF Scatter-Gather Entry (SGE) */
0382 struct sli4_dif_sge {
0383     __le32      buffer_address_high;
0384     __le32      buffer_address_low;
0385     __le32      dw2_flags;
0386     __le32      rsvd12;
0387 };
0388 
0389 /* Data Integrity Seed (DISEED) SGE */
0390 enum sli4_diseed_sge_flags {
0391     /* DW2W1 */
0392     SLI4_DISEED_SGE_HS      = 1 << 2,
0393     SLI4_DISEED_SGE_WS      = 1 << 3,
0394     SLI4_DISEED_SGE_IC      = 1 << 4,
0395     SLI4_DISEED_SGE_ICS     = 1 << 5,
0396     SLI4_DISEED_SGE_ATRT        = 1 << 6,
0397     SLI4_DISEED_SGE_AT      = 1 << 7,
0398     SLI4_DISEED_SGE_FAT     = 1 << 8,
0399     SLI4_DISEED_SGE_NA      = 1 << 9,
0400     SLI4_DISEED_SGE_HI      = 1 << 10,
0401 
0402     /* DW3W1 */
0403     SLI4_DISEED_SGE_BS_MASK     = 0x0007,
0404     SLI4_DISEED_SGE_AI      = 1 << 3,
0405     SLI4_DISEED_SGE_ME      = 1 << 4,
0406     SLI4_DISEED_SGE_RE      = 1 << 5,
0407     SLI4_DISEED_SGE_CE      = 1 << 6,
0408     SLI4_DISEED_SGE_NR      = 1 << 7,
0409 
0410     SLI4_DISEED_SGE_OP_RX_SHIFT = 8,
0411     SLI4_DISEED_SGE_OP_RX_MASK  = 0x0f00,
0412     SLI4_DISEED_SGE_OP_TX_SHIFT = 12,
0413     SLI4_DISEED_SGE_OP_TX_MASK  = 0xf000,
0414 };
0415 
0416 /* Opcode values */
0417 enum sli4_diseed_sge_opcodes {
0418     SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CRC,
0419     SLI4_DISEED_SGE_OP_IN_CRC_OUT_NODIF,
0420     SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CSUM,
0421     SLI4_DISEED_SGE_OP_IN_CSUM_OUT_NODIF,
0422     SLI4_DISEED_SGE_OP_IN_CRC_OUT_CRC,
0423     SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CSUM,
0424     SLI4_DISEED_SGE_OP_IN_CRC_OUT_CSUM,
0425     SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CRC,
0426     SLI4_DISEED_SGE_OP_IN_RAW_OUT_RAW,
0427 };
0428 
0429 #define SLI4_DISEED_SGE_OP_RX_VALUE(stype) \
0430     (SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_RX_SHIFT)
0431 #define SLI4_DISEED_SGE_OP_TX_VALUE(stype) \
0432     (SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_TX_SHIFT)
0433 
0434 struct sli4_diseed_sge {
0435     __le32      ref_tag_cmp;
0436     __le32      ref_tag_repl;
0437     __le16      app_tag_repl;
0438     __le16      dw2w1_flags;
0439     __le16      app_tag_cmp;
0440     __le16      dw3w1_flags;
0441 };
0442 
0443 /* List Segment Pointer Scatter-Gather Entry (SGE) */
0444 #define SLI4_LSP_SGE_SEGLEN 0x00ffffff
0445 
0446 struct sli4_lsp_sge {
0447     __le32      buffer_address_high;
0448     __le32      buffer_address_low;
0449     __le32      dw2_flags;
0450     __le32      dw3_seglen;
0451 };
0452 
0453 enum sli4_eqe_e {
0454     SLI4_EQE_VALID  = 1,
0455     SLI4_EQE_MJCODE = 0xe,
0456     SLI4_EQE_MNCODE = 0xfff0,
0457 };
0458 
0459 struct sli4_eqe {
0460     __le16      dw0w0_flags;
0461     __le16      resource_id;
0462 };
0463 
0464 #define SLI4_MAJOR_CODE_STANDARD    0
0465 #define SLI4_MAJOR_CODE_SENTINEL    1
0466 
0467 /* Sentinel EQE indicating the EQ is full */
0468 #define SLI4_EQE_STATUS_EQ_FULL     2
0469 
0470 enum sli4_mcqe_e {
0471     SLI4_MCQE_CONSUMED  = 1u << 27,
0472     SLI4_MCQE_COMPLETED = 1u << 28,
0473     SLI4_MCQE_AE        = 1u << 30,
0474     SLI4_MCQE_VALID     = 1u << 31,
0475 };
0476 
0477 /* Entry was consumed but not completed */
0478 #define SLI4_MCQE_STATUS_NOT_COMPLETED  -2
0479 
0480 struct sli4_mcqe {
0481     __le16      completion_status;
0482     __le16      extended_status;
0483     __le32      mqe_tag_low;
0484     __le32      mqe_tag_high;
0485     __le32      dw3_flags;
0486 };
0487 
0488 enum sli4_acqe_e {
0489     SLI4_ACQE_AE    = 1 << 6, /* async event - this is an ACQE */
0490     SLI4_ACQE_VAL   = 1 << 7, /* valid - contents of CQE are valid */
0491 };
0492 
0493 struct sli4_acqe {
0494     __le32      event_data[3];
0495     u8      rsvd12;
0496     u8      event_code;
0497     u8      event_type;
0498     u8      ae_val;
0499 };
0500 
0501 enum sli4_acqe_event_code {
0502     SLI4_ACQE_EVENT_CODE_LINK_STATE     = 0x01,
0503     SLI4_ACQE_EVENT_CODE_FIP        = 0x02,
0504     SLI4_ACQE_EVENT_CODE_DCBX       = 0x03,
0505     SLI4_ACQE_EVENT_CODE_ISCSI      = 0x04,
0506     SLI4_ACQE_EVENT_CODE_GRP_5      = 0x05,
0507     SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT  = 0x10,
0508     SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT = 0x11,
0509     SLI4_ACQE_EVENT_CODE_VF_EVENT       = 0x12,
0510     SLI4_ACQE_EVENT_CODE_MR_EVENT       = 0x13,
0511 };
0512 
0513 enum sli4_qtype {
0514     SLI4_QTYPE_EQ,
0515     SLI4_QTYPE_CQ,
0516     SLI4_QTYPE_MQ,
0517     SLI4_QTYPE_WQ,
0518     SLI4_QTYPE_RQ,
0519     SLI4_QTYPE_MAX,         /* must be last */
0520 };
0521 
0522 #define SLI4_USER_MQ_COUNT  1
0523 #define SLI4_MAX_CQ_SET_COUNT   16
0524 #define SLI4_MAX_RQ_SET_COUNT   16
0525 
0526 enum sli4_qentry {
0527     SLI4_QENTRY_ASYNC,
0528     SLI4_QENTRY_MQ,
0529     SLI4_QENTRY_RQ,
0530     SLI4_QENTRY_WQ,
0531     SLI4_QENTRY_WQ_RELEASE,
0532     SLI4_QENTRY_OPT_WRITE_CMD,
0533     SLI4_QENTRY_OPT_WRITE_DATA,
0534     SLI4_QENTRY_XABT,
0535     SLI4_QENTRY_MAX         /* must be last */
0536 };
0537 
0538 enum sli4_queue_flags {
0539     SLI4_QUEUE_FLAG_MQ  = 1 << 0,   /* CQ has MQ/Async completion */
0540     SLI4_QUEUE_FLAG_HDR = 1 << 1,   /* RQ for packet headers */
0541     SLI4_QUEUE_FLAG_RQBATCH = 1 << 2,   /* RQ index increment by 8 */
0542 };
0543 
0544 /* Generic Command Request header */
0545 enum sli4_cmd_version {
0546     CMD_V0,
0547     CMD_V1,
0548     CMD_V2,
0549 };
0550 
0551 struct sli4_rqst_hdr {
0552     u8      opcode;
0553     u8      subsystem;
0554     __le16      rsvd2;
0555     __le32      timeout;
0556     __le32      request_length;
0557     __le32      dw3_version;
0558 };
0559 
0560 /* Generic Command Response header */
0561 struct sli4_rsp_hdr {
0562     u8      opcode;
0563     u8      subsystem;
0564     __le16      rsvd2;
0565     u8      status;
0566     u8      additional_status;
0567     __le16      rsvd6;
0568     __le32      response_length;
0569     __le32      actual_response_length;
0570 };
0571 
0572 #define SLI4_QUEUE_RQ_BATCH 8
0573 
0574 #define SZ_DMAADDR      sizeof(struct sli4_dmaaddr)
0575 #define SLI4_RQST_CMDSZ(stype)  sizeof(struct sli4_rqst_##stype)
0576 
0577 #define SLI4_RQST_PYLD_LEN(stype) \
0578         cpu_to_le32(sizeof(struct sli4_rqst_##stype) - \
0579             sizeof(struct sli4_rqst_hdr))
0580 
0581 #define SLI4_RQST_PYLD_LEN_VAR(stype, varpyld) \
0582         cpu_to_le32((sizeof(struct sli4_rqst_##stype) + \
0583             varpyld) - sizeof(struct sli4_rqst_hdr))
0584 
0585 #define SLI4_CFG_PYLD_LENGTH(stype) \
0586         max(sizeof(struct sli4_rqst_##stype), \
0587         sizeof(struct sli4_rsp_##stype))
0588 
0589 enum sli4_create_cqv2_e {
0590     /* DW5_flags values*/
0591     SLI4_CREATE_CQV2_CLSWM_MASK = 0x00003000,
0592     SLI4_CREATE_CQV2_NODELAY    = 0x00004000,
0593     SLI4_CREATE_CQV2_AUTOVALID  = 0x00008000,
0594     SLI4_CREATE_CQV2_CQECNT_MASK    = 0x18000000,
0595     SLI4_CREATE_CQV2_VALID      = 0x20000000,
0596     SLI4_CREATE_CQV2_EVT        = 0x80000000,
0597     /* DW6W1_flags values*/
0598     SLI4_CREATE_CQV2_ARM        = 0x8000,
0599 };
0600 
0601 struct sli4_rqst_cmn_create_cq_v2 {
0602     struct sli4_rqst_hdr    hdr;
0603     __le16          num_pages;
0604     u8          page_size;
0605     u8          rsvd19;
0606     __le32          dw5_flags;
0607     __le16          eq_id;
0608     __le16          dw6w1_arm;
0609     __le16          cqe_count;
0610     __le16          rsvd30;
0611     __le32          rsvd32;
0612     struct sli4_dmaaddr page_phys_addr[];
0613 };
0614 
0615 enum sli4_create_cqset_e {
0616     /* DW5_flags values*/
0617     SLI4_CREATE_CQSETV0_CLSWM_MASK  = 0x00003000,
0618     SLI4_CREATE_CQSETV0_NODELAY = 0x00004000,
0619     SLI4_CREATE_CQSETV0_AUTOVALID   = 0x00008000,
0620     SLI4_CREATE_CQSETV0_CQECNT_MASK = 0x18000000,
0621     SLI4_CREATE_CQSETV0_VALID   = 0x20000000,
0622     SLI4_CREATE_CQSETV0_EVT     = 0x80000000,
0623     /* DW5W1_flags values */
0624     SLI4_CREATE_CQSETV0_CQE_COUNT   = 0x7fff,
0625     SLI4_CREATE_CQSETV0_ARM     = 0x8000,
0626 };
0627 
0628 struct sli4_rqst_cmn_create_cq_set_v0 {
0629     struct sli4_rqst_hdr    hdr;
0630     __le16          num_pages;
0631     u8          page_size;
0632     u8          rsvd19;
0633     __le32          dw5_flags;
0634     __le16          num_cq_req;
0635     __le16          dw6w1_flags;
0636     __le16          eq_id[16];
0637     struct sli4_dmaaddr page_phys_addr[];
0638 };
0639 
0640 /* CQE count */
0641 enum sli4_cq_cnt {
0642     SLI4_CQ_CNT_256,
0643     SLI4_CQ_CNT_512,
0644     SLI4_CQ_CNT_1024,
0645     SLI4_CQ_CNT_LARGE,
0646 };
0647 
0648 #define SLI4_CQ_CNT_SHIFT   27
0649 #define SLI4_CQ_CNT_VAL(type)   (SLI4_CQ_CNT_##type << SLI4_CQ_CNT_SHIFT)
0650 
0651 #define SLI4_CQE_BYTES      (4 * sizeof(u32))
0652 
0653 #define SLI4_CREATE_CQV2_MAX_PAGES  8
0654 
0655 /* Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion */
0656 struct sli4_rsp_cmn_create_queue {
0657     struct sli4_rsp_hdr hdr;
0658     __le16  q_id;
0659     u8  rsvd18;
0660     u8  ulp;
0661     __le32  db_offset;
0662     __le16  db_rs;
0663     __le16  db_fmt;
0664 };
0665 
0666 struct sli4_rsp_cmn_create_queue_set {
0667     struct sli4_rsp_hdr hdr;
0668     __le16  q_id;
0669     __le16  num_q_allocated;
0670 };
0671 
0672 /* Common Destroy Queue */
0673 struct sli4_rqst_cmn_destroy_q {
0674     struct sli4_rqst_hdr    hdr;
0675     __le16  q_id;
0676     __le16  rsvd;
0677 };
0678 
0679 struct sli4_rsp_cmn_destroy_q {
0680     struct sli4_rsp_hdr hdr;
0681 };
0682 
0683 /* Modify the delay multiplier for EQs */
0684 struct sli4_eqdelay_rec {
0685     __le32  eq_id;
0686     __le32  phase;
0687     __le32  delay_multiplier;
0688 };
0689 
0690 struct sli4_rqst_cmn_modify_eq_delay {
0691     struct sli4_rqst_hdr    hdr;
0692     __le32          num_eq;
0693     struct sli4_eqdelay_rec eq_delay_record[8];
0694 };
0695 
0696 struct sli4_rsp_cmn_modify_eq_delay {
0697     struct sli4_rsp_hdr hdr;
0698 };
0699 
0700 enum sli4_create_cq_e {
0701     /* DW5 */
0702     SLI4_CREATE_EQ_AUTOVALID        = 1u << 28,
0703     SLI4_CREATE_EQ_VALID            = 1u << 29,
0704     SLI4_CREATE_EQ_EQESZ            = 1u << 31,
0705     /* DW6 */
0706     SLI4_CREATE_EQ_COUNT            = 7 << 26,
0707     SLI4_CREATE_EQ_ARM          = 1u << 31,
0708     /* DW7 */
0709     SLI4_CREATE_EQ_DELAYMULTI_SHIFT     = 13,
0710     SLI4_CREATE_EQ_DELAYMULTI_MASK      = 0x007fe000,
0711     SLI4_CREATE_EQ_DELAYMULTI       = 0x00040000,
0712 };
0713 
0714 struct sli4_rqst_cmn_create_eq {
0715     struct sli4_rqst_hdr    hdr;
0716     __le16          num_pages;
0717     __le16          rsvd18;
0718     __le32          dw5_flags;
0719     __le32          dw6_flags;
0720     __le32          dw7_delaymulti;
0721     __le32          rsvd32;
0722     struct sli4_dmaaddr page_address[8];
0723 };
0724 
0725 struct sli4_rsp_cmn_create_eq {
0726     struct sli4_rsp_cmn_create_queue q_rsp;
0727 };
0728 
0729 /* EQ count */
0730 enum sli4_eq_cnt {
0731     SLI4_EQ_CNT_256,
0732     SLI4_EQ_CNT_512,
0733     SLI4_EQ_CNT_1024,
0734     SLI4_EQ_CNT_2048,
0735     SLI4_EQ_CNT_4096 = 3,
0736 };
0737 
0738 #define SLI4_EQ_CNT_SHIFT   26
0739 #define SLI4_EQ_CNT_VAL(type)   (SLI4_EQ_CNT_##type << SLI4_EQ_CNT_SHIFT)
0740 
0741 #define SLI4_EQE_SIZE_4     0
0742 #define SLI4_EQE_SIZE_16    1
0743 
0744 /* Create a Mailbox Queue; accommodate v0 and v1 forms. */
0745 enum sli4_create_mq_flags {
0746     /* DW6W1 */
0747     SLI4_CREATE_MQEXT_RINGSIZE  = 0xf,
0748     SLI4_CREATE_MQEXT_CQID_SHIFT    = 6,
0749     SLI4_CREATE_MQEXT_CQIDV0_MASK   = 0xffc0,
0750     /* DW7 */
0751     SLI4_CREATE_MQEXT_VAL       = 1u << 31,
0752     /* DW8 */
0753     SLI4_CREATE_MQEXT_ACQV      = 1u << 0,
0754     SLI4_CREATE_MQEXT_ASYNC_CQIDV0  = 0x7fe,
0755 };
0756 
0757 struct sli4_rqst_cmn_create_mq_ext {
0758     struct sli4_rqst_hdr    hdr;
0759     __le16          num_pages;
0760     __le16          cq_id_v1;
0761     __le32          async_event_bitmap;
0762     __le16          async_cq_id_v1;
0763     __le16          dw6w1_flags;
0764     __le32          dw7_val;
0765     __le32          dw8_flags;
0766     __le32          rsvd36;
0767     struct sli4_dmaaddr page_phys_addr[];
0768 };
0769 
0770 struct sli4_rsp_cmn_create_mq_ext {
0771     struct sli4_rsp_cmn_create_queue q_rsp;
0772 };
0773 
0774 enum sli4_mqe_size {
0775     SLI4_MQE_SIZE_16 = 0x05,
0776     SLI4_MQE_SIZE_32,
0777     SLI4_MQE_SIZE_64,
0778     SLI4_MQE_SIZE_128,
0779 };
0780 
0781 enum sli4_async_evt {
0782     SLI4_ASYNC_EVT_LINK_STATE   = 1 << 1,
0783     SLI4_ASYNC_EVT_FIP      = 1 << 2,
0784     SLI4_ASYNC_EVT_GRP5     = 1 << 5,
0785     SLI4_ASYNC_EVT_FC       = 1 << 16,
0786     SLI4_ASYNC_EVT_SLI_PORT     = 1 << 17,
0787 };
0788 
0789 #define SLI4_ASYNC_EVT_FC_ALL \
0790         (SLI4_ASYNC_EVT_LINK_STATE  | \
0791          SLI4_ASYNC_EVT_FIP     | \
0792          SLI4_ASYNC_EVT_GRP5        | \
0793          SLI4_ASYNC_EVT_FC      | \
0794          SLI4_ASYNC_EVT_SLI_PORT)
0795 
0796 /* Create a Completion Queue. */
0797 struct sli4_rqst_cmn_create_cq_v0 {
0798     struct sli4_rqst_hdr    hdr;
0799     __le16          num_pages;
0800     __le16          rsvd18;
0801     __le32          dw5_flags;
0802     __le32          dw6_flags;
0803     __le32          rsvd28;
0804     __le32          rsvd32;
0805     struct sli4_dmaaddr page_phys_addr[];
0806 };
0807 
0808 enum sli4_create_rq_e {
0809     SLI4_RQ_CREATE_DUA      = 0x1,
0810     SLI4_RQ_CREATE_BQU      = 0x2,
0811 
0812     SLI4_RQE_SIZE           = 8,
0813     SLI4_RQE_SIZE_8         = 0x2,
0814     SLI4_RQE_SIZE_16        = 0x3,
0815     SLI4_RQE_SIZE_32        = 0x4,
0816     SLI4_RQE_SIZE_64        = 0x5,
0817     SLI4_RQE_SIZE_128       = 0x6,
0818 
0819     SLI4_RQ_PAGE_SIZE_4096      = 0x1,
0820     SLI4_RQ_PAGE_SIZE_8192      = 0x2,
0821     SLI4_RQ_PAGE_SIZE_16384     = 0x4,
0822     SLI4_RQ_PAGE_SIZE_32768     = 0x8,
0823     SLI4_RQ_PAGE_SIZE_64536     = 0x10,
0824 
0825     SLI4_RQ_CREATE_V0_MAX_PAGES = 8,
0826     SLI4_RQ_CREATE_V0_MIN_BUF_SIZE  = 128,
0827     SLI4_RQ_CREATE_V0_MAX_BUF_SIZE  = 2048,
0828 };
0829 
0830 struct sli4_rqst_rq_create {
0831     struct sli4_rqst_hdr    hdr;
0832     __le16          num_pages;
0833     u8          dua_bqu_byte;
0834     u8          ulp;
0835     __le16          rsvd16;
0836     u8          rqe_count_byte;
0837     u8          rsvd19;
0838     __le32          rsvd20;
0839     __le16          buffer_size;
0840     __le16          cq_id;
0841     __le32          rsvd28;
0842     struct sli4_dmaaddr page_phys_addr[SLI4_RQ_CREATE_V0_MAX_PAGES];
0843 };
0844 
0845 struct sli4_rsp_rq_create {
0846     struct sli4_rsp_cmn_create_queue rsp;
0847 };
0848 
0849 enum sli4_create_rqv1_e {
0850     SLI4_RQ_CREATE_V1_DNB       = 0x80,
0851     SLI4_RQ_CREATE_V1_MAX_PAGES = 8,
0852     SLI4_RQ_CREATE_V1_MIN_BUF_SIZE  = 64,
0853     SLI4_RQ_CREATE_V1_MAX_BUF_SIZE  = 2048,
0854 };
0855 
0856 struct sli4_rqst_rq_create_v1 {
0857     struct sli4_rqst_hdr    hdr;
0858     __le16          num_pages;
0859     u8          rsvd14;
0860     u8          dim_dfd_dnb;
0861     u8          page_size;
0862     u8          rqe_size_byte;
0863     __le16          rqe_count;
0864     __le32          rsvd20;
0865     __le16          rsvd24;
0866     __le16          cq_id;
0867     __le32          buffer_size;
0868     struct sli4_dmaaddr page_phys_addr[SLI4_RQ_CREATE_V1_MAX_PAGES];
0869 };
0870 
0871 struct sli4_rsp_rq_create_v1 {
0872     struct sli4_rsp_cmn_create_queue rsp;
0873 };
0874 
0875 #define SLI4_RQCREATEV2_DNB 0x80
0876 
0877 struct sli4_rqst_rq_create_v2 {
0878     struct sli4_rqst_hdr    hdr;
0879     __le16          num_pages;
0880     u8          rq_count;
0881     u8          dim_dfd_dnb;
0882     u8          page_size;
0883     u8          rqe_size_byte;
0884     __le16          rqe_count;
0885     __le16          hdr_buffer_size;
0886     __le16          payload_buffer_size;
0887     __le16          base_cq_id;
0888     __le16          rsvd26;
0889     __le32          rsvd42;
0890     struct sli4_dmaaddr page_phys_addr[];
0891 };
0892 
0893 struct sli4_rsp_rq_create_v2 {
0894     struct sli4_rsp_cmn_create_queue rsp;
0895 };
0896 
0897 #define SLI4_CQE_CODE_OFFSET    14
0898 
0899 enum sli4_cqe_code {
0900     SLI4_CQE_CODE_WORK_REQUEST_COMPLETION = 0x01,
0901     SLI4_CQE_CODE_RELEASE_WQE,
0902     SLI4_CQE_CODE_RSVD,
0903     SLI4_CQE_CODE_RQ_ASYNC,
0904     SLI4_CQE_CODE_XRI_ABORTED,
0905     SLI4_CQE_CODE_RQ_COALESCING,
0906     SLI4_CQE_CODE_RQ_CONSUMPTION,
0907     SLI4_CQE_CODE_MEASUREMENT_REPORTING,
0908     SLI4_CQE_CODE_RQ_ASYNC_V1,
0909     SLI4_CQE_CODE_RQ_COALESCING_V1,
0910     SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD,
0911     SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA,
0912 };
0913 
0914 #define SLI4_WQ_CREATE_MAX_PAGES        8
0915 
0916 struct sli4_rqst_wq_create {
0917     struct sli4_rqst_hdr    hdr;
0918     __le16          num_pages;
0919     __le16          cq_id;
0920     u8          page_size;
0921     u8          wqe_size_byte;
0922     __le16          wqe_count;
0923     __le32          rsvd;
0924     struct  sli4_dmaaddr    page_phys_addr[SLI4_WQ_CREATE_MAX_PAGES];
0925 };
0926 
0927 struct sli4_rsp_wq_create {
0928     struct sli4_rsp_cmn_create_queue rsp;
0929 };
0930 
0931 enum sli4_link_attention_flags {
0932     SLI4_LNK_ATTN_TYPE_LINK_UP      = 0x01,
0933     SLI4_LNK_ATTN_TYPE_LINK_DOWN        = 0x02,
0934     SLI4_LNK_ATTN_TYPE_NO_HARD_ALPA     = 0x03,
0935 
0936     SLI4_LNK_ATTN_P2P           = 0x01,
0937     SLI4_LNK_ATTN_FC_AL         = 0x02,
0938     SLI4_LNK_ATTN_INTERNAL_LOOPBACK     = 0x03,
0939     SLI4_LNK_ATTN_SERDES_LOOPBACK       = 0x04,
0940 };
0941 
0942 struct sli4_link_attention {
0943     u8      link_number;
0944     u8      attn_type;
0945     u8      topology;
0946     u8      port_speed;
0947     u8      port_fault;
0948     u8      shared_link_status;
0949     __le16      logical_link_speed;
0950     __le32      event_tag;
0951     u8      rsvd12;
0952     u8      event_code;
0953     u8      event_type;
0954     u8      flags;
0955 };
0956 
0957 enum sli4_link_event_type {
0958     SLI4_EVENT_LINK_ATTENTION       = 0x01,
0959     SLI4_EVENT_SHARED_LINK_ATTENTION    = 0x02,
0960 };
0961 
0962 enum sli4_wcqe_flags {
0963     SLI4_WCQE_XB = 0x10,
0964     SLI4_WCQE_QX = 0x80,
0965 };
0966 
0967 struct sli4_fc_wcqe {
0968     u8      hw_status;
0969     u8      status;
0970     __le16      request_tag;
0971     __le32      wqe_specific_1;
0972     __le32      wqe_specific_2;
0973     u8      rsvd12;
0974     u8      qx_byte;
0975     u8      code;
0976     u8      flags;
0977 };
0978 
0979 /* FC WQ consumed CQ queue entry */
0980 struct sli4_fc_wqec {
0981     __le32      rsvd0;
0982     __le32      rsvd1;
0983     __le16      wqe_index;
0984     __le16      wq_id;
0985     __le16      rsvd12;
0986     u8      code;
0987     u8      vld_byte;
0988 };
0989 
0990 /* FC Completion Status Codes. */
0991 enum sli4_wcqe_status {
0992     SLI4_FC_WCQE_STATUS_SUCCESS,
0993     SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE,
0994     SLI4_FC_WCQE_STATUS_REMOTE_STOP,
0995     SLI4_FC_WCQE_STATUS_LOCAL_REJECT,
0996     SLI4_FC_WCQE_STATUS_NPORT_RJT,
0997     SLI4_FC_WCQE_STATUS_FABRIC_RJT,
0998     SLI4_FC_WCQE_STATUS_NPORT_BSY,
0999     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 */