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_MR_H 7*4882a593Smuzhiyun #define __QLA_MR_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "qla_dsd.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* 12*4882a593Smuzhiyun * The PCI VendorID and DeviceID for our board. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #define PCI_DEVICE_ID_QLOGIC_ISPF001 0xF001 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* FX00 specific definitions */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define FX00_COMMAND_TYPE_7 0x07 /* Command Type 7 entry for 7XXX */ 19*4882a593Smuzhiyun struct cmd_type_7_fx00 { 20*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 21*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 22*4882a593Smuzhiyun uint8_t sys_define; /* System defined. */ 23*4882a593Smuzhiyun uint8_t entry_status; /* Entry Status. */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun uint32_t handle; /* System handle. */ 26*4882a593Smuzhiyun uint8_t reserved_0; 27*4882a593Smuzhiyun uint8_t port_path_ctrl; 28*4882a593Smuzhiyun uint16_t reserved_1; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun __le16 tgt_idx; /* Target Idx. */ 31*4882a593Smuzhiyun uint16_t timeout; /* Command timeout. */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun __le16 dseg_count; /* Data segment count. */ 34*4882a593Smuzhiyun uint8_t scsi_rsp_dsd_len; 35*4882a593Smuzhiyun uint8_t reserved_2; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun struct scsi_lun lun; /* LUN (LE). */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun uint8_t cntrl_flags; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun uint8_t task_mgmt_flags; /* Task management flags. */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun uint8_t task; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun uint8_t crn; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun uint8_t fcp_cdb[MAX_CMDSZ]; /* SCSI command words. */ 48*4882a593Smuzhiyun __le32 byte_count; /* Total byte count. */ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct dsd64 dsd; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define STATUS_TYPE_FX00 0x01 /* Status entry. */ 54*4882a593Smuzhiyun struct sts_entry_fx00 { 55*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 56*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 57*4882a593Smuzhiyun uint8_t sys_define; /* System defined. */ 58*4882a593Smuzhiyun uint8_t entry_status; /* Entry Status. */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun uint32_t handle; /* System handle. */ 61*4882a593Smuzhiyun uint32_t reserved_3; /* System handle. */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun __le16 comp_status; /* Completion status. */ 64*4882a593Smuzhiyun uint16_t reserved_0; /* OX_ID used by the firmware. */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun __le32 residual_len; /* FW calc residual transfer length. */ 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun uint16_t reserved_1; 69*4882a593Smuzhiyun uint16_t state_flags; /* State flags. */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun uint16_t reserved_2; 72*4882a593Smuzhiyun __le16 scsi_status; /* SCSI status. */ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun uint32_t sense_len; /* FCP SENSE length. */ 75*4882a593Smuzhiyun uint8_t data[32]; /* FCP response/sense information. */ 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define MAX_HANDLE_COUNT 15 80*4882a593Smuzhiyun #define MULTI_STATUS_TYPE_FX00 0x0D 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct multi_sts_entry_fx00 { 83*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 84*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 85*4882a593Smuzhiyun uint8_t handle_count; 86*4882a593Smuzhiyun uint8_t entry_status; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun __le32 handles[MAX_HANDLE_COUNT]; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define TSK_MGMT_IOCB_TYPE_FX00 0x05 92*4882a593Smuzhiyun struct tsk_mgmt_entry_fx00 { 93*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 94*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 95*4882a593Smuzhiyun uint8_t sys_define; 96*4882a593Smuzhiyun uint8_t entry_status; /* Entry Status. */ 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun uint32_t handle; /* System handle. */ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun uint32_t reserved_0; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun __le16 tgt_id; /* Target Idx. */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun uint16_t reserved_1; 105*4882a593Smuzhiyun uint16_t reserved_3; 106*4882a593Smuzhiyun uint16_t reserved_4; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct scsi_lun lun; /* LUN (LE). */ 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun __le32 control_flags; /* Control Flags. */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun uint8_t reserved_2[32]; 113*4882a593Smuzhiyun }; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define ABORT_IOCB_TYPE_FX00 0x08 /* Abort IOCB status. */ 117*4882a593Smuzhiyun struct abort_iocb_entry_fx00 { 118*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 119*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 120*4882a593Smuzhiyun uint8_t sys_define; /* System defined. */ 121*4882a593Smuzhiyun uint8_t entry_status; /* Entry Status. */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun uint32_t handle; /* System handle. */ 124*4882a593Smuzhiyun __le32 reserved_0; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun __le16 tgt_id_sts; /* Completion status. */ 127*4882a593Smuzhiyun __le16 options; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun uint32_t abort_handle; /* System handle. */ 130*4882a593Smuzhiyun __le32 reserved_2; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun __le16 req_que_no; 133*4882a593Smuzhiyun uint8_t reserved_1[38]; 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define IOCTL_IOSB_TYPE_FX00 0x0C 137*4882a593Smuzhiyun struct ioctl_iocb_entry_fx00 { 138*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 139*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 140*4882a593Smuzhiyun uint8_t sys_define; /* System defined. */ 141*4882a593Smuzhiyun uint8_t entry_status; /* Entry Status. */ 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun uint32_t handle; /* System handle. */ 144*4882a593Smuzhiyun uint32_t reserved_0; /* System handle. */ 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun uint16_t comp_func_num; 147*4882a593Smuzhiyun __le16 fw_iotcl_flags; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun __le32 dataword_r; /* Data word returned */ 150*4882a593Smuzhiyun uint32_t adapid; /* Adapter ID */ 151*4882a593Smuzhiyun uint32_t dataword_r_extra; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun __le32 seq_no; 154*4882a593Smuzhiyun uint8_t reserved_2[20]; 155*4882a593Smuzhiyun uint32_t residuallen; 156*4882a593Smuzhiyun __le32 status; 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #define STATUS_CONT_TYPE_FX00 0x04 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #define FX00_IOCB_TYPE 0x0B 162*4882a593Smuzhiyun struct fxdisc_entry_fx00 { 163*4882a593Smuzhiyun uint8_t entry_type; /* Entry type. */ 164*4882a593Smuzhiyun uint8_t entry_count; /* Entry count. */ 165*4882a593Smuzhiyun uint8_t sys_define; /* System Defined. */ 166*4882a593Smuzhiyun uint8_t entry_status; /* Entry Status. */ 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun uint32_t handle; /* System handle. */ 169*4882a593Smuzhiyun __le32 reserved_0; /* System handle. */ 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun __le16 func_num; 172*4882a593Smuzhiyun __le16 req_xfrcnt; 173*4882a593Smuzhiyun __le16 req_dsdcnt; 174*4882a593Smuzhiyun __le16 rsp_xfrcnt; 175*4882a593Smuzhiyun __le16 rsp_dsdcnt; 176*4882a593Smuzhiyun uint8_t flags; 177*4882a593Smuzhiyun uint8_t reserved_1; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct dsd64 dseg_rq; 180*4882a593Smuzhiyun struct dsd64 dseg_rsp; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun __le32 dataword; 183*4882a593Smuzhiyun __le32 adapid; 184*4882a593Smuzhiyun __le32 adapid_hi; 185*4882a593Smuzhiyun __le32 dataword_extra; 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun struct qlafx00_tgt_node_info { 189*4882a593Smuzhiyun uint8_t tgt_node_wwpn[WWN_SIZE]; 190*4882a593Smuzhiyun uint8_t tgt_node_wwnn[WWN_SIZE]; 191*4882a593Smuzhiyun uint32_t tgt_node_state; 192*4882a593Smuzhiyun uint8_t reserved[128]; 193*4882a593Smuzhiyun uint32_t reserved_1[8]; 194*4882a593Smuzhiyun uint64_t reserved_2[4]; 195*4882a593Smuzhiyun } __packed; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define QLAFX00_TGT_NODE_INFO sizeof(struct qlafx00_tgt_node_info) 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define QLAFX00_LINK_STATUS_DOWN 0x10 200*4882a593Smuzhiyun #define QLAFX00_LINK_STATUS_UP 0x11 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #define QLAFX00_PORT_SPEED_2G 0x2 203*4882a593Smuzhiyun #define QLAFX00_PORT_SPEED_4G 0x4 204*4882a593Smuzhiyun #define QLAFX00_PORT_SPEED_8G 0x8 205*4882a593Smuzhiyun #define QLAFX00_PORT_SPEED_10G 0xa 206*4882a593Smuzhiyun struct port_info_data { 207*4882a593Smuzhiyun uint8_t port_state; 208*4882a593Smuzhiyun uint8_t port_type; 209*4882a593Smuzhiyun uint16_t port_identifier; 210*4882a593Smuzhiyun uint32_t up_port_state; 211*4882a593Smuzhiyun uint8_t fw_ver_num[32]; 212*4882a593Smuzhiyun uint8_t portal_attrib; 213*4882a593Smuzhiyun uint16_t host_option; 214*4882a593Smuzhiyun uint8_t reset_delay; 215*4882a593Smuzhiyun uint8_t pdwn_retry_cnt; 216*4882a593Smuzhiyun uint16_t max_luns2tgt; 217*4882a593Smuzhiyun uint8_t risc_ver; 218*4882a593Smuzhiyun uint8_t pconn_option; 219*4882a593Smuzhiyun uint16_t risc_option; 220*4882a593Smuzhiyun uint16_t max_frame_len; 221*4882a593Smuzhiyun uint16_t max_iocb_alloc; 222*4882a593Smuzhiyun uint16_t exec_throttle; 223*4882a593Smuzhiyun uint8_t retry_cnt; 224*4882a593Smuzhiyun uint8_t retry_delay; 225*4882a593Smuzhiyun uint8_t port_name[8]; 226*4882a593Smuzhiyun uint8_t port_id[3]; 227*4882a593Smuzhiyun uint8_t link_status; 228*4882a593Smuzhiyun uint8_t plink_rate; 229*4882a593Smuzhiyun uint32_t link_config; 230*4882a593Smuzhiyun uint16_t adap_haddr; 231*4882a593Smuzhiyun uint8_t tgt_disc; 232*4882a593Smuzhiyun uint8_t log_tout; 233*4882a593Smuzhiyun uint8_t node_name[8]; 234*4882a593Smuzhiyun uint16_t erisc_opt1; 235*4882a593Smuzhiyun uint8_t resp_acc_tmr; 236*4882a593Smuzhiyun uint8_t intr_del_tmr; 237*4882a593Smuzhiyun uint8_t erisc_opt2; 238*4882a593Smuzhiyun uint8_t alt_port_name[8]; 239*4882a593Smuzhiyun uint8_t alt_node_name[8]; 240*4882a593Smuzhiyun uint8_t link_down_tout; 241*4882a593Smuzhiyun uint8_t conn_type; 242*4882a593Smuzhiyun uint8_t fc_fw_mode; 243*4882a593Smuzhiyun uint32_t uiReserved[48]; 244*4882a593Smuzhiyun } __packed; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* OS Type Designations */ 247*4882a593Smuzhiyun #define OS_TYPE_UNKNOWN 0 248*4882a593Smuzhiyun #define OS_TYPE_LINUX 2 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* Linux Info */ 251*4882a593Smuzhiyun #define SYSNAME_LENGTH 128 252*4882a593Smuzhiyun #define NODENAME_LENGTH 64 253*4882a593Smuzhiyun #define RELEASE_LENGTH 64 254*4882a593Smuzhiyun #define VERSION_LENGTH 64 255*4882a593Smuzhiyun #define MACHINE_LENGTH 64 256*4882a593Smuzhiyun #define DOMNAME_LENGTH 64 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun struct host_system_info { 259*4882a593Smuzhiyun uint32_t os_type; 260*4882a593Smuzhiyun char sysname[SYSNAME_LENGTH]; 261*4882a593Smuzhiyun char nodename[NODENAME_LENGTH]; 262*4882a593Smuzhiyun char release[RELEASE_LENGTH]; 263*4882a593Smuzhiyun char version[VERSION_LENGTH]; 264*4882a593Smuzhiyun char machine[MACHINE_LENGTH]; 265*4882a593Smuzhiyun char domainname[DOMNAME_LENGTH]; 266*4882a593Smuzhiyun char hostdriver[VERSION_LENGTH]; 267*4882a593Smuzhiyun uint32_t reserved[64]; 268*4882a593Smuzhiyun } __packed; 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun struct register_host_info { 271*4882a593Smuzhiyun struct host_system_info hsi; /* host system info */ 272*4882a593Smuzhiyun uint64_t utc; /* UTC (system time) */ 273*4882a593Smuzhiyun uint32_t reserved[64]; /* future additions */ 274*4882a593Smuzhiyun } __packed; 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #define QLAFX00_PORT_DATA_INFO (sizeof(struct port_info_data)) 278*4882a593Smuzhiyun #define QLAFX00_TGT_NODE_LIST_SIZE (sizeof(uint32_t) * 32) 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun struct config_info_data { 281*4882a593Smuzhiyun uint8_t model_num[16]; 282*4882a593Smuzhiyun uint8_t model_description[80]; 283*4882a593Smuzhiyun uint8_t reserved0[160]; 284*4882a593Smuzhiyun uint8_t symbolic_name[64]; 285*4882a593Smuzhiyun uint8_t serial_num[32]; 286*4882a593Smuzhiyun uint8_t hw_version[16]; 287*4882a593Smuzhiyun uint8_t fw_version[16]; 288*4882a593Smuzhiyun uint8_t uboot_version[16]; 289*4882a593Smuzhiyun uint8_t fru_serial_num[32]; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun uint8_t fc_port_count; 292*4882a593Smuzhiyun uint8_t iscsi_port_count; 293*4882a593Smuzhiyun uint8_t reserved1[2]; 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun uint8_t mode; 296*4882a593Smuzhiyun uint8_t log_level; 297*4882a593Smuzhiyun uint8_t reserved2[2]; 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun uint32_t log_size; 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun uint8_t tgt_pres_mode; 302*4882a593Smuzhiyun uint8_t iqn_flags; 303*4882a593Smuzhiyun uint8_t lun_mapping; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun uint64_t adapter_id; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun uint32_t cluster_key_len; 308*4882a593Smuzhiyun uint8_t cluster_key[16]; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun uint64_t cluster_master_id; 311*4882a593Smuzhiyun uint64_t cluster_slave_id; 312*4882a593Smuzhiyun uint8_t cluster_flags; 313*4882a593Smuzhiyun uint32_t enabled_capabilities; 314*4882a593Smuzhiyun uint32_t nominal_temp_value; 315*4882a593Smuzhiyun } __packed; 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun #define FXDISC_GET_CONFIG_INFO 0x01 318*4882a593Smuzhiyun #define FXDISC_GET_PORT_INFO 0x02 319*4882a593Smuzhiyun #define FXDISC_GET_TGT_NODE_INFO 0x80 320*4882a593Smuzhiyun #define FXDISC_GET_TGT_NODE_LIST 0x81 321*4882a593Smuzhiyun #define FXDISC_REG_HOST_INFO 0x99 322*4882a593Smuzhiyun #define FXDISC_ABORT_IOCTL 0xff 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #define QLAFX00_HBA_ICNTRL_REG 0x20B08 325*4882a593Smuzhiyun #define QLAFX00_ICR_ENB_MASK 0x80000000 326*4882a593Smuzhiyun #define QLAFX00_ICR_DIS_MASK 0x7fffffff 327*4882a593Smuzhiyun #define QLAFX00_HST_RST_REG 0x18264 328*4882a593Smuzhiyun #define QLAFX00_SOC_TEMP_REG 0x184C4 329*4882a593Smuzhiyun #define QLAFX00_HST_TO_HBA_REG 0x20A04 330*4882a593Smuzhiyun #define QLAFX00_HBA_TO_HOST_REG 0x21B70 331*4882a593Smuzhiyun #define QLAFX00_HST_INT_STS_BITS 0x7 332*4882a593Smuzhiyun #define QLAFX00_BAR1_BASE_ADDR_REG 0x40018 333*4882a593Smuzhiyun #define QLAFX00_PEX0_WIN0_BASE_ADDR_REG 0x41824 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun #define QLAFX00_INTR_MB_CMPLT 0x1 336*4882a593Smuzhiyun #define QLAFX00_INTR_RSP_CMPLT 0x2 337*4882a593Smuzhiyun #define QLAFX00_INTR_ASYNC_CMPLT 0x4 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun #define QLAFX00_MBA_SYSTEM_ERR 0x8002 340*4882a593Smuzhiyun #define QLAFX00_MBA_TEMP_OVER 0x8005 341*4882a593Smuzhiyun #define QLAFX00_MBA_TEMP_NORM 0x8006 342*4882a593Smuzhiyun #define QLAFX00_MBA_TEMP_CRIT 0x8007 343*4882a593Smuzhiyun #define QLAFX00_MBA_LINK_UP 0x8011 344*4882a593Smuzhiyun #define QLAFX00_MBA_LINK_DOWN 0x8012 345*4882a593Smuzhiyun #define QLAFX00_MBA_PORT_UPDATE 0x8014 346*4882a593Smuzhiyun #define QLAFX00_MBA_SHUTDOWN_RQSTD 0x8062 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun #define SOC_SW_RST_CONTROL_REG_CORE0 0x0020800 349*4882a593Smuzhiyun #define SOC_FABRIC_RST_CONTROL_REG 0x0020840 350*4882a593Smuzhiyun #define SOC_FABRIC_CONTROL_REG 0x0020200 351*4882a593Smuzhiyun #define SOC_FABRIC_CONFIG_REG 0x0020204 352*4882a593Smuzhiyun #define SOC_PWR_MANAGEMENT_PWR_DOWN_REG 0x001820C 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun #define SOC_INTERRUPT_SOURCE_I_CONTROL_REG 0x0020B00 355*4882a593Smuzhiyun #define SOC_CORE_TIMER_REG 0x0021850 356*4882a593Smuzhiyun #define SOC_IRQ_ACK_REG 0x00218b4 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun #define CONTINUE_A64_TYPE_FX00 0x03 /* Continuation entry. */ 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun #define QLAFX00_SET_HST_INTR(ha, value) \ 361*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + QLAFX00_HST_TO_HBA_REG, \ 362*4882a593Smuzhiyun value) 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun #define QLAFX00_CLR_HST_INTR(ha, value) \ 365*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + QLAFX00_HBA_TO_HOST_REG, \ 366*4882a593Smuzhiyun ~value) 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun #define QLAFX00_RD_INTR_REG(ha) \ 369*4882a593Smuzhiyun rd_reg_dword((ha)->cregbase + QLAFX00_HBA_TO_HOST_REG) 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define QLAFX00_CLR_INTR_REG(ha, value) \ 372*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + QLAFX00_HBA_TO_HOST_REG, \ 373*4882a593Smuzhiyun ~value) 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun #define QLAFX00_SET_HBA_SOC_REG(ha, off, val)\ 376*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + off, val) 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun #define QLAFX00_GET_HBA_SOC_REG(ha, off)\ 379*4882a593Smuzhiyun rd_reg_dword((ha)->cregbase + off) 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun #define QLAFX00_HBA_RST_REG(ha, val)\ 382*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + QLAFX00_HST_RST_REG, val) 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun #define QLAFX00_RD_ICNTRL_REG(ha) \ 385*4882a593Smuzhiyun rd_reg_dword((ha)->cregbase + QLAFX00_HBA_ICNTRL_REG) 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun #define QLAFX00_ENABLE_ICNTRL_REG(ha) \ 388*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + QLAFX00_HBA_ICNTRL_REG, \ 389*4882a593Smuzhiyun (QLAFX00_GET_HBA_SOC_REG(ha, QLAFX00_HBA_ICNTRL_REG) | \ 390*4882a593Smuzhiyun QLAFX00_ICR_ENB_MASK)) 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun #define QLAFX00_DISABLE_ICNTRL_REG(ha) \ 393*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + QLAFX00_HBA_ICNTRL_REG, \ 394*4882a593Smuzhiyun (QLAFX00_GET_HBA_SOC_REG(ha, QLAFX00_HBA_ICNTRL_REG) & \ 395*4882a593Smuzhiyun QLAFX00_ICR_DIS_MASK)) 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun #define QLAFX00_RD_REG(ha, off) \ 398*4882a593Smuzhiyun rd_reg_dword((ha)->cregbase + off) 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun #define QLAFX00_WR_REG(ha, off, val) \ 401*4882a593Smuzhiyun wrt_reg_dword((ha)->cregbase + off, val) 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun struct qla_mt_iocb_rqst_fx00 { 404*4882a593Smuzhiyun __le32 reserved_0; 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun __le16 func_type; 407*4882a593Smuzhiyun uint8_t flags; 408*4882a593Smuzhiyun uint8_t reserved_1; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun __le32 dataword; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun __le32 adapid; 413*4882a593Smuzhiyun __le32 adapid_hi; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun __le32 dataword_extra; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun __le16 req_len; 418*4882a593Smuzhiyun __le16 reserved_2; 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun __le16 rsp_len; 421*4882a593Smuzhiyun __le16 reserved_3; 422*4882a593Smuzhiyun }; 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun struct qla_mt_iocb_rsp_fx00 { 425*4882a593Smuzhiyun uint32_t reserved_1; 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun uint16_t func_type; 428*4882a593Smuzhiyun __le16 ioctl_flags; 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun __le32 ioctl_data; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun uint32_t adapid; 433*4882a593Smuzhiyun uint32_t adapid_hi; 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun uint32_t reserved_2; 436*4882a593Smuzhiyun __le32 seq_number; 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun uint8_t reserved_3[20]; 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun int32_t res_count; 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun __le32 status; 443*4882a593Smuzhiyun }; 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun #define MAILBOX_REGISTER_COUNT_FX00 16 447*4882a593Smuzhiyun #define AEN_MAILBOX_REGISTER_COUNT_FX00 8 448*4882a593Smuzhiyun #define MAX_FIBRE_DEVICES_FX00 512 449*4882a593Smuzhiyun #define MAX_LUNS_FX00 0x1024 450*4882a593Smuzhiyun #define MAX_TARGETS_FX00 MAX_ISA_DEVICES 451*4882a593Smuzhiyun #define REQUEST_ENTRY_CNT_FX00 512 /* Number of request entries. */ 452*4882a593Smuzhiyun #define RESPONSE_ENTRY_CNT_FX00 256 /* Number of response entries.*/ 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* 455*4882a593Smuzhiyun * Firmware state codes for QLAFX00 adapters 456*4882a593Smuzhiyun */ 457*4882a593Smuzhiyun #define FSTATE_FX00_CONFIG_WAIT 0x0000 /* Waiting for driver to issue 458*4882a593Smuzhiyun * Initialize FW Mbox cmd 459*4882a593Smuzhiyun */ 460*4882a593Smuzhiyun #define FSTATE_FX00_INITIALIZED 0x1000 /* FW has been initialized by 461*4882a593Smuzhiyun * the driver 462*4882a593Smuzhiyun */ 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun #define FX00_DEF_RATOV 10 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun struct mr_data_fx00 { 467*4882a593Smuzhiyun uint8_t symbolic_name[64]; 468*4882a593Smuzhiyun uint8_t serial_num[32]; 469*4882a593Smuzhiyun uint8_t hw_version[16]; 470*4882a593Smuzhiyun uint8_t fw_version[16]; 471*4882a593Smuzhiyun uint8_t uboot_version[16]; 472*4882a593Smuzhiyun uint8_t fru_serial_num[32]; 473*4882a593Smuzhiyun fc_port_t fcport; /* fcport used for requests 474*4882a593Smuzhiyun * that are not linked 475*4882a593Smuzhiyun * to a particular target 476*4882a593Smuzhiyun */ 477*4882a593Smuzhiyun uint8_t fw_hbt_en; 478*4882a593Smuzhiyun uint8_t fw_hbt_cnt; 479*4882a593Smuzhiyun uint8_t fw_hbt_miss_cnt; 480*4882a593Smuzhiyun uint32_t old_fw_hbt_cnt; 481*4882a593Smuzhiyun uint16_t fw_reset_timer_tick; 482*4882a593Smuzhiyun uint8_t fw_reset_timer_exp; 483*4882a593Smuzhiyun uint16_t fw_critemp_timer_tick; 484*4882a593Smuzhiyun uint32_t old_aenmbx0_state; 485*4882a593Smuzhiyun uint32_t critical_temperature; 486*4882a593Smuzhiyun bool extended_io_enabled; 487*4882a593Smuzhiyun bool host_info_resend; 488*4882a593Smuzhiyun uint8_t hinfo_resend_timer_tick; 489*4882a593Smuzhiyun }; 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun #define QLAFX00_EXTENDED_IO_EN_MASK 0x20 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* 494*4882a593Smuzhiyun * SoC Junction Temperature is stored in 495*4882a593Smuzhiyun * bits 9:1 of SoC Junction Temperature Register 496*4882a593Smuzhiyun * in a firmware specific format format. 497*4882a593Smuzhiyun * To get the temperature in Celsius degrees 498*4882a593Smuzhiyun * the value from this bitfiled should be converted 499*4882a593Smuzhiyun * using this formula: 500*4882a593Smuzhiyun * Temperature (degrees C) = ((3,153,000 - (10,000 * X)) / 13,825) 501*4882a593Smuzhiyun * where X is the bit field value 502*4882a593Smuzhiyun * this macro reads the register, extracts the bitfield value, 503*4882a593Smuzhiyun * performs the calcualtions and returns temperature in Celsius 504*4882a593Smuzhiyun */ 505*4882a593Smuzhiyun #define QLAFX00_GET_TEMPERATURE(ha) ((3153000 - (10000 * \ 506*4882a593Smuzhiyun ((QLAFX00_RD_REG(ha, QLAFX00_SOC_TEMP_REG) & 0x3FE) >> 1))) / 13825) 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun #define QLAFX00_LOOP_DOWN_TIME 615 /* 600 */ 510*4882a593Smuzhiyun #define QLAFX00_HEARTBEAT_INTERVAL 6 /* number of seconds */ 511*4882a593Smuzhiyun #define QLAFX00_HEARTBEAT_MISS_CNT 3 /* number of miss */ 512*4882a593Smuzhiyun #define QLAFX00_RESET_INTERVAL 120 /* number of seconds */ 513*4882a593Smuzhiyun #define QLAFX00_MAX_RESET_INTERVAL 600 /* number of seconds */ 514*4882a593Smuzhiyun #define QLAFX00_CRITEMP_INTERVAL 60 /* number of seconds */ 515*4882a593Smuzhiyun #define QLAFX00_HINFO_RESEND_INTERVAL 60 /* number of seconds */ 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun #define QLAFX00_CRITEMP_THRSHLD 80 /* Celsius degrees */ 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun /* Max conncurrent IOs that can be queued */ 520*4882a593Smuzhiyun #define QLAFX00_MAX_CANQUEUE 1024 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun /* IOCTL IOCB abort success */ 523*4882a593Smuzhiyun #define QLAFX00_IOCTL_ICOB_ABORT_SUCCESS 0x68 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun #endif 526