1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux network driver for QLogic BR-series Converged Network Adapter. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 7*4882a593Smuzhiyun * Copyright (c) 2014-2015 QLogic Corporation 8*4882a593Smuzhiyun * All rights reserved 9*4882a593Smuzhiyun * www.qlogic.com 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun #ifndef __BFI_H__ 12*4882a593Smuzhiyun #define __BFI_H__ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include "bfa_defs.h" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* BFI FW image type */ 17*4882a593Smuzhiyun #define BFI_FLASH_CHUNK_SZ 256 /*!< Flash chunk size */ 18*4882a593Smuzhiyun #define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32)) 19*4882a593Smuzhiyun #define BFI_FLASH_IMAGE_SZ 0x100000 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* Msg header common to all msgs */ 22*4882a593Smuzhiyun struct bfi_mhdr { 23*4882a593Smuzhiyun u8 msg_class; /*!< @ref enum bfi_mclass */ 24*4882a593Smuzhiyun u8 msg_id; /*!< msg opcode with in the class */ 25*4882a593Smuzhiyun union { 26*4882a593Smuzhiyun struct { 27*4882a593Smuzhiyun u8 qid; 28*4882a593Smuzhiyun u8 fn_lpu; /*!< msg destination */ 29*4882a593Smuzhiyun } __packed h2i; 30*4882a593Smuzhiyun u16 i2htok; /*!< token in msgs to host */ 31*4882a593Smuzhiyun } __packed mtag; 32*4882a593Smuzhiyun } __packed; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define bfi_fn_lpu(__fn, __lpu) ((__fn) << 1 | (__lpu)) 35*4882a593Smuzhiyun #define bfi_mhdr_2_fn(_mh) ((_mh)->mtag.h2i.fn_lpu >> 1) 36*4882a593Smuzhiyun #define bfi_mhdr_2_qid(_mh) ((_mh)->mtag.h2i.qid) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do { \ 39*4882a593Smuzhiyun (_mh).msg_class = (_mc); \ 40*4882a593Smuzhiyun (_mh).msg_id = (_op); \ 41*4882a593Smuzhiyun (_mh).mtag.h2i.fn_lpu = (_fn_lpu); \ 42*4882a593Smuzhiyun } while (0) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define bfi_i2h_set(_mh, _mc, _op, _i2htok) do { \ 45*4882a593Smuzhiyun (_mh).msg_class = (_mc); \ 46*4882a593Smuzhiyun (_mh).msg_id = (_op); \ 47*4882a593Smuzhiyun (_mh).mtag.i2htok = (_i2htok); \ 48*4882a593Smuzhiyun } while (0) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * Message opcodes: 0-127 to firmware, 128-255 to host 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun #define BFI_I2H_OPCODE_BASE 128 54*4882a593Smuzhiyun #define BFA_I2HM(_x) ((_x) + BFI_I2H_OPCODE_BASE) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /**************************************************************************** 57*4882a593Smuzhiyun * 58*4882a593Smuzhiyun * Scatter Gather Element and Page definition 59*4882a593Smuzhiyun * 60*4882a593Smuzhiyun **************************************************************************** 61*4882a593Smuzhiyun */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* DMA addresses */ 64*4882a593Smuzhiyun union bfi_addr_u { 65*4882a593Smuzhiyun struct { 66*4882a593Smuzhiyun u32 addr_lo; 67*4882a593Smuzhiyun u32 addr_hi; 68*4882a593Smuzhiyun } __packed a32; 69*4882a593Smuzhiyun } __packed; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* Generic DMA addr-len pair. */ 72*4882a593Smuzhiyun struct bfi_alen { 73*4882a593Smuzhiyun union bfi_addr_u al_addr; /* DMA addr of buffer */ 74*4882a593Smuzhiyun u32 al_len; /* length of buffer */ 75*4882a593Smuzhiyun } __packed; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* 78*4882a593Smuzhiyun * Large Message structure - 128 Bytes size Msgs 79*4882a593Smuzhiyun */ 80*4882a593Smuzhiyun #define BFI_LMSG_SZ 128 81*4882a593Smuzhiyun #define BFI_LMSG_PL_WSZ \ 82*4882a593Smuzhiyun ((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* Mailbox message structure */ 85*4882a593Smuzhiyun #define BFI_MBMSG_SZ 7 86*4882a593Smuzhiyun struct bfi_mbmsg { 87*4882a593Smuzhiyun struct bfi_mhdr mh; 88*4882a593Smuzhiyun u32 pl[BFI_MBMSG_SZ]; 89*4882a593Smuzhiyun } __packed; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Supported PCI function class codes (personality) */ 92*4882a593Smuzhiyun enum bfi_pcifn_class { 93*4882a593Smuzhiyun BFI_PCIFN_CLASS_FC = 0x0c04, 94*4882a593Smuzhiyun BFI_PCIFN_CLASS_ETH = 0x0200, 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* Message Classes */ 98*4882a593Smuzhiyun enum bfi_mclass { 99*4882a593Smuzhiyun BFI_MC_IOC = 1, /*!< IO Controller (IOC) */ 100*4882a593Smuzhiyun BFI_MC_DIAG = 2, /*!< Diagnostic Msgs */ 101*4882a593Smuzhiyun BFI_MC_FLASH = 3, /*!< Flash message class */ 102*4882a593Smuzhiyun BFI_MC_CEE = 4, /*!< CEE */ 103*4882a593Smuzhiyun BFI_MC_FCPORT = 5, /*!< FC port */ 104*4882a593Smuzhiyun BFI_MC_IOCFC = 6, /*!< FC - IO Controller (IOC) */ 105*4882a593Smuzhiyun BFI_MC_LL = 7, /*!< Link Layer */ 106*4882a593Smuzhiyun BFI_MC_UF = 8, /*!< Unsolicited frame receive */ 107*4882a593Smuzhiyun BFI_MC_FCXP = 9, /*!< FC Transport */ 108*4882a593Smuzhiyun BFI_MC_LPS = 10, /*!< lport fc login services */ 109*4882a593Smuzhiyun BFI_MC_RPORT = 11, /*!< Remote port */ 110*4882a593Smuzhiyun BFI_MC_ITNIM = 12, /*!< I-T nexus (Initiator mode) */ 111*4882a593Smuzhiyun BFI_MC_IOIM_READ = 13, /*!< read IO (Initiator mode) */ 112*4882a593Smuzhiyun BFI_MC_IOIM_WRITE = 14, /*!< write IO (Initiator mode) */ 113*4882a593Smuzhiyun BFI_MC_IOIM_IO = 15, /*!< IO (Initiator mode) */ 114*4882a593Smuzhiyun BFI_MC_IOIM = 16, /*!< IO (Initiator mode) */ 115*4882a593Smuzhiyun BFI_MC_IOIM_IOCOM = 17, /*!< good IO completion */ 116*4882a593Smuzhiyun BFI_MC_TSKIM = 18, /*!< Initiator Task management */ 117*4882a593Smuzhiyun BFI_MC_SBOOT = 19, /*!< SAN boot services */ 118*4882a593Smuzhiyun BFI_MC_IPFC = 20, /*!< IP over FC Msgs */ 119*4882a593Smuzhiyun BFI_MC_PORT = 21, /*!< Physical port */ 120*4882a593Smuzhiyun BFI_MC_SFP = 22, /*!< SFP module */ 121*4882a593Smuzhiyun BFI_MC_MSGQ = 23, /*!< MSGQ */ 122*4882a593Smuzhiyun BFI_MC_ENET = 24, /*!< ENET commands/responses */ 123*4882a593Smuzhiyun BFI_MC_PHY = 25, /*!< External PHY message class */ 124*4882a593Smuzhiyun BFI_MC_NBOOT = 26, /*!< Network Boot */ 125*4882a593Smuzhiyun BFI_MC_TIO_READ = 27, /*!< read IO (Target mode) */ 126*4882a593Smuzhiyun BFI_MC_TIO_WRITE = 28, /*!< write IO (Target mode) */ 127*4882a593Smuzhiyun BFI_MC_TIO_DATA_XFERED = 29, /*!< ds transferred (target mode) */ 128*4882a593Smuzhiyun BFI_MC_TIO_IO = 30, /*!< IO (Target mode) */ 129*4882a593Smuzhiyun BFI_MC_TIO = 31, /*!< IO (target mode) */ 130*4882a593Smuzhiyun BFI_MC_MFG = 32, /*!< MFG/ASIC block commands */ 131*4882a593Smuzhiyun BFI_MC_EDMA = 33, /*!< EDMA copy commands */ 132*4882a593Smuzhiyun BFI_MC_MAX = 34 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #define BFI_IOC_MSGLEN_MAX 32 /* 32 bytes */ 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define BFI_FWBOOT_ENV_OS 0 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /*---------------------------------------------------------------------- 140*4882a593Smuzhiyun * IOC 141*4882a593Smuzhiyun *---------------------------------------------------------------------- 142*4882a593Smuzhiyun */ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* Different asic generations */ 145*4882a593Smuzhiyun enum bfi_asic_gen { 146*4882a593Smuzhiyun BFI_ASIC_GEN_CB = 1, 147*4882a593Smuzhiyun BFI_ASIC_GEN_CT = 2, 148*4882a593Smuzhiyun BFI_ASIC_GEN_CT2 = 3, 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun enum bfi_asic_mode { 152*4882a593Smuzhiyun BFI_ASIC_MODE_FC = 1, /* FC up to 8G speed */ 153*4882a593Smuzhiyun BFI_ASIC_MODE_FC16 = 2, /* FC up to 16G speed */ 154*4882a593Smuzhiyun BFI_ASIC_MODE_ETH = 3, /* Ethernet ports */ 155*4882a593Smuzhiyun BFI_ASIC_MODE_COMBO = 4, /* FC 16G and Ethernet 10G port */ 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun enum bfi_ioc_h2i_msgs { 159*4882a593Smuzhiyun BFI_IOC_H2I_ENABLE_REQ = 1, 160*4882a593Smuzhiyun BFI_IOC_H2I_DISABLE_REQ = 2, 161*4882a593Smuzhiyun BFI_IOC_H2I_GETATTR_REQ = 3, 162*4882a593Smuzhiyun BFI_IOC_H2I_DBG_SYNC = 4, 163*4882a593Smuzhiyun BFI_IOC_H2I_DBG_DUMP = 5, 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun enum bfi_ioc_i2h_msgs { 167*4882a593Smuzhiyun BFI_IOC_I2H_ENABLE_REPLY = BFA_I2HM(1), 168*4882a593Smuzhiyun BFI_IOC_I2H_DISABLE_REPLY = BFA_I2HM(2), 169*4882a593Smuzhiyun BFI_IOC_I2H_GETATTR_REPLY = BFA_I2HM(3), 170*4882a593Smuzhiyun BFI_IOC_I2H_HBEAT = BFA_I2HM(4), 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* BFI_IOC_H2I_GETATTR_REQ message */ 174*4882a593Smuzhiyun struct bfi_ioc_getattr_req { 175*4882a593Smuzhiyun struct bfi_mhdr mh; 176*4882a593Smuzhiyun union bfi_addr_u attr_addr; 177*4882a593Smuzhiyun } __packed; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct bfi_ioc_attr { 180*4882a593Smuzhiyun u64 mfg_pwwn; /*!< Mfg port wwn */ 181*4882a593Smuzhiyun u64 mfg_nwwn; /*!< Mfg node wwn */ 182*4882a593Smuzhiyun u8 mfg_mac[ETH_ALEN]; /*!< Mfg mac */ 183*4882a593Smuzhiyun u8 port_mode; /* enum bfi_port_mode */ 184*4882a593Smuzhiyun u8 rsvd_a; 185*4882a593Smuzhiyun u64 pwwn; 186*4882a593Smuzhiyun u64 nwwn; 187*4882a593Smuzhiyun u8 mac[ETH_ALEN]; /*!< PBC or Mfg mac */ 188*4882a593Smuzhiyun u16 rsvd_b; 189*4882a593Smuzhiyun u8 fcoe_mac[ETH_ALEN]; 190*4882a593Smuzhiyun u16 rsvd_c; 191*4882a593Smuzhiyun char brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)]; 192*4882a593Smuzhiyun u8 pcie_gen; 193*4882a593Smuzhiyun u8 pcie_lanes_orig; 194*4882a593Smuzhiyun u8 pcie_lanes; 195*4882a593Smuzhiyun u8 rx_bbcredit; /*!< receive buffer credits */ 196*4882a593Smuzhiyun u32 adapter_prop; /*!< adapter properties */ 197*4882a593Smuzhiyun u16 maxfrsize; /*!< max receive frame size */ 198*4882a593Smuzhiyun char asic_rev; 199*4882a593Smuzhiyun u8 rsvd_d; 200*4882a593Smuzhiyun char fw_version[BFA_VERSION_LEN]; 201*4882a593Smuzhiyun char optrom_version[BFA_VERSION_LEN]; 202*4882a593Smuzhiyun struct bfa_mfg_vpd vpd; 203*4882a593Smuzhiyun u32 card_type; /*!< card type */ 204*4882a593Smuzhiyun } __packed; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* BFI_IOC_I2H_GETATTR_REPLY message */ 207*4882a593Smuzhiyun struct bfi_ioc_getattr_reply { 208*4882a593Smuzhiyun struct bfi_mhdr mh; /*!< Common msg header */ 209*4882a593Smuzhiyun u8 status; /*!< cfg reply status */ 210*4882a593Smuzhiyun u8 rsvd[3]; 211*4882a593Smuzhiyun } __packed; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* Firmware memory page offsets */ 214*4882a593Smuzhiyun #define BFI_IOC_SMEM_PG0_CB (0x40) 215*4882a593Smuzhiyun #define BFI_IOC_SMEM_PG0_CT (0x180) 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /* Firmware statistic offset */ 218*4882a593Smuzhiyun #define BFI_IOC_FWSTATS_OFF (0x6B40) 219*4882a593Smuzhiyun #define BFI_IOC_FWSTATS_SZ (4096) 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* Firmware trace offset */ 222*4882a593Smuzhiyun #define BFI_IOC_TRC_OFF (0x4b00) 223*4882a593Smuzhiyun #define BFI_IOC_TRC_ENTS 256 224*4882a593Smuzhiyun #define BFI_IOC_TRC_ENT_SZ 16 225*4882a593Smuzhiyun #define BFI_IOC_TRC_HDR_SZ 32 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun #define BFI_IOC_FW_SIGNATURE (0xbfadbfad) 228*4882a593Smuzhiyun #define BFI_IOC_FW_INV_SIGN (0xdeaddead) 229*4882a593Smuzhiyun #define BFI_IOC_MD5SUM_SZ 4 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun struct bfi_ioc_fwver { 232*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 233*4882a593Smuzhiyun u8 patch; 234*4882a593Smuzhiyun u8 maint; 235*4882a593Smuzhiyun u8 minor; 236*4882a593Smuzhiyun u8 major; 237*4882a593Smuzhiyun u8 rsvd[2]; 238*4882a593Smuzhiyun u8 build; 239*4882a593Smuzhiyun u8 phase; 240*4882a593Smuzhiyun #else 241*4882a593Smuzhiyun u8 major; 242*4882a593Smuzhiyun u8 minor; 243*4882a593Smuzhiyun u8 maint; 244*4882a593Smuzhiyun u8 patch; 245*4882a593Smuzhiyun u8 phase; 246*4882a593Smuzhiyun u8 build; 247*4882a593Smuzhiyun u8 rsvd[2]; 248*4882a593Smuzhiyun #endif 249*4882a593Smuzhiyun } __packed; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun struct bfi_ioc_image_hdr { 252*4882a593Smuzhiyun u32 signature; /*!< constant signature */ 253*4882a593Smuzhiyun u8 asic_gen; /*!< asic generation */ 254*4882a593Smuzhiyun u8 asic_mode; 255*4882a593Smuzhiyun u8 port0_mode; /*!< device mode for port 0 */ 256*4882a593Smuzhiyun u8 port1_mode; /*!< device mode for port 1 */ 257*4882a593Smuzhiyun u32 exec; /*!< exec vector */ 258*4882a593Smuzhiyun u32 bootenv; /*!< firmware boot env */ 259*4882a593Smuzhiyun u32 rsvd_b[2]; 260*4882a593Smuzhiyun struct bfi_ioc_fwver fwver; 261*4882a593Smuzhiyun u32 md5sum[BFI_IOC_MD5SUM_SZ]; 262*4882a593Smuzhiyun } __packed; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun enum bfi_ioc_img_ver_cmp { 265*4882a593Smuzhiyun BFI_IOC_IMG_VER_INCOMP, 266*4882a593Smuzhiyun BFI_IOC_IMG_VER_OLD, 267*4882a593Smuzhiyun BFI_IOC_IMG_VER_SAME, 268*4882a593Smuzhiyun BFI_IOC_IMG_VER_BETTER 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun #define BFI_FWBOOT_DEVMODE_OFF 4 272*4882a593Smuzhiyun #define BFI_FWBOOT_TYPE_OFF 8 273*4882a593Smuzhiyun #define BFI_FWBOOT_ENV_OFF 12 274*4882a593Smuzhiyun #define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \ 275*4882a593Smuzhiyun (((u32)(__asic_gen)) << 24 | \ 276*4882a593Smuzhiyun ((u32)(__asic_mode)) << 16 | \ 277*4882a593Smuzhiyun ((u32)(__p0_mode)) << 8 | \ 278*4882a593Smuzhiyun ((u32)(__p1_mode))) 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun enum bfi_fwboot_type { 281*4882a593Smuzhiyun BFI_FWBOOT_TYPE_NORMAL = 0, 282*4882a593Smuzhiyun BFI_FWBOOT_TYPE_FLASH = 1, 283*4882a593Smuzhiyun BFI_FWBOOT_TYPE_MEMTEST = 2, 284*4882a593Smuzhiyun }; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun enum bfi_port_mode { 287*4882a593Smuzhiyun BFI_PORT_MODE_FC = 1, 288*4882a593Smuzhiyun BFI_PORT_MODE_ETH = 2, 289*4882a593Smuzhiyun }; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun struct bfi_ioc_hbeat { 292*4882a593Smuzhiyun struct bfi_mhdr mh; /*!< common msg header */ 293*4882a593Smuzhiyun u32 hb_count; /*!< current heart beat count */ 294*4882a593Smuzhiyun } __packed; 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun /* IOC hardware/firmware state */ 297*4882a593Smuzhiyun enum bfi_ioc_state { 298*4882a593Smuzhiyun BFI_IOC_UNINIT = 0, /*!< not initialized */ 299*4882a593Smuzhiyun BFI_IOC_INITING = 1, /*!< h/w is being initialized */ 300*4882a593Smuzhiyun BFI_IOC_HWINIT = 2, /*!< h/w is initialized */ 301*4882a593Smuzhiyun BFI_IOC_CFG = 3, /*!< IOC configuration in progress */ 302*4882a593Smuzhiyun BFI_IOC_OP = 4, /*!< IOC is operational */ 303*4882a593Smuzhiyun BFI_IOC_DISABLING = 5, /*!< IOC is being disabled */ 304*4882a593Smuzhiyun BFI_IOC_DISABLED = 6, /*!< IOC is disabled */ 305*4882a593Smuzhiyun BFI_IOC_CFG_DISABLED = 7, /*!< IOC is being disabled;transient */ 306*4882a593Smuzhiyun BFI_IOC_FAIL = 8, /*!< IOC heart-beat failure */ 307*4882a593Smuzhiyun BFI_IOC_MEMTEST = 9, /*!< IOC is doing memtest */ 308*4882a593Smuzhiyun }; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun enum { 311*4882a593Smuzhiyun BFI_ADAPTER_TYPE_FC = 0x01, /*!< FC adapters */ 312*4882a593Smuzhiyun BFI_ADAPTER_TYPE_MK = 0x0f0000, /*!< adapter type mask */ 313*4882a593Smuzhiyun BFI_ADAPTER_TYPE_SH = 16, /*!< adapter type shift */ 314*4882a593Smuzhiyun BFI_ADAPTER_NPORTS_MK = 0xff00, /*!< number of ports mask */ 315*4882a593Smuzhiyun BFI_ADAPTER_NPORTS_SH = 8, /*!< number of ports shift */ 316*4882a593Smuzhiyun BFI_ADAPTER_SPEED_MK = 0xff, /*!< adapter speed mask */ 317*4882a593Smuzhiyun BFI_ADAPTER_SPEED_SH = 0, /*!< adapter speed shift */ 318*4882a593Smuzhiyun BFI_ADAPTER_PROTO = 0x100000, /*!< prototype adapaters */ 319*4882a593Smuzhiyun BFI_ADAPTER_TTV = 0x200000, /*!< TTV debug capable */ 320*4882a593Smuzhiyun BFI_ADAPTER_UNSUPP = 0x400000, /*!< unknown adapter type */ 321*4882a593Smuzhiyun }; 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun #define BFI_ADAPTER_GETP(__prop, __adap_prop) \ 324*4882a593Smuzhiyun (((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >> \ 325*4882a593Smuzhiyun BFI_ADAPTER_ ## __prop ## _SH) 326*4882a593Smuzhiyun #define BFI_ADAPTER_SETP(__prop, __val) \ 327*4882a593Smuzhiyun ((__val) << BFI_ADAPTER_ ## __prop ## _SH) 328*4882a593Smuzhiyun #define BFI_ADAPTER_IS_SPECIAL(__adap_type) \ 329*4882a593Smuzhiyun ((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \ 330*4882a593Smuzhiyun BFI_ADAPTER_UNSUPP)) 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun /* BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages */ 333*4882a593Smuzhiyun struct bfi_ioc_ctrl_req { 334*4882a593Smuzhiyun struct bfi_mhdr mh; 335*4882a593Smuzhiyun u16 clscode; 336*4882a593Smuzhiyun u16 rsvd; 337*4882a593Smuzhiyun u32 tv_sec; 338*4882a593Smuzhiyun } __packed; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun /* BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages */ 341*4882a593Smuzhiyun struct bfi_ioc_ctrl_reply { 342*4882a593Smuzhiyun struct bfi_mhdr mh; /*!< Common msg header */ 343*4882a593Smuzhiyun u8 status; /*!< enable/disable status */ 344*4882a593Smuzhiyun u8 port_mode; /*!< enum bfa_mode */ 345*4882a593Smuzhiyun u8 cap_bm; /*!< capability bit mask */ 346*4882a593Smuzhiyun u8 rsvd; 347*4882a593Smuzhiyun } __packed; 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun #define BFI_IOC_MSGSZ 8 350*4882a593Smuzhiyun /* H2I Messages */ 351*4882a593Smuzhiyun union bfi_ioc_h2i_msg_u { 352*4882a593Smuzhiyun struct bfi_mhdr mh; 353*4882a593Smuzhiyun struct bfi_ioc_ctrl_req enable_req; 354*4882a593Smuzhiyun struct bfi_ioc_ctrl_req disable_req; 355*4882a593Smuzhiyun struct bfi_ioc_getattr_req getattr_req; 356*4882a593Smuzhiyun u32 mboxmsg[BFI_IOC_MSGSZ]; 357*4882a593Smuzhiyun } __packed; 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun /* I2H Messages */ 360*4882a593Smuzhiyun union bfi_ioc_i2h_msg_u { 361*4882a593Smuzhiyun struct bfi_mhdr mh; 362*4882a593Smuzhiyun struct bfi_ioc_ctrl_reply fw_event; 363*4882a593Smuzhiyun u32 mboxmsg[BFI_IOC_MSGSZ]; 364*4882a593Smuzhiyun } __packed; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /*---------------------------------------------------------------------- 367*4882a593Smuzhiyun * MSGQ 368*4882a593Smuzhiyun *---------------------------------------------------------------------- 369*4882a593Smuzhiyun */ 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun enum bfi_msgq_h2i_msgs { 372*4882a593Smuzhiyun BFI_MSGQ_H2I_INIT_REQ = 1, 373*4882a593Smuzhiyun BFI_MSGQ_H2I_DOORBELL_PI = 2, 374*4882a593Smuzhiyun BFI_MSGQ_H2I_DOORBELL_CI = 3, 375*4882a593Smuzhiyun BFI_MSGQ_H2I_CMDQ_COPY_RSP = 4, 376*4882a593Smuzhiyun }; 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun enum bfi_msgq_i2h_msgs { 379*4882a593Smuzhiyun BFI_MSGQ_I2H_INIT_RSP = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ), 380*4882a593Smuzhiyun BFI_MSGQ_I2H_DOORBELL_PI = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI), 381*4882a593Smuzhiyun BFI_MSGQ_I2H_DOORBELL_CI = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI), 382*4882a593Smuzhiyun BFI_MSGQ_I2H_CMDQ_COPY_REQ = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP), 383*4882a593Smuzhiyun }; 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun /* Messages(commands/responsed/AENS will have the following header */ 386*4882a593Smuzhiyun struct bfi_msgq_mhdr { 387*4882a593Smuzhiyun u8 msg_class; 388*4882a593Smuzhiyun u8 msg_id; 389*4882a593Smuzhiyun u16 msg_token; 390*4882a593Smuzhiyun u16 num_entries; 391*4882a593Smuzhiyun u8 enet_id; 392*4882a593Smuzhiyun u8 rsvd; 393*4882a593Smuzhiyun } __packed; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun #define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do { \ 396*4882a593Smuzhiyun (_mh).msg_class = (_mc); \ 397*4882a593Smuzhiyun (_mh).msg_id = (_mid); \ 398*4882a593Smuzhiyun (_mh).msg_token = (_tok); \ 399*4882a593Smuzhiyun (_mh).enet_id = (_enet_id); \ 400*4882a593Smuzhiyun } while (0) 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun /* 403*4882a593Smuzhiyun * Mailbox for messaging interface 404*4882a593Smuzhiyun */ 405*4882a593Smuzhiyun #define BFI_MSGQ_CMD_ENTRY_SIZE (64) /* TBD */ 406*4882a593Smuzhiyun #define BFI_MSGQ_RSP_ENTRY_SIZE (64) /* TBD */ 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun #define bfi_msgq_num_cmd_entries(_size) \ 409*4882a593Smuzhiyun (((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE) 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun struct bfi_msgq { 412*4882a593Smuzhiyun union bfi_addr_u addr; 413*4882a593Smuzhiyun u16 q_depth; /* Total num of entries in the queue */ 414*4882a593Smuzhiyun u8 rsvd[2]; 415*4882a593Smuzhiyun } __packed; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun /* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */ 418*4882a593Smuzhiyun struct bfi_msgq_cfg_req { 419*4882a593Smuzhiyun struct bfi_mhdr mh; 420*4882a593Smuzhiyun struct bfi_msgq cmdq; 421*4882a593Smuzhiyun struct bfi_msgq rspq; 422*4882a593Smuzhiyun } __packed; 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /* BFI_ENET_MSGQ_CFG_RSP */ 425*4882a593Smuzhiyun struct bfi_msgq_cfg_rsp { 426*4882a593Smuzhiyun struct bfi_mhdr mh; 427*4882a593Smuzhiyun u8 cmd_status; 428*4882a593Smuzhiyun u8 rsvd[3]; 429*4882a593Smuzhiyun } __packed; 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun /* BFI_MSGQ_H2I_DOORBELL */ 432*4882a593Smuzhiyun struct bfi_msgq_h2i_db { 433*4882a593Smuzhiyun struct bfi_mhdr mh; 434*4882a593Smuzhiyun union { 435*4882a593Smuzhiyun u16 cmdq_pi; 436*4882a593Smuzhiyun u16 rspq_ci; 437*4882a593Smuzhiyun } __packed idx; 438*4882a593Smuzhiyun } __packed; 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun /* BFI_MSGQ_I2H_DOORBELL */ 441*4882a593Smuzhiyun struct bfi_msgq_i2h_db { 442*4882a593Smuzhiyun struct bfi_mhdr mh; 443*4882a593Smuzhiyun union { 444*4882a593Smuzhiyun u16 rspq_pi; 445*4882a593Smuzhiyun u16 cmdq_ci; 446*4882a593Smuzhiyun } __packed idx; 447*4882a593Smuzhiyun } __packed; 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun #define BFI_CMD_COPY_SZ 28 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun /* BFI_MSGQ_H2I_CMD_COPY_RSP */ 452*4882a593Smuzhiyun struct bfi_msgq_h2i_cmdq_copy_rsp { 453*4882a593Smuzhiyun struct bfi_mhdr mh; 454*4882a593Smuzhiyun u8 data[BFI_CMD_COPY_SZ]; 455*4882a593Smuzhiyun } __packed; 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun /* BFI_MSGQ_I2H_CMD_COPY_REQ */ 458*4882a593Smuzhiyun struct bfi_msgq_i2h_cmdq_copy_req { 459*4882a593Smuzhiyun struct bfi_mhdr mh; 460*4882a593Smuzhiyun u16 offset; 461*4882a593Smuzhiyun u16 len; 462*4882a593Smuzhiyun } __packed; 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun /* 465*4882a593Smuzhiyun * FLASH module specific 466*4882a593Smuzhiyun */ 467*4882a593Smuzhiyun enum bfi_flash_h2i_msgs { 468*4882a593Smuzhiyun BFI_FLASH_H2I_QUERY_REQ = 1, 469*4882a593Smuzhiyun BFI_FLASH_H2I_ERASE_REQ = 2, 470*4882a593Smuzhiyun BFI_FLASH_H2I_WRITE_REQ = 3, 471*4882a593Smuzhiyun BFI_FLASH_H2I_READ_REQ = 4, 472*4882a593Smuzhiyun BFI_FLASH_H2I_BOOT_VER_REQ = 5, 473*4882a593Smuzhiyun }; 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun enum bfi_flash_i2h_msgs { 476*4882a593Smuzhiyun BFI_FLASH_I2H_QUERY_RSP = BFA_I2HM(1), 477*4882a593Smuzhiyun BFI_FLASH_I2H_ERASE_RSP = BFA_I2HM(2), 478*4882a593Smuzhiyun BFI_FLASH_I2H_WRITE_RSP = BFA_I2HM(3), 479*4882a593Smuzhiyun BFI_FLASH_I2H_READ_RSP = BFA_I2HM(4), 480*4882a593Smuzhiyun BFI_FLASH_I2H_BOOT_VER_RSP = BFA_I2HM(5), 481*4882a593Smuzhiyun BFI_FLASH_I2H_EVENT = BFA_I2HM(127), 482*4882a593Smuzhiyun }; 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun /* 485*4882a593Smuzhiyun * Flash query request 486*4882a593Smuzhiyun */ 487*4882a593Smuzhiyun struct bfi_flash_query_req { 488*4882a593Smuzhiyun struct bfi_mhdr mh; /* Common msg header */ 489*4882a593Smuzhiyun struct bfi_alen alen; 490*4882a593Smuzhiyun } __packed; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun /* 493*4882a593Smuzhiyun * Flash write request 494*4882a593Smuzhiyun */ 495*4882a593Smuzhiyun struct bfi_flash_write_req { 496*4882a593Smuzhiyun struct bfi_mhdr mh; /* Common msg header */ 497*4882a593Smuzhiyun struct bfi_alen alen; 498*4882a593Smuzhiyun u32 type; /* partition type */ 499*4882a593Smuzhiyun u8 instance; /* partition instance */ 500*4882a593Smuzhiyun u8 last; 501*4882a593Smuzhiyun u8 rsv[2]; 502*4882a593Smuzhiyun u32 offset; 503*4882a593Smuzhiyun u32 length; 504*4882a593Smuzhiyun } __packed; 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun /* 507*4882a593Smuzhiyun * Flash read request 508*4882a593Smuzhiyun */ 509*4882a593Smuzhiyun struct bfi_flash_read_req { 510*4882a593Smuzhiyun struct bfi_mhdr mh; /* Common msg header */ 511*4882a593Smuzhiyun u32 type; /* partition type */ 512*4882a593Smuzhiyun u8 instance; /* partition instance */ 513*4882a593Smuzhiyun u8 rsv[3]; 514*4882a593Smuzhiyun u32 offset; 515*4882a593Smuzhiyun u32 length; 516*4882a593Smuzhiyun struct bfi_alen alen; 517*4882a593Smuzhiyun } __packed; 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun /* 520*4882a593Smuzhiyun * Flash query response 521*4882a593Smuzhiyun */ 522*4882a593Smuzhiyun struct bfi_flash_query_rsp { 523*4882a593Smuzhiyun struct bfi_mhdr mh; /* Common msg header */ 524*4882a593Smuzhiyun u32 status; 525*4882a593Smuzhiyun } __packed; 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun /* 528*4882a593Smuzhiyun * Flash read response 529*4882a593Smuzhiyun */ 530*4882a593Smuzhiyun struct bfi_flash_read_rsp { 531*4882a593Smuzhiyun struct bfi_mhdr mh; /* Common msg header */ 532*4882a593Smuzhiyun u32 type; /* partition type */ 533*4882a593Smuzhiyun u8 instance; /* partition instance */ 534*4882a593Smuzhiyun u8 rsv[3]; 535*4882a593Smuzhiyun u32 status; 536*4882a593Smuzhiyun u32 length; 537*4882a593Smuzhiyun } __packed; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun /* 540*4882a593Smuzhiyun * Flash write response 541*4882a593Smuzhiyun */ 542*4882a593Smuzhiyun struct bfi_flash_write_rsp { 543*4882a593Smuzhiyun struct bfi_mhdr mh; /* Common msg header */ 544*4882a593Smuzhiyun u32 type; /* partition type */ 545*4882a593Smuzhiyun u8 instance; /* partition instance */ 546*4882a593Smuzhiyun u8 rsv[3]; 547*4882a593Smuzhiyun u32 status; 548*4882a593Smuzhiyun u32 length; 549*4882a593Smuzhiyun } __packed; 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun #endif /* __BFI_H__ */ 552