162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Linux network driver for QLogic BR-series Converged Network Adapter. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 762306a36Sopenharmony_ci * Copyright (c) 2014-2015 QLogic Corporation 862306a36Sopenharmony_ci * All rights reserved 962306a36Sopenharmony_ci * www.qlogic.com 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci#ifndef __BFI_H__ 1262306a36Sopenharmony_ci#define __BFI_H__ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "bfa_defs.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* BFI FW image type */ 1762306a36Sopenharmony_ci#define BFI_FLASH_CHUNK_SZ 256 /*!< Flash chunk size */ 1862306a36Sopenharmony_ci#define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32)) 1962306a36Sopenharmony_ci#define BFI_FLASH_IMAGE_SZ 0x100000 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* Msg header common to all msgs */ 2262306a36Sopenharmony_cistruct bfi_mhdr { 2362306a36Sopenharmony_ci u8 msg_class; /*!< @ref enum bfi_mclass */ 2462306a36Sopenharmony_ci u8 msg_id; /*!< msg opcode with in the class */ 2562306a36Sopenharmony_ci union { 2662306a36Sopenharmony_ci struct { 2762306a36Sopenharmony_ci u8 qid; 2862306a36Sopenharmony_ci u8 fn_lpu; /*!< msg destination */ 2962306a36Sopenharmony_ci } __packed h2i; 3062306a36Sopenharmony_ci u16 i2htok; /*!< token in msgs to host */ 3162306a36Sopenharmony_ci } __packed mtag; 3262306a36Sopenharmony_ci} __packed; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define bfi_fn_lpu(__fn, __lpu) ((__fn) << 1 | (__lpu)) 3562306a36Sopenharmony_ci#define bfi_mhdr_2_fn(_mh) ((_mh)->mtag.h2i.fn_lpu >> 1) 3662306a36Sopenharmony_ci#define bfi_mhdr_2_qid(_mh) ((_mh)->mtag.h2i.qid) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do { \ 3962306a36Sopenharmony_ci (_mh).msg_class = (_mc); \ 4062306a36Sopenharmony_ci (_mh).msg_id = (_op); \ 4162306a36Sopenharmony_ci (_mh).mtag.h2i.fn_lpu = (_fn_lpu); \ 4262306a36Sopenharmony_ci} while (0) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define bfi_i2h_set(_mh, _mc, _op, _i2htok) do { \ 4562306a36Sopenharmony_ci (_mh).msg_class = (_mc); \ 4662306a36Sopenharmony_ci (_mh).msg_id = (_op); \ 4762306a36Sopenharmony_ci (_mh).mtag.i2htok = (_i2htok); \ 4862306a36Sopenharmony_ci} while (0) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * Message opcodes: 0-127 to firmware, 128-255 to host 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_ci#define BFI_I2H_OPCODE_BASE 128 5462306a36Sopenharmony_ci#define BFA_I2HM(_x) ((_x) + BFI_I2H_OPCODE_BASE) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/**************************************************************************** 5762306a36Sopenharmony_ci * 5862306a36Sopenharmony_ci * Scatter Gather Element and Page definition 5962306a36Sopenharmony_ci * 6062306a36Sopenharmony_ci **************************************************************************** 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* DMA addresses */ 6462306a36Sopenharmony_ciunion bfi_addr_u { 6562306a36Sopenharmony_ci struct { 6662306a36Sopenharmony_ci u32 addr_lo; 6762306a36Sopenharmony_ci u32 addr_hi; 6862306a36Sopenharmony_ci } __packed a32; 6962306a36Sopenharmony_ci} __packed; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Generic DMA addr-len pair. */ 7262306a36Sopenharmony_cistruct bfi_alen { 7362306a36Sopenharmony_ci union bfi_addr_u al_addr; /* DMA addr of buffer */ 7462306a36Sopenharmony_ci u32 al_len; /* length of buffer */ 7562306a36Sopenharmony_ci} __packed; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* 7862306a36Sopenharmony_ci * Large Message structure - 128 Bytes size Msgs 7962306a36Sopenharmony_ci */ 8062306a36Sopenharmony_ci#define BFI_LMSG_SZ 128 8162306a36Sopenharmony_ci#define BFI_LMSG_PL_WSZ \ 8262306a36Sopenharmony_ci ((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4) 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* Mailbox message structure */ 8562306a36Sopenharmony_ci#define BFI_MBMSG_SZ 7 8662306a36Sopenharmony_cistruct bfi_mbmsg { 8762306a36Sopenharmony_ci struct bfi_mhdr mh; 8862306a36Sopenharmony_ci u32 pl[BFI_MBMSG_SZ]; 8962306a36Sopenharmony_ci} __packed; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* Supported PCI function class codes (personality) */ 9262306a36Sopenharmony_cienum bfi_pcifn_class { 9362306a36Sopenharmony_ci BFI_PCIFN_CLASS_FC = 0x0c04, 9462306a36Sopenharmony_ci BFI_PCIFN_CLASS_ETH = 0x0200, 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* Message Classes */ 9862306a36Sopenharmony_cienum bfi_mclass { 9962306a36Sopenharmony_ci BFI_MC_IOC = 1, /*!< IO Controller (IOC) */ 10062306a36Sopenharmony_ci BFI_MC_DIAG = 2, /*!< Diagnostic Msgs */ 10162306a36Sopenharmony_ci BFI_MC_FLASH = 3, /*!< Flash message class */ 10262306a36Sopenharmony_ci BFI_MC_CEE = 4, /*!< CEE */ 10362306a36Sopenharmony_ci BFI_MC_FCPORT = 5, /*!< FC port */ 10462306a36Sopenharmony_ci BFI_MC_IOCFC = 6, /*!< FC - IO Controller (IOC) */ 10562306a36Sopenharmony_ci BFI_MC_LL = 7, /*!< Link Layer */ 10662306a36Sopenharmony_ci BFI_MC_UF = 8, /*!< Unsolicited frame receive */ 10762306a36Sopenharmony_ci BFI_MC_FCXP = 9, /*!< FC Transport */ 10862306a36Sopenharmony_ci BFI_MC_LPS = 10, /*!< lport fc login services */ 10962306a36Sopenharmony_ci BFI_MC_RPORT = 11, /*!< Remote port */ 11062306a36Sopenharmony_ci BFI_MC_ITNIM = 12, /*!< I-T nexus (Initiator mode) */ 11162306a36Sopenharmony_ci BFI_MC_IOIM_READ = 13, /*!< read IO (Initiator mode) */ 11262306a36Sopenharmony_ci BFI_MC_IOIM_WRITE = 14, /*!< write IO (Initiator mode) */ 11362306a36Sopenharmony_ci BFI_MC_IOIM_IO = 15, /*!< IO (Initiator mode) */ 11462306a36Sopenharmony_ci BFI_MC_IOIM = 16, /*!< IO (Initiator mode) */ 11562306a36Sopenharmony_ci BFI_MC_IOIM_IOCOM = 17, /*!< good IO completion */ 11662306a36Sopenharmony_ci BFI_MC_TSKIM = 18, /*!< Initiator Task management */ 11762306a36Sopenharmony_ci BFI_MC_SBOOT = 19, /*!< SAN boot services */ 11862306a36Sopenharmony_ci BFI_MC_IPFC = 20, /*!< IP over FC Msgs */ 11962306a36Sopenharmony_ci BFI_MC_PORT = 21, /*!< Physical port */ 12062306a36Sopenharmony_ci BFI_MC_SFP = 22, /*!< SFP module */ 12162306a36Sopenharmony_ci BFI_MC_MSGQ = 23, /*!< MSGQ */ 12262306a36Sopenharmony_ci BFI_MC_ENET = 24, /*!< ENET commands/responses */ 12362306a36Sopenharmony_ci BFI_MC_PHY = 25, /*!< External PHY message class */ 12462306a36Sopenharmony_ci BFI_MC_NBOOT = 26, /*!< Network Boot */ 12562306a36Sopenharmony_ci BFI_MC_TIO_READ = 27, /*!< read IO (Target mode) */ 12662306a36Sopenharmony_ci BFI_MC_TIO_WRITE = 28, /*!< write IO (Target mode) */ 12762306a36Sopenharmony_ci BFI_MC_TIO_DATA_XFERED = 29, /*!< ds transferred (target mode) */ 12862306a36Sopenharmony_ci BFI_MC_TIO_IO = 30, /*!< IO (Target mode) */ 12962306a36Sopenharmony_ci BFI_MC_TIO = 31, /*!< IO (target mode) */ 13062306a36Sopenharmony_ci BFI_MC_MFG = 32, /*!< MFG/ASIC block commands */ 13162306a36Sopenharmony_ci BFI_MC_EDMA = 33, /*!< EDMA copy commands */ 13262306a36Sopenharmony_ci BFI_MC_MAX = 34 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define BFI_IOC_MSGLEN_MAX 32 /* 32 bytes */ 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define BFI_FWBOOT_ENV_OS 0 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/*---------------------------------------------------------------------- 14062306a36Sopenharmony_ci * IOC 14162306a36Sopenharmony_ci *---------------------------------------------------------------------- 14262306a36Sopenharmony_ci */ 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/* Different asic generations */ 14562306a36Sopenharmony_cienum bfi_asic_gen { 14662306a36Sopenharmony_ci BFI_ASIC_GEN_CB = 1, 14762306a36Sopenharmony_ci BFI_ASIC_GEN_CT = 2, 14862306a36Sopenharmony_ci BFI_ASIC_GEN_CT2 = 3, 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cienum bfi_asic_mode { 15262306a36Sopenharmony_ci BFI_ASIC_MODE_FC = 1, /* FC up to 8G speed */ 15362306a36Sopenharmony_ci BFI_ASIC_MODE_FC16 = 2, /* FC up to 16G speed */ 15462306a36Sopenharmony_ci BFI_ASIC_MODE_ETH = 3, /* Ethernet ports */ 15562306a36Sopenharmony_ci BFI_ASIC_MODE_COMBO = 4, /* FC 16G and Ethernet 10G port */ 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cienum bfi_ioc_h2i_msgs { 15962306a36Sopenharmony_ci BFI_IOC_H2I_ENABLE_REQ = 1, 16062306a36Sopenharmony_ci BFI_IOC_H2I_DISABLE_REQ = 2, 16162306a36Sopenharmony_ci BFI_IOC_H2I_GETATTR_REQ = 3, 16262306a36Sopenharmony_ci BFI_IOC_H2I_DBG_SYNC = 4, 16362306a36Sopenharmony_ci BFI_IOC_H2I_DBG_DUMP = 5, 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cienum bfi_ioc_i2h_msgs { 16762306a36Sopenharmony_ci BFI_IOC_I2H_ENABLE_REPLY = BFA_I2HM(1), 16862306a36Sopenharmony_ci BFI_IOC_I2H_DISABLE_REPLY = BFA_I2HM(2), 16962306a36Sopenharmony_ci BFI_IOC_I2H_GETATTR_REPLY = BFA_I2HM(3), 17062306a36Sopenharmony_ci BFI_IOC_I2H_HBEAT = BFA_I2HM(4), 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/* BFI_IOC_H2I_GETATTR_REQ message */ 17462306a36Sopenharmony_cistruct bfi_ioc_getattr_req { 17562306a36Sopenharmony_ci struct bfi_mhdr mh; 17662306a36Sopenharmony_ci union bfi_addr_u attr_addr; 17762306a36Sopenharmony_ci} __packed; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistruct bfi_ioc_attr { 18062306a36Sopenharmony_ci u64 mfg_pwwn; /*!< Mfg port wwn */ 18162306a36Sopenharmony_ci u64 mfg_nwwn; /*!< Mfg node wwn */ 18262306a36Sopenharmony_ci u8 mfg_mac[ETH_ALEN]; /*!< Mfg mac */ 18362306a36Sopenharmony_ci u8 port_mode; /* enum bfi_port_mode */ 18462306a36Sopenharmony_ci u8 rsvd_a; 18562306a36Sopenharmony_ci u64 pwwn; 18662306a36Sopenharmony_ci u64 nwwn; 18762306a36Sopenharmony_ci u8 mac[ETH_ALEN]; /*!< PBC or Mfg mac */ 18862306a36Sopenharmony_ci u16 rsvd_b; 18962306a36Sopenharmony_ci u8 fcoe_mac[ETH_ALEN]; 19062306a36Sopenharmony_ci u16 rsvd_c; 19162306a36Sopenharmony_ci char brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)]; 19262306a36Sopenharmony_ci u8 pcie_gen; 19362306a36Sopenharmony_ci u8 pcie_lanes_orig; 19462306a36Sopenharmony_ci u8 pcie_lanes; 19562306a36Sopenharmony_ci u8 rx_bbcredit; /*!< receive buffer credits */ 19662306a36Sopenharmony_ci u32 adapter_prop; /*!< adapter properties */ 19762306a36Sopenharmony_ci u16 maxfrsize; /*!< max receive frame size */ 19862306a36Sopenharmony_ci char asic_rev; 19962306a36Sopenharmony_ci u8 rsvd_d; 20062306a36Sopenharmony_ci char fw_version[BFA_VERSION_LEN]; 20162306a36Sopenharmony_ci char optrom_version[BFA_VERSION_LEN]; 20262306a36Sopenharmony_ci struct bfa_mfg_vpd vpd; 20362306a36Sopenharmony_ci u32 card_type; /*!< card type */ 20462306a36Sopenharmony_ci} __packed; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/* BFI_IOC_I2H_GETATTR_REPLY message */ 20762306a36Sopenharmony_cistruct bfi_ioc_getattr_reply { 20862306a36Sopenharmony_ci struct bfi_mhdr mh; /*!< Common msg header */ 20962306a36Sopenharmony_ci u8 status; /*!< cfg reply status */ 21062306a36Sopenharmony_ci u8 rsvd[3]; 21162306a36Sopenharmony_ci} __packed; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci/* Firmware memory page offsets */ 21462306a36Sopenharmony_ci#define BFI_IOC_SMEM_PG0_CB (0x40) 21562306a36Sopenharmony_ci#define BFI_IOC_SMEM_PG0_CT (0x180) 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/* Firmware statistic offset */ 21862306a36Sopenharmony_ci#define BFI_IOC_FWSTATS_OFF (0x6B40) 21962306a36Sopenharmony_ci#define BFI_IOC_FWSTATS_SZ (4096) 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/* Firmware trace offset */ 22262306a36Sopenharmony_ci#define BFI_IOC_TRC_OFF (0x4b00) 22362306a36Sopenharmony_ci#define BFI_IOC_TRC_ENTS 256 22462306a36Sopenharmony_ci#define BFI_IOC_TRC_ENT_SZ 16 22562306a36Sopenharmony_ci#define BFI_IOC_TRC_HDR_SZ 32 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#define BFI_IOC_FW_SIGNATURE (0xbfadbfad) 22862306a36Sopenharmony_ci#define BFI_IOC_FW_INV_SIGN (0xdeaddead) 22962306a36Sopenharmony_ci#define BFI_IOC_MD5SUM_SZ 4 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistruct bfi_ioc_fwver { 23262306a36Sopenharmony_ci#ifdef __BIG_ENDIAN 23362306a36Sopenharmony_ci u8 patch; 23462306a36Sopenharmony_ci u8 maint; 23562306a36Sopenharmony_ci u8 minor; 23662306a36Sopenharmony_ci u8 major; 23762306a36Sopenharmony_ci u8 rsvd[2]; 23862306a36Sopenharmony_ci u8 build; 23962306a36Sopenharmony_ci u8 phase; 24062306a36Sopenharmony_ci#else 24162306a36Sopenharmony_ci u8 major; 24262306a36Sopenharmony_ci u8 minor; 24362306a36Sopenharmony_ci u8 maint; 24462306a36Sopenharmony_ci u8 patch; 24562306a36Sopenharmony_ci u8 phase; 24662306a36Sopenharmony_ci u8 build; 24762306a36Sopenharmony_ci u8 rsvd[2]; 24862306a36Sopenharmony_ci#endif 24962306a36Sopenharmony_ci} __packed; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistruct bfi_ioc_image_hdr { 25262306a36Sopenharmony_ci u32 signature; /*!< constant signature */ 25362306a36Sopenharmony_ci u8 asic_gen; /*!< asic generation */ 25462306a36Sopenharmony_ci u8 asic_mode; 25562306a36Sopenharmony_ci u8 port0_mode; /*!< device mode for port 0 */ 25662306a36Sopenharmony_ci u8 port1_mode; /*!< device mode for port 1 */ 25762306a36Sopenharmony_ci u32 exec; /*!< exec vector */ 25862306a36Sopenharmony_ci u32 bootenv; /*!< firmware boot env */ 25962306a36Sopenharmony_ci u32 rsvd_b[2]; 26062306a36Sopenharmony_ci struct bfi_ioc_fwver fwver; 26162306a36Sopenharmony_ci u32 md5sum[BFI_IOC_MD5SUM_SZ]; 26262306a36Sopenharmony_ci} __packed; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cienum bfi_ioc_img_ver_cmp { 26562306a36Sopenharmony_ci BFI_IOC_IMG_VER_INCOMP, 26662306a36Sopenharmony_ci BFI_IOC_IMG_VER_OLD, 26762306a36Sopenharmony_ci BFI_IOC_IMG_VER_SAME, 26862306a36Sopenharmony_ci BFI_IOC_IMG_VER_BETTER 26962306a36Sopenharmony_ci}; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci#define BFI_FWBOOT_DEVMODE_OFF 4 27262306a36Sopenharmony_ci#define BFI_FWBOOT_TYPE_OFF 8 27362306a36Sopenharmony_ci#define BFI_FWBOOT_ENV_OFF 12 27462306a36Sopenharmony_ci#define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \ 27562306a36Sopenharmony_ci (((u32)(__asic_gen)) << 24 | \ 27662306a36Sopenharmony_ci ((u32)(__asic_mode)) << 16 | \ 27762306a36Sopenharmony_ci ((u32)(__p0_mode)) << 8 | \ 27862306a36Sopenharmony_ci ((u32)(__p1_mode))) 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cienum bfi_fwboot_type { 28162306a36Sopenharmony_ci BFI_FWBOOT_TYPE_NORMAL = 0, 28262306a36Sopenharmony_ci BFI_FWBOOT_TYPE_FLASH = 1, 28362306a36Sopenharmony_ci BFI_FWBOOT_TYPE_MEMTEST = 2, 28462306a36Sopenharmony_ci}; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_cienum bfi_port_mode { 28762306a36Sopenharmony_ci BFI_PORT_MODE_FC = 1, 28862306a36Sopenharmony_ci BFI_PORT_MODE_ETH = 2, 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistruct bfi_ioc_hbeat { 29262306a36Sopenharmony_ci struct bfi_mhdr mh; /*!< common msg header */ 29362306a36Sopenharmony_ci u32 hb_count; /*!< current heart beat count */ 29462306a36Sopenharmony_ci} __packed; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/* IOC hardware/firmware state */ 29762306a36Sopenharmony_cienum bfi_ioc_state { 29862306a36Sopenharmony_ci BFI_IOC_UNINIT = 0, /*!< not initialized */ 29962306a36Sopenharmony_ci BFI_IOC_INITING = 1, /*!< h/w is being initialized */ 30062306a36Sopenharmony_ci BFI_IOC_HWINIT = 2, /*!< h/w is initialized */ 30162306a36Sopenharmony_ci BFI_IOC_CFG = 3, /*!< IOC configuration in progress */ 30262306a36Sopenharmony_ci BFI_IOC_OP = 4, /*!< IOC is operational */ 30362306a36Sopenharmony_ci BFI_IOC_DISABLING = 5, /*!< IOC is being disabled */ 30462306a36Sopenharmony_ci BFI_IOC_DISABLED = 6, /*!< IOC is disabled */ 30562306a36Sopenharmony_ci BFI_IOC_CFG_DISABLED = 7, /*!< IOC is being disabled;transient */ 30662306a36Sopenharmony_ci BFI_IOC_FAIL = 8, /*!< IOC heart-beat failure */ 30762306a36Sopenharmony_ci BFI_IOC_MEMTEST = 9, /*!< IOC is doing memtest */ 30862306a36Sopenharmony_ci}; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cienum { 31162306a36Sopenharmony_ci BFI_ADAPTER_TYPE_FC = 0x01, /*!< FC adapters */ 31262306a36Sopenharmony_ci BFI_ADAPTER_TYPE_MK = 0x0f0000, /*!< adapter type mask */ 31362306a36Sopenharmony_ci BFI_ADAPTER_TYPE_SH = 16, /*!< adapter type shift */ 31462306a36Sopenharmony_ci BFI_ADAPTER_NPORTS_MK = 0xff00, /*!< number of ports mask */ 31562306a36Sopenharmony_ci BFI_ADAPTER_NPORTS_SH = 8, /*!< number of ports shift */ 31662306a36Sopenharmony_ci BFI_ADAPTER_SPEED_MK = 0xff, /*!< adapter speed mask */ 31762306a36Sopenharmony_ci BFI_ADAPTER_SPEED_SH = 0, /*!< adapter speed shift */ 31862306a36Sopenharmony_ci BFI_ADAPTER_PROTO = 0x100000, /*!< prototype adapaters */ 31962306a36Sopenharmony_ci BFI_ADAPTER_TTV = 0x200000, /*!< TTV debug capable */ 32062306a36Sopenharmony_ci BFI_ADAPTER_UNSUPP = 0x400000, /*!< unknown adapter type */ 32162306a36Sopenharmony_ci}; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci#define BFI_ADAPTER_GETP(__prop, __adap_prop) \ 32462306a36Sopenharmony_ci (((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >> \ 32562306a36Sopenharmony_ci BFI_ADAPTER_ ## __prop ## _SH) 32662306a36Sopenharmony_ci#define BFI_ADAPTER_SETP(__prop, __val) \ 32762306a36Sopenharmony_ci ((__val) << BFI_ADAPTER_ ## __prop ## _SH) 32862306a36Sopenharmony_ci#define BFI_ADAPTER_IS_SPECIAL(__adap_type) \ 32962306a36Sopenharmony_ci ((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \ 33062306a36Sopenharmony_ci BFI_ADAPTER_UNSUPP)) 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci/* BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages */ 33362306a36Sopenharmony_cistruct bfi_ioc_ctrl_req { 33462306a36Sopenharmony_ci struct bfi_mhdr mh; 33562306a36Sopenharmony_ci u16 clscode; 33662306a36Sopenharmony_ci u16 rsvd; 33762306a36Sopenharmony_ci u32 tv_sec; 33862306a36Sopenharmony_ci} __packed; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci/* BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages */ 34162306a36Sopenharmony_cistruct bfi_ioc_ctrl_reply { 34262306a36Sopenharmony_ci struct bfi_mhdr mh; /*!< Common msg header */ 34362306a36Sopenharmony_ci u8 status; /*!< enable/disable status */ 34462306a36Sopenharmony_ci u8 port_mode; /*!< enum bfa_mode */ 34562306a36Sopenharmony_ci u8 cap_bm; /*!< capability bit mask */ 34662306a36Sopenharmony_ci u8 rsvd; 34762306a36Sopenharmony_ci} __packed; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci#define BFI_IOC_MSGSZ 8 35062306a36Sopenharmony_ci/* H2I Messages */ 35162306a36Sopenharmony_ciunion bfi_ioc_h2i_msg_u { 35262306a36Sopenharmony_ci struct bfi_mhdr mh; 35362306a36Sopenharmony_ci struct bfi_ioc_ctrl_req enable_req; 35462306a36Sopenharmony_ci struct bfi_ioc_ctrl_req disable_req; 35562306a36Sopenharmony_ci struct bfi_ioc_getattr_req getattr_req; 35662306a36Sopenharmony_ci u32 mboxmsg[BFI_IOC_MSGSZ]; 35762306a36Sopenharmony_ci} __packed; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci/* I2H Messages */ 36062306a36Sopenharmony_ciunion bfi_ioc_i2h_msg_u { 36162306a36Sopenharmony_ci struct bfi_mhdr mh; 36262306a36Sopenharmony_ci struct bfi_ioc_ctrl_reply fw_event; 36362306a36Sopenharmony_ci u32 mboxmsg[BFI_IOC_MSGSZ]; 36462306a36Sopenharmony_ci} __packed; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/*---------------------------------------------------------------------- 36762306a36Sopenharmony_ci * MSGQ 36862306a36Sopenharmony_ci *---------------------------------------------------------------------- 36962306a36Sopenharmony_ci */ 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cienum bfi_msgq_h2i_msgs { 37262306a36Sopenharmony_ci BFI_MSGQ_H2I_INIT_REQ = 1, 37362306a36Sopenharmony_ci BFI_MSGQ_H2I_DOORBELL_PI = 2, 37462306a36Sopenharmony_ci BFI_MSGQ_H2I_DOORBELL_CI = 3, 37562306a36Sopenharmony_ci BFI_MSGQ_H2I_CMDQ_COPY_RSP = 4, 37662306a36Sopenharmony_ci}; 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_cienum bfi_msgq_i2h_msgs { 37962306a36Sopenharmony_ci BFI_MSGQ_I2H_INIT_RSP = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ), 38062306a36Sopenharmony_ci BFI_MSGQ_I2H_DOORBELL_PI = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI), 38162306a36Sopenharmony_ci BFI_MSGQ_I2H_DOORBELL_CI = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI), 38262306a36Sopenharmony_ci BFI_MSGQ_I2H_CMDQ_COPY_REQ = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP), 38362306a36Sopenharmony_ci}; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci/* Messages(commands/responsed/AENS will have the following header */ 38662306a36Sopenharmony_cistruct bfi_msgq_mhdr { 38762306a36Sopenharmony_ci u8 msg_class; 38862306a36Sopenharmony_ci u8 msg_id; 38962306a36Sopenharmony_ci u16 msg_token; 39062306a36Sopenharmony_ci u16 num_entries; 39162306a36Sopenharmony_ci u8 enet_id; 39262306a36Sopenharmony_ci u8 rsvd; 39362306a36Sopenharmony_ci} __packed; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci#define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do { \ 39662306a36Sopenharmony_ci (_mh).msg_class = (_mc); \ 39762306a36Sopenharmony_ci (_mh).msg_id = (_mid); \ 39862306a36Sopenharmony_ci (_mh).msg_token = (_tok); \ 39962306a36Sopenharmony_ci (_mh).enet_id = (_enet_id); \ 40062306a36Sopenharmony_ci} while (0) 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci/* 40362306a36Sopenharmony_ci * Mailbox for messaging interface 40462306a36Sopenharmony_ci */ 40562306a36Sopenharmony_ci#define BFI_MSGQ_CMD_ENTRY_SIZE (64) /* TBD */ 40662306a36Sopenharmony_ci#define BFI_MSGQ_RSP_ENTRY_SIZE (64) /* TBD */ 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci#define bfi_msgq_num_cmd_entries(_size) \ 40962306a36Sopenharmony_ci (((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE) 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_cistruct bfi_msgq { 41262306a36Sopenharmony_ci union bfi_addr_u addr; 41362306a36Sopenharmony_ci u16 q_depth; /* Total num of entries in the queue */ 41462306a36Sopenharmony_ci u8 rsvd[2]; 41562306a36Sopenharmony_ci} __packed; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci/* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */ 41862306a36Sopenharmony_cistruct bfi_msgq_cfg_req { 41962306a36Sopenharmony_ci struct bfi_mhdr mh; 42062306a36Sopenharmony_ci struct bfi_msgq cmdq; 42162306a36Sopenharmony_ci struct bfi_msgq rspq; 42262306a36Sopenharmony_ci} __packed; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci/* BFI_ENET_MSGQ_CFG_RSP */ 42562306a36Sopenharmony_cistruct bfi_msgq_cfg_rsp { 42662306a36Sopenharmony_ci struct bfi_mhdr mh; 42762306a36Sopenharmony_ci u8 cmd_status; 42862306a36Sopenharmony_ci u8 rsvd[3]; 42962306a36Sopenharmony_ci} __packed; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci/* BFI_MSGQ_H2I_DOORBELL */ 43262306a36Sopenharmony_cistruct bfi_msgq_h2i_db { 43362306a36Sopenharmony_ci struct bfi_mhdr mh; 43462306a36Sopenharmony_ci union { 43562306a36Sopenharmony_ci u16 cmdq_pi; 43662306a36Sopenharmony_ci u16 rspq_ci; 43762306a36Sopenharmony_ci } __packed idx; 43862306a36Sopenharmony_ci} __packed; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci/* BFI_MSGQ_I2H_DOORBELL */ 44162306a36Sopenharmony_cistruct bfi_msgq_i2h_db { 44262306a36Sopenharmony_ci struct bfi_mhdr mh; 44362306a36Sopenharmony_ci union { 44462306a36Sopenharmony_ci u16 rspq_pi; 44562306a36Sopenharmony_ci u16 cmdq_ci; 44662306a36Sopenharmony_ci } __packed idx; 44762306a36Sopenharmony_ci} __packed; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci#define BFI_CMD_COPY_SZ 28 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci/* BFI_MSGQ_H2I_CMD_COPY_RSP */ 45262306a36Sopenharmony_cistruct bfi_msgq_h2i_cmdq_copy_rsp { 45362306a36Sopenharmony_ci struct bfi_mhdr mh; 45462306a36Sopenharmony_ci u8 data[BFI_CMD_COPY_SZ]; 45562306a36Sopenharmony_ci} __packed; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci/* BFI_MSGQ_I2H_CMD_COPY_REQ */ 45862306a36Sopenharmony_cistruct bfi_msgq_i2h_cmdq_copy_req { 45962306a36Sopenharmony_ci struct bfi_mhdr mh; 46062306a36Sopenharmony_ci u16 offset; 46162306a36Sopenharmony_ci u16 len; 46262306a36Sopenharmony_ci} __packed; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci/* 46562306a36Sopenharmony_ci * FLASH module specific 46662306a36Sopenharmony_ci */ 46762306a36Sopenharmony_cienum bfi_flash_h2i_msgs { 46862306a36Sopenharmony_ci BFI_FLASH_H2I_QUERY_REQ = 1, 46962306a36Sopenharmony_ci BFI_FLASH_H2I_ERASE_REQ = 2, 47062306a36Sopenharmony_ci BFI_FLASH_H2I_WRITE_REQ = 3, 47162306a36Sopenharmony_ci BFI_FLASH_H2I_READ_REQ = 4, 47262306a36Sopenharmony_ci BFI_FLASH_H2I_BOOT_VER_REQ = 5, 47362306a36Sopenharmony_ci}; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cienum bfi_flash_i2h_msgs { 47662306a36Sopenharmony_ci BFI_FLASH_I2H_QUERY_RSP = BFA_I2HM(1), 47762306a36Sopenharmony_ci BFI_FLASH_I2H_ERASE_RSP = BFA_I2HM(2), 47862306a36Sopenharmony_ci BFI_FLASH_I2H_WRITE_RSP = BFA_I2HM(3), 47962306a36Sopenharmony_ci BFI_FLASH_I2H_READ_RSP = BFA_I2HM(4), 48062306a36Sopenharmony_ci BFI_FLASH_I2H_BOOT_VER_RSP = BFA_I2HM(5), 48162306a36Sopenharmony_ci BFI_FLASH_I2H_EVENT = BFA_I2HM(127), 48262306a36Sopenharmony_ci}; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci/* 48562306a36Sopenharmony_ci * Flash query request 48662306a36Sopenharmony_ci */ 48762306a36Sopenharmony_cistruct bfi_flash_query_req { 48862306a36Sopenharmony_ci struct bfi_mhdr mh; /* Common msg header */ 48962306a36Sopenharmony_ci struct bfi_alen alen; 49062306a36Sopenharmony_ci} __packed; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci/* 49362306a36Sopenharmony_ci * Flash write request 49462306a36Sopenharmony_ci */ 49562306a36Sopenharmony_cistruct bfi_flash_write_req { 49662306a36Sopenharmony_ci struct bfi_mhdr mh; /* Common msg header */ 49762306a36Sopenharmony_ci struct bfi_alen alen; 49862306a36Sopenharmony_ci u32 type; /* partition type */ 49962306a36Sopenharmony_ci u8 instance; /* partition instance */ 50062306a36Sopenharmony_ci u8 last; 50162306a36Sopenharmony_ci u8 rsv[2]; 50262306a36Sopenharmony_ci u32 offset; 50362306a36Sopenharmony_ci u32 length; 50462306a36Sopenharmony_ci} __packed; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci/* 50762306a36Sopenharmony_ci * Flash read request 50862306a36Sopenharmony_ci */ 50962306a36Sopenharmony_cistruct bfi_flash_read_req { 51062306a36Sopenharmony_ci struct bfi_mhdr mh; /* Common msg header */ 51162306a36Sopenharmony_ci u32 type; /* partition type */ 51262306a36Sopenharmony_ci u8 instance; /* partition instance */ 51362306a36Sopenharmony_ci u8 rsv[3]; 51462306a36Sopenharmony_ci u32 offset; 51562306a36Sopenharmony_ci u32 length; 51662306a36Sopenharmony_ci struct bfi_alen alen; 51762306a36Sopenharmony_ci} __packed; 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci/* 52062306a36Sopenharmony_ci * Flash query response 52162306a36Sopenharmony_ci */ 52262306a36Sopenharmony_cistruct bfi_flash_query_rsp { 52362306a36Sopenharmony_ci struct bfi_mhdr mh; /* Common msg header */ 52462306a36Sopenharmony_ci u32 status; 52562306a36Sopenharmony_ci} __packed; 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci/* 52862306a36Sopenharmony_ci * Flash read response 52962306a36Sopenharmony_ci */ 53062306a36Sopenharmony_cistruct bfi_flash_read_rsp { 53162306a36Sopenharmony_ci struct bfi_mhdr mh; /* Common msg header */ 53262306a36Sopenharmony_ci u32 type; /* partition type */ 53362306a36Sopenharmony_ci u8 instance; /* partition instance */ 53462306a36Sopenharmony_ci u8 rsv[3]; 53562306a36Sopenharmony_ci u32 status; 53662306a36Sopenharmony_ci u32 length; 53762306a36Sopenharmony_ci} __packed; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci/* 54062306a36Sopenharmony_ci * Flash write response 54162306a36Sopenharmony_ci */ 54262306a36Sopenharmony_cistruct bfi_flash_write_rsp { 54362306a36Sopenharmony_ci struct bfi_mhdr mh; /* Common msg header */ 54462306a36Sopenharmony_ci u32 type; /* partition type */ 54562306a36Sopenharmony_ci u8 instance; /* partition instance */ 54662306a36Sopenharmony_ci u8 rsv[3]; 54762306a36Sopenharmony_ci u32 status; 54862306a36Sopenharmony_ci u32 length; 54962306a36Sopenharmony_ci} __packed; 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci#endif /* __BFI_H__ */ 552