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