1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * QLogic Fibre Channel HBA Driver 4*4882a593Smuzhiyun * Copyright (c) 2003-2014 QLogic Corporation 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef __QLA_BSG_H 7*4882a593Smuzhiyun #define __QLA_BSG_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* BSG Vendor specific commands */ 10*4882a593Smuzhiyun #define QL_VND_LOOPBACK 0x01 11*4882a593Smuzhiyun #define QL_VND_A84_RESET 0x02 12*4882a593Smuzhiyun #define QL_VND_A84_UPDATE_FW 0x03 13*4882a593Smuzhiyun #define QL_VND_A84_MGMT_CMD 0x04 14*4882a593Smuzhiyun #define QL_VND_IIDMA 0x05 15*4882a593Smuzhiyun #define QL_VND_FCP_PRIO_CFG_CMD 0x06 16*4882a593Smuzhiyun #define QL_VND_READ_FLASH 0x07 17*4882a593Smuzhiyun #define QL_VND_UPDATE_FLASH 0x08 18*4882a593Smuzhiyun #define QL_VND_SET_FRU_VERSION 0x0B 19*4882a593Smuzhiyun #define QL_VND_READ_FRU_STATUS 0x0C 20*4882a593Smuzhiyun #define QL_VND_WRITE_FRU_STATUS 0x0D 21*4882a593Smuzhiyun #define QL_VND_DIAG_IO_CMD 0x0A 22*4882a593Smuzhiyun #define QL_VND_WRITE_I2C 0x10 23*4882a593Smuzhiyun #define QL_VND_READ_I2C 0x11 24*4882a593Smuzhiyun #define QL_VND_FX00_MGMT_CMD 0x12 25*4882a593Smuzhiyun #define QL_VND_SERDES_OP 0x13 26*4882a593Smuzhiyun #define QL_VND_SERDES_OP_EX 0x14 27*4882a593Smuzhiyun #define QL_VND_GET_FLASH_UPDATE_CAPS 0x15 28*4882a593Smuzhiyun #define QL_VND_SET_FLASH_UPDATE_CAPS 0x16 29*4882a593Smuzhiyun #define QL_VND_GET_BBCR_DATA 0x17 30*4882a593Smuzhiyun #define QL_VND_GET_PRIV_STATS 0x18 31*4882a593Smuzhiyun #define QL_VND_DPORT_DIAGNOSTICS 0x19 32*4882a593Smuzhiyun #define QL_VND_GET_PRIV_STATS_EX 0x1A 33*4882a593Smuzhiyun #define QL_VND_SS_GET_FLASH_IMAGE_STATUS 0x1E 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* BSG Vendor specific subcode returns */ 36*4882a593Smuzhiyun #define EXT_STATUS_OK 0 37*4882a593Smuzhiyun #define EXT_STATUS_ERR 1 38*4882a593Smuzhiyun #define EXT_STATUS_BUSY 2 39*4882a593Smuzhiyun #define EXT_STATUS_INVALID_PARAM 6 40*4882a593Smuzhiyun #define EXT_STATUS_DATA_OVERRUN 7 41*4882a593Smuzhiyun #define EXT_STATUS_DATA_UNDERRUN 8 42*4882a593Smuzhiyun #define EXT_STATUS_MAILBOX 11 43*4882a593Smuzhiyun #define EXT_STATUS_NO_MEMORY 17 44*4882a593Smuzhiyun #define EXT_STATUS_DEVICE_OFFLINE 22 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* 47*4882a593Smuzhiyun * To support bidirectional iocb 48*4882a593Smuzhiyun * BSG Vendor specific returns 49*4882a593Smuzhiyun */ 50*4882a593Smuzhiyun #define EXT_STATUS_NOT_SUPPORTED 27 51*4882a593Smuzhiyun #define EXT_STATUS_INVALID_CFG 28 52*4882a593Smuzhiyun #define EXT_STATUS_DMA_ERR 29 53*4882a593Smuzhiyun #define EXT_STATUS_TIMEOUT 30 54*4882a593Smuzhiyun #define EXT_STATUS_THREAD_FAILED 31 55*4882a593Smuzhiyun #define EXT_STATUS_DATA_CMP_FAILED 32 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* BSG definations for interpreting CommandSent field */ 58*4882a593Smuzhiyun #define INT_DEF_LB_LOOPBACK_CMD 0 59*4882a593Smuzhiyun #define INT_DEF_LB_ECHO_CMD 1 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Loopback related definations */ 62*4882a593Smuzhiyun #define INTERNAL_LOOPBACK 0xF1 63*4882a593Smuzhiyun #define EXTERNAL_LOOPBACK 0xF2 64*4882a593Smuzhiyun #define ENABLE_INTERNAL_LOOPBACK 0x02 65*4882a593Smuzhiyun #define ENABLE_EXTERNAL_LOOPBACK 0x04 66*4882a593Smuzhiyun #define INTERNAL_LOOPBACK_MASK 0x000E 67*4882a593Smuzhiyun #define MAX_ELS_FRAME_PAYLOAD 252 68*4882a593Smuzhiyun #define ELS_OPCODE_BYTE 0x10 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* BSG Vendor specific definations */ 71*4882a593Smuzhiyun #define A84_ISSUE_WRITE_TYPE_CMD 0 72*4882a593Smuzhiyun #define A84_ISSUE_READ_TYPE_CMD 1 73*4882a593Smuzhiyun #define A84_CLEANUP_CMD 2 74*4882a593Smuzhiyun #define A84_ISSUE_RESET_OP_FW 3 75*4882a593Smuzhiyun #define A84_ISSUE_RESET_DIAG_FW 4 76*4882a593Smuzhiyun #define A84_ISSUE_UPDATE_OPFW_CMD 5 77*4882a593Smuzhiyun #define A84_ISSUE_UPDATE_DIAGFW_CMD 6 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct qla84_mgmt_param { 80*4882a593Smuzhiyun union { 81*4882a593Smuzhiyun struct { 82*4882a593Smuzhiyun uint32_t start_addr; 83*4882a593Smuzhiyun } mem; /* for QLA84_MGMT_READ/WRITE_MEM */ 84*4882a593Smuzhiyun struct { 85*4882a593Smuzhiyun uint32_t id; 86*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_UIF 1 87*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_FCOE_COS 2 88*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_PAUSE 3 89*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_TIMEOUTS 4 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun uint32_t param0; 92*4882a593Smuzhiyun uint32_t param1; 93*4882a593Smuzhiyun } config; /* for QLA84_MGMT_CHNG_CONFIG */ 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct { 96*4882a593Smuzhiyun uint32_t type; 97*4882a593Smuzhiyun #define QLA84_MGMT_INFO_CONFIG_LOG_DATA 1 /* Get Config Log Data */ 98*4882a593Smuzhiyun #define QLA84_MGMT_INFO_LOG_DATA 2 /* Get Log Data */ 99*4882a593Smuzhiyun #define QLA84_MGMT_INFO_PORT_STAT 3 /* Get Port Statistics */ 100*4882a593Smuzhiyun #define QLA84_MGMT_INFO_LIF_STAT 4 /* Get LIF Statistics */ 101*4882a593Smuzhiyun #define QLA84_MGMT_INFO_ASIC_STAT 5 /* Get ASIC Statistics */ 102*4882a593Smuzhiyun #define QLA84_MGMT_INFO_CONFIG_PARAMS 6 /* Get Config Parameters */ 103*4882a593Smuzhiyun #define QLA84_MGMT_INFO_PANIC_LOG 7 /* Get Panic Log */ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun uint32_t context; 106*4882a593Smuzhiyun /* 107*4882a593Smuzhiyun * context definitions for QLA84_MGMT_INFO_CONFIG_LOG_DATA 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_DEBUG_LOG 0 110*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_LEARN_LOG 1 111*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_FC_ACL_INGRESS_LOG 2 112*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_FC_ACL_EGRESS_LOG 3 113*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_ETHERNET_ACL_INGRESS_LOG 4 114*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_ETHERNET_ACL_EGRESS_LOG 5 115*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_MESSAGE_TRANSMIT_LOG 6 116*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_MESSAGE_RECEIVE_LOG 7 117*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_LINK_EVENT_LOG 8 118*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_DCX_LOG 9 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* 121*4882a593Smuzhiyun * context definitions for QLA84_MGMT_INFO_PORT_STAT 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_ETHERNET_PORT0 0 124*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_ETHERNET_PORT1 1 125*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_NSL_PORT0 2 126*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_NSL_PORT1 3 127*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_FC_PORT0 4 128*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_FC_PORT1 5 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* 132*4882a593Smuzhiyun * context definitions for QLA84_MGMT_INFO_LIF_STAT 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_ETHERNET_PORT0 0 135*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_ETHERNET_PORT1 1 136*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_FC_PORT0 2 137*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_FC_PORT1 3 138*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_CPU 6 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun } info; /* for QLA84_MGMT_GET_INFO */ 141*4882a593Smuzhiyun } u; 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun struct qla84_msg_mgmt { 145*4882a593Smuzhiyun uint16_t cmd; 146*4882a593Smuzhiyun #define QLA84_MGMT_READ_MEM 0x00 147*4882a593Smuzhiyun #define QLA84_MGMT_WRITE_MEM 0x01 148*4882a593Smuzhiyun #define QLA84_MGMT_CHNG_CONFIG 0x02 149*4882a593Smuzhiyun #define QLA84_MGMT_GET_INFO 0x03 150*4882a593Smuzhiyun uint16_t rsrvd; 151*4882a593Smuzhiyun struct qla84_mgmt_param mgmtp;/* parameters for cmd */ 152*4882a593Smuzhiyun uint32_t len; /* bytes in payload following this struct */ 153*4882a593Smuzhiyun uint8_t payload[0]; /* payload for cmd */ 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun struct qla_bsg_a84_mgmt { 157*4882a593Smuzhiyun struct qla84_msg_mgmt mgmt; 158*4882a593Smuzhiyun } __attribute__ ((packed)); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct qla_scsi_addr { 161*4882a593Smuzhiyun uint16_t bus; 162*4882a593Smuzhiyun uint16_t target; 163*4882a593Smuzhiyun } __attribute__ ((packed)); 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct qla_ext_dest_addr { 166*4882a593Smuzhiyun union { 167*4882a593Smuzhiyun uint8_t wwnn[8]; 168*4882a593Smuzhiyun uint8_t wwpn[8]; 169*4882a593Smuzhiyun uint8_t id[4]; 170*4882a593Smuzhiyun struct qla_scsi_addr scsi_addr; 171*4882a593Smuzhiyun } dest_addr; 172*4882a593Smuzhiyun uint16_t dest_type; 173*4882a593Smuzhiyun #define EXT_DEF_TYPE_WWPN 2 174*4882a593Smuzhiyun uint16_t lun; 175*4882a593Smuzhiyun uint16_t padding[2]; 176*4882a593Smuzhiyun } __attribute__ ((packed)); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun struct qla_port_param { 179*4882a593Smuzhiyun struct qla_ext_dest_addr fc_scsi_addr; 180*4882a593Smuzhiyun uint16_t mode; 181*4882a593Smuzhiyun uint16_t speed; 182*4882a593Smuzhiyun } __attribute__ ((packed)); 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* FRU VPD */ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define MAX_FRU_SIZE 36 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun struct qla_field_address { 190*4882a593Smuzhiyun uint16_t offset; 191*4882a593Smuzhiyun uint16_t device; 192*4882a593Smuzhiyun uint16_t option; 193*4882a593Smuzhiyun } __packed; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct qla_field_info { 196*4882a593Smuzhiyun uint8_t version[MAX_FRU_SIZE]; 197*4882a593Smuzhiyun } __packed; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct qla_image_version { 200*4882a593Smuzhiyun struct qla_field_address field_address; 201*4882a593Smuzhiyun struct qla_field_info field_info; 202*4882a593Smuzhiyun } __packed; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct qla_image_version_list { 205*4882a593Smuzhiyun uint32_t count; 206*4882a593Smuzhiyun struct qla_image_version version[0]; 207*4882a593Smuzhiyun } __packed; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun struct qla_status_reg { 210*4882a593Smuzhiyun struct qla_field_address field_address; 211*4882a593Smuzhiyun uint8_t status_reg; 212*4882a593Smuzhiyun uint8_t reserved[7]; 213*4882a593Smuzhiyun } __packed; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun struct qla_i2c_access { 216*4882a593Smuzhiyun uint16_t device; 217*4882a593Smuzhiyun uint16_t offset; 218*4882a593Smuzhiyun uint16_t option; 219*4882a593Smuzhiyun uint16_t length; 220*4882a593Smuzhiyun uint8_t buffer[0x40]; 221*4882a593Smuzhiyun } __packed; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /* 26xx serdes register interface */ 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* serdes reg commands */ 226*4882a593Smuzhiyun #define INT_SC_SERDES_READ_REG 1 227*4882a593Smuzhiyun #define INT_SC_SERDES_WRITE_REG 2 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun struct qla_serdes_reg { 230*4882a593Smuzhiyun uint16_t cmd; 231*4882a593Smuzhiyun uint16_t addr; 232*4882a593Smuzhiyun uint16_t val; 233*4882a593Smuzhiyun } __packed; 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun struct qla_serdes_reg_ex { 236*4882a593Smuzhiyun uint16_t cmd; 237*4882a593Smuzhiyun uint32_t addr; 238*4882a593Smuzhiyun uint32_t val; 239*4882a593Smuzhiyun } __packed; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun struct qla_flash_update_caps { 242*4882a593Smuzhiyun uint64_t capabilities; 243*4882a593Smuzhiyun uint32_t outage_duration; 244*4882a593Smuzhiyun uint8_t reserved[20]; 245*4882a593Smuzhiyun } __packed; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* BB_CR Status */ 248*4882a593Smuzhiyun #define QLA_BBCR_STATUS_DISABLED 0 249*4882a593Smuzhiyun #define QLA_BBCR_STATUS_ENABLED 1 250*4882a593Smuzhiyun #define QLA_BBCR_STATUS_UNKNOWN 2 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /* BB_CR State */ 253*4882a593Smuzhiyun #define QLA_BBCR_STATE_OFFLINE 0 254*4882a593Smuzhiyun #define QLA_BBCR_STATE_ONLINE 1 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* BB_CR Offline Reason Code */ 257*4882a593Smuzhiyun #define QLA_BBCR_REASON_PORT_SPEED 1 258*4882a593Smuzhiyun #define QLA_BBCR_REASON_PEER_PORT 2 259*4882a593Smuzhiyun #define QLA_BBCR_REASON_SWITCH 3 260*4882a593Smuzhiyun #define QLA_BBCR_REASON_LOGIN_REJECT 4 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun struct qla_bbcr_data { 263*4882a593Smuzhiyun uint8_t status; /* 1 - enabled, 0 - Disabled */ 264*4882a593Smuzhiyun uint8_t state; /* 1 - online, 0 - offline */ 265*4882a593Smuzhiyun uint8_t configured_bbscn; /* 0-15 */ 266*4882a593Smuzhiyun uint8_t negotiated_bbscn; /* 0-15 */ 267*4882a593Smuzhiyun uint8_t offline_reason_code; 268*4882a593Smuzhiyun uint16_t mbx1; /* Port state */ 269*4882a593Smuzhiyun uint8_t reserved[9]; 270*4882a593Smuzhiyun } __packed; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun struct qla_dport_diag { 273*4882a593Smuzhiyun uint16_t options; 274*4882a593Smuzhiyun uint32_t buf[16]; 275*4882a593Smuzhiyun uint8_t unused[62]; 276*4882a593Smuzhiyun } __packed; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun /* D_Port options */ 279*4882a593Smuzhiyun #define QLA_DPORT_RESULT 0x0 280*4882a593Smuzhiyun #define QLA_DPORT_START 0x2 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /* active images in flash */ 283*4882a593Smuzhiyun struct qla_active_regions { 284*4882a593Smuzhiyun uint8_t global_image; 285*4882a593Smuzhiyun uint8_t board_config; 286*4882a593Smuzhiyun uint8_t vpd_nvram; 287*4882a593Smuzhiyun uint8_t npiv_config_0_1; 288*4882a593Smuzhiyun uint8_t npiv_config_2_3; 289*4882a593Smuzhiyun uint8_t reserved[32]; 290*4882a593Smuzhiyun } __packed; 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun #endif 293