0001
0002
0003
0004
0005
0006
0007
0008
0009
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
0023
0024
0025
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
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
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
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
0119 #define SLI4_PORT_ERROR1 0x040c
0120 #define SLI4_PORT_ERROR2 0x0410
0121
0122
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
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
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
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
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
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
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
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
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
0315
0316
0317 struct sli4_bufptr {
0318 struct sli4_dmaaddr addr;
0319 __le32 length;
0320 };
0321
0322
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
0341 enum sli4_bde_type {
0342 SLI4_BDE_TYPE_SHIFT = 24,
0343 SLI4_BDE_TYPE_64 = 0x00,
0344 SLI4_BDE_TYPE_IMM = 0x01,
0345 SLI4_BDE_TYPE_BLP = 0x40,
0346 };
0347
0348 #define SLI4_BDE_TYPE_VAL(type) \
0349 (SLI4_BDE_TYPE_##type << SLI4_BDE_TYPE_SHIFT)
0350
0351
0352 #define SLI4_SGE_MAX_RESERVED 3
0353
0354 enum sli4_sge_type {
0355
0356 SLI4_SGE_DATA_OFFSET_MASK = 0x07ffffff,
0357
0358 SLI4_SGE_TYPE_SHIFT = 27,
0359 SLI4_SGE_TYPE_MASK = 0x78000000,
0360
0361 SLI4_SGE_TYPE_DATA = 0x00,
0362 SLI4_SGE_TYPE_DIF = 0x04,
0363 SLI4_SGE_TYPE_LSP = 0x05,
0364 SLI4_SGE_TYPE_PEDIF = 0x06,
0365 SLI4_SGE_TYPE_PESEED = 0x07,
0366 SLI4_SGE_TYPE_DISEED = 0x08,
0367 SLI4_SGE_TYPE_ENC = 0x09,
0368 SLI4_SGE_TYPE_ATM = 0x0a,
0369 SLI4_SGE_TYPE_SKIP = 0x0c,
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
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
0390 enum sli4_diseed_sge_flags {
0391
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
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
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
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
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
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,
0490 SLI4_ACQE_VAL = 1 << 7,
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,
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
0536 };
0537
0538 enum sli4_queue_flags {
0539 SLI4_QUEUE_FLAG_MQ = 1 << 0,
0540 SLI4_QUEUE_FLAG_HDR = 1 << 1,
0541 SLI4_QUEUE_FLAG_RQBATCH = 1 << 2,
0542 };
0543
0544
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
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
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
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
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
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
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
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
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
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
0702 SLI4_CREATE_EQ_AUTOVALID = 1u << 28,
0703 SLI4_CREATE_EQ_VALID = 1u << 29,
0704 SLI4_CREATE_EQ_EQESZ = 1u << 31,
0705
0706 SLI4_CREATE_EQ_COUNT = 7 << 26,
0707 SLI4_CREATE_EQ_ARM = 1u << 31,
0708
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
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
0745 enum sli4_create_mq_flags {
0746
0747 SLI4_CREATE_MQEXT_RINGSIZE = 0xf,
0748 SLI4_CREATE_MQEXT_CQID_SHIFT = 6,
0749 SLI4_CREATE_MQEXT_CQIDV0_MASK = 0xffc0,
0750
0751 SLI4_CREATE_MQEXT_VAL = 1u << 31,
0752
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
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
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
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
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
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
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
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
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
1090 #define SLI4_MASK_CCP 0xfe
1091
1092
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
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,
1192 };
1193
1194
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
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
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
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
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
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
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
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
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
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
1644
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
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
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
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,
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,
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,
1921 SLI4_OCQE_FCFI = 0x3f,
1922 SLI4_OCQE_OOX = 1 << 6,
1923 SLI4_OCQE_AGXR = 1 << 7,
1924 SLI4_OCQE_HDPL = 0x3f,
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
1999 #define SLI4_INIT_PORT_DELAY_US 10000
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
2012
2013
2014 struct sli4_mbox_command_header {
2015 u8 resvd0;
2016 u8 command;
2017 __le16 status;
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
2059
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
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
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
2179 struct sli4_cmd_init_vpi {
2180 struct sli4_mbox_command_header hdr;
2181 __le16 vpi;
2182 __le16 vfi;
2183 };
2184
2185
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
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
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,
2224 SLI4_READ_CFG_RESP_TOPOLOGY = 0xff000000,
2225 };
2226
2227 enum sli4_read_cfg_topo {
2228 SLI4_READ_CFG_TOPO_FC = 0x1,
2229 SLI4_READ_CFG_TOPO_NON_FC_AL = 0x2,
2230 SLI4_READ_CFG_TOPO_FC_AL = 0x3,
2231 };
2232
2233
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
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
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
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
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
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
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
2497 enum sli4_reg_rpi {
2498 SLI4_REGRPI_REMOTE_N_PORTID = 0xffffff,
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
2518 enum sli_reg_vfi {
2519 SLI4_REGVFI_VP = 0x1000,
2520 SLI4_REGVFI_UPD = 0x2000,
2521
2522 SLI4_REGVFI_LOCAL_N_PORTID = 0xffffff,
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
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
2555 enum sli4_req_features_flags {
2556 SLI4_REQFEAT_QRY = 0x1,
2557
2558 SLI4_REQFEAT_IAAB = 1 << 0,
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
2586
2587
2588
2589
2590 enum sli4_sli_config {
2591 SLI4_SLICONF_EMB = 0x1,
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
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
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
2688 static inline void
2689 sli_set_wq_id_association(void *entry, u16 q_id)
2690 {
2691 u32 *wqe = entry;
2692
2693
2694
2695
2696
2697 wqe[10] &= ~0xffff;
2698 wqe[10] |= q_id << 1;
2699 }
2700
2701
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
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
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
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
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
2787
2788
2789
2790
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
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
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
2842 #define DMTF_EXEC_CLP_CMD 0x01
2843
2844
2845
2846
2847
2848
2849
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
2861
2862
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
2924
2925
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
2963
2964
2965
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
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
3011 SLI4_PARAM_PROTO_TYPE_MASK = 0xff,
3012
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
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
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
3028 SLI4_PARAM_MQ_PAGE_CNT_MASK = 0xf << 0,
3029 SLI4_PARAM_MQ_PAGE_SZS_MASK = 0xff << 16,
3030
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
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
3039 SLI4_PARAM_RQ_DB_WINDOW_MASK = 0xf000,
3040
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
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
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
3145
3146
3147
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
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
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
3449 #define SLI4_CQ_DEFAULT 0xffff
3450
3451
3452
3453
3454
3455
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
3484 SLI4_IO_CONTINUATION = 1 << 0,
3485
3486 SLI4_IO_AUTO_GOOD_RESPONSE = 1 << 1,
3487 SLI4_IO_NO_ABORT = 1 << 2,
3488
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
3519
3520 struct sli4_queue {
3521
3522 struct efc_dma dma;
3523 spinlock_t lock;
3524
3525
3526 u32 index;
3527 u16 size;
3528 u16 length;
3529 u16 n_posted;
3530 u16 id;
3531 u8 type;
3532 void __iomem *db_regaddr;
3533 u16 phase;
3534
3535
3536
3537
3538 u32 proc_limit;
3539 u32 posted_limit;
3540 u32 max_num_processed;
3541 u64 max_process_time;
3542 union {
3543 u32 r_idx;
3544 u32 flag;
3545 } u;
3546 };
3547
3548
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
3694
3695
3696
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
3707
3708 int (*link)(void *ctx, void *event);
3709 void *link_arg;
3710
3711 struct efc_dma bmbx;
3712
3713
3714
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
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
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