| /* |
| * Chip-specific hardware definitions for |
| * Broadcom 802.11abg Networking Device Driver |
| * |
| * Broadcom Proprietary and Confidential. Copyright (C) 2020, |
| * All Rights Reserved. |
| * |
| * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom; |
| * the contents of this file may not be disclosed to third parties, |
| * copied or duplicated in any form, in whole or in part, without |
| * the prior written permission of Broadcom. |
| * |
| * |
| * <<Broadcom-WL-IPTag/Proprietary:>> |
| */ |
| |
| #ifndef _D11_H |
| #define _D11_H |
| |
| /* |
| * Notes: |
| * 1. pre40/pre rev40: corerev < 40 |
| * 2. pre80/pre rev80: 40 <= corerev < 80 |
| * 3. rev40/D11AC: 80 > corerev >= 40 |
| * 4. rev80: corerev >= 80 |
| */ |
| |
| #include <typedefs.h> |
| #include <hndsoc.h> |
| #include <sbhnddma.h> |
| #include <802.11.h> |
| |
| #if defined(BCMDONGLEHOST) || defined(WL_UNITTEST) |
| typedef struct { |
| uint32 pad; |
| } shmdefs_t; |
| #else /* defined(BCMDONGLEHOST)|| defined(WL_UNITTEST) */ |
| #include <d11shm.h> |
| #ifdef USE_BCMCONF_H |
| #include <bcmconf.h> |
| #else |
| #include <wlc_cfg.h> |
| #endif |
| #endif /* !defined(BCMDONGLEHOST)|| !defined(WL_UNITTEST) */ |
| |
| #include <d11regs.h> |
| |
| /* This marks the start of a packed structure section. */ |
| #include <packed_section_start.h> |
| |
| /* cpp contortions to concatenate w/arg prescan */ |
| #ifndef PAD |
| #define _PADLINE(line) pad ## line |
| #define _XSTR(line) _PADLINE(line) |
| #define PAD _XSTR(__LINE__) |
| #endif |
| |
| #define D11AC_BCN_TMPL_LEN 640 /**< length of the BCN template area for 11AC */ |
| |
| #define LPRS_TMPL_LEN 512 /**< length of the legacy PRS template area */ |
| |
| /* RX FIFO numbers */ |
| #define RX_FIFO 0 /**< data and ctl frames */ |
| #define RX_FIFO1 1 /**< ctl frames */ |
| #define RX_FIFO2 2 /**< ctl frames */ |
| #define RX_FIFO_NUMBER 3 |
| |
| /* TX FIFO numbers using WME Access Classes */ |
| #define TX_AC_BK_FIFO 0 /**< Access Category Background TX FIFO */ |
| #define TX_AC_BE_FIFO 1 /**< Access Category Best-Effort TX FIFO */ |
| #define TX_AC_VI_FIFO 2 /**< Access Class Video TX FIFO */ |
| #define TX_AC_VO_FIFO 3 /**< Access Class Voice TX FIFO */ |
| #define TX_BCMC_FIFO 4 /**< Broadcast/Multicast TX FIFO */ |
| #define TX_ATIM_FIFO 5 /**< TX fifo for ATIM window info */ |
| #define TX_AC_N_DATA_FIFO 4 /**< Number of legacy Data Fifos (BK, BE, VI, VO) */ |
| |
| /* TX FIFO numbers for trigger queues for HE STA only chips (i.e |
| * This is valid only for 4369 or similar STA chips that supports |
| * a single HE STA connection. |
| */ |
| #define TX_TRIG_BK_FIFO 6 /**< Access Category Background TX FIFO */ |
| #define TX_TRIG_BE_FIFO 7 /**< Access Category Best-Effort TX FIFO */ |
| #define TX_TRIG_VI_FIFO 8 /**< Access Class Video TX FIFO */ |
| #define TX_TRIG_VO_FIFO 9 /**< Access Class Voice TX FIFO */ |
| #define TX_TRIG_HP_FIFO 10 /**< Access High Priority TX FIFO */ |
| #define TX_TRIG_N_DATA_FIFO 4 /**< Number of Trigger Data Fifos (BK, BE, VI, VO) */ |
| |
| #if defined(WL11AX_TRIGGERQ) && !defined(WL11AX_TRIGGERQ_DISABLED) |
| #define IS_TRIG_FIFO(fifo) \ |
| (((fifo) >= TX_TRIG_BK_FIFO) && ((fifo) < (TX_TRIG_BK_FIFO + TX_TRIG_N_DATA_FIFO))) |
| #else |
| #define IS_TRIG_FIFO(fifo) FALSE |
| #endif /* defined(WL11AX_TRIGGERQ) && !defined(WL11AX_TRIGGERQ_DISABLED) */ |
| |
| #define IS_AC_FIFO(fifo) \ |
| ((fifo) < (TX_AC_BK_FIFO + TX_AC_N_DATA_FIFO)) |
| |
| /** Legacy TX FIFO numbers */ |
| #define TX_DATA_FIFO TX_AC_BE_FIFO |
| #define TX_CTL_FIFO TX_AC_VO_FIFO |
| |
| /** Trig TX FIFO numbers */ |
| #define TX_TRIG_DATA_FIFO TX_TRIG_BE_FIFO |
| #define TX_TRIG_CTL_FIFO TX_TRIG_VO_FIFO |
| |
| /* Extended FIFOs for corerev >= 64 */ |
| #define TX_FIFO_6 6 |
| #define TX_FIFO_7 7 |
| #define TX_FIFO_16 16 |
| #define TX_FIFO_23 23 |
| #define TX_FIFO_25 25 |
| |
| #define TX_FIFO_EXT_START TX_FIFO_6 /* Starting index of extendied HW TX FIFOs */ |
| #define TX_FIFO_MU_START 8 /* index at which MU TX FIFOs start */ |
| |
| #define D11REG_IHR_WBASE 0x200 |
| #define D11REG_IHR_BASE (D11REG_IHR_WBASE << 1) |
| |
| #define PIHR_BASE 0x0400 /**< byte address of packed IHR region */ |
| |
| /* biststatus */ |
| #define BT_DONE (1U << 31) /**< bist done */ |
| #define BT_B2S (1 << 30) /**< bist2 ram summary bit */ |
| |
| /* DMA intstatus and intmask */ |
| #define I_PC (1 << 10) /**< pci descriptor error */ |
| #define I_PD (1 << 11) /**< pci data error */ |
| #define I_DE (1 << 12) /**< descriptor protocol error */ |
| #define I_RU (1 << 13) /**< receive descriptor underflow */ |
| #define I_RO (1 << 14) /**< receive fifo overflow */ |
| #define I_XU (1 << 15) /**< transmit fifo underflow */ |
| #define I_RI (1 << 16) /**< receive interrupt */ |
| #define I_XI (1 << 24) /**< transmit interrupt */ |
| |
| /* interrupt receive lazy */ |
| #define IRL_TO_MASK 0x00ffffff /**< timeout */ |
| #define IRL_FC_MASK 0xff000000 /**< frame count */ |
| #define IRL_FC_SHIFT 24 /**< frame count */ |
| #define IRL_DISABLE 0x01000000 /**< Disabled value: int on 1 frame, zero time */ |
| |
| /** for correv >= 80. prev rev uses bit 21 */ |
| #define MCTL_BCNS_PROMISC_SHIFT 21 |
| /** for correv < 80. prev rev uses bit 20 */ |
| #define MCTL_BCNS_PROMISC_SHIFT_LT80 20 |
| |
| /* maccontrol register */ |
| #define MCTL_GMODE (1U << 31) |
| #define MCTL_DISCARD_PMQ (1 << 30) |
| #define MCTL_DISCARD_TXSTATUS (1 << 29) |
| #define MCTL_TBTT_HOLD (1 << 28) |
| #define MCTL_CLOSED_NETWORK (1 << 27) |
| #define MCTL_WAKE (1 << 26) |
| #define MCTL_HPS (1 << 25) |
| #define MCTL_PROMISC (1 << 24) |
| #define MCTL_KEEPBADFCS (1 << 23) |
| #define MCTL_KEEPCONTROL (1 << 22) |
| #define MCTL_BCNS_PROMISC (1 << MCTL_BCNS_PROMISC_SHIFT) |
| #define MCTL_BCNS_PROMISC_LT80 (1 << MCTL_BCNS_PROMISC_SHIFT_LT80) |
| #define MCTL_NO_TXDMA_LAST_PTR (1 << 20) /** for correv >= 85 */ |
| #define MCTL_LOCK_RADIO (1 << 19) |
| #define MCTL_AP (1 << 18) |
| #define MCTL_INFRA (1 << 17) |
| #define MCTL_BIGEND (1 << 16) |
| #define MCTL_DISABLE_CT (1 << 14) /** for corerev >= 83.1 */ |
| #define MCTL_GPOUT_SEL_MASK (3 << 14) |
| #define MCTL_GPOUT_SEL_SHIFT 14 |
| #define MCTL_EN_PSMDBG (1 << 13) |
| #define MCTL_IHR_EN (1 << 10) |
| #define MCTL_SHM_UPPER (1 << 9) |
| #define MCTL_SHM_EN (1 << 8) |
| #define MCTL_PSM_JMP_0 (1 << 2) |
| #define MCTL_PSM_RUN (1 << 1) |
| #define MCTL_EN_MAC (1 << 0) |
| |
| /* maccontrol1 register */ |
| #define MCTL1_GCPS (1u << 0u) |
| #define MCTL1_EGS_MASK 0x0000c000 |
| #define MCTL1_EGS_SHIFT 14u |
| #define MCTL1_AVB_ENABLE (1u << 1u) |
| #define MCTL1_GPIOSEL_SHIFT 8u |
| #define MCTL1_GPIOSEL (0x3F) |
| #define MCTL1_GPIOSEL_MASK (MCTL1_GPIOSEL << MCTL1_GPIOSEL_SHIFT) |
| /* Select MAC_SMPL_CPTR debug data that is placed in pc<7:1> & ifs_gpio_out<8:0> GPIOs */ |
| #define MCTL1_GPIOSEL_TSF_PC_IFS(_corerev) (D11REV_GE(_corerev, 85) ? 0x3b : 0x36) |
| #define MCTL1_AVB_TRIGGER (1u << 2u) |
| #define MCTL1_THIRD_AXI1_FOR_PSM (1u << 3u) |
| #define MCTL1_AXI1_FOR_RX (1u << 4u) |
| #define MCTL1_TXDMA_ENABLE_PASS (1u << 5u) |
| /* SampleCollectPlayCtrl */ |
| #define SC_PLAYCTRL_MASK_ENABLE (1u << 8u) |
| #define SC_PLAYCTRL_TRANS_MODE (1u << 6u) |
| #define SC_PLAYCTRL_SRC_SHIFT 3u |
| #define SC_PLAYCTRL_SRC_MASK (3u << SC_PLAYCTRL_SRC_SHIFT) |
| #define SC_PLAYCTRL_SRC_PHY_DBG (3u << SC_PLAYCTRL_SRC_SHIFT) |
| #define SC_PLAYCTRL_SRC_GPIO_OUT (2u << SC_PLAYCTRL_SRC_SHIFT) |
| #define SC_PLAYCTRL_SRC_GPIO_IN (1u << SC_PLAYCTRL_SRC_SHIFT) |
| #define SC_PLAYCTRL_SRC_PHY_SMPL (0u << SC_PLAYCTRL_SRC_SHIFT) |
| #define SC_PLAYCTRL_STOP (1u << 2u) |
| #define SC_PLAYCTRL_PAUSE (1u << 1u) |
| #define SC_PLAYCTRL_START (1u << 0u) |
| /* SCPortalSel fields */ |
| #define SC_PORTAL_SEL_AUTO_INCR (1u << 15u) /* Autoincr */ |
| #define SC_PORTAL_SEL_STORE_MASK (0u << 5u) /* Bits 14:5 SCStoreMask15to0 */ |
| #define SC_PORTAL_SEL_MATCH_MASK (4u << 5u) /* Bits 14:5 SCMatchMask15to0 */ |
| #define SC_PORTAL_SEL_MATCH_VALUE (8u << 5u) /* Bits 14:5 SCMatchValue15to0 */ |
| #define SC_PORTAL_SEL_TRIGGER_MASK (12u << 0u) /* Bits 4:0 SCTriggerMask15to0 */ |
| #define SC_PORTAL_SEL_TRIGGER_VALUE (16u << 0u) /* Bits 4:0 SCTriggerValue15to0 */ |
| #define SC_PORTAL_SEL_TRANS_MASK (20u << 0u) /* Bits 4:0 SCTransMask15to0 */ |
| |
| /* GpioOut register */ |
| #define MGPIO_OUT_RXQ1_IFIFO_CNT_MASK 0x1fc0u |
| #define MGPIO_OUT_RXQ1_IFIFO_CNT_SHIFT 6u |
| |
| #define MAC_RXQ1_IFIFO_CNT_ADDR 0x26u |
| #define MAC_RXQ1_IFIFO_MAXLEN 3u |
| |
| /* maccommand register */ |
| #define MCMD_BCN0VLD (1 << 0) |
| #define MCMD_BCN1VLD (1 << 1) |
| #define MCMD_DIRFRMQVAL (1 << 2) |
| #define MCMD_CCA (1 << 3) |
| #define MCMD_BG_NOISE (1 << 4) |
| #define MCMD_SKIP_SHMINIT (1 << 5) /**< only used for simulation */ |
| #define MCMD_SLOWCAL (1 << 6) |
| #define MCMD_SAMPLECOLL MCMD_SKIP_SHMINIT /**< reuse for sample collect */ |
| #define MCMD_IF_DOWN (1 << 8 ) /**< indicate interface is going down */ |
| #define MCMD_TOF (1 << 9) /**< wifi ranging processing in ucode for rxd frames */ |
| #define MCMD_TSYNC (1 << 10) /**< start timestamp sync process in ucode */ |
| #define MCMD_RADIO_DOWN (1 << 11) /**< radio down by ucode */ |
| #define MCMD_RADIO_UP (1 << 12) /**< radio up by ucode */ |
| #define MCMD_TXPU (1 << 13) /**< txpu control by ucode */ |
| |
| /* macintstatus/macintmask */ |
| #define MI_MACSSPNDD (1 << 0) /**< MAC has gracefully suspended */ |
| #define MI_BCNTPL (1 << 1) /**< beacon template available */ |
| #define MI_TBTT (1 << 2) /**< TBTT indication */ |
| #define MI_BCNSUCCESS (1 << 3) /**< beacon successfully tx'd */ |
| #define MI_BCNCANCLD (1 << 4) /**< beacon canceled (IBSS) */ |
| #define MI_ATIMWINEND (1 << 5) /**< end of ATIM-window (IBSS) */ |
| #define MI_PMQ (1 << 6) /**< PMQ entries available */ |
| #define MI_ALTTFS (1 << 7) /**< TX status interrupt for ARM offloads */ |
| #define MI_NSPECGEN_1 (1 << 8) /**< non-specific gen-stat bits that are set by PSM */ |
| #define MI_MACTXERR (1 << 9) /**< MAC level Tx error */ |
| #define MI_PMQERR (1 << 10) |
| #define MI_PHYTXERR (1 << 11) /**< PHY Tx error */ |
| #define MI_PME (1 << 12) /**< Power Management Event */ |
| #define MI_GP0 (1 << 13) /**< General-purpose timer0 */ |
| #define MI_GP1 (1 << 14) /**< General-purpose timer1 */ |
| #define MI_DMAINT (1 << 15) /**< (ORed) DMA-interrupts */ |
| #define MI_TXSTOP (1 << 16) /**< MAC has completed a TX FIFO Suspend/Flush */ |
| #define MI_CCA (1 << 17) /**< MAC has completed a CCA measurement */ |
| #define MI_BG_NOISE (1 << 18) /**< MAC has collected background noise samples */ |
| #define MI_DTIM_TBTT (1 << 19) /**< MBSS DTIM TBTT indication */ |
| #define MI_PRQ (1 << 20) /**< Probe response queue needs attention */ |
| #define MI_HEB (1 << 21) /**< HEB (Hardware Event Block) interrupt - 11ax cores */ |
| #define MI_BT_RFACT_STUCK (1 << 22) /**< MAC has detected invalid BT_RFACT pin, |
| * valid when rev < 15 |
| */ |
| #define MI_TTTT (1 << 22) /**< Target TIM Transmission Time, |
| * valid in rev = 26/29, or rev >= 42 |
| */ |
| #define MI_BT_PRED_REQ (1 << 23) /**< MAC requested driver BTCX predictor calc */ |
| #define MI_BCNTRIM_RX (1 << 24) /**< PSM received a partial beacon */ |
| #define MI_P2P (1 << 25) /**< WiFi P2P interrupt */ |
| #define MI_DMATX (1 << 26) /**< MAC new frame ready */ |
| #define MI_TSSI_LIMIT (1 << 27) /**< Tssi Limit Reach, TxIdx=0/127 Interrupt */ |
| #define MI_HWACI_NOTIFY (1 << 27) /**< HWACI detects ACI, Apply Mitigation settings */ |
| #define MI_RFDISABLE (1 << 28) /**< MAC detected a change on RF Disable input |
| * (corerev >= 10) |
| */ |
| #define MI_TFS (1 << 29) /**< MAC has completed a TX (corerev >= 5) */ |
| #define MI_LEGACY_BUS_ERROR (1 << 30) /**< uCode indicated bus error */ |
| #define MI_TO (1U << 31) /**< general purpose timeout (corerev >= 3) */ |
| |
| #define MI_RXOV MI_NSPECGEN_1 /**< rxfifo overflow interrupt */ |
| |
| /* macintstatus_ext/macintmask_ext */ |
| #define MI_BUS_ERROR (1U << 0u) /**< uCode indicated bus error */ |
| #define MI_VCOPLL (1U << 1u) /**< uCode indicated PLL lock issue */ |
| #define MI_EXT_PS_CHG (1U << 2u) /**< Power state is changing (PS 0 <-> 1) */ |
| #define MI_DIS_ULOFDMA (1U << 3u) /**< ucode indicated disabling ULOFDMA request */ |
| #define MI_EXT_PM_OFFLOAD (1U << 4u) /**< PM offload */ |
| #define MI_OBSS_INTR (1U << 5u) /**< OBSS detection interrupt */ |
| #define MI_SENSORC_CX_REQ (1U << 6u) /**< SensorC Mitigation Request interrupt */ |
| #define MI_RLL_NAV_HOF (1U << 7u) /**< RLLW Switch */ |
| |
| #define MI_EXT_TXE_SHARED_ERR (1U << 28u) /* Error event in blocks inside TXE shared |
| * (BMC/AQM/AQM-DMA/MIF) |
| */ |
| |
| /* Mac capabilities registers */ |
| #define MCAP_TKIPMIC 0x80000000 /**< TKIP MIC hardware present */ |
| #define MCAP_TKIPPH2KEY 0x40000000 /**< TKIP phase 2 key hardware present */ |
| #define MCAP_BTCX 0x20000000 /**< BT coexistence hardware and pins present */ |
| #define MCAP_MBSS 0x10000000 /**< Multi-BSS hardware present */ |
| #define MCAP_RXFSZ_MASK 0x0ff80000 /**< Rx fifo size in blocks (revid >= 16) */ |
| #define MCAP_RXFSZ_SHIFT 19 |
| #define MCAP_NRXQ_MASK 0x00070000 /**< Max Rx queues supported - 1 */ |
| #define MCAP_NRXQ_SHIFT 16 |
| #define MCAP_UCMSZ_MASK 0x0000e000 /**< Ucode memory size */ |
| #define MCAP_UCMSZ_3K3 0 /**< 3328 Words Ucode memory, in unit of 50-bit */ |
| #define MCAP_UCMSZ_4K 1 /**< 4096 Words Ucode memory */ |
| #define MCAP_UCMSZ_5K 2 /**< 5120 Words Ucode memory */ |
| #define MCAP_UCMSZ_6K 3 /**< 6144 Words Ucode memory */ |
| #define MCAP_UCMSZ_8K 4 /**< 8192 Words Ucode memory */ |
| #define MCAP_UCMSZ_SHIFT 13 |
| #define MCAP_TXFSZ_MASK 0x00000ff8 /**< Tx fifo size (* 512 bytes) */ |
| #define MCAP_TXFSZ_SHIFT 3 |
| #define MCAP_NTXQ_MASK 0x00000007 /**< Max Tx queues supported - 1 */ |
| #define MCAP_NTXQ_SHIFT 0 |
| |
| #define MCAP_BTCX_SUP(corerev) (MCAP_BTCX) |
| |
| #define MCAP_UCMSZ_TYPES 8 /**< different Ucode memory size types */ |
| |
| /* machwcap1 */ |
| #define MCAP1_ERC_MASK 0x00000001 /**< external radio coexistence */ |
| #define MCAP1_ERC_SHIFT 0 |
| #define MCAP1_SHMSZ_MASK 0x0000000e /**< shm size (corerev >= 16) */ |
| #define MCAP1_SHMSZ_SHIFT 1 |
| #define MCAP1_SHMSZ_1K 0 /**< 1024 words in unit of 32-bit */ |
| #define MCAP1_SHMSZ_2K 1 /**< 1536 words in unit of 32-bit */ |
| #define MCAP1_NUMMACCHAINS 0x00003000 /**< Indicates one less than the |
| number of MAC Chains in the MAC. |
| */ |
| #define MCAP1_NUMMACCHAINS_SHIFT 12 |
| #define MCAP1_RXBLMAX_MASK 0x1800000u |
| #define MCAP1_RXBLMAX_SHIFT 23u |
| #define MCAP1_NUM_HEB_MASK 0xE0000000u |
| #define MCAP1_NUM_HEB_SHIFT 29u |
| #define MCAP1_NUM_HEB_FACTOR 3u |
| #define MCAP1_CT_CAPABLE_SHIFT 17 |
| |
| /* BTCX control */ |
| #define BTCX_CTRL_EN 0x0001 /**< Enable BTCX module */ |
| #define BTCX_CTRL_SW 0x0002 /**< Enable software override */ |
| #define BTCX_CTRL_DSBLBTCXOUT 0x8000 /* Disable txconf/prisel signal output from btcx module */ |
| |
| #define BTCX_CTRL_PRI_POL 0x0080 /* Invert prisel polarity */ |
| #define BTCX_CTRL_TXC_POL 0x0020 /* Invert txconf polarity */ |
| |
| #define SW_PRI_ON 1 /* switch prisel polarity */ |
| #define SW_TXC_ON 2 /* switch txconf polarity */ |
| |
| /* BTCX status */ |
| #define BTCX_STAT_RA 0x0001 /**< RF_ACTIVE state */ |
| |
| /* BTCX transaction control */ |
| #define BTCX_TRANS_ANTSEL 0x0040 /**< ANTSEL output */ |
| #define BTCX_TRANS_TXCONF 0x0080 /**< TX_CONF output */ |
| |
| /* pmqhost data */ |
| #define PMQH_DATA_MASK 0xffff0000 /**< data entry of head pmq entry */ |
| #define PMQH_BSSCFG 0x00100000 /**< PM entry for BSS config */ |
| #define PMQH_PMOFF 0x00010000 /**< PM Mode OFF: power save off */ |
| #define PMQH_PMON 0x00020000 /**< PM Mode ON: power save on */ |
| #define PMQH_PMPS 0x00200000 /**< PM Mode PRETEND */ |
| #define PMQH_DASAT 0x00040000 /**< Dis-associated or De-authenticated */ |
| #define PMQH_ATIMFAIL 0x00080000 /**< ATIM not acknowledged */ |
| #define PMQH_DEL_ENTRY 0x00000001 /**< delete head entry */ |
| #define PMQH_DEL_MULT 0x00000002 /**< delete head entry to cur read pointer -1 */ |
| #define PMQH_OFLO 0x00000004 /**< pmq overflow indication */ |
| #define PMQH_NOT_EMPTY 0x00000008 /**< entries are present in pmq */ |
| |
| /* phydebug (corerev >= 3) */ |
| #define PDBG_CRS (1 << 0) /**< phy is asserting carrier sense */ |
| #define PDBG_TXA (1 << 1) /**< phy is taking xmit byte from mac this cycle */ |
| #define PDBG_TXF (1 << 2) /**< mac is instructing the phy to transmit a frame */ |
| #define PDBG_TXE (1 << 3) /**< phy is signaling a transmit Error to the mac */ |
| #define PDBG_RXF (1 << 4) /**< phy detected the end of a valid frame preamble */ |
| #define PDBG_RXS (1 << 5) /**< phy detected the end of a valid PLCP header */ |
| #define PDBG_RXFRG (1 << 6) /**< rx start not asserted */ |
| #define PDBG_RXV (1 << 7) /**< mac is taking receive byte from phy this cycle */ |
| #define PDBG_RFD (1 << 16) /**< RF portion of the radio is disabled */ |
| |
| /* objaddr register */ |
| #define OBJADDR_UCM_SEL 0x00000000 |
| #define OBJADDR_SHM_SEL 0x00010000 |
| #define OBJADDR_SCR_SEL 0x00020000 |
| #define OBJADDR_IHR_SEL 0x00030000 |
| #define OBJADDR_RCMTA_SEL 0x00040000 |
| #define OBJADDR_AMT_SEL 0x00040000 |
| #define OBJADDR_SRCHM_SEL 0x00060000 |
| #define OBJADDR_KEYTBL_SEL 0x000c0000 |
| #define OBJADDR_HEB_SEL 0x00120000 |
| #define OBJADDR_TXDC_TBL_SEL 0x00140000 |
| #define OBJADDR_TXDC_RIB_SEL 0x00150000 |
| #define OBJADDR_FCBS_SEL 0x00160000 |
| #define OBJADDR_LIT_SEL 0x00170000 |
| #define OBJADDR_LIB_SEL 0x00180000 |
| #define OBJADDR_WINC 0x01000000 |
| #define OBJADDR_RINC 0x02000000 |
| #define OBJADDR_AUTO_INC 0x03000000 |
| /* SHM/SCR/IHR/SHMX/SCRX/IHRX allow 2 bytes read/write, else only 4 bytes */ |
| #define OBJADDR_2BYTES_ACCESS(sel) \ |
| (((sel & 0x70000) == OBJADDR_SHM_SEL) || \ |
| ((sel & 0x70000) == OBJADDR_SCR_SEL) || \ |
| ((sel & 0x70000) == OBJADDR_IHR_SEL)) |
| |
| /* objdata register */ |
| #define OBJDATA_WR_COMPLT 0x00000001 |
| |
| /* frmtxstatus */ |
| #define TXS_V (1 << 0) /**< valid bit */ |
| |
| #define TXS_STATUS_MASK 0xffff |
| /* sw mask to map txstatus for corerevs <= 4 to be the same as for corerev > 4 */ |
| #define TXS_COMPAT_MASK 0x3 |
| #define TXS_COMPAT_SHIFT 1 |
| #define TXS_FID_MASK 0xffff0000 |
| #define TXS_FID_SHIFT 16 |
| |
| /* frmtxstatus2 */ |
| #define TXS_SEQ_MASK 0xffff |
| #define TXS_PTX_MASK 0xff0000 |
| #define TXS_PTX_SHIFT 16 |
| #define TXS_MU_MASK 0x01000000 |
| #define TXS_MU_SHIFT 24 |
| |
| /* clk_ctl_st, corerev >= 17 */ |
| #define CCS_ERSRC_REQ_D11PLL 0x00000100 /**< d11 core pll request */ |
| #define CCS_ERSRC_REQ_PHYPLL 0x00000200 /**< PHY pll request */ |
| #define CCS_ERSRC_REQ_PTMPLL 0x00001000 /* PTM clock request */ |
| #define CCS_ERSRC_AVAIL_D11PLL 0x01000000 /**< d11 core pll available */ |
| #define CCS_ERSRC_AVAIL_PHYPLL 0x02000000 /**< PHY pll available */ |
| #define CCS_ERSRC_AVAIL_PTMPLL 0x10000000 /**< PHY pll available */ |
| |
| /* tsf_cfprep register */ |
| #define CFPREP_CBI_MASK 0xffffffc0 |
| #define CFPREP_CBI_SHIFT 6 |
| #define CFPREP_CFPP 0x00000001 |
| |
| /* receive fifo control */ |
| #define RFC_FR (1 << 0) /**< frame ready */ |
| #define RFC_DR (1 << 1) /**< data ready */ |
| |
| /* tx fifo sizes for corerev >= 9 */ |
| /* tx fifo sizes values are in terms of 256 byte blocks */ |
| #define TXFIFOCMD_RESET_MASK (1 << 15) /**< reset */ |
| #define TXFIFOCMD_FIFOSEL_SHIFT 8 /**< fifo */ |
| #define TXFIFOCMD_FIFOSEL_SET(val) ((val & 0x7) << TXFIFOCMD_FIFOSEL_SHIFT) /* fifo */ |
| #define TXFIFOCMD_FIFOSEL_GET(val) ((val >> TXFIFOCMD_FIFOSEL_SHIFT) & 0x7) /* fifo */ |
| #define TXFIFO_FIFOTOP_SHIFT 8 /**< fifo start */ |
| |
| #define TXFIFO_FIFO_START(def, def1) ((def & 0xFF) | ((def1 & 0xFF) << 8)) |
| #define TXFIFO_FIFO_END(def, def1) (((def & 0xFF00) >> 8) | (def1 & 0xFF00)) |
| |
| /* Must redefine to 65 for 16 MBSS */ |
| #ifdef WLLPRS |
| #define TXFIFO_START_BLK16 (65+16) /**< Base address + 32 * 512 B/P + 8 * 512 11g P */ |
| #else /* WLLPRS */ |
| #define TXFIFO_START_BLK16 65 /**< Base address + 32 * 512 B/P */ |
| #endif /* WLLPRS */ |
| #define TXFIFO_START_BLK 6 /**< Base address + 6 * 256 B */ |
| #define TXFIFO_START_BLK_NIN 7 /**< Base address + 6 * 256 B */ |
| |
| #define TXFIFO_AC_SIZE_PER_UNIT 512 /**< one unit corresponds to 512 bytes */ |
| |
| #define MBSS16_TEMPLMEM_MINBLKS 65 /**< one unit corresponds to 256 bytes */ |
| |
| /* phy versions, PhyVersion:Revision field */ |
| #define PV_AV_MASK 0xf000 /**< analog block version */ |
| #define PV_AV_SHIFT 12 /**< analog block version bitfield offset */ |
| #define PV_PT_MASK 0x0f00 /**< phy type */ |
| #define PV_PT_SHIFT 8 /**< phy type bitfield offset */ |
| #define PV_PV_MASK 0x00ff /**< phy version */ |
| #define PHY_TYPE(v) ((v & PV_PT_MASK) >> PV_PT_SHIFT) |
| |
| /* phy types, PhyVersion:PhyType field */ |
| #ifndef USE_BCMCONF_H |
| #define PHY_TYPE_A 0 /**< A-Phy value */ |
| #define PHY_TYPE_B 1 /**< B-Phy value */ |
| #define PHY_TYPE_G 2 /**< G-Phy value */ |
| #define PHY_TYPE_N 4 /**< N-Phy value */ |
| /* #define PHY_TYPE_LP 5 */ /**< LP-Phy value */ |
| /* #define PHY_TYPE_SSN 6 */ /**< SSLPN-Phy value */ |
| #define PHY_TYPE_HT 7 /**< 3x3 HTPhy value */ |
| #define PHY_TYPE_LCN 8 /**< LCN-Phy value */ |
| #define PHY_TYPE_LCNXN 9 /**< LCNXN-Phy value */ |
| #define PHY_TYPE_LCN40 10 /**< LCN40-Phy value */ |
| #define PHY_TYPE_AC 11 /**< AC-Phy value */ |
| #define PHY_TYPE_LCN20 12 /**< LCN20-Phy value */ |
| #define PHY_TYPE_HE 13 /**< HE-Phy value */ |
| #define PHY_TYPE_NULL 0xf /**< Invalid Phy value */ |
| #endif /* USE_BCMCONF_H */ |
| |
| /* analog types, PhyVersion:AnalogType field */ |
| #define ANA_11G_018 1 |
| #define ANA_11G_018_ALL 2 |
| #define ANA_11G_018_ALLI 3 |
| #define ANA_11G_013 4 |
| #define ANA_11N_013 5 |
| #define ANA_11LP_013 6 |
| |
| /** 802.11a PLCP header def */ |
| typedef struct ofdm_phy_hdr ofdm_phy_hdr_t; |
| BWL_PRE_PACKED_STRUCT struct ofdm_phy_hdr { |
| uint8 rlpt[3]; /**< rate, length, parity, tail */ |
| uint16 service; |
| uint8 pad; |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define D11A_PHY_HDR_GRATE(phdr) ((phdr)->rlpt[0] & 0x0f) |
| #define D11A_PHY_HDR_GRES(phdr) (((phdr)->rlpt[0] >> 4) & 0x01) |
| #define D11A_PHY_HDR_GLENGTH(phdr) (((*((uint32 *)((phdr)->rlpt))) >> 5) & 0x0fff) |
| #define D11A_PHY_HDR_GPARITY(phdr) (((phdr)->rlpt[3] >> 1) & 0x01) |
| #define D11A_PHY_HDR_GTAIL(phdr) (((phdr)->rlpt[3] >> 2) & 0x3f) |
| |
| /** rate encoded per 802.11a-1999 sec 17.3.4.1 */ |
| #define D11A_PHY_HDR_SRATE(phdr, rate) \ |
| ((phdr)->rlpt[0] = ((phdr)->rlpt[0] & 0xf0) | ((rate) & 0xf)) |
| /** set reserved field to zero */ |
| #define D11A_PHY_HDR_SRES(phdr) ((phdr)->rlpt[0] &= 0xef) |
| /** length is number of octets in PSDU */ |
| #define D11A_PHY_HDR_SLENGTH(phdr, length) \ |
| (*(uint32 *)((phdr)->rlpt) = *(uint32 *)((phdr)->rlpt) | \ |
| (((length) & 0x0fff) << 5)) |
| /** set the tail to all zeros */ |
| #define D11A_PHY_HDR_STAIL(phdr) ((phdr)->rlpt[3] &= 0x03) |
| |
| #define D11A_PHY_HDR_LEN_L 3 /**< low-rate part of PLCP header */ |
| #define D11A_PHY_HDR_LEN_R 2 /**< high-rate part of PLCP header */ |
| |
| #define D11A_PHY_TX_DELAY (2) /**< 2.1 usec */ |
| |
| #define D11A_PHY_HDR_TIME (4) /**< low-rate part of PLCP header */ |
| #define D11A_PHY_PRE_TIME (16) |
| #define D11A_PHY_PREHDR_TIME (D11A_PHY_PRE_TIME + D11A_PHY_HDR_TIME) |
| |
| /** 802.11b PLCP header def */ |
| typedef struct cck_phy_hdr cck_phy_hdr_t; |
| BWL_PRE_PACKED_STRUCT struct cck_phy_hdr { |
| uint8 signal; |
| uint8 service; |
| uint16 length; |
| uint16 crc; |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define D11B_PHY_HDR_LEN 6 |
| |
| #define D11B_PHY_TX_DELAY (3) /**< 3.4 usec */ |
| |
| #define D11B_PHY_LHDR_TIME (D11B_PHY_HDR_LEN << 3) |
| #define D11B_PHY_LPRE_TIME (144) |
| #define D11B_PHY_LPREHDR_TIME (D11B_PHY_LPRE_TIME + D11B_PHY_LHDR_TIME) |
| |
| #define D11B_PHY_SHDR_TIME (D11B_PHY_LHDR_TIME >> 1) |
| #define D11B_PHY_SPRE_TIME (D11B_PHY_LPRE_TIME >> 1) |
| #define D11B_PHY_SPREHDR_TIME (D11B_PHY_SPRE_TIME + D11B_PHY_SHDR_TIME) |
| |
| #define D11B_PLCP_SIGNAL_LOCKED (1 << 2) |
| #define D11B_PLCP_SIGNAL_LE (1 << 7) |
| |
| /* AMPDUXXX: move to ht header file once it is ready: Mimo PLCP */ |
| #define MIMO_PLCP_MCS_MASK 0x7f /**< mcs index */ |
| #define MIMO_PLCP_40MHZ 0x80 /**< 40 Hz frame */ |
| #define MIMO_PLCP_AMPDU 0x08 /**< ampdu */ |
| |
| #define WLC_GET_CCK_PLCP_LEN(plcp) (plcp[4] + (plcp[5] << 8)) |
| #define WLC_GET_MIMO_PLCP_LEN(plcp) (plcp[1] + (plcp[2] << 8)) |
| #define WLC_SET_MIMO_PLCP_LEN(plcp, len) \ |
| plcp[1] = len & 0xff; plcp[2] = ((len >> 8) & 0xff); |
| |
| #define WLC_SET_MIMO_PLCP_AMPDU(plcp) (plcp[3] |= MIMO_PLCP_AMPDU) |
| #define WLC_CLR_MIMO_PLCP_AMPDU(plcp) (plcp[3] &= ~MIMO_PLCP_AMPDU) |
| #define WLC_IS_MIMO_PLCP_AMPDU(plcp) (plcp[3] & MIMO_PLCP_AMPDU) |
| |
| /** |
| * The dot11a PLCP header is 5 bytes. To simplify the software (so that we don't need eg different |
| * tx DMA headers for 11a and 11b), the PLCP header has padding added in the ucode. |
| */ |
| #define D11_PHY_HDR_LEN 6u |
| |
| /** For the AC phy PLCP is 12 bytes and not all bytes are used for all the modulations */ |
| #define D11AC_PHY_HDR_LEN 12 |
| #define D11AC_PHY_VHT_PLCP_OFFSET 0 |
| #define D11AC_PHY_HTMM_PLCP_OFFSET 0 |
| #define D11AC_PHY_HTGF_PLCP_OFFSET 3 |
| #define D11AC_PHY_OFDM_PLCP_OFFSET 3 |
| #define D11AC_PHY_CCK_PLCP_OFFSET 6 |
| #define D11AC_PHY_BEACON_PLCP_OFFSET 0 |
| |
| #define D11_PHY_RXPLCP_LEN(rev) (D11_PHY_HDR_LEN) |
| #define D11_PHY_RXPLCP_OFF(rev) (0) |
| |
| /** TX descriptor - pre40 */ |
| typedef struct d11txh_pre40 d11txh_pre40_t; |
| BWL_PRE_PACKED_STRUCT struct d11txh_pre40 { |
| uint16 MacTxControlLow; /* 0x0 */ |
| uint16 MacTxControlHigh; /* 0x1 */ |
| uint16 MacFrameControl; /* 0x2 */ |
| uint16 TxFesTimeNormal; /* 0x3 */ |
| uint16 PhyTxControlWord; /* 0x4 */ |
| uint16 PhyTxControlWord_1; /* 0x5 */ |
| uint16 PhyTxControlWord_1_Fbr; /* 0x6 */ |
| uint16 PhyTxControlWord_1_Rts; /* 0x7 */ |
| uint16 PhyTxControlWord_1_FbrRts; /* 0x8 */ |
| uint16 MainRates; /* 0x9 */ |
| uint16 XtraFrameTypes; /* 0xa */ |
| uint8 IV[16]; /* 0x0b - 0x12 */ |
| uint8 TxFrameRA[6]; /* 0x13 - 0x15 */ |
| uint16 TxFesTimeFallback; /* 0x16 */ |
| uint8 RTSPLCPFallback[6]; /* 0x17 - 0x19 */ |
| uint16 RTSDurFallback; /* 0x1a */ |
| uint8 FragPLCPFallback[6]; /* 0x1b - 1d */ |
| uint16 FragDurFallback; /* 0x1e */ |
| uint16 MModeLen; /* 0x1f */ |
| uint16 MModeFbrLen; /* 0x20 */ |
| uint16 TstampLow; /* 0x21 */ |
| uint16 TstampHigh; /* 0x22 */ |
| uint16 ABI_MimoAntSel; /* 0x23 */ |
| uint16 PreloadSize; /* 0x24 */ |
| uint16 AmpduSeqCtl; /* 0x25 */ |
| uint16 TxFrameID; /* 0x26 */ |
| uint16 TxStatus; /* 0x27 */ |
| uint16 MaxNMpdus; /* 0x28 corerev >=16 */ |
| BWL_PRE_PACKED_STRUCT union { |
| uint16 MaxAggDur; /* 0x29 corerev >=16 */ |
| uint16 MaxAggLen; |
| } BWL_POST_PACKED_STRUCT u1; |
| BWL_PRE_PACKED_STRUCT union { |
| BWL_PRE_PACKED_STRUCT struct { /* 0x29 corerev >=16 */ |
| uint8 MaxRNum; |
| uint8 MaxAggBytes; /* Max Agg Bytes in power of 2 */ |
| } BWL_POST_PACKED_STRUCT s1; |
| uint16 MaxAggLen_FBR; |
| } BWL_POST_PACKED_STRUCT u2; |
| uint16 MinMBytes; /* 0x2b corerev >=16 */ |
| uint8 RTSPhyHeader[D11_PHY_HDR_LEN]; /* 0x2c - 0x2e */ |
| struct dot11_rts_frame rts_frame; /* 0x2f - 0x36 */ |
| uint16 pad; /* 0x37 */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define D11_TXH_LEN 112 /**< bytes */ |
| |
| /* Frame Types */ |
| #define FT_LEGACY (-1) |
| #define FT_CCK 0 |
| #define FT_OFDM 1 |
| #define FT_HT 2 |
| #define FT_VHT 3 |
| #define FT_HE 4 |
| #define FT_EHT 6 |
| |
| /* HE PPDU type */ |
| #define HE_SU_PPDU 0 |
| #define HE_SU_RE_PPDU 1 |
| #define HE_MU_PPDU 2 |
| #define HE_TRIG_PPDU 3 |
| |
| /* Position of MPDU inside A-MPDU; indicated with bits 10:9 of MacTxControlLow */ |
| #define TXC_AMPDU_SHIFT 9 /**< shift for ampdu settings */ |
| #define TXC_AMPDU_NONE 0 /**< Regular MPDU, not an A-MPDU */ |
| #define TXC_AMPDU_FIRST 1 /**< first MPDU of an A-MPDU */ |
| #define TXC_AMPDU_MIDDLE 2 /**< intermediate MPDU of an A-MPDU */ |
| #define TXC_AMPDU_LAST 3 /**< last (or single) MPDU of an A-MPDU */ |
| |
| /* MacTxControlLow */ |
| #define TXC_AMIC 0x8000 |
| #define TXC_USERIFS 0x4000 |
| #define TXC_LIFETIME 0x2000 |
| #define TXC_FRAMEBURST 0x1000 |
| #define TXC_SENDCTS 0x0800 |
| #define TXC_AMPDU_MASK 0x0600 |
| #define TXC_BW_40 0x0100 |
| #define TXC_FREQBAND_5G 0x0080 |
| #define TXC_DFCS 0x0040 |
| #define TXC_IGNOREPMQ 0x0020 |
| #define TXC_HWSEQ 0x0010 |
| #define TXC_STARTMSDU 0x0008 |
| #define TXC_SENDRTS 0x0004 |
| #define TXC_LONGFRAME 0x0002 |
| #define TXC_IMMEDACK 0x0001 |
| |
| /* MacTxControlHigh */ |
| #define TXC_PREAMBLE_RTS_FB_SHORT 0x8000 /* RTS fallback preamble type 1 = SHORT 0 = LONG */ |
| #define TXC_PREAMBLE_RTS_MAIN_SHORT 0x4000 /* RTS main rate preamble type 1 = SHORT 0 = LONG */ |
| #define TXC_PREAMBLE_DATA_FB_SHORT 0x2000 /**< Main fallback rate preamble type |
| * 1 = SHORT for OFDM/GF for MIMO |
| * 0 = LONG for CCK/MM for MIMO |
| */ |
| /* TXC_PREAMBLE_DATA_MAIN is in PhyTxControl bit 5 */ |
| #define TXC_AMPDU_FBR 0x1000 /**< use fallback rate for this AMPDU */ |
| #define TXC_SECKEY_MASK 0x0FF0 |
| #define TXC_SECKEY_SHIFT 4 |
| #define TXC_ALT_TXPWR 0x0008 /**< Use alternate txpwr defined at loc. M_ALT_TXPWR_IDX */ |
| #define TXC_SECTYPE_MASK 0x0007 |
| #define TXC_SECTYPE_SHIFT 0 |
| |
| /* Null delimiter for Fallback rate */ |
| #define AMPDU_FBR_NULL_DELIM 5 /**< Location of Null delimiter count for AMPDU */ |
| |
| /* PhyTxControl for Mimophy */ |
| #define PHY_TXC_PWR_MASK 0xFC00 |
| #define PHY_TXC_PWR_SHIFT 10 |
| #define PHY_TXC_ANT_MASK 0x03C0 /**< bit 6, 7, 8, 9 */ |
| #define PHY_TXC_ANT_SHIFT 6 |
| #define PHY_TXC_ANT_0_1 0x00C0 /**< auto, last rx */ |
| #define PHY_TXC_LPPHY_ANT_LAST 0x0000 |
| #define PHY_TXC_ANT_3 0x0200 /**< virtual antenna 3 */ |
| #define PHY_TXC_ANT_2 0x0100 /**< virtual antenna 2 */ |
| #define PHY_TXC_ANT_1 0x0080 /**< virtual antenna 1 */ |
| #define PHY_TXC_ANT_0 0x0040 /**< virtual antenna 0 */ |
| |
| #define PHY_TXC_SHORT_HDR 0x0010 |
| #define PHY_TXC_FT_MASK 0x0003 |
| |
| #define PHY_TXC_FT_CCK 0x0000 |
| #define PHY_TXC_FT_OFDM 0x0001 |
| #define PHY_TXC_FT_HT 0x0002 |
| #define PHY_TXC_FT_VHT 0x0003 |
| #define PHY_TXC_FT_HE 0x0004 |
| #define PHY_TXC_FT_EHT 0x0006 |
| |
| #define PHY_TXC_OLD_ANT_0 0x0000 |
| #define PHY_TXC_OLD_ANT_1 0x0100 |
| #define PHY_TXC_OLD_ANT_LAST 0x0300 |
| |
| /** PhyTxControl_1 for Mimophy */ |
| #define PHY_TXC1_BW_MASK 0x0007 |
| #define PHY_TXC1_BW_10MHZ 0 |
| #define PHY_TXC1_BW_10MHZ_UP 1 |
| #define PHY_TXC1_BW_20MHZ 2 |
| #define PHY_TXC1_BW_20MHZ_UP 3 |
| #define PHY_TXC1_BW_40MHZ 4 |
| #define PHY_TXC1_BW_40MHZ_DUP 5 |
| #define PHY_TXC1_MODE_SHIFT 3 |
| #define PHY_TXC1_MODE_MASK 0x0038 |
| #define PHY_TXC1_MODE_SISO 0 |
| #define PHY_TXC1_MODE_CDD 1 |
| #define PHY_TXC1_MODE_STBC 2 |
| #define PHY_TXC1_MODE_SDM 3 |
| #define PHY_TXC1_CODE_RATE_SHIFT 8 |
| #define PHY_TXC1_CODE_RATE_MASK 0x0700 |
| #define PHY_TXC1_CODE_RATE_1_2 0 |
| #define PHY_TXC1_CODE_RATE_2_3 1 |
| #define PHY_TXC1_CODE_RATE_3_4 2 |
| #define PHY_TXC1_CODE_RATE_4_5 3 |
| #define PHY_TXC1_CODE_RATE_5_6 4 |
| #define PHY_TXC1_CODE_RATE_7_8 6 |
| #define PHY_TXC1_MOD_SCHEME_SHIFT 11 |
| #define PHY_TXC1_MOD_SCHEME_MASK 0x3800 |
| #define PHY_TXC1_MOD_SCHEME_BPSK 0 |
| #define PHY_TXC1_MOD_SCHEME_QPSK 1 |
| #define PHY_TXC1_MOD_SCHEME_QAM16 2 |
| #define PHY_TXC1_MOD_SCHEME_QAM64 3 |
| #define PHY_TXC1_MOD_SCHEME_QAM256 4 |
| |
| /* PhyTxControl for HTphy that are different from Mimophy */ |
| #define PHY_TXC_HTANT_MASK 0x3fC0 /**< bit 6, 7, 8, 9, 10, 11, 12, 13 */ |
| #define PHY_TXC_HTCORE_MASK 0x03C0 /**< core enable core3:core0, 1=enable, 0=disable */ |
| #define PHY_TXC_HTCORE_SHIFT 6 /**< bit 6, 7, 8, 9 */ |
| #define PHY_TXC_HTANT_IDX_MASK 0x3C00 /**< 4-bit, 16 possible antenna configuration */ |
| #define PHY_TXC_HTANT_IDX_SHIFT 10 |
| #define PHY_TXC_HTANT_IDX0 0 |
| #define PHY_TXC_HTANT_IDX1 1 |
| #define PHY_TXC_HTANT_IDX2 2 |
| #define PHY_TXC_HTANT_IDX3 3 |
| |
| /* PhyTxControl_1 for HTphy that are different from Mimophy */ |
| #define PHY_TXC1_HTSPARTIAL_MAP_MASK 0x7C00 /**< bit 14:10 */ |
| #define PHY_TXC1_HTSPARTIAL_MAP_SHIFT 10 |
| #define PHY_TXC1_HTTXPWR_OFFSET_MASK 0x01f8 /**< bit 8:3 */ |
| #define PHY_TXC1_HTTXPWR_OFFSET_SHIFT 3 |
| |
| /* TxControl word follows new interface for AX */ |
| /* PhyTxControl_6 for AXphy */ |
| #define PHY_TXC5_AXTXPWR_OFFSET_C0_MASK 0xff00 /**< bit 15:8 */ |
| #define PHY_TXC5_AXTXPWR_OFFSET_C0_SHIFT 8 |
| #define PHY_TXC6_AXTXPWR_OFFSET_C1_MASK 0x00ff /**< bit 7:0 */ |
| #define PHY_TXC6_AXTXPWR_OFFSET_C1_SHIFT 0 |
| #define PHY_TXC5_AXTXPWR_OFFSET_C2_MASK 0x00ff /**< bit 7:0 */ |
| #define PHY_TXC5_AXTXPWR_OFFSET_C2_SHIFT 0 |
| |
| /* XtraFrameTypes */ |
| #define XFTS_RTS_FT_SHIFT 2 |
| #define XFTS_FBRRTS_FT_SHIFT 4 |
| #define XFTS_CHANNEL_SHIFT 8 |
| |
| /** Antenna diversity bit in ant_wr_settle */ |
| #define PHY_AWS_ANTDIV 0x2000 |
| |
| /* IFS ctl */ |
| #define IFS_USEEDCF (1 << 2) |
| |
| /* IFS ctl1 */ |
| #define IFS_CTL1_EDCRS (1 << 3) |
| #define IFS_CTL1_EDCRS_20L (1 << 4) |
| #define IFS_CTL1_EDCRS_40 (1 << 5) |
| #define IFS_EDCRS_MASK (IFS_CTL1_EDCRS | IFS_CTL1_EDCRS_20L | IFS_CTL1_EDCRS_40) |
| #define IFS_EDCRS_SHIFT 3 |
| |
| /* IFS ctl sel pricrs */ |
| #define IFS_CTL_CRS_SEL_20LL 1 |
| #define IFS_CTL_CRS_SEL_20LU 2 |
| #define IFS_CTL_CRS_SEL_20UL 4 |
| #define IFS_CTL_CRS_SEL_20UU 8 |
| #define IFS_CTL_CRS_SEL_MASK (IFS_CTL_CRS_SEL_20LL | IFS_CTL_CRS_SEL_20LU | \ |
| IFS_CTL_CRS_SEL_20UL | IFS_CTL_CRS_SEL_20UU) |
| #define IFS_CTL_ED_SEL_20LL (1 << 8) |
| #define IFS_CTL_ED_SEL_20LU (1 << 9) |
| #define IFS_CTL_ED_SEL_20UL (1 << 10) |
| #define IFS_CTL_ED_SEL_20UU (1 << 11) |
| #define IFS_CTL_ED_SEL_MASK (IFS_CTL_ED_SEL_20LL | IFS_CTL_ED_SEL_20LU | \ |
| IFS_CTL_ED_SEL_20UL | IFS_CTL_ED_SEL_20UU) |
| |
| /* ABI_MimoAntSel */ |
| #define ABI_MAS_ADDR_BMP_IDX_MASK 0x0f00 |
| #define ABI_MAS_ADDR_BMP_IDX_SHIFT 8 |
| #define ABI_MAS_FBR_ANT_PTN_MASK 0x00f0 |
| #define ABI_MAS_FBR_ANT_PTN_SHIFT 4 |
| #define ABI_MAS_MRT_ANT_PTN_MASK 0x000f |
| |
| #ifdef WLAWDL |
| #define ABI_MAS_AWDL_TS_INSERT 0x1000 /**< bit 12 */ |
| #endif |
| |
| #define ABI_MAS_TIMBC_TSF 0x2000 /**< Enable TIMBC tsf field present */ |
| |
| /* MinMBytes */ |
| #define MINMBYTES_PKT_LEN_MASK 0x0300 |
| #define MINMBYTES_FBRATE_PWROFFSET_MASK 0xFC00 |
| #define MINMBYTES_FBRATE_PWROFFSET_SHIFT 10 |
| |
| /* Rev40 template constants */ |
| |
| /** templates include a longer PLCP header that matches the MAC / PHY interface */ |
| #define D11_VHT_PLCP_LEN 12 |
| |
| /* 11AC TX DMA buffer header */ |
| |
| #define D11AC_TXH_NUM_RATES 4 |
| |
| /** per rate info - rev40 */ |
| typedef struct d11actxh_rate d11actxh_rate_t; |
| BWL_PRE_PACKED_STRUCT struct d11actxh_rate { |
| uint16 PhyTxControlWord_0; /* 0 - 1 */ |
| uint16 PhyTxControlWord_1; /* 2 - 3 */ |
| uint16 PhyTxControlWord_2; /* 4 - 5 */ |
| uint8 plcp[D11_PHY_HDR_LEN]; /* 6 - 11 */ |
| uint16 FbwInfo; /* 12 -13, fall back bandwidth info */ |
| uint16 TxRate; /* 14 */ |
| uint16 RtsCtsControl; /* 16 */ |
| uint16 Bfm0; /* 18 */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* Bit definition for FbwInfo field */ |
| #define FBW_BW_MASK 3 |
| #define FBW_BW_SHIFT 0 |
| #define FBW_TXBF 4 |
| #define FBW_TXBF_SHIFT 2 |
| /* this needs to be re-visited if we want to use this feature */ |
| #define FBW_BFM0_TXPWR_MASK 0x1F8 |
| #define FBW_BFM0_TXPWR_SHIFT 3 |
| #define FBW_BFM_TXPWR_MASK 0x7E00 |
| #define FBW_BFM_TXPWR_SHIFT 9 |
| |
| /* Bit definition for Bfm0 field */ |
| #define BFM0_TXPWR_MASK 0x3f |
| #define BFM0_STBC_SHIFT 6 |
| #define BFM0_STBC (1 << BFM0_STBC_SHIFT) |
| /* should find a chance to converge the two */ |
| #define D11AC2_BFM0_TXPWR_MASK 0x7f |
| #define D11AC2_BFM0_STBC_SHIFT 7 |
| #define D11AC2_BFM0_STBC (1 << D11AC2_BFM0_STBC_SHIFT) |
| |
| /* per packet info */ |
| typedef struct d11pktinfo_common d11pktinfo_common_t; |
| typedef struct d11pktinfo_common d11actxh_pkt_t; |
| BWL_PRE_PACKED_STRUCT struct d11pktinfo_common { |
| /* Per pkt info */ |
| uint16 TSOInfo; /* 0 */ |
| uint16 MacTxControlLow; /* 2 */ |
| uint16 MacTxControlHigh; /* 4 */ |
| uint16 Chanspec; /* 6 */ |
| uint8 IVOffset; /* 8 */ |
| uint8 PktCacheLen; /* 9 */ |
| uint16 FrameLen; /* 10. In [bytes] units. */ |
| uint16 TxFrameID; /* 12 */ |
| uint16 Seq; /* 14 */ |
| uint16 Tstamp; /* 16 */ |
| uint16 TxStatus; /* 18 */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* common cache info between rev40 and rev80 formats */ |
| typedef struct d11txh_cache_common d11txh_cache_common_t; |
| BWL_PRE_PACKED_STRUCT struct d11txh_cache_common { |
| uint8 BssIdEncAlg; /* 0 */ |
| uint8 KeyIdx; /* 1 */ |
| uint8 PrimeMpduMax; /* 2 */ |
| uint8 FallbackMpduMax; /* 3 */ |
| uint16 AmpduDur; /* 4 - 5 */ |
| uint8 BAWin; /* 6 */ |
| uint8 MaxAggLen; /* 7 */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Per cache info - rev40 */ |
| typedef struct d11actxh_cache d11actxh_cache_t; |
| BWL_PRE_PACKED_STRUCT struct d11actxh_cache { |
| d11txh_cache_common_t common; /* 0 - 7 */ |
| uint8 TkipPH1Key[10]; /* 8 - 17 */ |
| uint8 TSCPN[6]; /* 18 - 23 */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Long format tx descriptor - rev40 */ |
| typedef struct d11actxh d11actxh_t; |
| BWL_PRE_PACKED_STRUCT struct d11actxh { |
| /* Per pkt info */ |
| d11actxh_pkt_t PktInfo; /* 0 - 19 */ |
| |
| union { |
| |
| /** Rev 40 to rev 63 layout */ |
| struct { |
| /** Per rate info */ |
| d11actxh_rate_t RateInfo[D11AC_TXH_NUM_RATES]; /* 20 - 99 */ |
| |
| /** Per cache info */ |
| d11actxh_cache_t CacheInfo; /* 100 - 123 */ |
| } rev40; |
| |
| /** Rev >= 64 layout */ |
| struct { |
| /** Per cache info */ |
| d11actxh_cache_t CacheInfo; /* 20 - 43 */ |
| |
| /** Per rate info */ |
| d11actxh_rate_t RateInfo[D11AC_TXH_NUM_RATES]; /* 44 - 123 */ |
| } rev64; |
| |
| }; |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define D11AC_TXH_LEN sizeof(d11actxh_t) /* 124 bytes */ |
| |
| /* Short format tx descriptor only has per packet info */ |
| #define D11AC_TXH_SHORT_LEN sizeof(d11actxh_pkt_t) /* 20 bytes */ |
| |
| /* -TXDC-TxH Excluding Rate Info 41 bytes (Note 1 byte of RATEINFO is removed */ |
| #define D11AC_TXH_SHORT_EXT_LEN (sizeof(d11txh_rev80_t) - 1) |
| |
| /* Retry limit regs */ |
| /* Current retries for the fallback rates are hardcoded */ |
| #define D11AC_TXDC_SRL_FB (3u) /* Short Retry Limit - Fallback */ |
| #define D11AC_TXDC_LRL_FB (2u) /* Long Retry Limit - Fallback */ |
| |
| #define D11AC_TXDC_RET_LIM_MASK (0x000Fu) |
| #define D11AC_TXDC_SRL_SHIFT (0u) /* Short Retry Limit */ |
| #define D11AC_TXDC_SRL_FB_SHIFT (4u) /* Short Retry Limit - Fallback */ |
| #define D11AC_TXDC_LRL_SHIFT (8u) /* Long Retry Limit */ |
| #define D11AC_TXDC_LRL_FB_SHIFT (12u) /* Long Retry Limit - Fallback */ |
| |
| /* MacTxControlLow */ |
| #define D11AC_TXC_HDR_FMT_SHORT 0x0001 /**< 0: long format, 1: short format */ |
| #define D11AC_TXC_UPD_CACHE 0x0002 |
| #define D11AC_TXC_CACHE_IDX_MASK 0x003C /**< Cache index 0 .. 15 */ |
| #define D11AC_TXC_CACHE_IDX_SHIFT 2 |
| |
| #define D11AC_TXDC_IDX_SHIFT 1 |
| #define D11AC_TXDC_CPG_SHIFT 5 |
| #define D11REV80_TXDC_RIB_CPG 0x0020 /**< Cache Index CPG (Bit 5) -TXDC- */ |
| #define D11REV80_TXDC_RIB_DEL_MASK 0x001E /**< Cache index CIPX 0 .. 15 (Bit 1-4 -TXDC- */ |
| #define D11REV80_TXDC_RIB_IMM_MASK 0x003E /**< Cache index CIPX 0 .. 31 (Bit 1-5) -TXDC- */ |
| #define D11AC_TXC_AMPDU 0x0040 /**< Is aggregate-able */ |
| #define D11AC_TXC_IACK 0x0080 /**< Expect immediate ACK */ |
| #define D11AC_TXC_LFRM 0x0100 /**< Use long/short retry frame count/limit */ |
| #define D11AC_TXC_IPMQ 0x0200 /**< Ignore PMQ */ |
| #define D11AC_TXC_MBURST 0x0400 /**< Burst mode */ |
| #define D11AC_TXC_ASEQ 0x0800 /**< Add ucode generated seq num */ |
| #define D11AC_TXC_AGING 0x1000 /**< Use lifetime */ |
| #define D11AC_TXC_AMIC 0x2000 /**< Compute and add TKIP MIC */ |
| #define D11AC_TXC_STMSDU 0x4000 /**< First MSDU */ |
| #define D11AC_TXC_URIFS 0x8000 /**< Use RIFS */ |
| |
| /* MacTxControlHigh */ |
| #define D11AC_TXC_DISFCS 0x0001 /**< Discard FCS */ |
| #define D11AC_TXC_FIX_RATE 0x0002 /**< Use primary rate only */ |
| #define D11AC_TXC_SVHT 0x0004 /**< Single VHT mpdu ampdu */ |
| #define D11AC_TXC_PPS 0x0008 /**< Enable PS Pretend feature */ |
| #define D11AC_TXC_UCODE_SEQ 0x0010 /* Sequence counter for BK traffic, for offloads */ |
| #define D11AC_TXC_TIMBC_TSF 0x0020 /**< Enable TIMBC tsf field present */ |
| #define D11AC_TXC_TCPACK 0x0040 |
| #define D11AC_TXC_AWDL_PHYTT 0x0080 /**< Fill in PHY Transmission Time for AWDL action frames */ |
| #define D11AC_TXC_TOF 0x0100 /**< Enable wifi ranging processing for rxd frames */ |
| #define D11AC_TXC_MU 0x0200 /**< MU Tx data */ |
| #define D11AC_TXC_BFIX 0x0800 /**< BFI from SHMx */ |
| #define D11AC_TXC_NORETRY 0x0800 /**< Disable retry for tsync frames */ |
| #define D11AC_TXC_UFP 0x1000 /**< UFP */ |
| #define D11AC_TXC_OVERRIDE_NAV 0x1000 /**< if set, ucode will tx without honoring NAV */ |
| #define D11AC_TXC_DYNBW 0x2000 /**< Dynamic BW */ |
| #define D11AC_TXC_TXPROF_EN 0x8000 /**< TxProfile Enable TODO: support multiple idx */ |
| #define D11AC_TXC_SLTF 0x8000 /**< 11az Secure Ranging frame */ |
| |
| #define D11AC_TSTAMP_SHIFT 8 /**< Tstamp in 256us units */ |
| |
| /* PhyTxControlWord_0 */ |
| #define D11AC_PHY_TXC_FT_MASK 0x0003 |
| |
| /* vht txctl0 */ |
| #define D11AC_PHY_TXC_NON_SOUNDING 0x0004 |
| #define D11AC_PHY_TXC_BFM 0x0008 |
| #define D11AC_PHY_TXC_SHORT_PREAMBLE 0x0010 |
| #define D11AC2_PHY_TXC_STBC 0x0020 |
| #define D11AC_PHY_TXC_ANT_MASK 0x3FC0 |
| #define D11AC_PHY_TXC_CORE_MASK 0x03C0 |
| #define D11AC_PHY_TXC_CORE_SHIFT 6 |
| #define D11AC_PHY_TXC_ANT_IDX_MASK 0x3C00 |
| #define D11AC_PHY_TXC_ANT_IDX_SHIFT 10 |
| #define D11AC_PHY_TXC_BW_MASK 0xC000 |
| #define D11AC_PHY_TXC_BW_SHIFT 14 |
| #define D11AC_PHY_TXC_BW_20MHZ 0x0000 |
| #define D11AC_PHY_TXC_BW_40MHZ 0x4000 |
| #define D11AC_PHY_TXC_BW_80MHZ 0x8000 |
| #define D11AC_PHY_TXC_BW_160MHZ 0xC000 |
| |
| /* PhyTxControlWord_1 */ |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_MASK 0x0007 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_LLL 0x0000 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_LLU 0x0001 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_LUL 0x0002 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_LUU 0x0003 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_ULL 0x0004 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_ULU 0x0005 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_UUL 0x0006 |
| #define D11AC_PHY_TXC_PRIM_SUBBAND_UUU 0x0007 |
| #define D11AC_PHY_TXC_TXPWR_OFFSET_MASK 0x01F8 |
| #define D11AC_PHY_TXC_TXPWR_OFFSET_SHIFT 3 |
| #define D11AC2_PHY_TXC_TXPWR_OFFSET_MASK 0x03F8 |
| #define D11AC2_PHY_TXC_TXPWR_OFFSET_SHIFT 3 |
| #define D11AC_PHY_TXC_TXBF_USER_IDX_MASK 0x7C00 |
| #define D11AC_PHY_TXC_TXBF_USER_IDX_SHIFT 10 |
| #define D11AC2_PHY_TXC_DELTA_TXPWR_OFFSET_MASK 0x7C00 |
| #define D11AC2_PHY_TXC_DELTA_TXPWR_OFFSET_SHIFT 10 |
| /* Rather awkward bit mapping to keep pctl1 word same as legacy, for proprietary 11n rate support */ |
| #define D11AC_PHY_TXC_11N_PROP_MCS 0x8000 /* this represents bit mcs[6] */ |
| #define D11AC2_PHY_TXC_MU 0x8000 |
| |
| /* PhyTxControlWord_2 phy rate */ |
| #define D11AC_PHY_TXC_PHY_RATE_MASK 0x003F |
| #define D11AC2_PHY_TXC_PHY_RATE_MASK 0x007F |
| |
| /* 11b phy rate */ |
| #define D11AC_PHY_TXC_11B_PHY_RATE_MASK 0x0003 |
| #define D11AC_PHY_TXC_11B_PHY_RATE_1 0x0000 |
| #define D11AC_PHY_TXC_11B_PHY_RATE_2 0x0001 |
| #define D11AC_PHY_TXC_11B_PHY_RATE_5_5 0x0002 |
| #define D11AC_PHY_TXC_11B_PHY_RATE_11 0x0003 |
| |
| /* 11a/g phy rate */ |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_MASK 0x0007 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_6 0x0000 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_9 0x0001 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_12 0x0002 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_18 0x0003 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_24 0x0004 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_36 0x0005 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_48 0x0006 |
| #define D11AC_PHY_TXC_11AG_PHY_RATE_54 0x0007 |
| |
| /* 11ac phy rate */ |
| #define D11AC_PHY_TXC_11AC_MCS_MASK 0x000F |
| #define D11AC_PHY_TXC_11AC_NSS_MASK 0x0030 |
| #define D11AC_PHY_TXC_11AC_NSS_SHIFT 4 |
| |
| /* 11n phy rate */ |
| #define D11AC_PHY_TXC_11N_MCS_MASK 0x003F |
| #define D11AC2_PHY_TXC_11N_MCS_MASK 0x007F |
| #define D11AC2_PHY_TXC_11N_PROP_MCS 0x0040 /* this represents bit mcs[6] */ |
| |
| /* PhyTxControlWord_2 rest */ |
| #define D11AC_PHY_TXC_STBC 0x0040 |
| #define D11AC_PHY_TXC_DYN_BW_IN_NON_HT_PRESENT 0x0080 |
| #define D11AC_PHY_TXC_DYN_BW_IN_NON_HT_DYNAMIC 0x0100 |
| #define D11AC2_PHY_TXC_TXBF_USER_IDX_MASK 0xFE00 |
| #define D11AC2_PHY_TXC_TXBF_USER_IDX_SHIFT 9 |
| |
| /* RtsCtsControl */ |
| #define D11AC_RTSCTS_FRM_TYPE_MASK 0x0001 /**< frame type */ |
| #define D11AC_RTSCTS_FRM_TYPE_11B 0x0000 /**< 11b */ |
| #define D11AC_RTSCTS_FRM_TYPE_11AG 0x0001 /**< 11a/g */ |
| #define D11AC_RTSCTS_USE_RTS 0x0004 /**< Use RTS */ |
| #define D11AC_RTSCTS_USE_CTS 0x0008 /**< Use CTS */ |
| #define D11AC_RTSCTS_SHORT_PREAMBLE 0x0010 /**< Long/short preamble: 0 - long, 1 - short? */ |
| #define D11AC_RTSCTS_LAST_RATE 0x0020 /**< this is last rate */ |
| #define D11AC_RTSCTS_IMBF 0x0040 /**< Implicit TxBF */ |
| #define D11AC_RTSCTS_MIMOPS_RTS 0x8000 /**< Use RTS for mimops */ |
| #define D11AC_RTSCTS_DPCU_VALID 0x0080 /**< DPCU Valid : Same bitfield as above */ |
| #define D11AC_RTSCTS_BF_IDX_MASK 0xF000 /**< 4-bit index to the beamforming block */ |
| #define D11AC_RTSCTS_BF_IDX_SHIFT 12 |
| #define D11AC_RTSCTS_RATE_MASK 0x0F00 /**< Rate table offset: bit 3-0 of PLCP byte 0 */ |
| #define D11AC_RTSCTS_USE_RATE_SHIFT 8 |
| |
| /* BssIdEncAlg */ |
| #define D11AC_BSSID_MASK 0x000F /**< BSS index */ |
| #define D11AC_BSSID_SHIFT 0 |
| #define D11AC_ENCRYPT_ALG_MASK 0x00F0 /**< Encryption algoritm */ |
| #define D11AC_ENCRYPT_ALG_SHIFT 4 |
| #define D11AC_ENCRYPT_ALG_NOSEC 0x0000 /**< No security */ |
| #define D11AC_ENCRYPT_ALG_WEP 0x0010 /**< WEP */ |
| #define D11AC_ENCRYPT_ALG_TKIP 0x0020 /**< TKIP */ |
| #define D11AC_ENCRYPT_ALG_AES 0x0030 /**< AES */ |
| #define D11AC_ENCRYPT_ALG_WEP128 0x0040 /**< WEP128 */ |
| #define D11AC_ENCRYPT_ALG_NA 0x0050 /**< N/A */ |
| #define D11AC_ENCRYPT_ALG_WAPI 0x0060 /**< WAPI */ |
| |
| /* AmpduDur */ |
| #define D11AC_AMPDU_MIN_DUR_IDX_MASK 0x000F /**< AMPDU minimum duration index */ |
| #define D11AC_AMPDU_MIN_DUR_IDX_SHIFT 0 |
| #define D11AC_AMPDU_MAX_DUR_MASK 0xFFF0 /**< AMPDU maximum duration in unit 16 usec */ |
| #define D11AC_AMPDU_MAX_DUR_SHIFT 4 |
| |
| /** |
| * TX Descriptor definitions for supporting rev80 (HE) |
| */ |
| /* Maximum number of TX fallback rates per packet */ |
| #define D11_REV80_TXH_NUM_RATES 4 |
| #define D11_REV80_TXH_PHYTXCTL_MIN_LENGTH 1 |
| |
| /** per rate info - fixed portion - rev80 */ |
| typedef struct d11txh_rev80_rate_fixed d11txh_rev80_rate_fixed_t; |
| BWL_PRE_PACKED_STRUCT struct d11txh_rev80_rate_fixed { |
| uint16 TxRate; /* rate in 500Kbps */ |
| uint16 RtsCtsControl; /* RTS - CTS control */ |
| uint8 plcp[D11_PHY_HDR_LEN]; /* 6 bytes */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* rev80 specific per packet info fields */ |
| typedef struct d11pktinfo_rev80 d11pktinfo_rev80_t; |
| BWL_PRE_PACKED_STRUCT struct d11pktinfo_rev80 { |
| uint16 HEModeControl; /* 20 */ |
| uint16 length; /* 22 - length of txd in bytes */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define D11_REV80_TXH_TX_MODE_SHIFT 0 /* Bits 2:0 of HeModeControl */ |
| #define D11_REV80_TXH_TX_MODE_MASK 0x3 |
| #define D11_REV80_TXH_HTC_OFFSET_SHIFT 4 /* Bits 8:4 of HeModeControl */ |
| #define D11_REV80_TXH_HTC_OFFSET_MASK 0x01F0u |
| #define D11_REV80_TXH_TWT_EOSP 0x0200u /* bit 9 indicate TWT EOSP */ |
| #define D11_REV80_TXH_QSZ_QOS_CTL_IND_SHIFT 10 /* Bit 10 of HeModeControl */ |
| #define D11_REV80_TXH_QSZ_QOS_CTL_IND_MASK (1 << D11_REV80_TXH_QSZ_QOS_CTL_IND_SHIFT) |
| #define D11_REV80_TXH_USE_BSSCOLOR_SHM_SHIFT 15 /* Bit 15 of HEModeControl */ |
| #define D11_REV80_TXH_USE_BSSCOLOR_SHM_MASK (1 << D11_REV80_TXH_USE_BSSCOLOR_SHM_SHIFT) |
| |
| /* Calculate Length for short format TXD */ |
| #define D11_TXH_SHORT_LEN(__corerev__) (D11REV_GE(__corerev__, 80) ? \ |
| D11_REV80_TXH_SHORT_LEN : \ |
| D11AC_TXH_SHORT_LEN) |
| |
| /* Calculate Length for short format TXD (TXDC and/or FMF) */ |
| #define D11_TXH_SHORT_EX_LEN(__corerev__) (D11REV_GE(__corerev__, 80) ? \ |
| D11_REV80_TXH_SHORT_EX_LEN : \ |
| D11AC_TXH_SHORT_LEN) |
| |
| #define D11_REV80_TXH_IS_HE_AMPDU_SHIFT 11 /* Bit 11 of HeModeControl */ |
| #define D11_REV80_TXH_IS_HE_AMPDU_MASK (1 << D11_REV80_TXH_IS_HE_AMPDU_SHIFT) |
| |
| #define D11_REV80_PHY_TXC_EDCA 0x00 |
| #define D11_REV80_PHY_TXC_OFDMA_RA 0x01 /* Use Random Access Trigger for Tx */ |
| #define D11_REV80_PHY_TXC_OFDMA_DT 0x02 /* Use Directed Trigger for Tx */ |
| #define D11_REV80_PHY_TXC_OFDMA_ET 0x03 /* Use earliest Trigger Opportunity */ |
| |
| /** Per cache info - rev80 */ |
| typedef struct d11txh_rev80_cache d11txh_rev80_cache_t; |
| BWL_PRE_PACKED_STRUCT struct d11txh_rev80_cache { |
| d11txh_cache_common_t common; /* 0 - 7 */ |
| uint16 ampdu_mpdu_all; /* 8 - 9 */ |
| uint16 aggid; /* 10 - 11 */ |
| uint8 tkipph1_index; /* 12 */ |
| uint8 pktext; /* 13 */ |
| uint16 hebid_map; /* 14 -15: HEB ID bitmap */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Fixed size portion of TX descriptor - rev80 */ |
| typedef struct d11txh_rev80 d11txh_rev80_t; |
| BWL_PRE_PACKED_STRUCT struct d11txh_rev80 { |
| /** |
| * Per pkt info fields (common + rev80 specific) |
| * |
| * Note : Ensure that PktInfo field is always the first member |
| * of the d11txh_rev80 struct (that is at OFFSET - 0) |
| */ |
| d11pktinfo_common_t PktInfo; /* 0 - 19 */ |
| d11pktinfo_rev80_t PktInfoExt; /* 20 - 23 */ |
| |
| /** Per cache info */ |
| d11txh_rev80_cache_t CacheInfo; /* 24 - 39 */ |
| |
| /** |
| * D11_REV80_TXH_NUM_RATES number of Rate Info blocks |
| * contribute to the variable size portion of the TXD. |
| * Each Rate Info element (block) is a funtion of |
| * (N_PwrOffset, N_RU, N_User). |
| */ |
| uint8 RateInfoBlock[1]; |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* Size of fixed portion in TX descriptor (without CacheInfo(Link info) and RateInfoBlock) |
| * this portion never change regardless of TXDC/FMF support. |
| */ |
| /* OFFSETOF() is available in bcmutils.h but including it will cause |
| * recursive inclusion of d11.h specifically on NDIS platforms. |
| */ |
| #ifdef BCMFUZZ |
| /* use 0x10 offset to avoid undefined behavior error due to NULL access */ |
| #define D11_REV80_TXH_FIXED_LEN (((uint)(uintptr)&((d11txh_rev80_t *)0x10)->CacheInfo) - 0x10) |
| #else |
| #define D11_REV80_TXH_FIXED_LEN ((uint)(uintptr)&((d11txh_rev80_t *)0)->CacheInfo) |
| #endif /* BCMFUZZ */ |
| |
| /* Short format tx descriptor only has per packet info (24 bytes) */ |
| #define D11_REV80_TXH_SHORT_LEN (sizeof(d11pktinfo_common_t) + sizeof(d11pktinfo_rev80_t)) |
| |
| /* Size of CacheInfo(Link info) in TX descriptor */ |
| #define D11_REV80_TXH_LINK_INFO_LEN (sizeof(d11txh_rev80_cache_t)) |
| |
| /* Size of Short format TX descriptor |
| * with TXDC - Short TXD(40 bytes) shall include PktInfo and Cache info without Rate info |
| * with TXDC+FMF - Short TXD(24 bytes) shall include PktInfo only without Link info and Rate info |
| * do NOT use D11_REV80_TXH_SHORT_EX_LEN to calculate long TXD length, value depends on FMF feature |
| */ |
| #if defined(FMF_LIT) && !defined(FMF_LIT_DISABLED) |
| #define D11_REV80_TXH_SHORT_EX_LEN D11_REV80_TXH_FIXED_LEN |
| #else |
| #define D11_REV80_TXH_SHORT_EX_LEN (D11_REV80_TXH_FIXED_LEN + D11_REV80_TXH_LINK_INFO_LEN) |
| #endif /* FMF_LIT && !FMF_LIT_DISABLED */ |
| |
| /* Length of BFM0 field in RateInfo Blk */ |
| #define D11_REV80_TXH_BFM0_FIXED_LEN(pwr_offs) 2u |
| |
| /** |
| * Length of FBWInfo field in RateInfo Blk |
| * |
| * Note : for now return fixed length of 1 word |
| */ |
| #define D11_REV80_TXH_FBWINFO_FIXED_LEN(pwr_offs) 2 |
| |
| #define D11_REV80_TXH_FIXED_RATEINFO_LEN sizeof(d11txh_rev80_rate_fixed_t) |
| |
| /** |
| * Macros to find size of N-RUs field in the PhyTxCtlWord. |
| */ |
| #define D11_REV80_TXH_TXC_N_RUs_FIELD_SIZE 1 |
| #define D11_REV80_TXH_TXC_PER_RU_INFO_SIZE 4 |
| #define D11_REV80_TXH_TXC_PER_RU_MIN_SIZE 2 |
| |
| #define D11_REV80_TXH_TXC_RU_FIELD_SIZE(n_rus) ((n_rus == 1) ? \ |
| (D11_REV80_TXH_TXC_PER_RU_MIN_SIZE) : \ |
| ((D11_REV80_TXH_TXC_N_RUs_FIELD_SIZE) + \ |
| ((n_rus) * D11_REV80_TXH_TXC_PER_RU_INFO_SIZE))) |
| |
| /** |
| * Macros to find size of N-Users field in the TXCTL_EXT |
| */ |
| #define D11_REV80_TXH_TXC_EXT_N_USERs_FIELD_SIZE 1 |
| #define D11_REV80_TXH_TXC_EXT_PER_USER_INFO_SIZE 4 |
| |
| #define D11_REV80_TXH_TXC_N_USERs_FIELD_SIZE(n_users) \ |
| ((n_users) ? \ |
| (((n_users) * \ |
| (D11_REV80_TXH_TXC_EXT_PER_USER_INFO_SIZE)) + \ |
| (D11_REV80_TXH_TXC_EXT_N_USERs_FIELD_SIZE)) : \ |
| (n_users)) |
| |
| /** |
| * Size of each Tx Power Offset field in PhyTxCtlWord. |
| */ |
| #define D11_REV80_TXH_TXC_PWR_OFFSET_SIZE 1u |
| |
| /** |
| * Size of fixed / static fields in PhyTxCtlWord (all fields except N-RUs, N-Users and Pwr offsets) |
| */ |
| #define D11_REV80_TXH_TXC_CONST_FIELDS_SIZE 6u |
| |
| /** |
| * Macros used for filling PhyTxCtlWord |
| */ |
| |
| /* PhyTxCtl Byte 0 */ |
| #define D11_REV80_PHY_TXC_FT_MASK 0x0007u |
| #define D11_REV80_PHY_TXC_HE_FMT_MASK 0x0018u |
| #define D11_REV80_PHY_TXC_SOFT_AP_MODE 0x0020u |
| #define D11_REV80_PHY_TXC_NON_SOUNDING 0x0040u |
| #define D11_REV80_PHY_TXC_SHORT_PREAMBLE 0x0080u |
| #define D11_REV80_PHY_TXC_FRAME_TYPE_VHT 0X0003u |
| #define D11_REV80_PHY_TXC_FRAME_TYPE_HT 0X0002u |
| #define D11_REV80_PHY_TXC_FRAME_TYPE_LEG 0X0001u |
| |
| #define D11_REV80_PHY_TXC_HE_FMT_SHIFT 3u |
| |
| /* PhyTxCtl Byte 1 */ |
| #define D11_REV80_PHY_TXC_STBC 0x0080u |
| |
| /* PhyTxCtl Word 1 (Bytes 2 - 3) */ |
| #define D11_REV80_PHY_TXC_DPCU_SUBBAND_SHIFT 5u |
| #define D11_REV80_PHY_TXC_DYNBW_PRESENT 0x2000u |
| #define D11_REV80_PHY_TXC_DYNBW_MODE 0x4000u |
| #define D11_REV80_PHY_TXC_MU 0x8000u |
| #define D11_REV80_PHY_TXC_BW_MASK 0x0003u |
| #define D11_REV80_PHY_TXC_BW_20MHZ 0x0000u |
| #define D11_REV80_PHY_TXC_BW_40MHZ 0x0001u |
| #define D11_REV80_PHY_TXC_BW_80MHZ 0x0002u |
| #define D11_REV80_PHY_TXC_BW_160MHZ 0x0003u |
| /* PhyTxCtl Word 2 (Bytes 4 -5) */ |
| /* Though the width antennacfg, coremask fields are 8-bits, |
| * only 4 bits is valid for 4369a0, hence masking only 4 bits |
| */ |
| #define D11_REV80_PHY_TXC_ANT_CONFIG_MASK 0x00F0u |
| #define D11_REV80_PHY_TXC_CORE_MASK 0x000Fu |
| #define D11_REV80_PHY_TXC_ANT_CONFIG_SHIFT 4u |
| /* upper byte- Ant. cfg, lower byte - Core */ |
| #define D11_REV80_PHY_TXC_ANT_CORE_MASK 0x0F0Fu |
| |
| /* PhyTxCtl BFM field */ |
| #define D11_REV80_PHY_TXC_BFM 0x80u |
| |
| /* PhyTxCtl power offsets */ |
| #define D11_REV80_PHY_TXC_PWROFS0_BYTE_POS 6u |
| |
| /* Phytx Ctl Sub band location */ |
| #define D11_REV80_PHY_TXC_SB_SHIFT 2u |
| #define D11_REV80_PHY_TXC_SB_MASK 0x001Cu |
| |
| /* 11n phy rate */ |
| #define D11_REV80_PHY_TXC_11N_MCS_MASK 0x003Fu |
| #define D11_REV80_PHY_TXC_11N_PROP_MCS 0x0040u /* this represents bit mcs[6] */ |
| |
| /* 11ac phy rate */ |
| #define D11_REV80_PHY_TXC_11AC_NSS_SHIFT 4u |
| |
| /* PhyTxCtl Word0 */ |
| #define D11_REV80_PHY_TXC_MCS_NSS_MASK 0x7F00u |
| #define D11_REV80_PHY_TXC_MCS_MASK 0xF00u |
| #define D11_REV80_PHY_TXC_MCS_NSS_SHIFT 8u |
| |
| /* 11ax phy rate */ |
| #define D11_REV80_PHY_TXC_11AX_NSS_SHIFT 4u |
| |
| #define D11_PHY_TXC_FT_MASK(corerev) ((D11REV_GE(corerev, 80)) ? D11_REV80_PHY_TXC_FT_MASK : \ |
| D11AC_PHY_TXC_FT_MASK) |
| |
| /* PhyTxCtl Word 4 */ |
| #define D11_REV80_PHY_TXC_HEHL_ENABLE 0x2000u |
| |
| /* PhyTxCtl Word 5 */ |
| #define D11_REV80_PHY_TXC_CORE0_PWR_OFFSET_SHIFT 8u |
| #define D11_REV80_PHY_TXC_CORE0_PWR_OFFSET_MASK 0xFF00u |
| /* PhyTxCtl Word 6 */ |
| #define D11_REV80_PHY_TXC_CORE1_PWR_OFFSET_MASK 0x00FFu |
| /* Number of RU assigned */ |
| #define D11_REV80_PHY_TXC_NRU 0x0100u |
| |
| /* A wrapper structure for all versions of TxD/d11txh structures */ |
| typedef union d11txhdr { |
| d11txh_pre40_t pre40; |
| d11actxh_t rev40; |
| d11txh_rev80_t rev80; |
| } d11txhdr_t; |
| |
| /** |
| * Generic tx status packet for software use. This is independent of hardware |
| * structure for a particular core. Hardware structure should be read and converted |
| * to this structure before being sent for the sofware consumption. |
| */ |
| typedef struct tx_status tx_status_t; |
| typedef struct tx_status_macinfo tx_status_macinfo_t; |
| |
| BWL_PRE_PACKED_STRUCT struct tx_status_macinfo { |
| int8 pad0; |
| int8 is_intermediate; |
| int8 pm_indicated; |
| int8 pad1; |
| uint8 suppr_ind; |
| int8 was_acked; |
| uint16 rts_tx_cnt; |
| uint16 frag_tx_cnt; |
| uint16 cts_rx_cnt; |
| uint16 raw_bits; |
| uint32 s3; |
| uint32 s4; |
| uint32 s5; |
| uint32 s8; |
| uint32 s9; |
| uint32 s10; |
| uint32 s11; |
| uint32 s12; |
| uint32 s13; |
| uint32 s14; |
| /* 128BA support */ |
| uint16 ncons_ext; |
| uint16 s15; |
| uint32 ack_map[8]; |
| /* pktlat */ |
| uint16 pkt_fetch_ts; /* PSM Packet Fetch Time */ |
| uint16 med_acc_dly; /* Medium Access Delay */ |
| uint16 rx_dur; /* Rx duration */ |
| uint16 mac_susp_dur; /* Mac Suspend Duration */ |
| uint16 txstatus_ts; /* TxStatus Time */ |
| uint16 tx_en_cnt; /* Number of times Tx was enabled */ |
| uint16 oac_txs_cnt; /* Other AC TxStatus count */ |
| uint16 data_retx_cnt; /* DataRetry count */ |
| uint16 pktlat_rsvd; /* reserved */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| BWL_PRE_PACKED_STRUCT struct tx_status { |
| uint16 framelen; |
| uint16 frameid; |
| uint16 sequence; |
| uint16 phyerr; |
| uint32 lasttxtime; |
| uint16 ackphyrxsh; |
| uint16 procflags; /* tx status processing flags */ |
| uint32 dequeuetime; |
| tx_status_macinfo_t status; |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* Bits in struct tx_status procflags */ |
| #define TXS_PROCFLAG_AMPDU_BA_PKG2_READ_REQD 0x1 /* AMPDU BA txs pkg2 read required */ |
| |
| /* status field bit definitions */ |
| #define TX_STATUS_FRM_RTX_MASK 0xF000 |
| #define TX_STATUS_FRM_RTX_SHIFT 12 |
| #define TX_STATUS_RTS_RTX_MASK 0x0F00 |
| #define TX_STATUS_RTS_RTX_SHIFT 8 |
| #define TX_STATUS_MASK 0x00FE |
| #define TX_STATUS_PMINDCTD (1 << 7) /**< PM mode indicated to AP */ |
| #define TX_STATUS_INTERMEDIATE (1 << 6) /**< intermediate or 1st ampdu pkg */ |
| #define TX_STATUS_AMPDU (1 << 5) /**< AMPDU status */ |
| #define TX_STATUS_SUPR_MASK 0x1C /**< suppress status bits (4:2) */ |
| #define TX_STATUS_SUPR_SHIFT 2 |
| #define TX_STATUS_ACK_RCV (1 << 1) /**< ACK received */ |
| #define TX_STATUS_VALID (1 << 0) /**< Tx status valid (corerev >= 5) */ |
| #define TX_STATUS_NO_ACK 0 |
| #define TX_STATUS_BE (TX_STATUS_ACK_RCV | TX_STATUS_PMINDCTD) |
| |
| /* TX_STATUS for fw initiated pktfree event */ |
| #define TX_STATUS_SW_Q_FLUSH 0x10000 |
| |
| /* status field bit definitions phy rev > 40 */ |
| #define TX_STATUS40_FIRST 0x0002 |
| #define TX_STATUS40_INTERMEDIATE 0x0004 |
| #define TX_STATUS40_PMINDCTD 0x0008 |
| |
| #define TX_STATUS40_SUPR 0x00f0 |
| #define TX_STATUS40_SUPR_SHIFT 4 |
| |
| #define TX_STATUS40_NCONS 0x7f00 |
| |
| #define TX_STATUS40_NCONS_SHIFT 8 |
| |
| #define TX_STATUS40_ACK_RCV 0x8000 |
| |
| /* tx status bytes 8-16 */ |
| #define TX_STATUS40_TXCNT_RATE0_MASK 0x000000ff |
| #define TX_STATUS40_TXCNT_RATE0_SHIFT 0 |
| |
| #define TX_STATUS40_TXCNT_RATE1_MASK 0x00ff0000 |
| #define TX_STATUS40_TXCNT_RATE1_SHIFT 16 |
| |
| #define TX_STATUS40_MEDIUM_DELAY_MASK 0xFFFF |
| |
| #define TX_STATUS40_TXCNT(s3, s4) \ |
| (((s3 & TX_STATUS40_TXCNT_RATE0_MASK) >> TX_STATUS40_TXCNT_RATE0_SHIFT) + \ |
| ((s3 & TX_STATUS40_TXCNT_RATE1_MASK) >> TX_STATUS40_TXCNT_RATE1_SHIFT) + \ |
| ((s4 & TX_STATUS40_TXCNT_RATE0_MASK) >> TX_STATUS40_TXCNT_RATE0_SHIFT) + \ |
| ((s4 & TX_STATUS40_TXCNT_RATE1_MASK) >> TX_STATUS40_TXCNT_RATE1_SHIFT)) |
| |
| #define TX_STATUS40_TXCNT_RT0(s3) \ |
| ((s3 & TX_STATUS40_TXCNT_RATE0_MASK) >> TX_STATUS40_TXCNT_RATE0_SHIFT) |
| |
| #define TX_STATUS_EXTBA_TXCNT_BITS 0x3u |
| #define TX_STATUS_EXTBA_TXSUCCNT_BITS 0x1u |
| #define TX_STATUS_EXTBA_TXSIZE_RT 0x4u |
| |
| #define TX_STATUS_EXTBA_TXCNT_RATE_MASK 0x7u |
| #define TX_STATUS_EXTBA_TXSUCCNT_RATE_MASK 0x8u |
| |
| #define TX_STATUS_EXTBA_TXCNT_RATE_SHIFT 0x8u |
| #define TX_STATUS_EXTBA_TXSUCCNT_RATE_SHIFT 0x8u |
| |
| #define TX_STATUS_EXTBA_TXCNT_RT(s15, rt) \ |
| ((((s15) & (TX_STATUS_EXTBA_TXCNT_RATE_MASK << ((rt) * TX_STATUS_EXTBA_TXSIZE_RT))) >> \ |
| ((rt) * TX_STATUS_EXTBA_TXSIZE_RT)) << TX_STATUS_EXTBA_TXCNT_RATE_SHIFT) |
| |
| #define TX_STATUS_EXTBA_TXSUCCNT_RT(s15, rt) \ |
| ((((s15) & (TX_STATUS_EXTBA_TXSUCCNT_RATE_MASK << ((rt) * TX_STATUS_EXTBA_TXSIZE_RT))) >> \ |
| (((rt) * TX_STATUS_EXTBA_TXSIZE_RT))) << TX_STATUS_EXTBA_TXSUCCNT_RATE_SHIFT) |
| |
| #define TX_STATUS40_TX_MEDIUM_DELAY(txs) ((txs)->status.s8 & TX_STATUS40_MEDIUM_DELAY_MASK) |
| |
| /* chip rev 40 pkg 2 fields */ |
| #define TX_STATUS40_IMPBF_MASK 0x0000000Cu /* implicit bf applied */ |
| #define TX_STATUS40_IMPBF_BAD_MASK 0x00000010u /* impl bf applied but ack frm has no bfm */ |
| #define TX_STATUS40_IMPBF_LOW_MASK 0x00000020u /* ack received with low rssi */ |
| #define TX_STATUS40_BFTX 0x00000040u /* Beamformed pkt TXed */ |
| /* pkt two status field bit definitions mac rev > 64 */ |
| #define TX_STATUS64_MUTX 0x00000080u /* Not used in STA-dongle chips */ |
| |
| /* pkt two status field bit definitions mac rev > 80 */ |
| |
| /* TXS rate cookie contains |
| * mac rev 81/82 : RIT idx in bit[4:0] of RIB CtrlStat[0] |
| * mac rev >= 83 : RIB version in bit[4:0] of RIB CtrlStat[1] |
| */ |
| #define TX_STATUS80_RATE_COOKIE_MASK 0x00003E00u |
| #define TX_STATUS80_RATE_COOKIE_SHIFT 9u |
| #define TX_STATUS80_NAV_HDR 0x00004000u /* NAV Overriden */ |
| |
| #define TX_STATUS80_TBPPDU_MASK 0x00000040u /* Indicates TBPPDU TX */ |
| #define TX_STATUS80_TBPPDU_SHIFT 6u |
| #define TX_STATUS40_RTS_RTX_MASK 0x00ff0000u |
| #define TX_STATUS40_RTS_RTX_SHIFT 16u |
| #define TX_STATUS40_CTS_RRX_MASK 0xff000000u |
| #define TX_STATUS40_CTS_RRX_SHIFT 24u |
| |
| /* |
| * Intermediate status for TBPPDU (for stats purposes) |
| * First uint16 word (word0 - status): VALID, !FIRST, INTERMEDIATE |
| * Remaining word0 bits (3 - 15) are unasisgned |
| */ |
| #define TX_ITBSTATUS(status) \ |
| (((status) & (TX_STATUS40_FIRST | TX_STATUS40_INTERMEDIATE)) == TX_STATUS40_INTERMEDIATE) |
| /* Remainder of first uint32 (words 0 and 1) */ |
| #define TX_ITBSTATUS_LSIG_MASK 0x0000fff0u |
| #define TX_ITBSTATUS_LSIG_SHIFT 4u |
| #define TX_ITBSTATUS_TXPOWER_MASK 0xffff0000u |
| #define TX_ITBSTATUS_TXPOWER_SHIFT 16u |
| /* Second uint32 (words 2 and 3) */ |
| #define TX_ITBSTATUS_NULL_DELIMS_MASK 0x0007ffffu /* 19 bits * 4B => ~2M bytes */ |
| #define TX_ITBSTATUS_NULL_DELIMS_SHIFT 0u |
| #define TX_ITBSTATUS_ACKED_MPDUS_MASK 0x3ff80000u /* 11 bits: 0-2047 */ |
| #define TX_ITBSTATUS_ACKED_MPDUS_SHIFT 19u |
| /* Third uint32 (words 4 and 5) */ |
| #define TX_ITBSTATUS_SENT_MPDUS_MASK 0x0000ffe0u /* 11 bits: 0-2047 */ |
| #define TX_ITBSTATUS_SENT_MPDUS_SHIFT 5u |
| #define TX_ITBSTATUS_APTXPWR_MASK 0x003f0000u /* 0-60 => -20 - 40 */ |
| #define TX_ITBSTATUS_APTXPWR_SHIFT 16u |
| #define TX_ITBSTATUS_ULPKTEXT_MASK 0x01c00000u |
| #define TX_ITBSTATUS_ULPKTEXT_SHIFT 22u |
| #define TX_ITBSTATUS_MORETF_MASK 0x02000000u |
| #define TX_ITBSTATUS_MORETF_SHIFT 25u |
| #define TX_ITBSTATUS_CSREQ_MASK 0x04000000u |
| #define TX_ITBSTATUS_CSREQ_SHIFT 26u |
| #define TX_ITBSTATUS_ULBW_MASK 0x18000000u |
| #define TX_ITBSTATUS_ULBW_SHIFT 27u |
| #define TX_ITBSTATUS_GI_LTF_MASK 0x60000000u |
| #define TX_ITBSTATUS_GI_LTF_SHIFT 29u |
| #define TX_ITBSTATUS_MUMIMO_LTF_MASK 0x80000000u |
| #define TX_ITBSTATUS_MUMIMO_LTF_SHIFT 30u |
| /* Fourth uint32 (words 6 and 7) */ |
| #define TX_ITBSTATUS_CODING_TYPE_MASK 0x00000001u |
| #define TX_ITBSTATUS_CODING_TYPE_SHIFT 0u |
| #define TX_ITBSTATUS_MCS_MASK 0x0000001eu |
| #define TX_ITBSTATUS_MCS_SHIFT 1u |
| #define TX_ITBSTATUS_DCM_MASK 0x00000020u |
| #define TX_ITBSTATUS_DCM_SHIFT 5u |
| #define TX_ITBSTATUS_RU_ALLOC_MASK 0x00003fc0u |
| #define TX_ITBSTATUS_RU_ALLOC_SHIFT 6u |
| /* Bits 14 and 15 unassigned */ |
| #define TX_ITBSTATUS_NSS_MASK 0x00030000u |
| #define TX_ITBSTATUS_NSS_SHIFT 16u |
| #define TX_ITBSTATUS_TARGET_RSSI_MASK 0x03fc0000u |
| #define TX_ITBSTATUS_TARGET_RSSI_SHIFT 18u |
| #define TX_ITBSTATUS_RA_RU_MASK 0x04000000u |
| #define TX_ITBSTATUS_RA_RU_SHIFT 26u |
| /* Bits 27 through 31 unassigned */ |
| /* End of intermediate TBPPDU txstatus definitions */ |
| |
| /* MU group info txstatus field (s3 b[31:16]) */ |
| #define TX_STATUS64_MU_GID_MASK 0x003f0000u |
| #define TX_STATUS64_MU_GID_SHIFT 16u |
| #define TX_STATUS64_MU_BW_MASK 0x00c00000u |
| #define TX_STATUS64_MU_BW_SHIFT 22u |
| #define TX_STATUS64_MU_TXPWR_MASK 0x7f000000u |
| #define TX_STATUS64_MU_TXPWR_SHIFT 24u |
| #define TX_STATUS64_MU_SGI_MASK 0x80000080u |
| #define TX_STATUS64_MU_SGI_SHIFT 31u |
| #define TX_STATUS64_INTERM_MUTXCNT(s3) \ |
| ((s3 & TX_STATUS40_TXCNT_RATE0_MASK) >> TX_STATUS40_TXCNT_RATE0_SHIFT) |
| |
| #define TX_STATUS64_MU_GID(s3) ((s3 & TX_STATUS64_MU_GID_MASK) >> TX_STATUS64_MU_GID_SHIFT) |
| #define TX_STATUS64_MU_BW(s3) ((s3 & TX_STATUS64_MU_BW_MASK) >> TX_STATUS64_MU_BW_SHIFT) |
| #define TX_STATUS64_MU_TXPWR(s3) ((s3 & TX_STATUS64_MU_TXPWR_MASK) >> TX_STATUS64_MU_TXPWR_SHIFT) |
| #define TX_STATUS64_MU_SGI(s3) ((s3 & TX_STATUS64_MU_SGI_MASK) >> TX_STATUS64_MU_SGI_SHIFT) |
| |
| /* MU user info0 txstatus field (s4 b[15:0]) */ |
| #define TX_STATUS64_MU_MCS_MASK 0x0000000f |
| #define TX_STATUS64_MU_MCS_SHIFT 0 |
| #define TX_STATUS64_MU_NSS_MASK 0x00000070 |
| #define TX_STATUS64_MU_NSS_SHIFT 4 |
| #define TX_STATUS64_MU_SNR_MASK 0x0000ff00 |
| #define TX_STATUS64_MU_SNR_SHIFT 8 |
| |
| #define TX_STATUS64_MU_MCS(s4) ((s4 & TX_STATUS64_MU_MCS_MASK) >> TX_STATUS64_MU_MCS_SHIFT) |
| #define TX_STATUS64_MU_NSS(s4) ((s4 & TX_STATUS64_MU_NSS_MASK) >> TX_STATUS64_MU_NSS_SHIFT) |
| #define TX_STATUS64_MU_SNR(s4) ((s4 & TX_STATUS64_MU_SNR_MASK) >> TX_STATUS64_MU_SNR_SHIFT) |
| |
| /* MU txstatus rspec field (NSS | MCS) */ |
| #define TX_STATUS64_MU_RSPEC_MASK (TX_STATUS64_MU_NSS_MASK | TX_STATUS64_MU_MCS_MASK) |
| #define TX_STATUS64_MU_RSPEC_SHIFT 0 |
| |
| #define TX_STATUS64_MU_RSPEC(s4) ((s4 & TX_STATUS64_MU_RSPEC_MASK) >> TX_STATUS64_MU_RSPEC_SHIFT) |
| |
| /* MU user info0 txstatus field (s4 b[31:16]) */ |
| #define TX_STATUS64_MU_GBMP_MASK 0x000f0000 |
| #define TX_STATUS64_MU_GBMP_SHIFT 16 |
| #define TX_STATUS64_MU_GPOS_MASK 0x00300000 |
| #define TX_STATUS64_MU_GPOS_SHIFT 20 |
| #define TX_STATUS64_MU_TXCNT_MASK 0x0fc00000 |
| #define TX_STATUS64_MU_TXCNT_SHIFT 22 |
| |
| #define TX_STATUS64_MU_GBMP(s4) ((s4 & TX_STATUS64_MU_GBMP_MASK) >> TX_STATUS64_MU_GBMP_SHIFT) |
| #define TX_STATUS64_MU_GPOS(s4) ((s4 & TX_STATUS64_MU_GPOS_MASK) >> TX_STATUS64_MU_GPOS_SHIFT) |
| #define TX_STATUS64_MU_TXCNT(s4) ((s4 & TX_STATUS64_MU_TXCNT_MASK) >> TX_STATUS64_MU_TXCNT_SHIFT) |
| |
| #define HE_MU_APTX_PWR_MAX 60u |
| #define HE_TXS_MU_APTX_PWR_DBM(aptx_pwr) ((aptx_pwr) - 20u) |
| |
| #define HE_TXS_MU_TARGET_RSSI_RANG 90 |
| #define HE_TXS_MU_TARGET_RSSI_MAX_PWR 127 |
| #define HE_TXS_MU_TARGET_RSSI_DBM(rssi) ((rssi) - 110) |
| |
| #define HE_TXS_W4_MU_GET_RU_INDEX(index) ((index <= HE_MAX_26_TONE_RU_INDX) ? 0u : \ |
| ((index) <= HE_MAX_52_TONE_RU_INDX) ? 1u : \ |
| ((index) <= HE_MAX_106_TONE_RU_INDX) ? 2u : \ |
| ((index) <= HE_MAX_242_TONE_RU_INDX) ? 3u : \ |
| ((index) <= HE_MAX_484_TONE_RU_INDX) ? 4u :\ |
| ((index) <= HE_MAX_996_TONE_RU_INDX) ? 5u : 6u) |
| |
| /* Bit 8 indicates upper 80 MHz */ |
| #define HE_TXS_W4_MU_RU_INDEX_RU_INDEX_MASK 0x7Fu |
| #define HE_TXS_W4_MU_RU_INDEX_TONE(index) HE_TXS_W4_MU_GET_RU_INDEX(((index) & \ |
| HE_TXS_W4_MU_RU_INDEX_RU_INDEX_MASK)) |
| |
| #define HE_TXS_W3_MU_APTX_PWR_MASK 0x003F0000u |
| #define HE_TXS_W3_MU_APTX_PWR_SHIFT 16u |
| #define HE_TXS_W3_MU_PKT_EXT_MASK 0x01C00000u |
| #define HE_TXS_W3_MU_PKT_EXT_SHIFT 22u |
| #define HE_TXS_W3_MU_MORE_TF_MASK 0x02000000u |
| #define HE_TXS_W3_MU_MORE_TF_SHIFT 25u |
| #define HE_TXS_W3_MU_CS_REQ_MASK 0x04000000u |
| #define HE_TXS_W3_MU_CS_REQ_SHIFT 26u |
| #define HE_TXS_W3_MU_UL_BW_MASK 0x18000000u |
| #define HE_TXS_W3_MU_UL_BW_SHIFT 27u |
| #define HE_TXS_W3_MU_GI_LTF_MASK 0x60000000u |
| #define HE_TXS_W3_MU_GI_LTF_SHIFT 29u |
| #define HE_TXS_W3_MU_MIMO_LTF_MASK 0x80000000u |
| #define HE_TXS_W3_MU_MIMO_LTF_SHIFT 31u |
| |
| #define HE_TXS_W3_MU_APTX_PWR(s3) (((s3) & HE_TXS_W3_MU_APTX_PWR_MASK) >> \ |
| HE_TXS_W3_MU_APTX_PWR_SHIFT) |
| #define HE_TXS_W3_MU_PKT_EXT(s3) (((s3) & HE_TXS_W3_MU_PKT_EXT_MASK) >> \ |
| HE_TXS_W3_MU_PKT_EXT_SHIFT) |
| #define HE_TXS_W3_MU_MORE_TF(s3) (((s3) & HE_TXS_W3_MU_MORE_TF_MASK) >> \ |
| HE_TXS_W3_MU_MORE_TF_SHIFT) |
| #define HE_TXS_W3_MU_CS_REQ(s3) (((s3) & HE_TXS_W3_MU_CS_REQ_MASK) >> \ |
| HE_TXS_W3_MU_CS_REQ_SHIFT) |
| #define HE_TXS_W3_MU_UL_BW(s3) (((s3) & HE_TXS_W3_MU_UL_BW_MASK) >> \ |
| HE_TXS_W3_MU_UL_BW_SHIFT) |
| #define HE_TXS_W3_MU_GI_LTF(s3) (((s3) & HE_TXS_W3_MU_GI_LTF_MASK) >> \ |
| HE_TXS_W3_MU_GI_LTF_SHIFT) |
| #define HE_TXS_W3_MU_MIMO_LT(s3) (((s3) & HE_TXS_W3_MU_MIMO_LTF_MASK) >> \ |
| HE_TXS_W3_MU_MIMO_LTF_SHIFT) |
| |
| #define HE_TXS_W4_MU_CODINF_TYPE_MASK 0x00000001u |
| #define HE_TXS_W4_MU_CODINF_TYPE_SHIFT 0u |
| #define HE_TXS_W4_MU_MCS_MASK 0x0000001Eu |
| #define HE_TXS_W4_MU_MCS_SHIFT 1u |
| #define HE_TXS_W4_MU_DCM_MASK 0x00000020u |
| #define HE_TXS_W4_MU_DCM_SHIFT 5u |
| #define HE_TXS_W4_RU_ALLOCATION_MASK 0x00003FC0u |
| #define HE_TXS_W4_RU_ALLOCATION_SHIFT 6u |
| |
| #define HE_TXS_W4_MU_CODINF_TYPE(s4) (((s4) & HE_TXS_W4_MU_CODINF_TYPE_MASK) >> \ |
| HE_TXS_W4_MU_CODINF_TYPE_SHIFT) |
| #define HE_TXS_W4_MU_MCS(s4) (((s4) & HE_TXS_W4_MU_MCS_MASK) >> \ |
| HE_TXS_W4_MU_MCS_SHIFT) |
| #define HE_TXS_W4_MU_DCM(s4) (((s4) & HE_TXS_W4_MU_DCM_MASK) >> \ |
| HE_TXS_W4_MU_DCM_SHIFT) |
| #define HE_TXS_W4_RU_ALLOCATION(s4) (((s4) & HE_TXS_W4_RU_ALLOCATION_MASK) >> \ |
| HE_TXS_W4_RU_ALLOCATION_SHIFT) |
| |
| #define HE_TXS_W4_MU_NSS_MASK 0x00030000u |
| #define HE_TXS_W4_MU_NSS_SHIFT 16u |
| #define HE_TXS_W4_MU_TARGET_RSSI_MASK 0x03FC0000u |
| #define HE_TXS_W4_MU_TARGET_RSSI_SHIFT 18u |
| |
| #define HE_TXS_W4_MU_NSS(s4) (((s4) & HE_TXS_W4_MU_NSS_MASK) >> \ |
| HE_TXS_W4_MU_NSS_SHIFT) |
| #define HE_TXS_W4_MU_TARGET_RSSI(s4) (((s4) & HE_TXS_W4_MU_TARGET_RSSI_MASK) >> \ |
| HE_TXS_W4_MU_TARGET_RSSI_SHIFT) |
| |
| /* WARNING: Modifying suppress reason codes? |
| * Update wlc_tx_status_t and TX_STS_REASON_STRINGS and |
| * wlc_tx_status_map_hw_to_sw_supr_code() also |
| */ |
| /* status field bit definitions */ |
| /** suppress status reason codes */ |
| enum { |
| TX_STATUS_SUPR_NONE = 0, |
| TX_STATUS_SUPR_PMQ = 1, /**< PMQ entry */ |
| TX_STATUS_SUPR_FLUSH = 2, /**< flush request */ |
| TX_STATUS_SUPR_FRAG = 3, /**< previous frag failure */ |
| TX_STATUS_SUPR_TBTT = 3, /**< SHARED: Probe response supr for TBTT */ |
| TX_STATUS_SUPR_BADCH = 4, /**< channel mismatch */ |
| TX_STATUS_SUPR_EXPTIME = 5, /**< lifetime expiry */ |
| TX_STATUS_SUPR_UF = 6, /**< underflow */ |
| #ifdef WLP2P_UCODE |
| TX_STATUS_SUPR_NACK_ABS = 7, /**< BSS entered ABSENCE period */ |
| #endif |
| TX_STATUS_SUPR_PPS = 8, /**< Pretend PS */ |
| TX_STATUS_SUPR_PHASE1_KEY = 9, /**< Request new TKIP phase-1 key */ |
| TX_STATUS_UNUSED = 10, /**< Unused in trunk */ |
| TX_STATUS_INT_XFER_ERR = 11, /**< Internal DMA xfer error */ |
| TX_STATUS_SUPR_TWT_SP_OUT = 12, /**< Suppress Tx outside TWTSP */ |
| NUM_TX_STATUS_SUPR |
| }; |
| |
| /** Unexpected tx status for rate update */ |
| #define TX_STATUS_UNEXP(status) \ |
| ((((status.is_intermediate))) && \ |
| TX_STATUS_UNEXP_AMPDU(status)) |
| |
| /** Unexpected tx status for A-MPDU rate update */ |
| #ifdef WLP2P_UCODE |
| #define TX_STATUS_UNEXP_AMPDU(status) \ |
| ((((status.suppr_ind)) != TX_STATUS_SUPR_NONE) && \ |
| (((status.suppr_ind)) != TX_STATUS_SUPR_EXPTIME) && \ |
| (((status.suppr_ind)) != TX_STATUS_SUPR_NACK_ABS)) |
| #else |
| #define TX_STATUS_UNEXP_AMPDU(status) \ |
| ((((status.suppr_ind)) != TX_STATUS_SUPR_NONE) && \ |
| (((status.suppr_ind)) != TX_STATUS_SUPR_EXPTIME)) |
| #endif |
| |
| /** |
| * This defines the collection of supp reasons (including none) |
| * for which mac has done its (re-)transmission in any of ucode retx schemes |
| * which include ucode/hw/aqm agg |
| */ |
| #define TXS_SUPR_MAGG_DONE_MASK ((1 << TX_STATUS_SUPR_NONE) | \ |
| (1 << TX_STATUS_SUPR_UF) | \ |
| (1 << TX_STATUS_SUPR_FRAG) | \ |
| (1 << TX_STATUS_SUPR_EXPTIME)) |
| #define TXS_SUPR_MAGG_DONE(suppr_ind) \ |
| ((1 << (suppr_ind)) & TXS_SUPR_MAGG_DONE_MASK) |
| |
| #define TX_STATUS_BA_BMAP03_MASK 0xF000 /**< ba bitmap 0:3 in 1st pkg */ |
| #define TX_STATUS_BA_BMAP03_SHIFT 12 /**< ba bitmap 0:3 in 1st pkg */ |
| #define TX_STATUS_BA_BMAP47_MASK 0x001E /**< ba bitmap 4:7 in 2nd pkg */ |
| #define TX_STATUS_BA_BMAP47_SHIFT 3 /**< ba bitmap 4:7 in 2nd pkg */ |
| |
| /* RXE (Receive Engine) */ |
| |
| /* RCM_CTL */ |
| #define RCM_INC_MASK_H 0x0080 |
| #define RCM_INC_MASK_L 0x0040 |
| #define RCM_INC_DATA 0x0020 |
| #define RCM_INDEX_MASK 0x001F |
| #define RCM_SIZE 15 |
| |
| #define RCM_MAC_OFFSET 0 /**< current MAC address */ |
| #define RCM_BSSID_OFFSET 3 /**< current BSSID address */ |
| #define RCM_F_BSSID_0_OFFSET 6 /**< foreign BSS CFP tracking */ |
| #define RCM_F_BSSID_1_OFFSET 9 /**< foreign BSS CFP tracking */ |
| #define RCM_F_BSSID_2_OFFSET 12 /**< foreign BSS CFP tracking */ |
| |
| #define RCM_WEP_TA0_OFFSET 16 |
| #define RCM_WEP_TA1_OFFSET 19 |
| #define RCM_WEP_TA2_OFFSET 22 |
| #define RCM_WEP_TA3_OFFSET 25 |
| |
| /* AMT - Address Match Table */ |
| |
| /* AMT Attribute bits */ |
| #define AMT_ATTR_VALID 0x8000 /**< Mark the table entry valid */ |
| #define AMT_ATTR_A1 0x0008 /**< Match for A1 */ |
| #define AMT_ATTR_A2 0x0004 /**< Match for A2 */ |
| #define AMT_ATTR_A3 0x0002 /**< Match for A3 */ |
| |
| /* AMT Index defines */ |
| #define AMT_SIZE_64 64 /* number of AMT entries */ |
| #define AMT_SIZE_128 128 /* number of AMT entries for corerev >= 64 */ |
| #define AMT_IDX_MAC 63 /**< device MAC */ |
| #define AMT_IDX_BSSID 62 /**< BSSID match */ |
| #define AMT_IDX_TRANSMITTED_BSSID 60 /**< transmitted BSSID in multiple BSSID set */ |
| #define AMT_WORD_CNT 2 /* Number of word count per AMT entry */ |
| |
| #define AMT_SIZE(_corerev) (D11REV_GE(_corerev, 64) ? \ |
| (D11REV_GE(_corerev, 80) ? AMT_SIZE_64 : AMT_SIZE_128) : \ |
| AMT_SIZE_64) |
| |
| /* RMC entries */ |
| #define AMT_IDX_MCAST_ADDR 61 /**< MCAST address for Reliable Mcast feature */ |
| #define AMT_IDX_MCAST_ADDR1 59 /**< MCAST address for Reliable Mcast feature */ |
| #define AMT_IDX_MCAST_ADDR2 58 /**< MCAST address for Reliable Mcast feature */ |
| #define AMT_IDX_MCAST_ADDR3 57 /**< MCAST address for Reliable Mcast feature */ |
| |
| #ifdef WLMESH |
| /* note: this is max supported by ucode. But ARM-driver can |
| * only mesh_info->mesh_max_peers which should be <= this value. |
| */ |
| |
| #define AMT_MAX_MESH_PEER 10 |
| #define AMT_MAXIDX_MESH_PEER 60 |
| #define AMT_MAXIDX_P2P_USE \ |
| (AMT_MAXIDX_MESH_PEER - AMT_MAX_MESH_PEER) |
| #else |
| #define AMT_MAXIDX_P2P_USE 60 /**< Max P2P entry to use */ |
| #endif /* WL_STA_MONITOR */ |
| #define AMT_MAX_TXBF_ENTRIES 7 /**< Max tx beamforming entry */ |
| /* PSTA AWARE AP: Max PSTA Tx beamforming entry */ |
| #define AMT_MAX_TXBF_PSTA_ENTRIES 20 |
| |
| /* M_AMT_INFO SHM bit field definition */ |
| #define AMTINFO_BMP_IBSS (1u << 0u) /* IBSS Station */ |
| #define AMTINFO_BMP_MESH (1u << 1u) /* MESH Station */ |
| #define AMTINFO_BMP_BSSID (1u << 2u) /* BSSID-only */ |
| #define AMTINFO_BMP_IS_WAPI (1u << 3u) /* For WAPI keyid extraction */ |
| #define AMTINFO_BMP_IS_HE (1u << 13u) /* For HE peer indication */ |
| |
| #define AUXPMQ_ENTRIES 64 /* number of AUX PMQ entries */ |
| #define AUXPMQ_ENTRY_SIZE 8 |
| |
| /* PSM Block */ |
| |
| /* psm_phy_hdr_param bits */ |
| #define MAC_PHY_RESET 1 |
| #define MAC_PHY_CLOCK_EN 2 |
| #define MAC_PHY_FORCE_CLK 4 |
| #define MAC_IHRP_CLOCK_EN 15 |
| |
| /* PSMCoreControlStatus (IHR Address 0x078) bit definitions */ |
| #define PSM_CORE_CTL_AR (1 << 0) |
| #define PSM_CORE_CTL_HR (1 << 1) |
| #define PSM_CORE_CTL_IR (1 << 2) |
| #define PSM_CORE_CTL_AAR (1 << 3) |
| #define PSM_CORE_CTL_HAR (1 << 4) |
| #define PSM_CORE_CTL_PPAR (1 << 5) |
| #define PSM_CORE_CTL_SS (1 << 6) |
| #define PSM_CORE_CTL_REHE (1 << 7) |
| #define PSM_CORE_CTL_PPAS (1 << 13) |
| #define PSM_CORE_CTL_AAS (1 << 14) |
| #define PSM_CORE_CTL_HAS (1 << 15) |
| |
| #define PSM_CORE_CTL_LTR_BIT 9 |
| #define PSM_CORE_CTL_LTR_MASK 0x3 |
| |
| #define PSM_SBACCESS_FIFO_MODE (1 << 1) |
| #define PSM_SBACCESS_EXT_ERR (1 << 11) |
| |
| /* WEP Block */ |
| |
| /* WEP_WKEY */ |
| #define WKEY_START (1 << 8) |
| #define WKEY_SEL_MASK 0x1F |
| |
| /* WEP data formats */ |
| |
| /* the number of RCMTA entries */ |
| #define RCMTA_SIZE 50 |
| |
| /* max keys in M_TKMICKEYS_BLK - 96 * sizeof(uint16) */ |
| #define WSEC_MAX_TKMIC_ENGINE_KEYS(_corerev) ((D11REV_GE(_corerev, 64)) ? \ |
| AMT_SIZE(_corerev) : 12) /* 8 + 4 default - 2 mic keys 8 bytes each */ |
| |
| /* max keys in M_WAPIMICKEYS_BLK - 64 * sizeof(uint16) */ |
| #define WSEC_MAX_SMS4MIC_ENGINE_KEYS(_corerev) ((D11REV_GE(_corerev, 64)) ? \ |
| AMT_SIZE(_corerev) : 8) /* 4 + 4 default - 16 bytes each */ |
| |
| /* max RXE match registers */ |
| #define WSEC_MAX_RXE_KEYS 4 |
| |
| /* SECKINDXALGO (Security Key Index & Algorithm Block) word format */ |
| /* SKL (Security Key Lookup) */ |
| #define SKL_POST80_ALGO_MASK 0x000F |
| #define SKL_PRE80_ALGO_MASK 0x0007 |
| #define SKL_ALGO_SHIFT 0 |
| |
| #define SKL_ALGO_MASK(_corerev) (D11REV_GE(_corerev, 80) ? SKL_POST80_ALGO_MASK : \ |
| SKL_PRE80_ALGO_MASK) |
| |
| #define SKL_WAPI_KEYID_MASK 0x8000 |
| #define SKL_WAPI_KEYID_SHIFT 15 |
| #define SKL_INDEX_SHIFT 4 |
| |
| #define SKL_PRE80_WAPI_KEYID_MASK 0x0008 |
| #define SKL_PRE80_WAPI_KEYID_SHIFT 3 |
| |
| #define SKL_INDEX_MASK(_corerev) ((D11REV_GE(_corerev, 64)) ? \ |
| (0x0FF0) : (0x03F0)) |
| #define SKL_GRP_ALGO_MASK(_corerev) ((D11REV_GE(_corerev, 64)) ? \ |
| ((D11REV_GE(_corerev, 80)) ? (0xE000) : (0x7000)) : (0x1c00)) |
| #define SKL_GRP_ALGO_SHIFT(_corerev) ((D11REV_GE(_corerev, 64)) ? \ |
| ((D11REV_GE(_corerev, 80)) ? (13) : (12)) : (10)) |
| |
| #define SKL_STAMON_NBIT 0x8000 /* STA monitor bit */ |
| |
| /* additional bits defined for IBSS group key support */ |
| #define SKL_IBSS_INDEX_MASK 0x01F0 |
| #define SKL_IBSS_INDEX_SHIFT 4 |
| #define SKL_IBSS_KEYID1_MASK 0x0600 |
| #define SKL_IBSS_KEYID1_SHIFT 9 |
| #define SKL_IBSS_KEYID2_MASK 0x1800 |
| #define SKL_IBSS_KEYID2_SHIFT 11 |
| #define SKL_IBSS_KEYALGO_MASK 0xE000 |
| #define SKL_IBSS_KEYALGO_SHIFT 13 |
| |
| #define WSEC_MODE_OFF 0 |
| #define WSEC_MODE_HW 1 |
| #define WSEC_MODE_SW 2 |
| |
| /* Mapped as per HW_ALGO */ |
| #define WSEC_ALGO_OFF 0 |
| #define WSEC_ALGO_WEP1 1 |
| #define WSEC_ALGO_TKIP 2 |
| #define WSEC_ALGO_WEP128 3 |
| #define WSEC_ALGO_AES_LEGACY 4 |
| #define WSEC_ALGO_AES 5 |
| #define WSEC_ALGO_SMS4 6 |
| #define WSEC_ALGO_SMS4_DFT_2005_09_07 7 /**< Not used right now */ |
| #define WSEC_ALGO_NALG 8 |
| |
| /* For CORE_REV 80 */ |
| #define WSEC_ALGO_AES_GCM 8 |
| #define WSEC_ALGO_AES_GCM256 9 |
| |
| /* For CORE_REV Less than 80 and */ |
| #define WSEC_ALGO_AES_PRE80_GCM 6 |
| #define WSEC_ALGO_AES_PRE80_GCM256 8 |
| |
| /* D11 MAX TTAK INDEX */ |
| #define TSC_TTAK_PRE80_MAX_INDEX 50 |
| #define TSC_TTAK_MAX_INDEX 8 |
| /* D11 COREREV 80 TTAK KEY INDEX SHIFT */ |
| #define SKL_TTAK_INDEX_SHIFT 13 |
| #define SKL_TTAK_INDEX_MASK 0xE000 |
| |
| /* D11 PRECOREREV 40 Hw algos...changed from corerev 40 */ |
| #define D11_PRE40_WSEC_ALGO_AES 3 |
| #define D11_PRE40_WSEC_ALGO_WEP128 4 |
| #define D11_PRE40_WSEC_ALGO_AES_LEGACY 5 |
| #define D11_PRE40_WSEC_ALGO_SMS4 6 |
| #define D11_PRE40_WSEC_ALGO_NALG 7 |
| |
| #define D11_WSEC_ALGO_AES(_corerev) WSEC_ALGO_AES |
| |
| #define AES_MODE_NONE 0 |
| #define AES_MODE_CCM 1 |
| #define AES_MODE_OCB_MSDU 2 |
| #define AES_MODE_OCB_MPDU 3 |
| #define AES_MODE_CMAC 4 |
| #define AES_MODE_GCM 5 |
| #define AES_MODE_GMAC 6 |
| |
| /* WEP_CTL (Rev 0) */ |
| #define WECR0_KEYREG_SHIFT 0 |
| #define WECR0_KEYREG_MASK 0x7 |
| #define WECR0_DECRYPT (1 << 3) |
| #define WECR0_IVINLINE (1 << 4) |
| #define WECR0_WEPALG_SHIFT 5 |
| #define WECR0_WEPALG_MASK (0x7 << 5) |
| #define WECR0_WKEYSEL_SHIFT 8 |
| #define WECR0_WKEYSEL_MASK (0x7 << 8) |
| #define WECR0_WKEYSTART (1 << 11) |
| #define WECR0_WEPINIT (1 << 14) |
| #define WECR0_ICVERR (1 << 15) |
| |
| /* Frame template map byte offsets */ |
| #define T_ACTS_TPL_BASE (0) |
| #define T_NULL_TPL_BASE (0xc * 2) |
| #define T_QNULL_TPL_BASE (0x1c * 2) |
| #define T_RR_TPL_BASE (0x2c * 2) |
| #define T_BCN0_TPL_BASE (0x34 * 2) |
| #define T_PRS_TPL_BASE (0x134 * 2) |
| #define T_BCN1_TPL_BASE (0x234 * 2) |
| #define T_P2P_NULL_TPL_BASE (0x340 * 2) |
| #define T_P2P_NULL_TPL_SIZE (32) |
| #define T_TRIG_TPL_BASE (0x90 * 2) |
| |
| /* FCBS base addresses and sizes in BM */ |
| |
| #define FCBS_DS0_BM_CMD_SZ_CORE0 0x0200 /* 512 bytes */ |
| #define FCBS_DS0_BM_DAT_SZ_CORE0 0x0200 /* 512 bytes */ |
| |
| #ifndef FCBS_DS0_BM_CMDPTR_BASE_CORE0 |
| #define FCBS_DS0_BM_CMDPTR_BASE_CORE0 0x3000 |
| #endif |
| #define FCBS_DS0_BM_DATPTR_BASE_CORE0 (FCBS_DS0_BM_CMDPTR_BASE_CORE0 + FCBS_DS0_BM_CMD_SZ_CORE0) |
| |
| #define FCBS_DS0_BM_CMD_SZ_CORE1 0x0200 /* 512 bytes */ |
| #define FCBS_DS0_BM_DAT_SZ_CORE1 0x0200 /* 512 bytes */ |
| |
| #ifndef FCBS_DS0_BM_CMDPTR_BASE_CORE1 |
| #define FCBS_DS0_BM_CMDPTR_BASE_CORE1 0x2400 |
| #endif |
| #define FCBS_DS0_BM_DATPTR_BASE_CORE1 (FCBS_DS0_BM_CMDPTR_BASE_CORE1 + FCBS_DS0_BM_CMD_SZ_CORE1) |
| |
| #define FCBS_DS0_BM_CMD_SZ_CORE2 0x0200 /* 512 bytes */ |
| #define FCBS_DS0_BM_DAT_SZ_CORE2 0x0200 /* 512 bytes */ |
| |
| #define FCBS_DS1_BM_CMD_SZ_CORE0 0x2000 /* Not used */ |
| #define FCBS_DS1_BM_DAT_SZ_CORE0 0x2000 /* Not used */ |
| |
| #define FCBS_DS1_BM_CMDPTR_BASE_CORE0 0x17B4 |
| #define FCBS_DS1_BM_DATPTR_BASE_CORE0 (FCBS_DS1_BM_CMDPTR_BASE_CORE0 + FCBS_DS1_BM_CMD_SZ_CORE0) |
| |
| #define FCBS_DS1_BM_CMD_SZ_CORE1 0x2000 /* Not used */ |
| #define FCBS_DS1_BM_DAT_SZ_CORE1 0x2000 /* Not used */ |
| |
| #define FCBS_DS1_BM_CMDPTR_BASE_CORE1 0x17B4 |
| #define FCBS_DS1_BM_DATPTR_BASE_CORE1 (FCBS_DS1_BM_CMDPTR_BASE_CORE1 + FCBS_DS1_BM_CMD_SZ_CORE1) |
| |
| #define T_BA_TPL_BASE T_QNULL_TPL_BASE /**< template area for BA */ |
| |
| #define T_RAM_ACCESS_SZ 4 /**< template ram is 4 byte access only */ |
| |
| #define TPLBLKS_PER_BCN_NUM 2 |
| #define TPLBLKS_AC_PER_BCN_NUM 1 |
| |
| #if defined(WLLPRS) && defined(MBSS) |
| #define TPLBLKS_PER_PRS_NUM 4 |
| #define TPLBLKS_AC_PER_PRS_NUM 2 |
| #else |
| #define TPLBLKS_PER_PRS_NUM 2 |
| #define TPLBLKS_AC_PER_PRS_NUM 1 |
| #endif /* WLLPRS && MBSS */ |
| |
| /* MAC Sample Collect Params */ |
| |
| /* SampleCapture set-up options in |
| * different registers based on CoreRev |
| */ |
| /* CoreRev >= 50, use SMP_CTRL in TXE_IHR */ |
| #define SC_SRC_MAC 2 /* MAC as Sample Collect Src */ |
| #define SC_SRC_SHIFT 3 /* SC_SRC bits [3:4] */ |
| #define SC_TRIG_SHIFT 5 |
| #define SC_TRANS_SHIFT 6 |
| #define SC_MATCH_SHIFT 7 |
| #define SC_STORE_SHIFT 8 |
| |
| #define SC_STRT 1 |
| #define SC_TRIG_EN (1 << SC_TRIG_SHIFT) |
| #define SC_TRANS_EN (1 << SC_TRANS_SHIFT) |
| #define SC_MATCH_EN (1 << SC_MATCH_SHIFT) |
| #define SC_STORE_EN (1 << SC_STORE_SHIFT) |
| |
| /* CoreRev < 50, use PHY_CTL in PSM_IHR */ |
| #define PHYCTL_PHYCLKEN (1 << 1) |
| #define PHYCTL_FORCE_GATED_CLK_ON (1 << 2) |
| #define PHYCTL_SC_STRT (1 << 4) |
| #define PHYCTL_SC_SRC_LB (1 << 7) |
| #define PHYCTL_SC_TRIG_EN (1 << 8) |
| #define PHYCTL_SC_TRANS_EN (1 << 9) |
| #define PHYCTL_SC_STR_EN (1 << 10) |
| #define PHYCTL_IHRP_CLK_EN (1 << 15) |
| /* End MAC Sample Collect Params */ |
| |
| #define ANTSEL_CLKDIV_4MHZ 6 |
| #define MIMO_ANTSEL_BUSY 0x4000 /**< bit 14 (busy) */ |
| #define MIMO_ANTSEL_SEL 0x8000 /**< bit 15 write the value */ |
| #define MIMO_ANTSEL_WAIT 50 /**< 50us wait */ |
| #define MIMO_ANTSEL_OVERRIDE 0x8000 /**< flag */ |
| |
| typedef struct shm_acparams shm_acparams_t; |
| BWL_PRE_PACKED_STRUCT struct shm_acparams { |
| uint16 txop; |
| uint16 cwmin; |
| uint16 cwmax; |
| uint16 cwcur; |
| uint16 aifs; |
| uint16 bslots; |
| uint16 reggap; |
| uint16 status; |
| uint16 txcnt; |
| uint16 rsvd[7]; |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define WME_STATUS_NEWAC (1 << 8) |
| |
| /* M_HOST_FLAGS */ |
| #define MHFMAX 5 /* Number of valid hostflag half-word (uint16) */ |
| #define MHF1 0 /* Hostflag 1 index */ |
| #define MHF2 1 /* Hostflag 2 index */ |
| #define MHF3 2 /* Hostflag 3 index */ |
| #define MHF4 3 /* Hostflag 4 index */ |
| #define MHF5 4 /* Hostflag 5 index */ |
| |
| #define MXHFMAX 1 /* Number of valid PSMx hostflag half-word (uint16) */ |
| #define MXHF0 64 /* PSMx Hostflag 0 index */ |
| |
| /* Flags in M_HOST_FLAGS */ |
| #define MHF1_D11AC_DYNBW 0x0001 /**< dynamic bw */ |
| #define MHF1_WLAN_CRITICAL 0x0002 /**< WLAN is in critical state */ |
| #define MHF1_MBSS_EN 0x0004 /**< Enable MBSS: RXPUWAR deprecated for rev >= 9 */ |
| #define MHF1_BTCOEXIST 0x0010 /**< Enable Bluetooth / WLAN coexistence */ |
| #define MHF1_P2P_SKIP_TIME_UPD 0x0020 /**< Skip P2P SHM updates and P2P event generations */ |
| #define MHF1_TXMUTE_WAR 0x0040 /**< ucode based Tx mute */ |
| #define MHF1_RXFIFO1 0x0080 /**< Switch data reception from RX fifo 0 to fifo 1 */ |
| #define MHF1_EDCF 0x0100 /**< Enable EDCF access control */ |
| #define MHF1_ULP 0x0200 /**< Force Ucode to put chip in low power state */ |
| #define MHF1_FORCE_SEND_BCN 0x0800 /**< Force send bcn, even if rcvd from peer STA (IBSS) */ |
| #define MHF1_TIMBC_EN 0x1000 /**< Enable Target TIM Transmission Time function */ |
| #define MHF1_RADARWAR 0x2000 /**< Enable Radar Detect WAR PR 16559 */ |
| #define MHF1_DEFKEYVALID 0x4000 /**< Enable use of the default keys */ |
| #define MHF1_CTS2SELF 0x8000 /**< Enable CTS to self full phy bw protection */ |
| |
| /* Flags in M_HOST_FLAGS2 */ |
| #define MHF2_DISABLE_PRB_RESP 0x0001 /**< disable Probe Response in ucode */ |
| #define MHF2_HIB_FEATURE_ENABLE 0x0008 /* Enable HIB feature in ucode (60<=rev<80) */ |
| #define MHF2_SKIP_ADJTSF 0x0010 /**< skip TSF update when receiving bcn/probeRsp */ |
| #define MHF2_RSPBW20 0x0020 /**< Uses bw20 for response frames ack/ba/cts */ |
| #define MHF2_TXBCMC_NOW 0x0040 /**< Flush BCMC FIFO immediately */ |
| #define MHF2_PPR_HWPWRCTL 0x0080 /**< TSSI_DIV WAR (rev<80) */ |
| #define MHF2_BTC2WIRE_ALTGPIO 0x0100 /**< BTC 2wire in alternate pins */ |
| #define MHF2_BTCPREMPT 0x0200 /**< BTC enable bluetooth check during tx */ |
| #define MHF2_SKIP_CFP_UPDATE 0x0400 /**< Skip CFP update ; for d11 rev <= 80 */ |
| #define MHF2_TX_TMSTMP 0x0800 /**< Enable passing tx-timestamps in tx-status */ |
| #define MHF2_UFC_GE84 0x2000 /**< Enable UFC in CT mode */ |
| #define MHF2_NAV_NORST_WAR 0x4000 /**< WAR to use rogue NAV duration */ |
| #define MHF2_BTCANTMODE 0x4000 // OBSOLETE (TO BE REMOVED) |
| |
| /* Flags in M_HOST_FLAGS3 */ |
| #define MHF3_ANTSEL_EN 0x0001 /**< enabled mimo antenna selection (REV<80) */ |
| #define MHF3_TKIP_FRAG_WAR 0x0001 /**< TKIP fragment corrupt WAR (REV>=80) */ |
| #define MHF3_TXSHAPER_EN 0x0002 /** enable tx shaper for non-OFDM-A frames */ |
| #define MHF3_ANTSEL_MODE 0x0002 /**< antenna selection mode: 0: 2x3, 1: 2x4 (REV<80) */ |
| #define MHF3_BTCX_DEF_BT 0x0004 /**< corerev >= 13 BT Coex. */ |
| #define MHF3_BTCX_ACTIVE_PROT 0x0008 /**< corerev >= 13 BT Coex. */ |
| #define MHF3_PKTENG_PROMISC 0x0010 /**< pass frames to driver in packet engine Rx mode */ |
| #define MHF3_SCANCORE_PM_EN 0x0040 /**< enable ScanCore PM from ucode */ |
| #define MHF3_PM_BCNRX 0x0080 /**< PM single core beacon RX for power reduction */ |
| #define MHF3_BTCX_SIM_RSP 0x0100 /**< allow limited lwo power tx when BT is active */ |
| #define MHF3_BTCX_PS_PROTECT 0x0200 /**< use PS mode to protect BT activity */ |
| #define MHF3_BTCX_SIM_TX_LP 0x0400 /**< use low power for simultaneous tx responses */ |
| #define MHF3_SELECT_RXF1 0x0800 /**< enable frame classification in pcie FD */ |
| #define MHF3_BTCX_ECI 0x1000 /**< Enable BTCX ECI interface */ |
| #define MHF3_NOISECAL_ENHANCE 0x2000 |
| |
| /* Flags in M_HOST_FLAGS4 */ |
| #define MHF4_RCMTA_BSSID_EN 0x0002 /**< BTAMP: multiSta BSSIDs matching in RCMTA area */ |
| #define MHF4_SC_MIX_EN 0x0002 /**< set to enable 4389a0 specific changes */ |
| #define MHF4_BCN_ROT_RR 0x0004 /**< MBSSID: beacon rotate in round-robin fashion */ |
| #define MHF4_OPT_SLEEP 0x0008 /**< enable opportunistic sleep (REV<80) */ |
| #define MHF4_PM_OFFLOAD 0x0008 /**< enable PM offload */ |
| #define MHF4_PROXY_STA 0x0010 /**< enable proxy-STA feature */ |
| #define MHF4_AGING 0x0020 /**< Enable aging threshold for RF awareness */ |
| #define MHF4_STOP_BA_ON_NDP 0x0080 /**< Stop BlockAck to AP to get chance to send NULL data */ |
| #define MHF4_NOPHYHANGWAR 0x0100 /**< disable ucode WAR for idletssi cal (rev=61) */ |
| #define MHF4_WMAC_ACKTMOUT 0x0200 /**< reserved for WMAC testing */ |
| #define MHF4_NAPPING_ENABLE 0x0400 /**< Napping enable (REV<80) */ |
| #define MHF4_IBSS_SEC 0x0800 /**< IBSS WPA2-PSK operating mode */ |
| #define MHF4_SISO_BCMC_RX 0x1000 /* Disable switch to MIMO on recving multicast TIM */ |
| #define MHF4_RSDB_CR1_MINIPMU_CAL_EN 0x8000 /* for 4349B0. JIRA:SW4349-1469 */ |
| |
| /* Flags in M_HOST_FLAGS5 */ |
| #define MHF5_BTCX_LIGHT 0x0002 /**< light coex mode, off txpu only for critical BT */ |
| #define MHF5_BTCX_PARALLEL 0x0004 /**< BT and WLAN run in parallel. */ |
| #define MHF5_BTCX_DEFANT 0x0008 /**< default position for shared antenna */ |
| #define MHF5_P2P_MODE 0x0010 /**< Enable P2P mode */ |
| #define MHF5_LEGACY_PRS 0x0020 /**< Enable legacy probe resp support */ |
| #define MHF5_HWRSSI_EN 0x0800 /**< Enable HW RSSI (ac) */ |
| #define MHF5_HIBERNATE 0x1000 /**< Force ucode to power save until wake-bit */ |
| #define MHF5_BTCX_GPIO_DEBUG 0x4000 /**< Enable gpio pins for btcoex ECI signals */ |
| #define MHF5_SUPPRESS_PRB_REQ 0x8000 /**< Suppress probe requests at ucode level */ |
| |
| /* Flags in M_HOST_FLAGS6 */ |
| #define MHF6_TXPWRCAP_RST_EN 0x0001 /** < Ucode clear phyreg after each tx */ |
| #define MHF6_TXPWRCAP_EN 0x0002 /** < Enable TX power capping in ucode */ |
| #define MHF6_TSYNC_AVB 0x0004 /** Enable AVB for timestamping */ |
| #define MHF6_TSYNC_3PKG 0x0020 /** < Enable 3rd txstatus package */ |
| #define MHF6_TDMTX 0x0040 /** < Enable SDB TDM in ucode */ |
| #define MHF6_TSYNC_NODEEPSLP 0x0080 /** < Disable deep sleep to keep AVB clock */ |
| #define MHF6_TSYNC_CAL 0x0100 /** < Enable Tsync cal in ucode */ |
| #define MHF6_TXPWRCAP_IOS_NBIT 0x0200 /** < Enable IOS mode of operation for Txpwrcap (REV>=80) */ |
| #define MHF6_MULBSSID_NBIT 0x0400 /** < associated to AP belonging to a multiple BSSID set */ |
| #define MHF6_HEBCN_TX_NBIT 0x0800 /** < HE BCN-TX */ |
| #define MHF6_LATENCY_EN 0x2000 /** < Enable Latency instrumentation in ucode */ |
| #define MHF6_PTMSTS_EN 0x4000 /** < Enable PTM Status */ |
| |
| /* MX_HOST_FLAGS */ |
| /* Flags for MX_HOST_FLAGS0 */ |
| #define MXHF0_RSV0 0x0001 /* ucode internal, not exposed yet */ |
| #define MXHF0_TXDRATE 0x0002 /* mu txrate to use rate from txd */ |
| #define MXHF0_CHKFID 0x0004 /* check if frameid->fifo matches hw txfifo idx */ |
| #define MXHF0_DISWAR 0x0008 /* disable some WAR. */ |
| |
| /* M_AXC_HOST_FLAGS0 */ |
| #define MAXCHF0_WAIT_TRIG 0x0001 /* Hold frames till trigger frame is rxed */ |
| #define MAXCHF0_HTC_SUPPORT 0x0002 /* 11AX HTC field support */ |
| #define MAXCHF0_AX_ASSOC_SHIFT 0x0003 /* 11AX association indicator */ |
| #define MAXCHF0_HEB_CONFIG 0x0004 /* HEB configuration */ |
| #define MAXCHF0_ACI_DET 0x0008 /* ACI detect soft enable */ |
| #define MAXCHF0_TRIGRES_LP 0x0010 /* Lite-Point testing */ |
| #define MAXCHF0_HDRCONV_SHIFT 5u /* Enable header conversion */ |
| #define MAXCHF0_HDRCONV (1 << MAXCHF0_HDRCONV_SHIFT) |
| #define MAXCHF0_FORCE_ZERO_PPR_SHIFT 6u /* Force PPR value to 0 for ULTPC */ |
| #define MAXCHF0_FORCE_ZERO_PPR (1 << MAXCHF0_FORCE_ZERO_PPR_SHIFT) |
| #define MAXCHF0_DISABLE_PYLDECWAR_SHIFT 7u /* Disable WAR for Paydecode issue */ |
| #define MAXCHF0_DISABLE_PYLDECWAR (1 << MAXCHF0_DISABLE_PYLDECWAR_SHIFT) |
| #define MAXCHF0_BSR_SUPPORT_SHIFT 8u /* BSR is supported */ |
| #define MAXCHF0_BSR_SUPPORT (1 << MAXCHF0_BSR_SUPPORT_SHIFT) |
| #define MAXCHF0_MUEDCA_VALID_SHIFT 9u /* MUEDCA information is valid */ |
| #define MAXCHF0_MUEDCA_VALID (1 << MAXCHF0_MUEDCA_VALID_SHIFT) |
| /* Bit 10 definition missing? */ |
| #define MAXCHF0_TWT_PKTSUPP_SHIFT 11u /* Enable pkt suppress outside TWT SP */ |
| #define MAXCHF0_TWT_PKTSUPP_EN (1 << MAXCHF0_TWT_PKTSUPP_SHIFT) |
| #define MAXCHF0_TBPPDU_STATUS_SHIFT 12u |
| #define MAXCHF0_TBPPDU_STATUS_EN (1 << MAXCHF0_TBPPDU_STATUS_SHIFT) |
| #define MAXCHF0_11AX_TXSTATUS_EXT_SHIFT 13u /* Enable 128 BA pkg in TX status */ |
| #define MAXCHF0_11AX_TXSTATUS_EXT_EN (1u << MAXCHF0_11AX_TXSTATUS_EXT_SHIFT) |
| #define MAXCHF1_11AX_TXSTATUS_EXT_SHIFT 0u /* Enable 256 BA pkg in TX status */ |
| #define MAXCHF1_11AX_TXSTATUS_EXT_EN (1u << MAXCHF1_11AX_TXSTATUS_EXT_SHIFT) |
| /* Bit 14 for UORA_EN */ |
| #define MAXCHF0_11AX_UORA_SHIFT 14u /* Enable UORA support */ |
| #define MAXCHF0_11AX_UORA_EN (1u << MAXCHF0_11AX_UORA_SHIFT) |
| |
| /* M_AXC_HOST_FLAGS1 */ |
| #define MAXCHF1_ITXSTATUS_EN 0x0004u /* Enable intermediate txs for TB PPDU */ |
| #define MAXCHF1_OBSSHWSTATS_EN 0x0008u /* Enable ucode OBSS stats monitoring */ |
| |
| /* M_SC_HOST_FLAGS */ |
| #define C_SCCX_STATS_EN 0x0001u /* Enable SC stats */ |
| #define C_SC_BTMC_COEX_EN 0x0002u /* Enable WLSC-BTMC coex */ |
| |
| /** Short version of receive frame status. Only used for non-last MSDU of AMSDU - rev61.1 */ |
| typedef struct d11rxhdrshort_rev61_1 d11rxhdrshort_rev61_1_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdrshort_rev61_1 { |
| uint16 RxFrameSize; /**< Actual byte length of the frame data received */ |
| |
| /* These two 8-bit fields remain in the same order regardless of |
| * processor byte order. |
| */ |
| uint8 dma_flags; /**< bit 0 indicates short or long rx status. 1 == short. */ |
| uint8 fifo; /**< rx fifo number */ |
| uint16 mrxs; /**< MAC Rx Status */ |
| uint16 RxFrameSize0; /**< rxframesize for fifo-0 (in bytes). */ |
| uint16 HdrConvSt; /**< hdr conversion status. Copy of ihr(RCV_HDR_CTLSTS). */ |
| uint16 RxTSFTimeL; /**< RxTSFTime time of first MAC symbol + M_PHY_PLCPRX_DLY */ |
| uint16 RxTSFTimeH; /**< RxTSFTime time of first MAC symbol + M_PHY_PLCPRX_DLY */ |
| uint16 aux_status; /**< DMA writes into this field. ucode treats as reserved. */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Short version of receive frame status. Only used for non-last MSDU of AMSDU - pre80 */ |
| typedef struct d11rxhdrshort_lt80 d11rxhdrshort_lt80_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdrshort_lt80 { |
| uint16 RxFrameSize; /**< Actual byte length of the frame data received */ |
| |
| /* These two 8-bit fields remain in the same order regardless of |
| * processor byte order. |
| */ |
| uint8 dma_flags; /**< bit 0 indicates short or long rx status. 1 == short. */ |
| uint8 fifo; /**< rx fifo number */ |
| uint16 mrxs; /**< MAC Rx Status */ |
| uint16 RxTSFTime; /**< RxTSFTime time of first MAC symbol + M_PHY_PLCPRX_DLY */ |
| uint16 HdrConvSt; /**< hdr conversion status. Copy of ihr(RCV_HDR_CTLSTS). */ |
| uint16 aux_status; /**< DMA writes into this field. ucode treats as reserved. */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* Errflag bits for ge80 */ |
| #define ERRFLAGS_ERR_STATE 0x0003u |
| #define ERRFLAGS_GREATER_MSDU_LEN 0x0001u |
| #define ERRFLAGS_AMSDU_TRUNCATED 0x0002u |
| #define ERRFLAGS_HDRCONV_MASK 0x00F0u |
| #define ERRFLAGS_HDRCONV_SHIFT 4u |
| #define ERRFLAGS_CSI_LEN_64K 0x0100u |
| #define ERRFLAGS_MESH_FMT_ERR 0x0200u |
| |
| /* Register 'D11_RXE_ERRVAL' bits for ge80 */ |
| #define RXEERR_GREATER_MSDU_LEN (1u << 6) |
| |
| /* 128 BA configuration */ |
| /* Register D11_TXBA_DataSel bits for ge80 */ |
| #define TXBA_DATASEL_WSIZE_BITMAP_LEN_ENC_SEL (1u << 0u) |
| |
| /* Register D11_TXBA_Data bits (ge80) */ |
| #define TXBA_DATA_WSIZE_256 (0x100u) |
| #define TXBA_DATA_WSIZE_128 (0x80u) |
| #define TXBA_DATA_WSIZE_64 (0x40u) |
| |
| /* HW optimisation to generate bitmap based on start SSN & max SSN */ |
| #define TXBA_DATA_HW_CONST (0xfu << 12) |
| |
| /* Register D11_RXE_BA_LEN bits (ge80) */ |
| #define RXE_BA_LEN_RXBA_64 (0x0u) |
| #define RXE_BA_LEN_RXBA_128 (0x1u) |
| #define RXE_BA_LEN_RXBA_256 (0x2u) |
| #define RXE_BA_LEN_TID0_SHIFT (0u) |
| #define RXE_BA_LEN_TID1_SHIFT (2u) |
| #define RXE_BA_LEN_TID2_SHIFT (4u) |
| #define RXE_BA_LEN_TID3_SHIFT (6u) |
| #define RXE_BA_LEN_TID4_SHIFT (8u) |
| #define RXE_BA_LEN_TID5_SHIFT (10u) |
| #define RXE_BA_LEN_TID6_SHIFT (12u) |
| #define RXE_BA_LEN_TID7_SHIFT (14u) |
| |
| /* Register D11_RXE_BA_LEN_ENC bits (ge80) */ |
| #define RXE_BA_LEN_ENC_BA32_VAL (0x3u << 0u) |
| #define RXE_BA_LEN_ENC_BA64_VAL (0x0u << 2u) |
| #define RXE_BA_LEN_ENC_BA128_VAL (0x1u << 4u) |
| #define RXE_BA_LEN_ENC_BA256_VAL (0x2u << 6u) |
| |
| /* Register D11_RXE_TXBA_CTL2 (ge80) */ |
| #define RXE_TXBA_CTL2_CONIG_SINGLE_TID (0x0u << 0u) |
| #define RXE_TXBA_CTL2_CONIG_ALL_TID (0x1u << 0u) |
| #define RXE_TXBA_CTL2_SEL_TID0 (0x0u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID1 (0x1u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID2 (0x2u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID3 (0x3u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID4 (0x4u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID5 (0x5u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID6 (0x6u << 12u) |
| #define RXE_TXBA_CTL2_SEL_TID7 (0x7u << 12u) |
| |
| /** |
| * Special Notes |
| * #1: dma_flags, fifo |
| * These two 8-bit fields remain in the same order regardless of |
| * processor byte order. |
| * #2: pktclass |
| * 16 bit bitmap is a result of Packet (or Flow ) Classification. |
| * |
| * 0 : Flow ID Different |
| * 1,2,3 : A1, A2, A3 Different |
| * 4 : TID Different |
| * 5, 6 : DA, SA from AMSDU SubFrame Different |
| * 7 : FC Different |
| * 8 : AMPDU boundary |
| * 9 - 15 : Reserved |
| * #3: errflags |
| * These bits indicate specific errors detected by the HW on the Rx Path. |
| * However, these will be relevant for Last MSDU Status only. |
| * |
| * Whenever there is an error at any MSDU, HW treats it as last |
| * MSDU and send out last MSDU status. |
| */ |
| |
| #define D11RXHDR_HW_STATUS_GE80 \ |
| uint16 RxFrameSize; /**< Actual byte length of the frame data received */ \ |
| /* For comments see special note #1 above */\ |
| uint8 dma_flags; /**< bit 0 indicates short or long rx status. 1 == short. */ \ |
| uint8 fifo; /**< rx fifo number */ \ |
| \ |
| uint16 mrxs; /**< MAC Rx Status */ \ |
| uint16 RxFrameSize0; /**< rxframesize for fifo-0 (in bytes). */ \ |
| uint16 HdrConvSt; /**< hdr conversion status. Copy of ihr(RCV_HDR_CTLSTS). */ \ |
| uint16 pktclass; \ |
| uint32 filtermap; /**< 32 bit bitmap indicates which "Filters" have matched. */ \ |
| /* For comments see special note #2 above */ \ |
| uint16 flowid; /**< result of Flow ID Look Up performed by the HW. */ \ |
| /* For comments see special note #3 above */\ |
| uint16 errflags; |
| |
| #define D11RXHDR_UCODE_STATUS_GE80 \ |
| /**< Ucode Generated Status (16 Bytes) */ \ |
| uint16 RxStatus1; /**< MAC Rx Status */ \ |
| uint16 RxStatus2; /**< extended MAC Rx status */ \ |
| uint16 RxChan; /**< Rx channel info or chanspec */ \ |
| uint16 AvbRxTimeL; /**< AVB RX timestamp low16 */ \ |
| uint16 AvbRxTimeH; /**< AVB RX timestamp high16 */ \ |
| uint16 RxTSFTime; /**< Lower 16 bits of Rx timestamp */ \ |
| uint16 RxTsfTimeH; /**< Higher 16 bits of Rx timestamp */ \ |
| uint16 MuRate; /**< MU rate info (bit3:0 MCS, bit6:4 NSTS) */ |
| |
| #define D11RXHDR_HW_STATUS_GE87_1 /**< HW Generated 24 bytes RX Status */ \ |
| D11RXHDR_HW_STATUS_GE80 /**< First 20 bytes are same as mac rev >= 80 */ \ |
| uint16 roe_hw_sts; /**< ROE HW status */ \ |
| uint16 roe_err_flags; /**< ROE error flags */ |
| |
| #define D11RXHDR_UCODE_STATUS_GE87_1 /**< Ucode Generated Status (22 Bytes) */ \ |
| uint16 RxStatus1; /**< MAC Rx Status */ \ |
| uint16 RxStatus2; /**< extended MAC Rx status */ \ |
| uint16 RxChan; /**< Rx channel info or chanspec */ \ |
| uint16 MuRate; /**< MU rate info (bit3:0 MCS, bit6:4 NSTS) */ \ |
| uint32 AVBRxTime; /**< 32 bit AVB timestamp */ \ |
| uint32 TSFRxTime; /**< 32 bit TSF timestamp */ \ |
| uint64 PTMRxTime; /**< 64 bit PTM timestamp */ |
| |
| /**< HW Generated Status (20 Bytes) */ |
| /** Short version of receive frame status. Only used for non-last MSDU of AMSDU - rev80 */ |
| typedef struct d11rxhdrshort_ge87_1 d11rxhdrshort_ge87_1_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdrshort_ge87_1 { |
| |
| D11RXHDR_HW_STATUS_GE87_1 |
| |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Mid version of receive frame status. Only used for MPDU of AMPDU - rev80 */ |
| typedef struct d11rxhdrmid_ge87_1 d11rxhdrmid_ge87_1_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdrmid_ge87_1 { |
| |
| D11RXHDR_HW_STATUS_GE87_1 |
| D11RXHDR_UCODE_STATUS_GE87_1 |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Short version of receive frame status. Only used for non-last MSDU of AMSDU - rev80 */ |
| typedef struct d11rxhdrshort_ge80 d11rxhdrshort_ge80_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdrshort_ge80 { |
| |
| D11RXHDR_HW_STATUS_GE80 |
| |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Mid version of receive frame status. Only used for MPDU of AMPDU - rev80 */ |
| typedef struct d11rxhdrmid_ge80 d11rxhdrmid_ge80_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdrmid_ge80 { |
| |
| D11RXHDR_HW_STATUS_GE80 |
| D11RXHDR_UCODE_STATUS_GE80 |
| |
| } BWL_POST_PACKED_STRUCT; |
| |
| /** Receive Frame Data Header - pre80 */ |
| typedef struct d11rxhdr_lt80 d11rxhdr_lt80_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdr_lt80 { |
| uint16 RxFrameSize; /**< Actual byte length of the frame data received */ |
| |
| /** |
| * These two 8-bit fields remain in the same order regardless of |
| * processor byte order. |
| */ |
| uint8 dma_flags; /* bit 0 indicates short or long rx status. 1 == short. */ |
| uint8 fifo; /* rx fifo number */ |
| |
| uint16 PhyRxStatus_0; /**< PhyRxStatus 15:0 */ |
| uint16 PhyRxStatus_1; /**< PhyRxStatus 31:16 */ |
| uint16 PhyRxStatus_2; /**< PhyRxStatus 47:32 */ |
| uint16 PhyRxStatus_3; /**< PhyRxStatus 63:48 */ |
| uint16 PhyRxStatus_4; /**< PhyRxStatus 79:64 */ |
| uint16 PhyRxStatus_5; /**< PhyRxStatus 95:80 */ |
| uint16 RxStatus1; /**< MAC Rx Status */ |
| uint16 RxStatus2; /**< extended MAC Rx status */ |
| |
| /** |
| * - RxTSFTime time of first MAC symbol + M_PHY_PLCPRX_DLY |
| */ |
| uint16 RxTSFTime; |
| |
| uint16 RxChan; /**< Rx channel info or chanspec */ |
| uint16 RxFrameSize0; /**< size of rx-frame in fifo-0 in case frame is copied to fifo-1 */ |
| uint16 HdrConvSt; /**< hdr conversion status. Copy of ihr(RCV_HDR_CTLSTS). */ |
| uint16 AvbRxTimeL; /**< AVB RX timestamp low16 */ |
| uint16 AvbRxTimeH; /**< AVB RX timestamp high16 */ |
| uint16 MuRate; /**< MU rate info (bit3:0 MCS, bit6:4 NSTS) */ |
| /** |
| * These bits indicate specific errors detected by the HW on the Rx Path. |
| * However, these will be relevant for Last MSDU Status only. |
| * |
| * Whenever there is an error at any MSDU, HW treats it as last |
| * MSDU and send out last MSDU status. |
| */ |
| uint16 errflags; |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define N_PRXS_GE80 16 /* Total number of PhyRx status words for corerev >= 80 */ |
| #define N_PRXS_LT80 6 /* Total number of PhyRx status words for corerev < 80 */ |
| |
| /* number of PhyRx status words newly added for (corerev >= 80) */ |
| #define N_PRXS_REM_GE80 (N_PRXS_GE80 - N_PRXS_LT80) |
| |
| /** RX Hdr definition - rev80 */ |
| typedef struct d11rxhdr_ge80 d11rxhdr_ge80_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdr_ge80 { |
| /** |
| * Even though rxhdr can be in short or long format, always declare it here |
| * to be in long format. So the offsets for the other fields are always the same. |
| */ |
| |
| /**< HW Generated Status (20 Bytes) */ |
| D11RXHDR_HW_STATUS_GE80 |
| D11RXHDR_UCODE_STATUS_GE80 |
| |
| /**< PHY Generated Status (32 Bytes) */ |
| uint16 PhyRxStatus_0; /**< PhyRxStatus 15:0 */ |
| uint16 PhyRxStatus_1; /**< PhyRxStatus 31:16 */ |
| uint16 PhyRxStatus_2; /**< PhyRxStatus 47:32 */ |
| uint16 PhyRxStatus_3; /**< PhyRxStatus 63:48 */ |
| uint16 PhyRxStatus_4; /**< PhyRxStatus 79:64 */ |
| uint16 PhyRxStatus_5; /**< PhyRxStatus 95:80 */ |
| uint16 phyrxs_rem[N_PRXS_REM_GE80]; /**< 20 bytes of remaining prxs (corerev >= 80) */ |
| /* Currently only 6 words are being pushed out of uCode: 6, 9, 16, 17, 21, 23 */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| #define N_PRXS_GE85 32u // total number of PhyRxStatus BYTEs for rev >= 85 |
| |
| typedef struct d11rxhdr_ge87_1 d11rxhdr_ge87_1_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdr_ge87_1 { |
| /** |
| * Even though rxhdr can be in short or long format, always declare it here |
| * to be in long format. So the offsets for the other fields are always the same. |
| */ |
| |
| D11RXHDR_HW_STATUS_GE87_1 /**< HW Generated Status (24 Bytes) */ |
| D11RXHDR_UCODE_STATUS_GE87_1 /**< uCode Generated Status (24 Bytes) */ |
| uint8 PHYRXSTATUS[N_PRXS_GE85]; /**< PHY Generated Status (32 Bytes) */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* A wrapper structure for all versions of d11rxh short structures */ |
| typedef struct d11rxhdr_ge85 d11rxhdr_ge85_t; |
| BWL_PRE_PACKED_STRUCT struct d11rxhdr_ge85 { |
| /** |
| * Even though rxhdr can be in short or long format, always declare it here |
| * to be in long format. So the offsets for the other fields are always the same. |
| */ |
| |
| /**< HW Generated Status (20 Bytes) */ |
| D11RXHDR_HW_STATUS_GE80 |
| D11RXHDR_UCODE_STATUS_GE80 |
| |
| /**< PHY Generated Status (32 Bytes) */ |
| uint8 PHYRXSTATUS[N_PRXS_GE85]; |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* A wrapper structure for all versions of d11rxh short structures */ |
| typedef union d11rxhdrshort { |
| d11rxhdrshort_rev61_1_t rev61_1; |
| d11rxhdrshort_lt80_t lt80; |
| d11rxhdrshort_ge80_t ge80; |
| d11rxhdrshort_ge87_1_t ge87_1; |
| } d11rxhdrshort_t; |
| |
| /* A wrapper structure for all versions of d11rxh mid structures */ |
| typedef union d11rxhdrmid { |
| d11rxhdrmid_ge80_t ge80; |
| d11rxhdrmid_ge87_1_t ge87_1; |
| } d11rxhdrmid_t; |
| |
| /* A wrapper structure for all versions of d11rxh structures */ |
| typedef union d11rxhdr { |
| d11rxhdr_lt80_t lt80; |
| d11rxhdr_ge80_t ge80; |
| d11rxhdr_ge85_t ge85; |
| d11rxhdr_ge87_1_t ge87_1; |
| } d11rxhdr_t; |
| |
| #define D11RXHDRSHORT_GE87_1_ACCESS_REF(srxh, member) \ |
| (&((((d11rxhdrshort_t *)(srxh))->ge87_1).member)) |
| |
| #define D11RXHDRMID_GE87_1_ACCESS_REF(mrxh, member) \ |
| (&((((d11rxhdrmid_t *)(mrxh))->ge87_1).member)) |
| |
| #define D11RXHDRSHORT_GE87_1_ACCESS_VAL(srxh, member) \ |
| ((((d11rxhdrshort_t *)(srxh))->ge87_1).member) |
| |
| #define D11RXHDRMID_GE87_1_ACCESS_VAL(mrxh, member) \ |
| ((((d11rxhdrmid_t *)(mrxh))->ge87_1).member) |
| |
| #define D11RXHDR_GE87_1_ACCESS_REF(rxh, member) \ |
| (&((rxh)->ge87_1).member) |
| |
| #define D11RXHDR_GE87_1_ACCESS_VAL(rxh, member) \ |
| (((rxh)->ge87_1).member) |
| |
| #define D11RXHDR_GE87_1_SET_VAL(rxh, member, value) \ |
| (((rxh)->ge87_1).member = value) |
| |
| #define D11RXHDRSHORT_GE80_ACCESS_REF(srxh, member) \ |
| (&((((d11rxhdrshort_t *)(srxh))->ge80).member)) |
| |
| #define D11RXHDRMID_GE80_ACCESS_REF(mrxh, member) \ |
| (&((((d11rxhdrmid_t *)(mrxh))->ge80).member)) |
| |
| #define D11RXHDRSHORT_LT80_ACCESS_REF(srxh, member) \ |
| (&((((d11rxhdrshort_t *)(srxh))->lt80).member)) |
| |
| #define D11RXHDRSHORT_GE80_ACCESS_VAL(srxh, member) \ |
| ((((d11rxhdrshort_t *)(srxh))->ge80).member) |
| |
| #define D11RXHDRMID_GE80_ACCESS_VAL(mrxh, member) \ |
| ((((d11rxhdrmid_t *)(mrxh))->ge80).member) |
| |
| #define D11RXHDRSHORT_LT80_ACCESS_VAL(srxh, member) \ |
| ((((d11rxhdrshort_t *)(srxh))->lt80).member) |
| |
| #define D11RXHDR_GE80_ACCESS_REF(rxh, member) \ |
| (&((rxh)->ge80).member) |
| |
| #define D11RXHDR_LT80_ACCESS_REF(rxh, member) \ |
| (&((rxh)->lt80).member) |
| |
| #define D11RXHDR_GE80_ACCESS_VAL(rxh, member) \ |
| (((rxh)->ge80).member) |
| |
| #define D11RXHDR_GE80_SET_VAL(rxh, member, value) \ |
| (((rxh)->ge80).member = value) |
| |
| #define D11RXHDR_LT80_ACCESS_VAL(rxh, member) \ |
| (((rxh)->lt80).member) |
| |
| #define D11RXHDR_LT80_SET_VAL(rxh, member, value) \ |
| (((rxh)->lt80).member = value) |
| |
| /** For accessing members of d11rxhdrshort_t by reference (address of members) */ |
| #define D11RXHDRSHORT_ACCESS_REF(srxh, corerev, corerev_minor, member) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDRSHORT_GE87_1_ACCESS_REF(srxh, member) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDRSHORT_GE80_ACCESS_REF(srxh, member) : \ |
| D11RXHDRSHORT_LT80_ACCESS_REF(srxh, member)) |
| |
| /** For accessing members of d11rxhdrshort_t by value (only value stored inside members accessed) */ |
| #define D11RXHDRSHORT_ACCESS_VAL(srxh, corerev, corerev_minor, member) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDRSHORT_GE87_1_ACCESS_VAL(srxh, member) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDRSHORT_GE80_ACCESS_VAL(srxh, member) : \ |
| D11RXHDRSHORT_LT80_ACCESS_VAL(srxh, member)) |
| |
| /** For accessing members of d11rxhdrmid_t by reference (address of members) */ |
| #define D11RXHDRMID_ACCESS_REF(mrxh, corerev, corerev_minor, member) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDRMID_GE87_1_ACCESS_REF(mrxh, member) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDRMID_GE80_ACCESS_REF(mrxh, member) : NULL) |
| |
| /** For accessing members of d11rxhdrmid_t by value (only value stored inside members accessed) */ |
| #define D11RXHDRMID_ACCESS_VAL(mrxh, corerev, corerev_minor, member) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDRMID_GE87_1_ACCESS_VAL(mrxh, member) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDRMID_GE80_ACCESS_VAL(mrxh, member) : NULL) |
| |
| /** For accessing members of d11rxhdr_t by reference (address of members) */ |
| #define D11RXHDR_ACCESS_REF(rxh, corerev, corerev_minor, member) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_REF(rxh, member) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDR_GE80_ACCESS_REF(rxh, member) : \ |
| D11RXHDR_LT80_ACCESS_REF(rxh, member)) |
| |
| /** For accessing members of d11rxhdr_t by value (only value stored inside members accessed) */ |
| #define D11RXHDR_ACCESS_VAL(rxh, corerev, corerev_minor, member) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, member) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, member) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, member)) |
| |
| /** For accessing members of d11rxhdr_t by value (only value stored inside members accessed) */ |
| #define D11RXHDR_SET_VAL(rxh, corerev, corerev_minor, member, value) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_SET_VAL(rxh, member, value) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDR_GE80_SET_VAL(rxh, member, value) : \ |
| D11RXHDR_LT80_SET_VAL(rxh, member, value)) |
| |
| #define D11RXHDR_PTM(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, PTMRxTime) : 0) |
| |
| #define D11RXHDR_AVB(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| (uint32)D11RXHDR_GE87_1_ACCESS_VAL(rxh, AVBRxTime) : \ |
| D11REV_GE(corerev, 80) ? ((uint32)D11RXHDR_GE80_ACCESS_VAL(rxh, AvbRxTimeL) | \ |
| ((uint32)D11RXHDR_GE80_ACCESS_VAL(rxh, AvbRxTimeH) << 16u)) : \ |
| ((uint32)D11RXHDR_LT80_ACCESS_VAL(rxh, AvbRxTimeL) | \ |
| ((uint32)D11RXHDR_LT80_ACCESS_VAL(rxh, AvbRxTimeH) << 16u))) |
| |
| #define D11RXHDR_TSF_REF(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_REF(rxh, TSFRxTime) : \ |
| D11REV_GE(corerev, 80) ? (uint32*)D11RXHDR_GE80_ACCESS_REF(rxh, RxTSFTime) : \ |
| (uint32*)D11RXHDR_LT80_ACCESS_REF(rxh, RxTSFTime)) |
| |
| #define D11RXHDR_TSF(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, TSFRxTime) : \ |
| D11REV_GE(corerev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, RxTSFTime) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, RxTSFTime)) |
| |
| #define RXS_SHORT_ENAB(rev) (D11REV_GE(rev, 64) || \ |
| D11REV_IS(rev, 60) || \ |
| D11REV_IS(rev, 62)) |
| |
| #define RXS_MID_ENAB(rev) (D11REV_GE(rev, 80)) |
| #define RXS_LONG_ENAB(rev) (D11REV_GE(rev, 80)) |
| |
| #define IS_D11RXHDRSHORT(rxh, rev, rev_min) ((RXS_SHORT_ENAB(rev) && \ |
| ((D11RXHDR_ACCESS_VAL((rxh), (rev), (rev_min), dma_flags)) & RXS_SHORT_MASK)) != 0) |
| |
| #define IS_D11RXHDRMID(rxh, rev, rev_min) ((RXS_MID_ENAB(rev) && \ |
| ((D11RXHDR_ACCESS_VAL((rxh), (rev), (rev_min), dma_flags)) == 0))) |
| |
| #define IS_D11RXHDRLONG(rxh, rev, rev_min) \ |
| ((!(IS_D11RXHDRSHORT((rxh), (rev), (rev_min)))) && \ |
| (!(IS_D11RXHDRMID((rxh), (rev), (rev_min))))) |
| |
| #define D11RXHDR_HAS_UCODE_STATUS(rxhdr, corerev, corerev_minor) \ |
| ((!IS_D11RXHDRSHORT((rxhdr), (corerev), (corerev_minor))) || \ |
| (IS_D11RXHDRMID((rxhdr), (corerev), (corerev_minor)))) |
| |
| #define IS_PHYRXHDR_VALID(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| (D11RXHDR_GE87_1_ACCESS_VAL(rxh, dma_flags) == RXS_PHYRXST_VALID_REV_GE80) : \ |
| D11REV_GE(corerev, 80) ? \ |
| (D11RXHDR_GE80_ACCESS_VAL(rxh, dma_flags) == RXS_PHYRXST_VALID_REV_GE80) : \ |
| (D11RXHDR_LT80_ACCESS_VAL(rxh, RxStatus2) & RXS_PHYRXST_VALID)) |
| |
| #define RXHDR_GET_PAD_LEN(rxh, corerev, corerev_minor) (D11REV_GE(corerev, 80) ? \ |
| ((((D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, mrxs) : \ |
| D11RXHDR_GE80_ACCESS_VAL(rxh, mrxs)) & RXSS_PBPRES) != 0) ? HDRCONV_PAD : 0) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| (((D11RXHDRSHORT_ACCESS_VAL(rxh, corerev, corerev_minor, mrxs) & \ |
| RXSS_PBPRES) != 0) ? HDRCONV_PAD : 0) : \ |
| (((D11RXHDR_LT80_ACCESS_VAL(rxh, RxStatus1) & RXS_PBPRES) != 0) ? HDRCONV_PAD : 0))) |
| |
| #define RXHDR_GET_PAD_PRES(rxh, corerev, corerev_minor) (D11REV_GE(corerev, 80) ? \ |
| (((D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, mrxs) : \ |
| D11RXHDR_GE80_ACCESS_VAL(rxh, mrxs)) & RXSS_PBPRES) != 0) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| ((D11RXHDRSHORT_ACCESS_VAL(rxh, corerev, corerev_minor, mrxs) & \ |
| RXSS_PBPRES) != 0) : \ |
| (((D11RXHDR_LT80_ACCESS_VAL(rxh, RxStatus1) & RXS_PBPRES) != 0)))) |
| |
| #define RXHDR_GET_CONV_TYPE(rxh, corerev, corerev_minor) \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| ((D11RXHDRSHORT_ACCESS_VAL(rxh, corerev, corerev_minor, \ |
| HdrConvSt) & HDRCONV_ETH_FRAME) != 0) : ((D11RXHDR_ACCESS_VAL(rxh, \ |
| corerev, corerev_minor, HdrConvSt) & HDRCONV_ETH_FRAME) != 0)) |
| |
| #define RXHDR_GET_ROE_ERR_STS(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| ((D11RXHDR_GE87_1_ACCESS_VAL(rxh, roe_err_flags))) : 0) |
| |
| #define RXHDR_GET_ROE_L3_TYPE(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| ((D11RXHDR_GE87_1_ACCESS_VAL(rxh, roe_hw_sts)) & ROE_L3_PROT_TYPE_MASK) : 0) |
| |
| #define RXHDR_GET_ROE_L4_TYPE(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| ((D11RXHDR_GE87_1_ACCESS_VAL(rxh, roe_hw_sts)) & ROE_L4_PROT_TYPE_MASK) : 0) |
| |
| #define RXHDR_GET_ROE_L3_STATUS(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| ((D11RXHDR_GE87_1_ACCESS_VAL(rxh, roe_hw_sts)) & ROE_L3_CHKSUM_STATUS_MASK) : 0) |
| |
| #define RXHDR_GET_ROE_L4_STATUS(rxh, corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| ((D11RXHDR_GE87_1_ACCESS_VAL(rxh, roe_hw_sts)) & ROE_L4_CHKSUM_STATUS_MASK) : 0) |
| |
| #define RXHDR_GET_AGG_TYPE(rxh, corerev, corerev_minor) \ |
| (D11REV_GE(corerev, 80) ? \ |
| (((D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, mrxs) : \ |
| D11RXHDR_GE80_ACCESS_VAL(rxh, mrxs)) & RXSS_AGGTYPE_MASK) >> RXSS_AGGTYPE_SHIFT) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| ((D11RXHDRSHORT_ACCESS_VAL(rxh, corerev, corerev_minor, mrxs) \ |
| & RXSS_AGGTYPE_MASK) >> RXSS_AGGTYPE_SHIFT) : \ |
| ((D11RXHDR_LT80_ACCESS_VAL(rxh, RxStatus2) & RXS_AGGTYPE_MASK) >> RXS_AGGTYPE_SHIFT))) |
| |
| #define RXHDR_GET_PBPRS_REF(rxh, corerev, corerev_minor) (D11REV_GE(corerev, 80) ? \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_REF(rxh, mrxs) : \ |
| D11RXHDR_GE80_ACCESS_REF(rxh, mrxs)) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| ((D11RXHDRSHORT_ACCESS_REF(rxh, corerev, corerev_minor, mrxs))) : \ |
| (D11RXHDR_LT80_ACCESS_REF(rxh, RxStatus1)))) |
| |
| #define RXHDR_GET_IS_DEFRAG(rxh, corerev, corerev_minor) (D11REV_GE(corerev, 80) ? \ |
| (D11RXHDR_ACCESS_VAL(rxh, corerev, corerev_minor, RxStatus1) & RXS_IS_DEFRAG) : 0) |
| |
| #define SET_RXHDR_PBPRS_REF_VAL(rxh, corerev, corerev_minor, val) \ |
| (D11REV_GE(corerev, 80) ? \ |
| (*val |= RXSS_PBPRES) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? (*val |= RXSS_PBPRES) : \ |
| (*val |= RXS_PBPRES))) |
| |
| #define CLEAR_RXHDR_PBPRS_REF_VAL(rxh, corerev, corerev_minor, val) \ |
| (D11REV_GE(corerev, 80) ? \ |
| (*val &= ~RXSS_PBPRES) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? (*val &= ~RXSS_PBPRES) : \ |
| (*val &= ~RXS_PBPRES))) |
| |
| #define RXHDR_GET_AMSDU(rxh, corerev, corerev_minor) (D11REV_GE(corerev, 80) ? \ |
| (((D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, mrxs) : \ |
| D11RXHDR_GE80_ACCESS_VAL(rxh, mrxs)) & RXSS_AMSDU_MASK) != 0) : \ |
| (IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| ((D11RXHDRSHORT_ACCESS_VAL(rxh, corerev, corerev_minor, \ |
| mrxs) & RXSS_AMSDU_MASK) != 0) : \ |
| ((D11RXHDR_LT80_ACCESS_VAL(rxh, RxStatus2) & RXS_AMSDU_MASK) != 0))) |
| |
| #ifdef BCMDBG |
| #define RXHDR_GET_MSDU_COUNT(rxh, corerev, corerev_minor) (D11REV_GE(corerev, 80) ? \ |
| (((D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? \ |
| D11RXHDR_GE87_1_ACCESS_VAL(rxh, mrxs) : \ |
| D11RXHDR_GE80_ACCESS_VAL(rxh, mrxs)) & RXSS_MSDU_CNT_MASK) >> RXSS_MSDU_CNT_SHIFT) : \ |
| IS_D11RXHDRSHORT(rxh, corerev, corerev_minor) ? \ |
| (((D11RXHDRSHORT_ACCESS_VAL(rxh, corerev, corerev_minor, mrxs)) & \ |
| RXSS_MSDU_CNT_MASK) >> RXSS_MSDU_CNT_SHIFT) : 0) |
| |
| #endif /* BCMDBG */ |
| |
| /** Length of HW RX status in RxStatus */ |
| #define HW_RXHDR_LEN_REV_GE87_1 (sizeof(d11rxhdrshort_ge87_1_t)) /* 24 bytes */ |
| #define HW_RXHDR_LEN_REV_GE80 (sizeof(d11rxhdrshort_ge80_t)) /* 20 bytes */ |
| #define HW_RXHDR_LEN_REV_LT80 (sizeof(d11rxhdrshort_lt80_t)) /* 12 bytes */ |
| #define HW_RXHDR_LEN_REV_61_1 (sizeof(d11rxhdrshort_rev61_1_t)) /* 16 bytes */ |
| |
| /** Length of HW RX status + ucode Rx status in RxStatus */ |
| #define MID_RXHDR_LEN_REV_GE87_1 (sizeof(d11rxhdrmid_ge87_1_t)) /* 48 bytes */ |
| #define MID_RXHDR_LEN_REV_GE80 (sizeof(d11rxhdrmid_ge80_t)) /* 36 bytes */ |
| |
| /** Length of HW RX status + ucode RX status + PHY RX status + padding(if need align) */ |
| #define D11_RXHDR_LEN_REV_GE87_1 (sizeof(d11rxhdr_ge87_1_t)) /* 80 bytes */ |
| #define D11_RXHDR_LEN_REV_GE80 (sizeof(d11rxhdr_ge80_t)) /* 68 bytes */ |
| #define D11_RXHDR_LEN_REV_LT80 (sizeof(d11rxhdr_lt80_t)) /* 36 bytes */ |
| |
| #define HW_RXHDR_LEN(corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? HW_RXHDR_LEN_REV_GE87_1 : \ |
| D11REV_GE(corerev, 80) ? HW_RXHDR_LEN_REV_GE80 : HW_RXHDR_LEN_REV_LT80) |
| |
| #define MID_RXHDR_LEN(corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? MID_RXHDR_LEN_REV_GE87_1 : \ |
| D11REV_GE(corerev, 80) ? \ |
| MID_RXHDR_LEN_REV_GE80 : NULL) |
| |
| #define D11_RXHDR_LEN(corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? D11_RXHDR_LEN_REV_GE87_1 : \ |
| D11REV_GE(corerev, 80) ? D11_RXHDR_LEN_REV_GE80 : \ |
| D11_RXHDR_LEN_REV_LT80) |
| |
| #define FRAMELEN(corerev, corerev_minor, rxh) \ |
| D11RXHDR_ACCESS_VAL(rxh, corerev, corerev_minor, RxFrameSize) |
| |
| #define RXS_SHORT_MASK 0x01 /**< Short vs full rx status in dma_flags field of d11rxhdr */ |
| |
| /** validate chip specific phychain info for MCSSQ snr. |
| * should sync with uCode reporting. |
| * please add a condition with decending order to avoid any wrong skip |
| * Note: this macro can be removed once NEWT no longer needs 4368a0. |
| */ |
| #define IS_MCSSQ_ANT3_VALID_GE80(corerev, corerev_minor) \ |
| (D11REV_IS(corerev, 83) && (D11MINORREV_IS(corerev_minor, 1))) |
| |
| /* Header conversion status register bit fields */ |
| #define HDRCONV_USR_ENAB 0x0001 |
| #define HDRCONV_ENAB 0x0100 |
| #define HDRCONV_ETH_FRAME 0x0200 |
| #define HDRCONV_STATUS_VALID 0x8000 |
| |
| #define ROE_L3_PROT_TYPE_IPV4 (0x10u) |
| #define ROE_L3_PROT_TYPE_IPV6 (0x20u) |
| #define ROE_L3_PROT_TYPE_MASK (0x30u) |
| #define ROE_L3_PROT_TYPE_SHIFT (4u) |
| |
| #define ROE_L4_PROT_TYPE_TCP (0x40u) |
| #define ROE_L4_PROT_TYPE_UDP (0x80u) |
| #define ROE_L4_PROT_TYPE_MASK (0xC0u) |
| #define ROE_L4_PROT_TYPE_SHIFT (6u) |
| |
| #define ROE_L3_CHKSUM_STATUS_FAIL (0x100u) |
| #define ROE_L3_CHKSUM_STATUS_SUCCESS (0x200u) |
| #define ROE_L3_CHKSUM_STATUS_MASK (0x300u) |
| #define ROE_L3_CHKSUM_STATUS_SHIFT (8u) |
| |
| #define ROE_L4_CHKSUM_STATUS_FAIL (0x400u) |
| #define ROE_L4_CHKSUM_STATUS_SUCCESS (0x800u) |
| #define ROE_L4_CHKSUM_STATUS_MASK (0xC00u) |
| #define ROE_L4_CHKSUM_STATUS_SHIFT (10u) |
| |
| /** NOTE: Due to precommit issue, _d11_autophyrxsts_ will be moved |
| * to a separated file when 4387 trunk build is stable |
| */ |
| #ifndef _d11_autophyrxsts_ |
| #define _d11_autophyrxsts_ |
| |
| #define APRXS_WD0_L_EN_GE85 1u |
| #define APRXS_WD0_H_EN_GE85 1u |
| #define APRXS_WD1_L_EN_GE85 1u |
| #define APRXS_WD1_H_EN_GE85 1u |
| #define APRXS_WD2_L_EN_GE85 1u |
| #define APRXS_WD2_H_EN_GE85 1u |
| #define APRXS_WD3_L_EN_GE85 1u |
| #define APRXS_WD3_H_EN_GE85 0u // DO NOT ENABLE WD3_H |
| #define APRXS_WD4_L_EN_GE85 1u |
| #define APRXS_WD4_H_EN_GE85 1u |
| #define APRXS_WD5_L_EN_GE85 1u |
| #define APRXS_WD5_H_EN_GE85 1u |
| #define APRXS_WD6_L_EN_GE85 0u |
| #define APRXS_WD6_H_EN_GE85 0u |
| #define APRXS_WD7_L_EN_GE85 0u |
| #define APRXS_WD7_H_EN_GE85 0u |
| #define APRXS_WD8_L_EN_GE85 0u |
| #define APRXS_WD8_H_EN_GE85 1u |
| #define APRXS_WD9_L_EN_GE85 0u |
| #define APRXS_WD9_H_EN_GE85 0u |
| #define APRXS_WD10_L_EN_GE85 0u |
| #define APRXS_WD10_H_EN_GE85 0u |
| #define APRXS_WD11_L_EN_GE85 0u |
| #define APRXS_WD11_H_EN_GE85 0u |
| #define APRXS_WD12_L_EN_GE85 0u |
| #define APRXS_WD12_H_EN_GE85 0u |
| #define APRXS_WD13_L_EN_GE85 0u |
| #define APRXS_WD13_H_EN_GE85 0u |
| #define APRXS_WD14_L_EN_GE85 0u |
| #define APRXS_WD14_H_EN_GE85 0u |
| #define APRXS_WD15_L_EN_GE85 0u |
| #define APRXS_WD15_H_EN_GE85 0u |
| #define APRXS_WD16_L_EN_GE85 1u |
| #define APRXS_WD16_H_EN_GE85 0u |
| #define APRXS_WD17_L_EN_GE85 0u |
| #define APRXS_WD17_H_EN_GE85 0u |
| #define APRXS_WD18_L_EN_GE85 1u |
| #define APRXS_WD18_H_EN_GE85 0u |
| #define APRXS_WD19_L_EN_GE85 0u |
| #define APRXS_WD19_H_EN_GE85 0u |
| #define APRXS_WD20_L_EN_GE85 1u |
| #define APRXS_WD20_H_EN_GE85 1u |
| #define APRXS_WD21_L_EN_GE85 0u |
| #define APRXS_WD21_H_EN_GE85 1u |
| #define APRXS_WD22_L_EN_GE85 1u |
| #define APRXS_WD22_H_EN_GE85 1u |
| #define APRXS_WD23_L_EN_GE85 1u |
| #define APRXS_WD23_H_EN_GE85 1u |
| #define APRXS_WD24_L_EN_GE85 0u |
| #define APRXS_WD24_H_EN_GE85 0u |
| #define APRXS_WD25_L_EN_GE85 0u |
| #define APRXS_WD25_H_EN_GE85 0u |
| |
| enum { |
| APRXS_WD0_L_SHIFT = 0, // frameType, unsupportedRate, band, lostCRS, shortPreamble |
| APRXS_WD0_H_SHIFT, // PLCPViolation, MFCRSFired, ACCRSFired, MUPPDU, OBSSStat |
| APRXS_WD1_L_SHIFT, // coremask, antcfg, |
| APRXS_WD1_H_SHIFT, // BWclassification |
| APRXS_WD2_L_SHIFT, // RxPwrAnt0 |
| APRXS_WD2_H_SHIFT, // RxPwrAnt1 |
| APRXS_WD3_L_SHIFT, // RxPwrAnt2 |
| APRXS_WD3_H_SHIFT, // RxPwrAnt3, OCL |
| APRXS_WD4_L_SHIFT, // RSSI factional bit |
| APRXS_WD4_H_SHIFT, // AGC type, ACI mitigation state, ClipCount, DynBWInNonHT |
| APRXS_WD5_L_SHIFT, // MCSSQSNRCore0 |
| APRXS_WD5_H_SHIFT, // MCSSQSNRCore1 |
| APRXS_WD6_L_SHIFT, // MCSSQSNRCore2 |
| APRXS_WD6_H_SHIFT, // MCSSQSNRCore3, OCL 1 |
| APRXS_WD7_L_SHIFT, // MUIntProcessType, |
| APRXS_WD7_H_SHIFT, // coarse freq_offset, packet abort |
| APRXS_WD8_L_SHIFT = 0, // fine freq offset |
| APRXS_WD8_H_SHIFT, // ChBWInNonHT, MLUsed, SINRBasedACIDet |
| APRXS_WD9_L_SHIFT, // SpatialSQCnt |
| APRXS_WD9_H_SHIFT, // packet gain |
| APRXS_WD10_L_SHIFT, // RxPwrAntExt |
| APRXS_WD10_H_SHIFT, // coarse freq_offset of 2nd 80mhz |
| APRXS_WD11_L_SHIFT, // fine freq_offset of 2nd 80mhz |
| APRXS_WD11_H_SHIFT, |
| APRXS_WD12_L_SHIFT, |
| APRXS_WD12_H_SHIFT, |
| APRXS_WD13_L_SHIFT, |
| APRXS_WD13_H_SHIFT, |
| APRXS_WD14_L_SHIFT, |
| APRXS_WD14_H_SHIFT, |
| APRXS_WD15_L_SHIFT, |
| APRXS_WD15_H_SHIFT, |
| APRXS_WD16_L_SHIFT = 0, |
| APRXS_WD16_H_SHIFT, |
| APRXS_WD17_L_SHIFT, |
| APRXS_WD17_H_SHIFT, |
| APRXS_WD18_L_SHIFT, |
| APRXS_WD18_H_SHIFT, |
| APRXS_WD19_L_SHIFT, |
| APRXS_WD19_H_SHIFT, |
| APRXS_WD20_L_SHIFT, |
| APRXS_WD20_H_SHIFT, |
| APRXS_WD21_L_SHIFT, |
| APRXS_WD21_H_SHIFT, |
| APRXS_WD22_L_SHIFT, // STA ID |
| APRXS_WD22_H_SHIFT, // STA ID, NSTS, TXBF, DCM |
| APRXS_WD23_L_SHIFT, |
| APRXS_WD23_H_SHIFT, |
| APRXS_WD24_L_SHIFT = 0, |
| APRXS_WD24_H_SHIFT, |
| APRXS_WD25_L_SHIFT, |
| APRXS_WD25_H_SHIFT |
| }; |
| |
| #define APRXS_WD0_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD0_L_EN_GE85 : 0) |
| #define APRXS_WD0_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD0_H_EN_GE85 : 0) |
| #define APRXS_WD1_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD1_L_EN_GE85 : 0) |
| #define APRXS_WD1_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD1_H_EN_GE85 : 0) |
| #define APRXS_WD2_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD2_L_EN_GE85 : 0) |
| #define APRXS_WD2_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD2_H_EN_GE85 : 0) |
| #define APRXS_WD3_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD3_L_EN_GE85 : 0) |
| #define APRXS_WD3_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD3_H_EN_GE85 : 0) |
| #define APRXS_WD4_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD4_L_EN_GE85 : 0) |
| #define APRXS_WD4_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD4_H_EN_GE85 : 0) |
| #define APRXS_WD5_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD5_L_EN_GE85 : 0) |
| #define APRXS_WD5_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD5_H_EN_GE85 : 0) |
| #define APRXS_WD6_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD6_L_EN_GE85 : 0) |
| #define APRXS_WD6_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD6_H_EN_GE85 : 0) |
| #define APRXS_WD7_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD7_L_EN_GE85 : 0) |
| #define APRXS_WD7_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD7_H_EN_GE85 : 0) |
| #define APRXS_WD8_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD8_L_EN_GE85 : 0) |
| #define APRXS_WD8_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD8_H_EN_GE85 : 0) |
| #define APRXS_WD9_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD9_L_EN_GE85 : 0) |
| #define APRXS_WD9_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD9_H_EN_GE85 : 0) |
| #define APRXS_WD10_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD10_L_EN_GE85 : 0) |
| #define APRXS_WD10_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD10_H_EN_GE85 : 0) |
| #define APRXS_WD11_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD11_L_EN_GE85 : 0) |
| #define APRXS_WD11_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD11_H_EN_GE85 : 0) |
| #define APRXS_WD12_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD12_L_EN_GE85 : 0) |
| #define APRXS_WD12_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD12_H_EN_GE85 : 0) |
| #define APRXS_WD13_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD13_L_EN_GE85 : 0) |
| #define APRXS_WD13_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD13_H_EN_GE85 : 0) |
| #define APRXS_WD14_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD14_L_EN_GE85 : 0) |
| #define APRXS_WD14_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD14_H_EN_GE85 : 0) |
| #define APRXS_WD15_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD15_L_EN_GE85 : 0) |
| #define APRXS_WD15_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD15_H_EN_GE85 : 0) |
| #define APRXS_WD16_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD16_L_EN_GE85 : 0) |
| #define APRXS_WD16_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD16_H_EN_GE85 : 0) |
| #define APRXS_WD17_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD17_L_EN_GE85 : 0) |
| #define APRXS_WD17_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD17_H_EN_GE85 : 0) |
| #define APRXS_WD18_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD18_L_EN_GE85 : 0) |
| #define APRXS_WD18_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD18_H_EN_GE85 : 0) |
| #define APRXS_WD19_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD19_L_EN_GE85 : 0) |
| #define APRXS_WD19_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD19_H_EN_GE85 : 0) |
| #define APRXS_WD20_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD20_L_EN_GE85 : 0) |
| #define APRXS_WD20_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD20_H_EN_GE85 : 0) |
| #define APRXS_WD21_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD21_L_EN_GE85 : 0) |
| #define APRXS_WD21_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD21_H_EN_GE85 : 0) |
| #define APRXS_WD22_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD22_L_EN_GE85 : 0) |
| #define APRXS_WD22_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD22_H_EN_GE85 : 0) |
| #define APRXS_WD23_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD23_L_EN_GE85 : 0) |
| #define APRXS_WD23_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD23_H_EN_GE85 : 0) |
| #define APRXS_WD24_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD24_L_EN_GE85 : 0) |
| #define APRXS_WD24_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD24_H_EN_GE85 : 0) |
| #define APRXS_WD25_L_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD25_L_EN_GE85 : 0) |
| #define APRXS_WD25_H_EN(rev) ((D11REV_GE(rev, 85)) ? \ |
| APRXS_WD25_H_EN_GE85 : 0) |
| |
| #define APRXS_BMAP0(rev) ((APRXS_WD0_L_EN(rev) << APRXS_WD0_L_SHIFT) | \ |
| (APRXS_WD0_H_EN(rev) << APRXS_WD0_H_SHIFT) |\ |
| (APRXS_WD1_L_EN(rev) << APRXS_WD1_L_SHIFT) |\ |
| (APRXS_WD1_H_EN(rev) << APRXS_WD1_H_SHIFT) |\ |
| (APRXS_WD2_L_EN(rev) << APRXS_WD2_L_SHIFT) |\ |
| (APRXS_WD2_H_EN(rev) << APRXS_WD2_H_SHIFT) |\ |
| (APRXS_WD3_L_EN(rev) << APRXS_WD3_L_SHIFT) |\ |
| (APRXS_WD3_H_EN(rev) << APRXS_WD3_H_SHIFT) |\ |
| (APRXS_WD4_L_EN(rev) << APRXS_WD4_L_SHIFT) |\ |
| (APRXS_WD4_H_EN(rev) << APRXS_WD4_H_SHIFT) |\ |
| (APRXS_WD5_L_EN(rev) << APRXS_WD5_L_SHIFT) |\ |
| (APRXS_WD5_H_EN(rev) << APRXS_WD5_H_SHIFT) |\ |
| (APRXS_WD6_L_EN(rev) << APRXS_WD6_L_SHIFT) |\ |
| (APRXS_WD6_H_EN(rev) << APRXS_WD6_H_SHIFT) |\ |
| (APRXS_WD7_L_EN(rev) << APRXS_WD7_L_SHIFT) |\ |
| (APRXS_WD7_H_EN(rev) << APRXS_WD7_H_SHIFT)) |
| |
| #define APRXS_BMAP1(rev) ((APRXS_WD8_L_EN(rev) << APRXS_WD8_L_SHIFT) | \ |
| (APRXS_WD8_H_EN(rev) << APRXS_WD8_H_SHIFT) |\ |
| (APRXS_WD9_L_EN(rev) << APRXS_WD9_L_SHIFT) |\ |
| (APRXS_WD9_H_EN(rev) << APRXS_WD9_H_SHIFT) |\ |
| (APRXS_WD10_L_EN(rev) << APRXS_WD10_L_SHIFT) |\ |
| (APRXS_WD10_H_EN(rev) << APRXS_WD10_H_SHIFT) |\ |
| (APRXS_WD11_L_EN(rev) << APRXS_WD11_L_SHIFT) |\ |
| (APRXS_WD11_H_EN(rev) << APRXS_WD11_H_SHIFT) |\ |
| (APRXS_WD12_L_EN(rev) << APRXS_WD12_L_SHIFT) |\ |
| (APRXS_WD12_H_EN(rev) << APRXS_WD12_H_SHIFT) |\ |
| (APRXS_WD13_L_EN(rev) << APRXS_WD13_L_SHIFT) |\ |
| (APRXS_WD13_H_EN(rev) << APRXS_WD13_H_SHIFT) |\ |
| (APRXS_WD14_L_EN(rev) << APRXS_WD14_L_SHIFT) |\ |
| (APRXS_WD14_H_EN(rev) << APRXS_WD14_H_SHIFT) |\ |
| (APRXS_WD15_L_EN(rev) << APRXS_WD15_L_SHIFT) |\ |
| (APRXS_WD15_H_EN(rev) << APRXS_WD15_H_SHIFT)) |
| |
| #define APRXS_BMAP2(rev) ((APRXS_WD16_L_EN(rev) << APRXS_WD16_L_SHIFT) | \ |
| (APRXS_WD16_H_EN(rev) << APRXS_WD16_H_SHIFT) |\ |
| (APRXS_WD17_L_EN(rev) << APRXS_WD17_L_SHIFT) |\ |
| (APRXS_WD17_H_EN(rev) << APRXS_WD17_H_SHIFT) |\ |
| (APRXS_WD18_L_EN(rev) << APRXS_WD18_L_SHIFT) |\ |
| (APRXS_WD18_H_EN(rev) << APRXS_WD18_H_SHIFT) |\ |
| (APRXS_WD19_L_EN(rev) << APRXS_WD19_L_SHIFT) |\ |
| (APRXS_WD19_H_EN(rev) << APRXS_WD19_H_SHIFT) |\ |
| (APRXS_WD20_L_EN(rev) << APRXS_WD20_L_SHIFT) |\ |
| (APRXS_WD20_H_EN(rev) << APRXS_WD20_H_SHIFT) |\ |
| (APRXS_WD21_L_EN(rev) << APRXS_WD21_L_SHIFT) |\ |
| (APRXS_WD21_H_EN(rev) << APRXS_WD21_H_SHIFT) |\ |
| (APRXS_WD22_L_EN(rev) << APRXS_WD22_L_SHIFT) |\ |
| (APRXS_WD22_H_EN(rev) << APRXS_WD22_H_SHIFT) |\ |
| (APRXS_WD23_L_EN(rev) << APRXS_WD23_L_SHIFT) |\ |
| (APRXS_WD23_H_EN(rev) << APRXS_WD23_H_SHIFT)) |
| |
| #define APRXS_BMAP3(rev) ((APRXS_WD24_L_EN(rev) << APRXS_WD24_L_SHIFT) | \ |
| (APRXS_WD24_H_EN(rev) << APRXS_WD24_H_SHIFT) |\ |
| (APRXS_WD25_L_EN(rev) << APRXS_WD25_L_SHIFT) |\ |
| (APRXS_WD25_H_EN(rev) << APRXS_WD25_H_SHIFT)) |
| /* byte position */ |
| #define APRXS_WD0_L_POS(rev) 0u |
| #define APRXS_WD0_H_POS(rev) (APRXS_WD0_L_POS(rev) + APRXS_WD0_L_EN(rev)) /* 1 */ |
| #define APRXS_WD1_L_POS(rev) (APRXS_WD0_H_POS(rev) + APRXS_WD0_H_EN(rev)) /* 2 */ |
| #define APRXS_WD1_H_POS(rev) (APRXS_WD1_L_POS(rev) + APRXS_WD1_L_EN(rev)) /* 3 */ |
| #define APRXS_WD2_L_POS(rev) (APRXS_WD1_H_POS(rev) + APRXS_WD1_H_EN(rev)) /* 4 */ |
| #define APRXS_WD2_H_POS(rev) (APRXS_WD2_L_POS(rev) + APRXS_WD2_L_EN(rev)) /* 5 */ |
| #define APRXS_WD3_L_POS(rev) (APRXS_WD2_H_POS(rev) + APRXS_WD2_H_EN(rev)) /* 6 */ |
| #define APRXS_WD3_H_POS(rev) (APRXS_WD3_L_POS(rev) + APRXS_WD3_L_EN(rev)) /* 7 */ |
| #define APRXS_WD4_L_POS(rev) (APRXS_WD3_H_POS(rev) + APRXS_WD3_H_EN(rev)) /* 7 */ |
| #define APRXS_WD4_H_POS(rev) (APRXS_WD4_L_POS(rev) + APRXS_WD4_L_EN(rev)) /* 8 */ |
| #define APRXS_WD5_L_POS(rev) (APRXS_WD4_H_POS(rev) + APRXS_WD4_H_EN(rev)) /* 9 */ |
| #define APRXS_WD5_H_POS(rev) (APRXS_WD5_L_POS(rev) + APRXS_WD5_L_EN(rev)) /* 10 */ |
| #define APRXS_WD6_L_POS(rev) (APRXS_WD5_H_POS(rev) + APRXS_WD5_H_EN(rev)) /* 11 */ |
| #define APRXS_WD6_H_POS(rev) (APRXS_WD6_L_POS(rev) + APRXS_WD6_L_EN(rev)) /* 11 */ |
| #define APRXS_WD7_L_POS(rev) (APRXS_WD6_H_POS(rev) + APRXS_WD6_H_EN(rev)) /* 11 */ |
| #define APRXS_WD7_H_POS(rev) (APRXS_WD7_L_POS(rev) + APRXS_WD7_L_EN(rev)) /* 11 */ |
| #define APRXS_WD8_L_POS(rev) (APRXS_WD7_H_POS(rev) + APRXS_WD7_H_EN(rev)) /* 11 */ |
| #define APRXS_WD8_H_POS(rev) (APRXS_WD8_L_POS(rev) + APRXS_WD8_L_EN(rev)) /* 11 */ |
| #define APRXS_WD9_L_POS(rev) (APRXS_WD8_H_POS(rev) + APRXS_WD8_H_EN(rev)) /* 12 */ |
| #define APRXS_WD9_H_POS(rev) (APRXS_WD9_L_POS(rev) + APRXS_WD9_L_EN(rev)) /* 12 */ |
| #define APRXS_WD10_L_POS(rev) (APRXS_WD9_H_POS(rev) + APRXS_WD9_H_EN(rev)) /* 12 */ |
| #define APRXS_WD10_H_POS(rev) (APRXS_WD10_L_POS(rev) + APRXS_WD10_L_EN(rev)) /* 12 */ |
| #define APRXS_WD11_L_POS(rev) (APRXS_WD10_H_POS(rev) + APRXS_WD10_H_EN(rev)) /* 12 */ |
| #define APRXS_WD11_H_POS(rev) (APRXS_WD11_L_POS(rev) + APRXS_WD11_L_EN(rev)) /* 12 */ |
| #define APRXS_WD12_L_POS(rev) (APRXS_WD11_H_POS(rev) + APRXS_WD11_H_EN(rev)) /* 12 */ |
| #define APRXS_WD12_H_POS(rev) (APRXS_WD12_L_POS(rev) + APRXS_WD12_L_EN(rev)) /* 12 */ |
| #define APRXS_WD13_L_POS(rev) (APRXS_WD12_H_POS(rev) + APRXS_WD12_H_EN(rev)) /* 12 */ |
| #define APRXS_WD13_H_POS(rev) (APRXS_WD13_L_POS(rev) + APRXS_WD13_L_EN(rev)) /* 12 */ |
| #define APRXS_WD14_L_POS(rev) (APRXS_WD13_H_POS(rev) + APRXS_WD13_H_EN(rev)) /* 12 */ |
| #define APRXS_WD14_H_POS(rev) (APRXS_WD14_L_POS(rev) + APRXS_WD14_L_EN(rev)) /* 12 */ |
| #define APRXS_WD15_L_POS(rev) (APRXS_WD14_H_POS(rev) + APRXS_WD14_H_EN(rev)) /* 12 */ |
| #define APRXS_WD15_H_POS(rev) (APRXS_WD15_L_POS(rev) + APRXS_WD15_L_EN(rev)) /* 12 */ |
| #define APRXS_WD16_L_POS(rev) (APRXS_WD15_H_POS(rev) + APRXS_WD15_H_EN(rev)) /* 12 */ |
| #define APRXS_WD16_H_POS(rev) (APRXS_WD16_L_POS(rev) + APRXS_WD16_L_EN(rev)) /* 13 */ |
| #define APRXS_WD17_L_POS(rev) (APRXS_WD16_H_POS(rev) + APRXS_WD16_H_EN(rev)) /* 13 */ |
| #define APRXS_WD17_H_POS(rev) (APRXS_WD17_L_POS(rev) + APRXS_WD17_L_EN(rev)) /* 13 */ |
| #define APRXS_WD18_L_POS(rev) (APRXS_WD17_H_POS(rev) + APRXS_WD17_H_EN(rev)) /* 13 */ |
| #define APRXS_WD18_H_POS(rev) (APRXS_WD18_L_POS(rev) + APRXS_WD18_L_EN(rev)) /* 14 */ |
| #define APRXS_WD19_L_POS(rev) (APRXS_WD18_H_POS(rev) + APRXS_WD18_H_EN(rev)) /* 14 */ |
| #define APRXS_WD19_H_POS(rev) (APRXS_WD19_L_POS(rev) + APRXS_WD19_L_EN(rev)) /* 14 */ |
| #define APRXS_WD20_L_POS(rev) (APRXS_WD19_H_POS(rev) + APRXS_WD19_H_EN(rev)) /* 14 */ |
| #define APRXS_WD20_H_POS(rev) (APRXS_WD20_L_POS(rev) + APRXS_WD20_L_EN(rev)) /* 15 */ |
| #define APRXS_WD21_L_POS(rev) (APRXS_WD20_H_POS(rev) + APRXS_WD20_H_EN(rev)) /* 16 */ |
| #define APRXS_WD21_H_POS(rev) (APRXS_WD21_L_POS(rev) + APRXS_WD21_L_EN(rev)) /* 16 */ |
| #define APRXS_WD22_L_POS(rev) (APRXS_WD21_H_POS(rev) + APRXS_WD21_H_EN(rev)) /* 17 */ |
| #define APRXS_WD22_H_POS(rev) (APRXS_WD22_L_POS(rev) + APRXS_WD22_L_EN(rev)) /* 18 */ |
| #define APRXS_WD23_L_POS(rev) (APRXS_WD22_H_POS(rev) + APRXS_WD22_H_EN(rev)) /* 19 */ |
| #define APRXS_WD23_H_POS(rev) (APRXS_WD23_L_POS(rev) + APRXS_WD23_L_EN(rev)) /* 20 */ |
| #define APRXS_WD24_L_POS(rev) (APRXS_WD23_H_POS(rev) + APRXS_WD23_H_EN(rev)) /* 21 */ |
| #define APRXS_WD24_H_POS(rev) (APRXS_WD24_L_POS(rev) + APRXS_WD24_L_EN(rev)) /* 21 */ |
| #define APRXS_WD25_L_POS(rev) (APRXS_WD24_H_POS(rev) + APRXS_WD24_H_EN(rev)) /* 22 */ |
| #define APRXS_WD25_H_POS(rev) (APRXS_WD25_L_POS(rev) + APRXS_WD25_L_EN(rev)) /* 23 */ |
| |
| #define APRXS_NBYTES(rev) (APRXS_WD25_H_POS(rev)) // total number of bytes enabled |
| |
| // frame type |
| #define APRXS_FT_POS(rev) APRXS_WD0_L_POS(rev) |
| #define APRXS_FT_MASK 0xFu |
| #define APRXS_FT(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_FT_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_FT_POS(rev)]) & \ |
| APRXS_FT_MASK) |
| |
| // unsupported rate |
| #define APRXS_UNSRATE_POS(rev) APRXS_WD0_L_POS(rev) |
| #define APRXS_UNSRATE_MASK 0x10u |
| #define APRXS_UNSRATE_SHIFT 4u |
| #define APRXS_UNSRATE(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_UNSRATE_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_UNSRATE_POS(rev)]) & \ |
| APRXS_UNSRATE_MASK) >> APRXS_UNSRATE_SHIFT) |
| |
| // band |
| #define APRXS_BAND_POS(rev) APRXS_WD0_L_POS(rev) |
| #define APRXS_BAND_MASK 0x20u |
| #define APRXS_BAND_SHIFT 5u |
| #define APRXS_BAND(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_BAND_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_BAND_POS(rev)]) & \ |
| APRXS_BAND_MASK) >> APRXS_BAND_SHIFT) |
| |
| // lost CRS |
| #define APRXS_LOSTCRS_POS(rev) APRXS_WD0_L_POS(rev) |
| #define APRXS_LOSTCRS_MASK 0x40u |
| #define APRXS_LOSTCRS_SHIFT 6u |
| #define APRXS_LOSTCRS(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_LOSTCRS_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_LOSTCRS_POS(rev)]) & \ |
| APRXS_LOSTCRS_MASK) >> APRXS_LOSTCRS_SHIFT) |
| |
| // short preamble |
| #define APRXS_SHORTH_POS(rev) APRXS_WD0_L_POS(rev) |
| #define APRXS_SHORTH_MASK 0x80u |
| #define APRXS_SHORTH_SHIFT 7u |
| #define APRXS_SHORTH(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_SHORTH_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_SHORTH_POS(rev)]) & \ |
| APRXS_SHORTH_MASK) >> APRXS_SHORTH_SHIFT) |
| |
| // plcp format violation |
| #define APRXS_PLCPFV_POS(rev) APRXS_WD0_H_POS(rev) |
| #define APRXS_PLCPFV_MASK 0x1u |
| #define APRXS_PLCPFV(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_PLCPFV_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_PLCPFV_POS(rev)]) & \ |
| APRXS_PLCPFV_MASK) |
| |
| // plcp header CRC failed |
| #define APRXS_PLCPHCF_POS(rev) APRXS_WD0_H_POS(rev) |
| #define APRXS_PLCPHCF_MASK 0x2u |
| #define APRXS_PLCPHCF_SHIFT 1u |
| #define APRXS_PLCPHCF(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_PLCPHCF_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_PLCPHCF_POS(rev)]) & \ |
| APRXS_PLCPHCF_MASK) >> APRXS_PLCPHCF_SHIFT) |
| |
| // MFCRS fired |
| #define APRXS_MFCRS_FIRED_POS(rev) APRXS_WD0_H_POS(rev) |
| #define APRXS_MFCRS_FIRED_MASK 0x4u |
| #define APRXS_MFCRS_FIRED_SHIFT 2u |
| #define APRXS_MFCRS_FIRED(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_MFCRS_FIRED_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_MFCRS_FIRED_POS(rev)]) & \ |
| APRXS_MFCRS_FIRED_MASK) >> APRXS_MFCRS_FIRED_SHIFT) |
| |
| // ACCRS fired |
| #define APRXS_ACCRS_FIRED_POS(rev) APRXS_WD0_H_POS(rev) |
| #define APRXS_ACCRS_FIRED_MASK 0x8u |
| #define APRXS_ACCRS_FIRED_SHIFT 3u |
| #define APRXS_ACCRS_FIRED(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_ACCRS_FIRED_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_ACCRS_FIRED_POS(rev)]) & \ |
| APRXS_ACCRS_FIRED_MASK) >> APRXS_ACCRS_FIRED_SHIFT) |
| |
| // MU PPDU |
| #define APRXS_MUPPDU_POS(rev) APRXS_WD0_H_POS(rev) |
| #define APRXS_MUPPDU_MASK 0x10u |
| #define APRXS_MUPPDU_SHIFT 4u |
| #define APRXS_MUPPDU(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_MUPPDU_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_MUPPDU_POS(rev)]) & \ |
| APRXS_MUPPDU_MASK) >> APRXS_MUPPDU_SHIFT) |
| |
| // OBSS status |
| #define APRXS_OBSS_STS_POS(rev) APRXS_WD0_H_POS(rev) |
| #define APRXS_OBSS_STS_MASK 0xE0u |
| #define APRXS_OBSS_STS_SHIFT 5u |
| #define APRXS_OBSS_STS(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_OBSS_STS_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_OBSS_STS_POS(rev)]) & \ |
| APRXS_OBSS_STS_MASK) >> APRXS_OBSS_STS_SHIFT) |
| |
| // coremask |
| #define APRXS_COREMASK_POS(rev) APRXS_WD1_L_POS(rev) |
| #define APRXS_COREMASK_MASK 0xFu |
| #define APRXS_COREMASK(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_COREMASK_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_COREMASK_POS(rev)]) & \ |
| APRXS_COREMASK_MASK) |
| |
| // antcfg |
| #define APRXS_ANTCFG_POS(rev) APRXS_WD1_L_POS(rev) |
| #define APRXS_ANTCFG_MASK 0xF0u |
| #define APRXS_ANTCFG_SHIFT 4u |
| #define APRXS_ANTCFG(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_ANTCFG_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_ANTCFG_POS(rev)]) & \ |
| APRXS_ANTCFG_MASK) >> APRXS_ANTCFG_SHIFT) |
| |
| // final BW classification |
| #define APRXS_SUBBAND_POS(rev) APRXS_WD1_H_POS(rev) |
| #define APRXS_SUBBAND_MASK 0xFFu |
| #define APRXS_SUBBAND(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_SUBBAND_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_SUBBAND_POS(rev)]) & \ |
| APRXS_SUBBAND_MASK) |
| |
| // Rx power Antenna0 |
| #define APRXS_RXPWR_ANT0_POS(rev) APRXS_WD2_L_POS(rev) |
| #define APRXS_RXPWR_ANT0_MASK 0xFFu |
| #define APRXS_RXPWR_ANT0(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_RXPWR_ANT0_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_RXPWR_ANT0_POS(rev)]) & \ |
| APRXS_RXPWR_ANT0_MASK) |
| |
| // Rx power Antenna1 |
| #define APRXS_RXPWR_ANT1_POS(rev) APRXS_WD2_H_POS(rev) |
| #define APRXS_RXPWR_ANT1_MASK 0xFFu |
| #define APRXS_RXPWR_ANT1(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_RXPWR_ANT1_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_RXPWR_ANT1_POS(rev)]) & \ |
| APRXS_RXPWR_ANT1_MASK) |
| |
| // Rx power Antenna2 |
| #define APRXS_RXPWR_ANT2_POS(rev) APRXS_WD3_L_POS(rev) |
| #define APRXS_RXPWR_ANT2_MASK 0xFFu |
| #define APRXS_RXPWR_ANT2(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_RXPWR_ANT2_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_RXPWR_ANT2_POS(rev)]) & \ |
| APRXS_RXPWR_ANT2_MASK) |
| |
| // Rx power Antenna3 |
| #define APRXS_RXPWR_ANT3_POS(rev) APRXS_WD3_H_POS(rev) |
| #define APRXS_RXPWR_ANT3_MASK 0xFFu |
| #define APRXS_RXPWR_ANT3(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_RXPWR_ANT3_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_RXPWR_ANT3_POS(rev)]) & \ |
| APRXS_RXPWR_ANT3_MASK) |
| |
| // RX ELNA INDEX ANT0 |
| #define APRXS_ELNA_IDX_ANT0_POS(rev) APRXS_WD20_L_POS(rev) |
| #define APRXS_ELNA_IDX_ANT0_MASK 0x2u |
| #define APRXS_ELNA_IDX_ANT0_SHIFT 1u |
| #define APRXS_ELNA_IDX_ANT0(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_ELNA_IDX_ANT0_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_ELNA_IDX_ANT0_POS(rev)]) & \ |
| APRXS_ELNA_IDX_ANT0_MASK) >> APRXS_ELNA_IDX_ANT0_SHIFT) |
| |
| // RX ELNA INDEX ANT1 |
| #define APRXS_ELNA_IDX_ANT1_POS(rev) APRXS_WD20_L_POS(rev) |
| #define APRXS_ELNA_IDX_ANT1_MASK 0x20u |
| #define APRXS_ELNA_IDX_ANT1_SHIFT 5u |
| #define APRXS_ELNA_IDX_ANT1(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_ELNA_IDX_ANT1_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_ELNA_IDX_ANT1_POS(rev)]) & \ |
| APRXS_ELNA_IDX_ANT1_MASK) >> APRXS_ELNA_IDX_ANT1_SHIFT) |
| |
| // RX TIA INDEX ANT0 LO |
| #define APRXS_TIA_IDX_ANT0_POS(rev) APRXS_WD16_L_POS(rev) |
| #define APRXS_TIA_IDX_ANT0_MASK 0x1Cu |
| #define APRXS_TIA_IDX_ANT0_SHIFT 2u |
| #define APRXS_TIA_IDX_ANT0(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_TIA_IDX_ANT0_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_TIA_IDX_ANT0_POS(rev)]) & \ |
| APRXS_TIA_IDX_ANT0_MASK) >> APRXS_TIA_IDX_ANT0_SHIFT) |
| |
| // RX TIA INDEX ANT1 LO |
| #define APRXS_TIA_IDX_ANT1_POS(rev) APRXS_WD18_L_POS(rev) |
| #define APRXS_TIA_IDX_ANT1_MASK 0x1Cu |
| #define APRXS_TIA_IDX_ANT1_SHIFT 2u |
| #define APRXS_TIA_IDX_ANT1(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_TIA_IDX_ANT1_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_TIA_IDX_ANT1_POS(rev)]) & \ |
| APRXS_TIA_IDX_ANT1_MASK) >> APRXS_TIA_IDX_ANT1_SHIFT) |
| |
| // RX VSW INDEX ANT0 |
| #define APRXS_VSW_IDX_ANT0_POS(rev) APRXS_WD20_L_POS(rev) |
| #define APRXS_VSW_IDX_ANT0_MASK 0x8u |
| #define APRXS_VSW_IDX_ANT0_SHIFT 3u |
| #define APRXS_VSW_IDX_ANT0(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_VSW_IDX_ANT0_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_VSW_IDX_ANT0_POS(rev)]) & \ |
| APRXS_VSW_IDX_ANT0_MASK) >> APRXS_VSW_IDX_ANT0_SHIFT) |
| |
| // RX VSW INDEX ANT1 |
| #define APRXS_VSW_IDX_ANT1_POS(rev) APRXS_WD20_L_POS(rev) |
| #define APRXS_VSW_IDX_ANT1_MASK 0x80u |
| #define APRXS_VSW_IDX_ANT1_SHIFT 7u |
| #define APRXS_VSW_IDX_ANT1(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_VSW_IDX_ANT1_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_VSW_IDX_ANT1_POS(rev)]) & \ |
| APRXS_VSW_IDX_ANT1_MASK) >> APRXS_VSW_IDX_ANT1_SHIFT) |
| |
| // RSSI fractional bits |
| #define APRXS_RXPWR_FRAC_POS(rev) APRXS_WD4_L_POS(rev) |
| #define APRXS_RXPWR_FRAC_MASK 0xFFu |
| #define APRXS_RXPWR_FRAC(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_RXPWR_FRAC_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_RXPWR_FRAC_POS(rev)]) & \ |
| APRXS_RXPWR_FRAC_MASK) |
| |
| // Ucode overwrites ClipCount with GILTF |
| #define APRXS_GILTF_POS(rev) APRXS_WD4_H_POS(rev) |
| #define APRXS_GILTF_MASK 0x18u |
| #define APRXS_GILTF_SHIFT 3u |
| #define APRXS_GILTF(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_GILTF_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_GILTF_POS(rev)]) & \ |
| APRXS_GILTF_MASK) >> APRXS_GILTF_SHIFT) |
| |
| #define APRXS_DYNBWINNONHT_POS(rev) APRXS_WD4_H_POS(rev) |
| #define APRXS_DYNBWINNONHT_MASK 0x20u |
| #define APRXS_DYNBWINNONHT_SHIFT 5u |
| #define APRXS_DYNBWINNONHT(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_DYNBWINNONHT_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_DYNBWINNONHT_POS(rev)]) & \ |
| APRXS_DYNBWINNONHT_MASK) >> APRXS_DYNBWINNONHT_SHIFT) |
| |
| #define APRXS_MCSSQSNR0_POS(rev) APRXS_WD5_L_POS(rev) |
| #define APRXS_MCSSQSNR0_MASK 0xFFu |
| #define APRXS_MCSSQSNR0(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_MCSSQSNR0_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_MCSSQSNR0_POS(rev)]) & \ |
| APRXS_MCSSQSNR0_MASK) |
| |
| #define APRXS_MCSSQSNR1_POS(rev) APRXS_WD5_H_POS(rev) |
| #define APRXS_MCSSQSNR1_MASK 0xFFu |
| #define APRXS_MCSSQSNR1(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_MCSSQSNR1_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_MCSSQSNR1_POS(rev)]) & \ |
| APRXS_MCSSQSNR1_MASK) |
| |
| #define APRXS_MCSSQSNR2_POS(rev) APRXS_WD6_L_POS(rev) |
| #define APRXS_MCSSQSNR2_MASK 0xFFu |
| #define APRXS_MCSSQSNR2(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_MCSSQSNR2_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_MCSSQSNR2_POS(rev)]) & \ |
| APRXS_MCSSQSNR2_MASK) |
| |
| #define APRXS_CHBWINNONHT_POS(rev) APRXS_WD8_H_POS(rev) |
| #define APRXS_CHBWINNONHT_MASK 0x3u |
| #define APRXS_CHBWINNONHT(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_CHBWINNONHT_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_CHBWINNONHT_POS(rev)]) & \ |
| APRXS_CHBWINNONHT_MASK) |
| |
| // User type |
| #define APRXS_USTY_POS(rev) APRXS_WD23_H_POS(rev) |
| #define APRXS_USTY_MASK 0xE0u |
| #define APRXS_USTY_SHIFT 0x5u |
| #define APRXS_USTY(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_USTY_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_USTY_POS(rev)]) & \ |
| APRXS_USTY_MASK) >> APRXS_USTY_SHIFT) |
| |
| // 11ax frame format |
| #define APRXS_AXFF_POS(rev) APRXS_WD20_H_POS(rev) |
| #define APRXS_AXFF_MASK 0x7u |
| #define APRXS_AXFF(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_AXFF_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_AXFF_POS(rev)]) & \ |
| APRXS_AXFF_MASK) |
| |
| // MCS |
| #define APRXS_AXMCS_POS(rev) APRXS_WD21_H_POS(rev) |
| #define APRXS_AXMCS_MASK 0xFu |
| #define APRXS_AXMCS(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_AXMCS_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_AXMCS_POS(rev)]) & \ |
| APRXS_AXMCS_MASK) |
| |
| // Coding |
| #define APRXS_CODING_POS(rev) APRXS_WD21_H_POS(rev) |
| #define APRXS_CODING_MASK 0x10u |
| #define APRXS_CODING_SHIFT 4u |
| #define APRXS_CODING(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_CODING_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_CODING_POS(rev)]) & \ |
| APRXS_CODING_MASK) >> APRXS_CODING_SHIFT) |
| |
| // STAID |
| #define APRXS_AX_STAID_L_POS(rev) APRXS_WD22_L_POS(rev) |
| #define APRXS_AX_STAID_L_MASK 0xFFu |
| #define APRXS_AX_STAID_L(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_AX_STAID_L_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_AX_STAID_L_POS(rev)]) & \ |
| APRXS_AX_STAID_L_MASK) |
| |
| #define APRXS_AX_STAID_H_POS(rev) APRXS_WD22_H_POS(rev) |
| #define APRXS_AX_STAID_H_MASK 0x03u |
| #define APRXS_AX_STAID_H(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_AX_STAID_H_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_AX_STAID_H_POS(rev)]) & \ |
| APRXS_AX_STAID_H_MASK) |
| |
| #define APRXS_AX_STAID(rxh, rev, min_rev) ((APRXS_AX_STAID_H(rxh, rev, min_rev) << 1) |\ |
| APRXS_AX_STAID_L(rxh, rev, min_rev)) |
| |
| // NSTS |
| #define APRXS_NSTS_POS(rev) APRXS_WD22_H_POS(rev) |
| #define APRXS_NSTS_MASK 0x38u |
| #define APRXS_NSTS_SHIFT 3u |
| #define APRXS_NSTS(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_DCM_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_DCM_POS(rev)]) & \ |
| APRXS_NSTS_MASK) >> APRXS_NSTS_SHIFT) |
| |
| // TXBF |
| #define APRXS_TXBF_POS(rev) APRXS_WD22_H_POS(rev) |
| #define APRXS_TXBF_MASK 0x40u |
| #define APRXS_TXBF_SHIFT 6u |
| #define APRXS_TXBF(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_TXBF_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_TXBF_POS(rev)]) & \ |
| APRXS_TXBF_MASK) >> APRXS_TXBF_SHIFT) |
| |
| //DCM |
| #define APRXS_DCM_POS(rev) APRXS_WD22_H_POS(rev) |
| #define APRXS_DCM_MASK 0x80u |
| #define APRXS_DCM_SHIFT 7u |
| #define APRXS_DCM(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_DCM_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_DCM_POS(rev)]) & \ |
| APRXS_DCM_MASK) >> APRXS_DCM_SHIFT) |
| |
| // RU Offset |
| #define APRXS_AX_RUALLOC_POS(rev) APRXS_WD23_L_POS(rev) |
| #define APRXS_AX_RUALLOC_MASK 0x7Fu |
| #define APRXS_AX_RUALLOC_SHIFT 0u |
| #define APRXS_AX_RUALLOC(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_AX_RUALLOC_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_AX_RUALLOC_POS(rev)]) & \ |
| APRXS_AX_RUALLOC_MASK) >> APRXS_AX_RUALLOC_SHIFT) |
| |
| #define APRXS_PE_L_POS(rev) APRXS_WD23_L_POS(rev) |
| #define APRXS_PE_L_MASK 0x80u |
| #define APRXS_PE_L_SHIFT 7u |
| #define APRXS_PE_L(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_PE_L_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_PE_L_POS(rev)]) & \ |
| APRXS_PE_L_MASK) >> APRXS_PE_L_SHIFT) |
| |
| #define APRXS_PE_H_POS(rev) APRXS_WD23_H_POS(rev) |
| #define APRXS_PE_H_MASK 0x3u |
| #define APRXS_PE_H(rxh, rev, min_rev) \ |
| ((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_PE_H_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_PE_H_POS(rev)]) & \ |
| APRXS_PE_H_MASK) |
| |
| #define APRXS_PE(rxh, rev, rev_min) \ |
| ((APRXS_PE_H(rxh, rev, rev_min) << 1) | APRXS_PE_L(rxh, rev, rev_min)) |
| |
| #define APRXS_RU_POS(rev) APRXS_WD23_H_POS(rev) |
| #define APRXS_RU_MASK 0x1Cu |
| #define APRXS_RU_SHIFT 2u |
| #define APRXS_RU(rxh, rev, min_rev) \ |
| (((D11REV_MAJ_MIN_GE(rev, min_rev, 87, 1) ? \ |
| (rxh)->ge87_1.PHYRXSTATUS[APRXS_RU_POS(rev)] : \ |
| (rxh)->ge85.PHYRXSTATUS[APRXS_RU_POS(rev)]) & \ |
| APRXS_RU_MASK) >> APRXS_RU_SHIFT) |
| |
| #endif /* _d11_autophyrxsts_ */ |
| |
| #if defined(AUTO_PHYRXSTS) |
| #define AUTO_PHYRXSTS_ENAB() 1u |
| #else |
| #define AUTO_PHYRXSTS_ENAB() 0u |
| #endif /* AUTO_PHYRXSTS */ |
| |
| /* PhyRxStatus_0: */ |
| #define PRXS0_FT_MASK 0x0003u /**< [PRE-HE] NPHY only: CCK, OFDM, HT, VHT */ |
| #define PRXS0_CLIP_MASK 0x000Cu /**< NPHY only: clip count adjustment steps by AGC */ |
| #define PRXS0_CLIP_SHIFT 2u /**< SHIFT bits for clip count adjustment */ |
| #define PRXS0_UNSRATE 0x0010u /**< PHY received a frame with unsupported rate */ |
| #define PRXS0_UNSRATE_SHIFT 4u |
| #define PRXS0_RXANT_UPSUBBAND 0x0020u /**< GPHY: rx ant, NPHY: upper sideband */ |
| #define PRXS0_LCRS 0x0040u /**< CCK frame only: lost crs during cck frame reception */ |
| #define PRXS0_SHORTH 0x0080u /**< Short Preamble */ |
| #define PRXS0_SHORTH_SHIFT 7u |
| #define PRXS0_PLCPFV 0x0100u /**< PLCP violation */ |
| #define PRXS0_PLCPFV_SHIFT 8u |
| #define PRXS0_PLCPHCF 0x0200u /**< PLCP header integrity check failed */ |
| #define PRXS0_PLCPHCF_SHIFT 9u |
| #define PRXS0_GAIN_CTL 0x4000u /**< legacy PHY gain control */ |
| #define PRXS0_ANTSEL_MASK 0xF000u /**< NPHY: Antennas used for received frame, bitmask */ |
| #define PRXS0_ANTSEL_SHIFT 12u /**< SHIFT bits for Antennas used for received frame */ |
| #define PRXS0_PPDU_MASK 0x1000u /**< PPDU type SU/MU */ |
| |
| /* subfield PRXS0_FT_MASK [PRXS0_PRE_HE_FT_MASK] */ |
| #define PRXS0_CCK 0x0000u |
| #define PRXS0_OFDM 0x0001u /**< valid only for G phy, use rxh->RxChan for A phy */ |
| #define PRXS0_PREN 0x0002u |
| #define PRXS0_STDN 0x0003u |
| |
| /* subfield PRXS0_ANTSEL_MASK */ |
| #define PRXS0_ANTSEL_0 0x0u /**< antenna 0 is used */ |
| #define PRXS0_ANTSEL_1 0x2u /**< antenna 1 is used */ |
| #define PRXS0_ANTSEL_2 0x4u /**< antenna 2 is used */ |
| #define PRXS0_ANTSEL_3 0x8u /**< antenna 3 is used */ |
| |
| /* PhyRxStatus_1: */ |
| #define PRXS1_JSSI_MASK 0x00FFu |
| #define PRXS1_JSSI_SHIFT 0u |
| #define PRXS1_SQ_MASK 0xFF00u |
| #define PRXS1_SQ_SHIFT 8u |
| #define PRXS1_COREMAP 0x000Fu /**< core enable bits for core 0/1/2/3 */ |
| #define PRXS1_ANTCFG 0x00F0u /**< anttenna configuration bits */ |
| |
| #define PHY_COREMAP_LT85(rxh, rev) \ |
| ((D11REV_GE(rev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_1) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_1)) & \ |
| PRXS1_COREMAP) |
| #define PHY_COREMAP(rev, rev_min, rxh) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_COREMASK(rxh, rev, rev_min) : PHY_COREMAP_LT85(rxh, rev)) |
| |
| #define PHY_ANTMAP_LT85(rxh, corerev) \ |
| (((D11REV_GE(corerev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_1) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_1)) & \ |
| PRXS1_ANTCFG) >> 4) |
| #define PHY_ANTMAP(rev, rev_min, rxh) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_ANTCFG(rxh, rev, rev_min) : PHY_ANTMAP_LT85(rxh, rev)) |
| |
| /* nphy PhyRxStatus_1: */ |
| #define PRXS1_nphy_PWR0_MASK 0x00FF |
| #define PRXS1_nphy_PWR1_MASK 0xFF00 |
| |
| /* PhyRxStatus_2: */ |
| #define PRXS2_LNAGN_MASK 0xC000 |
| #define PRXS2_LNAGN_SHIFT 14 |
| #define PRXS2_PGAGN_MASK 0x3C00 |
| #define PRXS2_PGAGN_SHIFT 10 |
| #define PRXS2_FOFF_MASK 0x03FF |
| |
| /* nphy PhyRxStatus_2: */ |
| #define PRXS2_nphy_SQ_ANT0 0x000F /**< nphy overall signal quality for antenna 0 */ |
| #define PRXS2_nphy_SQ_ANT1 0x00F0 /**< nphy overall signal quality for antenna 0 */ |
| #define PRXS2_nphy_cck_SQ 0x00FF /**< bphy signal quality(when FT field is 0) */ |
| #define PRXS3_nphy_SSQ_MASK 0xFF00 /**< spatial conditioning of the two receive channels */ |
| #define PRXS3_nphy_SSQ_SHIFT 8 |
| |
| /* PhyRxStatus_3: */ |
| #define PRXS3_DIGGN_MASK 0x1800 |
| #define PRXS3_DIGGN_SHIFT 11 |
| #define PRXS3_TRSTATE 0x0400 |
| |
| /* nphy PhyRxStatus_3: */ |
| #define PRXS3_nphy_MMPLCPLen_MASK 0x0FFF /**< Mixed-mode preamble PLCP length */ |
| #define PRXS3_nphy_MMPLCP_RATE_MASK 0xF000 /**< Mixed-mode preamble rate field */ |
| #define PRXS3_nphy_MMPLCP_RATE_SHIFT 12 |
| |
| /* HTPHY Rx Status defines */ |
| /* htphy PhyRxStatus_0: those bit are overlapped with PhyRxStatus_0 */ |
| #define PRXS0_BAND 0x0400 /**< 0 = 2.4G, 1 = 5G */ |
| #define PRXS0_RSVD 0x0800 /**< reserved; set to 0 */ |
| #define PRXS0_UNUSED 0xF000 /**< unused and not defined; set to 0 */ |
| |
| /* htphy PhyRxStatus_1: */ |
| #define PRXS1_HTPHY_MMPLCPLenL_MASK 0xFF00 /**< Mixmode PLCP Length low byte mask */ |
| |
| /* htphy PhyRxStatus_2: */ |
| #define PRXS2_HTPHY_MMPLCPLenH_MASK 0x000F /**< Mixmode PLCP Length high byte maskw */ |
| #define PRXS2_HTPHY_MMPLCH_RATE_MASK 0x00F0 /**< Mixmode PLCP rate mask */ |
| #define PRXS2_HTPHY_RXPWR_ANT0 0xFF00 /**< Rx power on core 0 */ |
| |
| /* htphy PhyRxStatus_3: */ |
| #define PRXS3_HTPHY_RXPWR_ANT1 0x00FF /**< Rx power on core 1 */ |
| #define PRXS3_HTPHY_RXPWR_ANT2 0xFF00 /**< Rx power on core 2 */ |
| |
| /* htphy PhyRxStatus_4: */ |
| #define PRXS4_HTPHY_RXPWR_ANT3 0x00FF /**< Rx power on core 3 */ |
| #define PRXS4_HTPHY_CFO 0xFF00 /**< Coarse frequency offset */ |
| |
| /* htphy PhyRxStatus_5: */ |
| #define PRXS5_HTPHY_FFO 0x00FF /**< Fine frequency offset */ |
| #define PRXS5_HTPHY_AR 0xFF00 /**< Advance Retard */ |
| |
| /* ACPHY RxStatus defs */ |
| |
| /* ACPHY PhyRxStatus_0: */ |
| #define PRXS0_ACPHY_FT_MASK 0x0003 /**< CCK, OFDM, HT, VHT */ |
| #define PRXS0_ACPHY_CLIP_MASK 0x000C /**< clip count adjustment steps by AGC */ |
| #define PRXS0_ACPHY_CLIP_SHIFT 2 |
| #define PRXS0_ACPHY_UNSRATE 0x0010 /**< PHY received a frame with unsupported rate */ |
| #define PRXS0_ACPHY_BAND5G 0x0020 /**< Rx Band indication: 0 -> 2G, 1 -> 5G */ |
| #define PRXS0_ACPHY_LCRS 0x0040 /**< CCK frame only: lost crs during cck frame reception */ |
| #define PRXS0_ACPHY_SHORTH 0x0080 /**< Short Preamble (CCK), GF preamble (HT) */ |
| #define PRXS0_ACPHY_PLCPFV 0x0100 /**< PLCP violation */ |
| #define PRXS0_ACPHY_PLCPHCF 0x0200 /**< PLCP header integrity check failed */ |
| #define PRXS0_ACPHY_MFCRS 0x0400 /**< Matched Filter CRS fired */ |
| #define PRXS0_ACPHY_ACCRS 0x0800 /**< Autocorrelation CRS fired */ |
| #define PRXS0_ACPHY_SUBBAND_MASK 0xF000 /**< FinalBWClassification: |
| * lower nibble Bitfield of sub-bands occupied by Rx frame |
| */ |
| /* ACPHY PhyRxStatus_1: */ |
| #define PRXS1_ACPHY_ANT_CORE0 0x0001 /* Antenna Config for core 0 */ |
| #define PRXS1_ACPHY_SUBBAND_MASK_GEN2 0xFF00 /**< FinalBWClassification: |
| * lower byte Bitfield of sub-bands occupied by Rx frame |
| */ |
| #define PRXS0_ACPHY_SUBBAND_SHIFT 12 |
| #define PRXS1_ACPHY_SUBBAND_SHIFT_GEN2 8 |
| |
| /* acphy PhyRxStatus_3: */ |
| #define PRXS2_ACPHY_RXPWR_ANT0 0xFF00 /**< Rx power on core 1 */ |
| #define PRXS3_ACPHY_RXPWR_ANT1 0x00FF /**< Rx power on core 1 */ |
| #define PRXS3_ACPHY_RXPWR_ANT2 0xFF00 /**< Rx power on core 2 */ |
| #define PRXS3_ACPHY_SNR_ANT0 0xFF00 /* SNR on core 0 */ |
| |
| /* acphy PhyRxStatus_4: */ |
| /** FinalBWClassification:upper nibble of sub-bands occupied by Rx frame */ |
| #define PRXS4_ACPHY_SUBBAND_MASK 0x000F |
| #define PRXS4_ACPHY_RXPWR_ANT3 0x00FF /**< Rx power on core 3 */ |
| #define PRXS4_ACPHY_SNR_ANT1 0xFF00 /* SNR on core 1 */ |
| |
| #define PRXS5_ACPHY_CHBWINNONHT_MASK 0x0003 |
| #define PRXS5_ACPHY_CHBWINNONHT_20MHZ 0 |
| #define PRXS5_ACPHY_CHBWINNONHT_40MHZ 1 |
| #define PRXS5_ACPHY_CHBWINNONHT_80MHZ 2 |
| #define PRXS5_ACPHY_CHBWINNONHT_160MHZ 3 /* includes 80+80 */ |
| #define PRXS5_ACPHY_DYNBWINNONHT_MASK 0x0004 |
| |
| /** Get Rx power on core 0 */ |
| #define ACPHY_RXPWR_ANT0(rxs) (((rxs)->lt80.PhyRxStatus_2 & PRXS2_ACPHY_RXPWR_ANT0) >> 8) |
| /** Get Rx power on core 1 */ |
| #define ACPHY_RXPWR_ANT1(rxs) ((rxs)->lt80.PhyRxStatus_3 & PRXS3_ACPHY_RXPWR_ANT1) |
| /** Get Rx power on core 2 */ |
| #define ACPHY_RXPWR_ANT2(rxs) (((rxs)->lt80.PhyRxStatus_3 & PRXS3_ACPHY_RXPWR_ANT2) >> 8) |
| /** Get Rx power on core 3 */ |
| #define ACPHY_RXPWR_ANT3(rxs) ((rxs)->lt80.PhyRxStatus_4 & PRXS4_ACPHY_RXPWR_ANT3) |
| |
| /** MCSSQSNR location access. MCSSQ usage is limited by chip specific impl, |
| * and there is no way to commonize these status location yet. |
| * TODO: When the storage locations are settled we need to revisit |
| * this defs controls. |
| */ |
| |
| /* exception handling */ |
| #ifdef PHY_CORE_MAX |
| #if PHY_CORE_MAX > 4 |
| #error "PHY_CORE_MAX is exceeded more than MCSSQSNR defs (4)" |
| #endif |
| #endif /* PHY_CORE_MAX */ |
| |
| /* rev 48/55/59 are obsoleted for SNR in trunk */ |
| #define D11_PRXS_MCSSQ_SNR_SUPPORT(corerev) (D11REV_GE((corerev), 80)) |
| |
| #define ACPHY_SNR_MASK (0xFF) |
| #define ACPHY_SNR_SHIFT (8) |
| |
| #define PRXS5_ACPHY_DYNBWINNONHT(rxs) ((rxs)->lt80.PhyRxStatus_5 & PRXS5_ACPHY_DYNBWINNONHT_MASK) |
| #define PRXS5_ACPHY_CHBWINNONHT(rxs) ((rxs)->lt80.PhyRxStatus_5 & PRXS5_ACPHY_CHBWINNONHT_MASK) |
| |
| #define D11N_MMPLCPLen(rxs) ((rxs)->lt80.PhyRxStatus_3 & PRXS3_nphy_MMPLCPLen_MASK) |
| #define D11HT_MMPLCPLen(rxs) ((((rxs)->lt80.PhyRxStatus_1 & PRXS1_HTPHY_MMPLCPLenL_MASK) >> 8) | \ |
| (((rxs)->lt80.PhyRxStatus_2 & PRXS2_HTPHY_MMPLCPLenH_MASK) << 8)) |
| |
| /* REV80 Defintions (corerev >= 80) */ |
| |
| /** Dma_flags Masks */ |
| #define RXS_PHYRXST_VALID_REV_GE80 0x02 |
| |
| /** Get RxStatus1 */ |
| #define RXSTATUS1_REV_GE87_1(rxs) ((rxs)->ge87_1.RxStatus1) |
| #define RXSTATUS1_REV_GE80(rxs) ((rxs)->ge80.RxStatus1) |
| #define RXSTATUS1_REV_LT80(rxs) ((rxs)->lt80.RxStatus1) |
| |
| #define PHY_RXSTATUS1(corerev, corerev_minor, rxs) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? RXSTATUS1_REV_GE87_1(rxs) : \ |
| D11REV_GE(corerev, 80) ? RXSTATUS1_REV_GE80(rxs) : \ |
| RXSTATUS1_REV_LT80(rxs)) |
| |
| /* (FT Mask) PhyRxStatus_0: */ |
| #define PRXS0_FT_MASK_REV_LT80 PRXS0_FT_MASK /**< (corerev < 80) frame type field mask */ |
| |
| #define PRXS0_FT_SHIFT_REV_GE80 8 |
| #define PRXS0_FT_MASK_REV_GE80 0x0700 /** |
| * (corerev >= 80) frame type field mask. |
| * |
| * 0 = CCK, 1 = 11a/g legacy OFDM, |
| * 2 = HT, 3 = VHT, 4 = 11ah, 5 = HE, |
| * 6-15 Rsvd. |
| */ |
| |
| /* * |
| * Macro to find Frame type from RX Hdr based on corerev. |
| * |
| * Note: From rev80 onwards frame type is indicated only |
| * in the phyrxstatus, which is valid only for the last |
| * MPDU of an AMPDU. Since FT is required for every MPDU, |
| * frametype for core-revs >= 80, shall be |
| * provided in bits (8:10) of MuRate field in RXH. |
| * |
| */ |
| #define D11PPDU_FT(rxh, rev) (\ |
| (D11REV_GE(rev, 80) ? \ |
| ((D11RXHDR_ACCESS_VAL(rxh, rev, 0, MuRate) & PRXS_FT_MASK(rev)) >> \ |
| (PRXS0_FT_SHIFT_REV_GE80)) : \ |
| (D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_0) & PRXS_FT_MASK(rev)))) |
| |
| #define PRXS_UNSRATE_LT85(rxh, rev) \ |
| (((D11REV_GE(rev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_0) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_0)) & \ |
| PRXS0_UNSRATE) >> PRXS0_UNSRATE_SHIFT) |
| |
| #define PRXS_UNSRATE(rxh, rev, min_rev) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_UNSRATE(rxh, rev, min_rev) : PRXS_UNSRATE_LT85(rxh, rev)) |
| |
| // 1: short (or GF) preamble, 0: long (or MM) preamble |
| #define PRXS_SHORTH_LT85(rxh, rev) \ |
| (((D11REV_GE(rev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_0) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_0)) & \ |
| PRXS0_SHORTH) >> PRXS0_SHORTH_SHIFT) |
| #define PRXS_SHORTH(rxh, rev, min_rev) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_SHORTH(rxh, rev, min_rev) : \ |
| PRXS_SHORTH_LT85(rxh, rev)) |
| |
| #define PRXS_PLCPFV_LT85(rxh, rev) \ |
| (((D11REV_GE(rev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_0) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_0)) & \ |
| PRXS0_PLCPFV) >> PRXS0_PLCPFV_SHIFT) |
| #define PRXS_PLCPFV(rxh, rev, rev_min) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_PLCPFV(rxh, rev, rev_min) : PRXS_PLCPFV_LT85(rxh, rev)) |
| |
| #define PRXS_PLCPHCF_LT85(rxh, rev) \ |
| (((D11REV_GE(rev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_0) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_0)) & \ |
| PRXS0_PLCPHCF) >> PRXS0_PLCPHCF_SHIFT) |
| #define PRXS_PLCPHCF(rxh, rev, rev_min) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_PLCPHCF(rxh, rev, rev_min) : PRXS_PLCPHCF_LT85(rxh, rev)) |
| |
| // final BW classification |
| #define PRXS_SUBBAND_ACPHY(rxh, rev, rev_min) \ |
| (((D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_0) & \ |
| PRXS0_ACPHY_SUBBAND_MASK) >> PRXS0_ACPHY_SUBBAND_SHIFT) | \ |
| ((D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_4) & \ |
| PRXS4_ACPHY_SUBBAND_MASK) << 4)) |
| #define PRXS_SUBBAND_ACPHY2(rxh, rev, rev_min) \ |
| (((D11REV_GE(rev, 80) ? D11RXHDR_GE80_ACCESS_VAL(rxh, PhyRxStatus_1) : \ |
| D11RXHDR_LT80_ACCESS_VAL(rxh, PhyRxStatus_1)) & PRXS1_ACPHY2_SUBBAND_MASK) >> \ |
| PRXS1_ACPHY2_SUBBAND_SHIFT) |
| |
| #define PRXS_SUBBAND(rxh, rev, rev_min, phyrev) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_SUBBAND(rxh, rev, rev_min) : (ACREV_GE(phyrev, 32) ? \ |
| PRXS_SUBBAND_ACPHY2(rxh, rev, rev_min) : \ |
| PRXS_SUBBAND_ACPHY(rxh, rev, rev_min))) |
| |
| /* Macros to access MCS, NSTS and MU valididity from MuRate field in corerev > 80 RXH */ |
| #define RXS_MU_VALID_MASK_REV80 0x0080 |
| #define RXS_MU_VALID_SHIFT_REV80 7 |
| #define RXS_MCS_MASK_REV80 0x000F |
| #define RXS_MCS_SHIFT_REV80 0 |
| #define RXS_NSTS_MASK_REV80 0x0070 |
| #define RXS_NSTS_SHIFT_REV80 4 |
| |
| #define D11PPDU_ISMU_REV80(rxh, corerev, corerev_minor) \ |
| ((D11RXHDR_ACCESS_VAL(rxh, corerev, corerev_minor, MuRate) & \ |
| (RXS_MU_VALID_MASK_REV80)) >> RXS_MU_VALID_SHIFT_REV80) |
| #define D11RXHDR_GE80_GET_MCS(rxh, corerev, corerev_minor) \ |
| ((D11RXHDR_ACCESS_VAL(rxh, corerev, corerev_minor, MuRate) & \ |
| (RXS_MCS_MASK_REV80)) >> RXS_MCS_SHIFT_REV80) |
| #define D11RXHDR_GE80_GET_NSTS(rxh, corerev, corerev_minor) \ |
| ((D11RXHDR_ACCESS_VAL(rxh, corerev, corerev_minor, MuRate) & \ |
| (RXS_NSTS_MASK_REV80)) >> RXS_NSTS_SHIFT_REV80) |
| |
| /* subfield PRXS0_FT_MASK_REV_GE80 */ |
| #define PRXS0_HE 0x0004 /**< HE frame type */ |
| |
| /* (Corerev >= 80) PhyRxStatus_2: */ |
| #define PRXS2_RXPWR_ANT0_REV_GE80 0x00FF /**< (corerev >= 80) Rx power on first antenna */ |
| #define PRXS2_RXPWR_ANT1_REV_GE80 0xFF00 /**< (corerev >= 80) Rx power on second antenna */ |
| |
| /* (Corerev >= 80) PhyRxStatus_3: */ |
| #define PRXS3_RXPWR_ANT2_REV_GE80 0x00FF /**< (corerev >= 80) Rx power on third antenna */ |
| #define PRXS3_RXPWR_ANT3_REV_GE80 0xFF00 /** |
| * (corerev >= 80) Rx power on fourth antenna. |
| * |
| * Note: For PHY revs 3 and > 4, OCL Status |
| * byte 0 will be reported if PHY register |
| * OCL_RxStatus_Ctrl is set to 0x2 or 0x6. |
| */ |
| #define PRXS3_RXPWR_FRAC_REV_GE80 0xFFu |
| |
| /** Get Rx power on ANT 0 */ |
| #define RXPWR_ANT0_REV_GE80(rxs) ((rxs)->ge80.PhyRxStatus_2 & \ |
| (PRXS2_RXPWR_ANT0_REV_GE80)) |
| |
| #define PHY_RXPWR_ANT0(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_RXPWR_ANT0(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| RXPWR_ANT0_REV_GE80(rxs) : ACPHY_RXPWR_ANT0(rxs))) |
| |
| /** Get Rx power on ANT 1 */ |
| #define RXPWR_ANT1_REV_GE80(rxs) (((rxs)->ge80.PhyRxStatus_2 & \ |
| (PRXS2_RXPWR_ANT1_REV_GE80)) >> 8) |
| |
| #define PHY_RXPWR_ANT1(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_RXPWR_ANT1(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| RXPWR_ANT1_REV_GE80(rxs) : ACPHY_RXPWR_ANT1(rxs))) |
| |
| /** Get Rx power on ANT 2 */ |
| #define RXPWR_ANT2_REV_GE80(rxs) ((rxs)->ge80.PhyRxStatus_3 & \ |
| (PRXS3_RXPWR_ANT2_REV_GE80)) |
| |
| #define PHY_RXPWR_ANT2(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_RXPWR_ANT2(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| RXPWR_ANT2_REV_GE80(rxs) : ACPHY_RXPWR_ANT2(rxs))) |
| |
| /** Get Rx power on ANT 3 */ |
| #define RXPWR_ANT3_REV_GE80(rxs) (((rxs)->ge80.PhyRxStatus_3 & \ |
| (PRXS3_RXPWR_ANT3_REV_GE80)) >> 8) |
| |
| #define PHY_RXPWR_ANT3(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_RXPWR_ANT3(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| RXPWR_ANT3_REV_GE80(rxs) : ACPHY_RXPWR_ANT3(rxs))) |
| |
| /* Get the following entries from RXStatus bytes |
| * for RSSI compensation |
| * based on factory calibration |
| * TIA Index |
| * eLNA Index |
| * V_path Switch |
| */ |
| #define PHY_ELNA_IDX_ANT0_REV_GE85(corerev, corerev_min, rxs) \ |
| APRXS_ELNA_IDX_ANT0(rxs, corerev, corerev_min) |
| #define PHY_ELNA_IDX_ANT1_REV_GE85(corerev, corerev_min, rxs) \ |
| APRXS_ELNA_IDX_ANT1(rxs, corerev, corerev_min) |
| #define PHY_TIA_IDX_ANT0_REV_GE85(corerev, corerev_min, rxs) \ |
| APRXS_TIA_IDX_ANT0(rxs, corerev, corerev_min) |
| #define PHY_TIA_IDX_ANT1_REV_GE85(corerev, corerev_min, rxs) \ |
| APRXS_TIA_IDX_ANT1(rxs, corerev, corerev_min) |
| #define PHY_VSW_IDX_ANT0_REV_GE85(corerev, corerev_min, rxs) \ |
| APRXS_VSW_IDX_ANT0(rxs, corerev, corerev_min) |
| #define PHY_VSW_IDX_ANT1_REV_GE85(corerev, corerev_min, rxs) \ |
| APRXS_VSW_IDX_ANT1(rxs, corerev, corerev_min) |
| |
| /** Get RSSI fractional bits */ |
| #define RXPWR_FRAC_REV_GE80(rxs) ((rxs)->ge80.PhyRxStatus_4 & \ |
| (PRXS3_RXPWR_FRAC_REV_GE80)) |
| |
| #define RXPWR_FRAC(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_RXPWR_FRAC(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| RXPWR_FRAC_REV_GE80(rxs) : 0)) |
| |
| /* HECAPPHY PhyRxStatus_4: */ |
| #define PRXS4_DYNBWINNONHT_MASK_REV_GE80 0x1000 |
| #define PRXS4_DYNBWINNONHT_REV_GE80(rxs) ((rxs)->ge80.PhyRxStatus_4 & \ |
| PRXS4_DYNBWINNONHT_MASK_REV_GE80) |
| |
| #define PRXS_PHY_DYNBWINNONHT(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_DYNBWINNONHT(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| PRXS4_DYNBWINNONHT_REV_GE80(rxs) : PRXS5_ACPHY_DYNBWINNONHT(rxs))) |
| |
| /** (corerev >= 80) PhyRxStatus_5: MCSSQ SNR for core 0 and 1 */ |
| #define PRXS5_MCSSQ_SHIFT (8u) |
| #define PRXS5_MCSSQ_CORE0_REV_GE80 (0x00FF) |
| #define PRXS5_MCSSQ_CORE1_REV_GE80 (0xFF00) |
| |
| #define MCSSQ_SNR_ANT0_GE80(rxs) ((rxs)->ge80.PhyRxStatus_5 & PRXS5_MCSSQ_CORE0_REV_GE80) |
| #define MCSSQ_SNR_ANT0(rxs, rev, rev_min) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_MCSSQSNR0(rxs, rev, rev_min) : \ |
| ((rxs)->ge80.PhyRxStatus_5 & PRXS5_MCSSQ_CORE0_REV_GE80)) |
| |
| #define MCSSQ_SNR_ANT1_GE80(rxs) (((rxs)->ge80.PhyRxStatus_5 & PRXS5_MCSSQ_CORE1_REV_GE80) \ |
| >> PRXS5_MCSSQ_SHIFT) |
| #define MCSSQ_SNR_ANT1(rxs, rev, rev_min) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_MCSSQSNR1(rxs, rev, rev_min) : \ |
| (((rxs)->ge80.PhyRxStatus_5 & PRXS5_MCSSQ_CORE1_REV_GE80) \ |
| >> PRXS5_MCSSQ_SHIFT)) |
| |
| /** (corerev >= 80) PhyRxStatus_6: MCSSQ SNR for core 2 and 3 */ |
| #define PRXS6_MCSSQ_SHIFT (8u) |
| #define PRXS6_MCSSQ_CORE2_REV_GE80 (0x00FF) |
| #define PRXS6_MCSSQ_CORE3_REV_GE80 (0xFF00) |
| |
| #define MCSSQ_SNR_ANT2_GE80(rxs) (((rxs)->ge80.phyrxs_rem[0] & \ |
| PRXS6_MCSSQ_CORE2_REV_GE80)) |
| #define MCSSQ_SNR_ANT2(rxs, rev, rev_min) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_MCSSQSNR2(rxs, rev, rev_min) : \ |
| (((rxs)->ge80.phyrxs_rem[0] & PRXS6_MCSSQ_CORE2_REV_GE80))) |
| |
| /* HECAPPHY PhyRxStatus_8 (part of phyrxs_rem[2]) : */ |
| #define PRXS8_CHBWINNONHT_MASK_REV_GE80 0x0100 |
| #define PRXS8_CHBWINNONHT_REV_GE80(rxs) ((rxs)->ge80.phyrxs_rem[2] & \ |
| PRXS8_CHBWINNONHT_MASK_REV_GE80) |
| |
| #define PRXS_PHY_CHBWINNONHT(corerev, corerev_minor, rxs) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_CHBWINNONHT(rxs, corerev, corerev_minor) : (D11REV_GE(corerev, 80) ? \ |
| PRXS8_CHBWINNONHT_REV_GE80(rxs) : PRXS5_ACPHY_CHBWINNONHT(rxs))) |
| |
| /* HE phyrxs_rem[4] */ |
| #define PRXS_REM4_PE_MASK_REV80 0x0380 |
| #define PRXS_REM4_PE_SHIFT_REV80 7u |
| #define PRXS_REM4_RU_TYPE_MASK_REV80 0x1c00 |
| #define PRXS_REM4_RU_TYPE_SHIFT_REV80 10u |
| #define PRXS_REM4_NUM_USER_SHIFT_REV80 13u |
| #define PRXS_REM4_NUM_USER_BIT_MASK_REV80 0xe000 |
| |
| /* HE phyrxs_rem[5] */ |
| #define PRXS_REM5_GI_LTF_MASK_REV80 0x0003 |
| #define PRXS_REM5_GI_LTF_SHIFT_REV80 0u |
| #define PRXS_REM5_11AX_FF_MASK_REV80 0x0700 |
| #define PRXS_REM5_11AX_FF_SHIFT_REV80 8u |
| |
| /* HE phyrxs_rem[6] */ |
| #define PRXS_REM6_MCS_MASK_REV80 0x0f00 |
| #define PRXS_REM6_MCS_SHIFT_REV80 8u |
| #define PRXS_REM6_CODING_MASK_REV80 0x1000 |
| #define PRXS_REM6_CODING_SHIFT_REV80 12u |
| |
| /* HE phyrxs_rem[7] */ |
| #define PRXS_REM7_DCM_MASK_REV80 0x8000 |
| #define PRXS_REM7_DCM_SHIFT_REV80 15u |
| #define PRXS_REM7_TXBF_MASK_REV80 0x4000 |
| #define PRXS_REM7_TXBF_SHIFT_REV80 14u |
| #define PRXS_REM7_NSTS_MASK_REV80 0x3800 |
| #define PRXS_REM7_NSTS_SHIFT_REV80 11u |
| #define PRXS_REM7_RU_ALLOC_MASK_REV80 0x007f |
| #define PRXS_REM7_RU_ALLOC_SHIFT_REV80 0u |
| |
| #define PRXS_STAID_MASK 0x07ff |
| #define PRXS_STAID_SHIFT 0u |
| |
| enum { |
| HE_RU_TYPE_26T = 0, /* 26 tone RU, 0 - 36 */ |
| HE_RU_TYPE_52T = 1, /* 52 tone RU, 37 - 52 */ |
| HE_RU_TYPE_106T = 2, /* 106 tone RU, 53 - 60 */ |
| HE_RU_TYPE_242T = 3, /* 242 tone RU, 61 - 64 */ |
| HE_RU_TYPE_484T = 4, /* 484 tone RU, 65 - 66 */ |
| HE_RU_TYPE_996T = 5, /* 996 tone RU, 67 - 68 */ |
| HE_RU_TYPE_2x996T = 6, /* 2x996 tone RU, 69 */ |
| HE_RU_TYPE_LAST = 7 /* Reserved, Invalid */ |
| }; |
| |
| #define HE_RU_TYPE_MAX 6 |
| |
| /* received PE duration is present in phyrxs_rem[4] bit position [7-9] */ |
| #define D11PPDU_PE_GE80(rxh, corerev) ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[4]) & \ |
| (PRXS_REM4_PE_MASK_REV80)) >> PRXS_REM4_PE_SHIFT_REV80) |
| |
| #define D11PPDU_PE(rxh, corerev, corerev_minor) (AUTO_PHYRXSTS_ENAB() ? \ |
| APRXS_PE(rxh, corerev, corerev_minor) : D11PPDU_PE_GE80(rxh, corerev)) |
| |
| /* received RU type is present in phyrxs_rem[4] bit position [10-11] */ |
| #define D11PPDU_RU_TYPE(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_RU(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[4]) & \ |
| (PRXS_REM4_RU_TYPE_MASK_REV80)) >> PRXS_REM4_RU_TYPE_SHIFT_REV80) : 0)) |
| |
| /* received he num of user type is present in phyrxs_rem[4] bit position [13-15] */ |
| #define D11PPDU_HE_NUM_USER_TYPE(rxh, corerev, corerev_min) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_USTY(rxh, corerev, corerev_min) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[4]) & \ |
| (PRXS_REM4_NUM_USER_BIT_MASK_REV80)) >> PRXS_REM4_NUM_USER_SHIFT_REV80) : 0)) |
| |
| #define D11PPDU_FF_TYPE(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_AXFF(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[5]) & \ |
| (PRXS_REM5_11AX_FF_MASK_REV80)) >> PRXS_REM5_11AX_FF_SHIFT_REV80) : 0)) |
| |
| /* DCM is present in phyrxs_rem[7] byte 27, bit position [7] */ |
| #define D11PPDU_DCM(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_DCM(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[7]) & \ |
| (PRXS_REM7_DCM_MASK_REV80)) >> PRXS_REM7_DCM_SHIFT_REV80) : 0)) |
| |
| /* coding used is present in phyrxs_rem[6] byte:25, bit position [12] */ |
| #define D11PPDU_CODING(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_CODING(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[6]) & \ |
| (PRXS_REM6_CODING_MASK_REV80)) >> PRXS_REM6_CODING_SHIFT_REV80) : 0)) |
| |
| /* spatial reuse 2 / STA-ID */ |
| #define D11PPDU_STAID(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_AX_STAID(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[7]) & \ |
| (PRXS_STAID_MASK)) >> PRXS_STAID_SHIFT) : 0)) |
| |
| #define D11PPDU_TXBF(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_TXBF(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[7]) & \ |
| (PRXS_REM7_TXBF_MASK_REV80)) >> PRXS_REM7_TXBF_SHIFT_REV80) : 0)) |
| |
| /* GI_LTF is present in phyrxs_rem[5] bit position [0-1] */ |
| #define D11PPDU_GI_LTF(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_GILTF(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[5]) & \ |
| (PRXS_REM5_GI_LTF_MASK_REV80)) >> PRXS_REM5_GI_LTF_SHIFT_REV80) : 0)) |
| |
| /* MCS is present in phyrxs_rem[6] - byte 25, bit position [8-11] */ |
| #define D11PPDU_MCS(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_AXMCS(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[6]) & \ |
| (PRXS_REM6_MCS_MASK_REV80)) >> PRXS_REM6_MCS_SHIFT_REV80) : 0)) |
| |
| /* NSTS present in phyrxs_rem[7] bit position [11-13] */ |
| #define D11PPDU_NSTS(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_NSTS(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[7]) & \ |
| (PRXS_REM7_NSTS_MASK_REV80)) >> PRXS_REM7_NSTS_SHIFT_REV80) : 0)) |
| |
| /* RU ALLOC present in phyrxs_rem[7]- byte 26; bit position [6:0] */ |
| #define D11PPDU_RU_ALLOC(rxh, corerev, corerev_minor) \ |
| (AUTO_PHYRXSTS_ENAB() ? APRXS_AX_RUALLOC(rxh, corerev, corerev_minor) : \ |
| (D11REV_GE(corerev, 80) ? ((D11RXHDR_GE80_ACCESS_VAL(rxh, phyrxs_rem[7]) & \ |
| (PRXS_REM7_RU_ALLOC_MASK_REV80)) >> PRXS_REM7_RU_ALLOC_SHIFT_REV80) : 0) |
| |
| /* PHY RX status "Frame Type" field mask. */ |
| #define PRXS_FT_MASK(corerev) \ |
| (D11REV_GE(corerev, 80) ? (PRXS0_FT_MASK_REV_GE80) : \ |
| (PRXS0_FT_MASK_REV_LT80)) |
| |
| /** |
| * ACPHY PhyRxStatus0 SubBand (FinalBWClassification) bit defs |
| * FinalBWClassification is a 4 bit field, each bit representing one 20MHz sub-band |
| * of a channel. |
| */ |
| enum prxs_subband { |
| PRXS_SUBBAND_20LL = 0x0001, |
| PRXS_SUBBAND_20LU = 0x0002, |
| PRXS_SUBBAND_20UL = 0x0004, |
| PRXS_SUBBAND_20UU = 0x0008, |
| PRXS_SUBBAND_40L = 0x0003, |
| PRXS_SUBBAND_40U = 0x000C, |
| PRXS_SUBBAND_80 = 0x000F, |
| PRXS_SUBBAND_20LLL = 0x0001, |
| PRXS_SUBBAND_20LLU = 0x0002, |
| PRXS_SUBBAND_20LUL = 0x0004, |
| PRXS_SUBBAND_20LUU = 0x0008, |
| PRXS_SUBBAND_20ULL = 0x0010, |
| PRXS_SUBBAND_20ULU = 0x0020, |
| PRXS_SUBBAND_20UUL = 0x0040, |
| PRXS_SUBBAND_20UUU = 0x0080, |
| PRXS_SUBBAND_40LL = 0x0003, |
| PRXS_SUBBAND_40LU = 0x000c, |
| PRXS_SUBBAND_40UL = 0x0030, |
| PRXS_SUBBAND_40UU = 0x00c0, |
| PRXS_SUBBAND_80L = 0x000f, |
| PRXS_SUBBAND_80U = 0x00f0, |
| PRXS_SUBBAND_160 = 0x00ff |
| }; |
| |
| enum prxs_subband_bphy { |
| PRXS_SUBBAND_BPHY_20L = 0x0000, |
| PRXS_SUBBAND_BPHY_20U = 0x0001 |
| }; |
| |
| /* ACPHY Gen2 RxStatus defs */ |
| |
| /* ACPHY Gen2 PhyRxStatus_0: */ |
| #define PRXS0_ACPHY2_MUPPDU 0x1000 /**< 0: SU PPDU; 1: MU PPDU */ |
| #define PRXS0_ACPHY2_OBSS 0xE000 /**< OBSS mitigation state */ |
| |
| /* ACPHY Gen2 PhyRxStatus_1: */ |
| #define PRXS1_ACPHY2_SUBBAND_MASK 0xFF00 /**< FinalBWClassification: |
| * 8-bit bitfield of sub-bands occupied by Rx frame |
| */ |
| #define PRXS1_ACPHY2_SUBBAND_SHIFT 8 |
| |
| /* ACPHY Gen2 PhyRxStatus_2: */ |
| #define PRXS2_ACPHY2_MU_INT 0x003F /**< MU interference processing type */ |
| |
| /* ACPHY Gen2 PhyRxStatus_5: */ |
| #define PRXS5_ACPHY2_RSSI_FRAC 0xFF00 /**< RSSI fractional bits */ |
| |
| /* ucode RxStatus1: */ |
| #define RXS_BCNSENT 0x8000 |
| #define RXS_TOFINFO 0x4000 /**< Rxed measurement frame processed by ucode */ |
| #define RXS_GRANTBT 0x2000 /* Indicate medium given to BT */ |
| #define RXS_SECKINDX_MASK_GE64 0x1fe0 |
| #define RXS_SECKINDX_MASK 0x07e0 |
| #define RXS_IS_DEFRAG 0x4 |
| #define RXS_DEFRAG_SHIFT 2 |
| #define RXS_SECKINDX_SHIFT 5 |
| #define RXS_DECERR (1 << 4) |
| #define RXS_DECATMPT (1 << 3) |
| #define RXS_PBPRES (1 << 2) /**< PAD bytes to make IP data 4 bytes aligned */ |
| #define RXS_RESPFRAMETX (1 << 1) |
| #define RXS_FCSERR (1 << 0) |
| |
| /* ucode RxStatus2: */ |
| #define RXS_AMSDU_MASK 1 |
| #define RXS_AGGTYPE_MASK 0x6 |
| #define RXS_AGGTYPE_SHIFT 1 |
| #define RXS_AMSDU_FIRST 1 |
| #define RXS_AMSDU_INTERMEDIATE 0 |
| #define RXS_AMSDU_LAST 2 |
| #define RXS_AMSDU_N_ONE 3 |
| #define RXS_TKMICATMPT (1 << 3) |
| #define RXS_TKMICERR (1 << 4) |
| #define RXS_PHYRXST_PRISEL_CLR (1 << 5) /**< PR113291: When '1', Indicates that the Rx */ |
| /* packet was received while the antenna */ |
| /* (prisel) had been granted to BT. */ |
| #define RXS_PHYRXST_VALID (1 << 8) |
| #define RXS_BCNCLSG (1 << 9) /**< Coleasced beacon packet */ |
| #define RXS_RXANT_MASK 0x3 |
| #define RXS_RXANT_SHIFT_LT80 12 |
| #define RXS_RXANT_SHIFT_GE80 5 |
| #define RXS_LOOPBACK_MODE 4 |
| |
| /* Bit definitions for MRXS word for short rx status. */ |
| /* RXSS = RX Status Short */ |
| #define RXSS_AMSDU_MASK 1 /**< 1: AMSDU */ |
| #define RXSS_AGGTYPE_MASK 0x6 /**< 0 intermed, 1 first, 2 last, 3 single/non-AMSDU */ |
| #define RXSS_AGGTYPE_SHIFT 1 |
| #define RXSS_PBPRES (1 << 3) /**< two-byte PAD prior to plcp */ |
| #define RXSS_HDRSTS (1 << 4) /**< header conversion status. 1 enabled, 0 disabled */ |
| #define RXSS_RES_MASK 0xE0 /**< reserved */ |
| #define RXSS_MSDU_CNT_MASK 0xFF00 /**< index of this AMSDU sub-frame in the AMSDU */ |
| #define RXSS_MSDU_CNT_SHIFT 8 |
| |
| /* RX signal control definitions */ |
| /** PHYRXSTAUS validity checker; in-between ampdu, or rxs status isn't valid */ |
| #define PRXS_IS_VALID(rxh, rev, rev_min) \ |
| ((D11REV_GE(rev, 80) && \ |
| (D11RXHDR_ACCESS_VAL(rxh, rev, rev_min, dma_flags) & \ |
| RXS_PHYRXST_VALID_REV_GE80)) || \ |
| (D11REV_GE(rev, 64) && !(D11RXHDR_ACCESS_VAL(rxh, \ |
| rev, rev_min, dma_flags) & RXS_SHORT_MASK)) || \ |
| (D11RXHDR_ACCESS_VAL(rxh, rev, rev_min, RxStatus2) & RXS_PHYRXST_VALID)) |
| |
| /* RxChan */ |
| #define RXS_CHAN_40 0x1000 |
| #define RXS_CHAN_5G 0x0800 |
| #define RXS_CHAN_ID_MASK 0x07f8 |
| #define RXS_CHAN_ID_SHIFT 3 |
| |
| #define C_BTCX_AGGOFF_BLE (1 << 0) |
| #define C_BTCX_AGGOFF_A2DP (1 << 1) |
| #define C_BTCX_AGGOFF_PER (1 << 2) |
| #define C_BTCX_AGGOFF_MULTIHID (1 << 3) |
| #define C_BTCX_AGG_LMT_SET_HIGH (1 << 4) |
| #define C_BTCX_AGGOFF_ESCO_SLAVE (1 << 5) |
| |
| #define BTCX_HFLG_NO_A2DP_BFR (1 << 0) /**< no check a2dp buffer */ |
| #define BTCX_HFLG_NO_CCK (1 << 1) /**< no cck rate for null or cts2self */ |
| #define BTCX_HFLG_NO_OFDM_FBR (1 << 2) /**< no ofdm fbr for null or cts2self */ |
| #define BTCX_HFLG_NO_INQ_DEF (1 << 3) /**< no defer inquery */ |
| #define BTCX_HFLG_GRANT_BT (1 << 4) /**< always grant bt */ |
| #define BTCX_HFLG_ANT2WL (1 << 5) /**< force prisel to wl */ |
| #define BTCX_HFLG_PS4ACL (1 << 7) /**< use ps null for unsniff acl */ |
| #define BTCX_HFLG_DYAGG (1 << 8) /**< dynamic tx aggregation */ |
| #define BTCX_HFLG_SKIPLMP (1 << 10) /**< no LMP check for 4331 (w 20702 A1/A3) */ |
| #define BTCX_HFLG_ACL_BSD_BLE_SCAN_GRNT (1 << 14) /**< ACL based grant for BLE scan */ |
| /* indication to ucode */ |
| #define BTCX_HFLG2_TRAP_RFACTIVE (1 << 0) /* trap when RfActive too long */ |
| #define BTCX_HFLG2_TRAP_TXCONF (1 << 1) /* trap when coex grants txconf late */ |
| #define BTCX_HFLG2_TRAP_ANTDLY (1 << 2) /* trap when coex grants antdly late */ |
| #define BTCX_HFLG2_TRAP_BTTYPE (1 << 3) /* trap when illegal BT tasktype receive */ |
| /* Bit definitions for M_BTCX_CONFIG */ |
| #define BTCX_CONFIG_FORCE_TRAP (1 << 13) /* Force a specific BTCoex TRAP when set */ |
| |
| /* BTCX_CONFIG bits */ |
| #define C_BTCX_CONFIG_SLOTTED_STATE_1 (1 << 3) |
| #define C_BTCX_CONFIG_SLOTTED_STATE_2 (1 << 4) |
| #define C_BTCX_CONFIG_SLOTTED_STATE_3 (1 << 5) |
| #define C_BTCX_CONFIG_LOW_RSSI (1 << 7) |
| #define C_BTCX_CONFIG_BT_STROBE (1 << 9) |
| #define C_BTCX_CONFIG_SCO_PROT (1 << 10) |
| #define C_BTCX_CFG_CMN_CTS2SELF (1 << 11) |
| #define C_BTCX_CONFIG_HPP_STATE (1 << 15) |
| |
| #define BTC_PARAMS_FW_START_IDX 1000 /**< starting index of FW only btc params */ |
| /** BTC_PARAMS_FW definitions */ |
| typedef enum |
| { |
| // allow rx-agg to be re-enabled after SCO session completes |
| BTC_FW_RX_REAGG_AFTER_SCO = BTC_PARAMS_FW_START_IDX, |
| // RSSI threshold at which SCO grant/deny limits are changed dynamically |
| BTC_FW_RSSI_THRESH_SCO = BTC_PARAMS_FW_START_IDX + 1, |
| // Enable the dynamic LE scan priority |
| BTC_FW_ENABLE_DYN_LESCAN_PRI = BTC_PARAMS_FW_START_IDX + 2, |
| // If Tput(mbps) is above this, then share antenna with BT's LE_SCAN packet type. |
| BTC_FW_LESCAN_LO_TPUT_THRESH = BTC_PARAMS_FW_START_IDX + 3, |
| // If Tput(mbps) is below this, then share antenna with BT's LE_SCAN packet type. |
| // sampled once a second. |
| BTC_FW_LESCAN_HI_TPUT_THRESH = BTC_PARAMS_FW_START_IDX + 4, |
| // Numbers of denials before granting LS scans |
| BTC_FW_LESCAN_GRANT_INT = BTC_PARAMS_FW_START_IDX + 5, |
| // number of times algorighm changes lescn pri |
| BTC_FW_LESCAN_ALG_CNT = BTC_PARAMS_FW_START_IDX + 6, |
| // RSSI threshold at which aggregation will be disabled during frequent BLE activity |
| BTC_FW_RSSI_THRESH_BLE = BTC_PARAMS_FW_START_IDX + 7, |
| // AMPDU Aggregation state requested by BTC |
| BTC_FW_AGG_STATE_REQ = BTC_PARAMS_FW_START_IDX + 8, |
| // Reserving space for parameters used in other projects |
| BTC_FW_RSVD_1 = BTC_PARAMS_FW_START_IDX + 9, |
| BTC_FW_HOLDSCO_LIMIT = BTC_PARAMS_FW_START_IDX + 10, // Lower Limit |
| BTC_FW_HOLDSCO_LIMIT_HI = BTC_PARAMS_FW_START_IDX + 11, // Higher Limit |
| BTC_FW_SCO_GRANT_HOLD_RATIO = BTC_PARAMS_FW_START_IDX + 12, // Low Ratio |
| BTC_FW_SCO_GRANT_HOLD_RATIO_HI = BTC_PARAMS_FW_START_IDX + 13, // High Ratio |
| BTC_FW_HOLDSCO_HI_THRESH = BTC_PARAMS_FW_START_IDX + 14, // BT Period Threshold |
| BTC_FW_MOD_RXAGG_PKT_SZ_FOR_SCO = BTC_PARAMS_FW_START_IDX + 15, |
| /* Modify Rx Aggregation size when SCO/eSCO detected */ |
| BTC_FW_AGG_SIZE_LOW = BTC_PARAMS_FW_START_IDX + 16, |
| /* Agg size when BT period < 7500 ms */ |
| BTC_FW_AGG_SIZE_HIGH = BTC_PARAMS_FW_START_IDX + 17, |
| /* Agg size when BT period >= 7500 ms */ |
| BTC_FW_MOD_RXAGG_PKT_SZ_FOR_A2DP = BTC_PARAMS_FW_START_IDX + 18, |
| /* Enable COEX constraints for TWT scheduling */ |
| BTC_FW_TWT_COEX_CONSTRAINTS_EN = BTC_PARAMS_FW_START_IDX + 19, |
| /* Enable Rx Aggregation for P2P_GO and SOFTAP when ACL/A2DP detected */ |
| BTC_FW_MOD_RXAGG_PKT_SZ_FOR_APMODE_ACL_A2DP = BTC_PARAMS_FW_START_IDX + 20, |
| /* Disable amsdu dynamicaly during Rx limited aggregation */ |
| BTC_FW_DISABLE_AMSDU_DURING_LIM_AGG = BTC_PARAMS_FW_START_IDX + 21, |
| /* Enable acl based grant for ble scan based on number of 2G slots */ |
| BTC_FW_ENABLE_ACL_GRNT_FOR_BLE_SCAN = BTC_PARAMS_FW_START_IDX + 22, |
| /* Threshold slot count for 2g band to Enable acl based grant for ble scan during NAN */ |
| BTC_FW_NAN_THRESHOLD_SLOTS_FOR_2G = BTC_PARAMS_FW_START_IDX + 23, |
| /* BT task bm override for critical chansw slots */ |
| BTC_FW_CHANSW_CRT_OVR_BTTASK_BM_L = BTC_PARAMS_FW_START_IDX + 24, |
| BTC_FW_CHANSW_CRT_OVR_BTTASK_BM_H = BTC_PARAMS_FW_START_IDX + 25, |
| /* Limited Aggr AP check grace period, # of BTC watchdog timeout */ |
| BTC_FW_AGG_AP_GRACE_PERIOD = BTC_PARAMS_FW_START_IDX + 26, |
| /* Limited Aggr AP check buffer limit, sample interval, # of BTC watchdog timeout */ |
| BTC_FW_AGG_AP_BUFLIM_SMPLINTV = BTC_PARAMS_FW_START_IDX + 27, |
| /* Limited Aggr AP check excessive DELBA, sample interval, # of BTC watchdog timeout */ |
| BTC_FW_AGG_AP_DELBA_SMPLINTV = BTC_PARAMS_FW_START_IDX + 28, |
| /* Limited Aggr AP check excessive DELBA, threshold, # of DELBA */ |
| BTC_FW_AGG_AP_DELBA_THRESHOLD = BTC_PARAMS_FW_START_IDX + 29, |
| BTC_FW_MAX_INDICES // Maximum number of btc_fw sw registers |
| } btcParamsFirmwareDefinitions; |
| |
| #define BTC_FW_NUM_INDICES (BTC_FW_MAX_INDICES - BTC_PARAMS_FW_START_IDX) |
| |
| // 1: Re-enable aggregation after SCO |
| #define BTC_FW_RX_REAGG_AFTER_SCO_INIT_VAL 1 |
| |
| // 1: Enable limited aggregation for SCO |
| #define BTC_FW_MOD_RXAGG_PKT_SZ_FOR_SCO_INIT_VAL 0 |
| |
| /* Enable Limited aggregation for HI interval BT periodic task only (>=7.5ms) */ |
| #ifdef WL_BTC_LIMAGG_HI_INT |
| /* RX aggregation packet size when SCO */ |
| #define BTC_FW_AGG_SIZE_LOW_INIT_VAL 0 |
| #else |
| /* RX aggregation packet size when SCO */ |
| #define BTC_FW_AGG_SIZE_LOW_INIT_VAL 1 |
| #endif |
| |
| /* aggregation size when BT period < BT_AMPDU_RESIZE_THRESH */ |
| #define BTC_FW_AGG_SIZE_HIGH_INIT_VAL 2 |
| /* aggregation size when BT period > BT_AMPDU_RESIZE_THRESH */ |
| // 0: disable weak-rssi SCO coex feature. If > 0, adjust SCO COEX algorithm for weak RSSI scenario. |
| #define BTC_FW_RSSI_THRESH_SCO_INIT_VAL 0 |
| |
| // 1: Enable limited aggregation for A2DP |
| #define BTC_FW_MOD_RXAGG_PKT_SZ_FOR_A2DP_INIT_VAL 0 |
| |
| // Enable LE Scan Priority Algorithm 0: Disable, 1: Enable |
| #define BTC_FW_ENABLE_DYN_LESCAN_PRI_INIT_VAL 0 |
| // If WL Tput below 7 mbps, don't grant background LE Scans |
| #define BTC_FW_LESCAN_LO_TPUT_THRESH_INIT_VAL 7 |
| // If WL Tput above 30 mbps, don't grant background LE Scans |
| #define BTC_FW_LESCAN_HI_TPUT_THRESH_INIT_VAL 30 |
| // If LE Priority algorithm is triggered, grant one out of 2 LE_SCAN requests |
| #define BTC_FW_LESCAN_GRANT_INT_INIT_VAL 2 |
| // If RSSI is weaker than -70 dBm and BLE activity is frequent, then disable |
| // RX aggregation, and clamp TX aggregation. |
| #ifdef WL_BTCX_UDM |
| #define BTC_FW_RSSI_THRESH_BLE_INIT_VAL 100 |
| #else |
| #define BTC_FW_RSSI_THRESH_BLE_INIT_VAL 70 |
| #endif |
| #define BTC_FW_HOLDSCO_LIMIT_INIT_VAL 100 |
| #define BTC_FW_HOLDSCO_LIMIT_HI_INIT_VAL 10 |
| #define BTC_FW_SCO_GRANT_HOLD_RATIO_INIT_VAL 1500 |
| #define BTC_FW_SCO_GRANT_HOLD_RATIO_HI_INIT_VAL 1000 |
| #define BTC_FW_HOLDSCO_HI_THRESH_INIT_VAL 7400 |
| #define BTC_FW_TWT_COEX_CONSTRAINTS_EN_INIT_VAL 1 |
| /* Aggregation in AP mode (P2P_GO and SOFTAP) when ACL and A2DP */ |
| #define BTC_FW_MOD_RXAGG_PKT_SZ_FOR_APMODE_ACL_A2DP_INIT_VAL 16 |
| /* Disable amsdu dynamicaly during Rx limited aggregation */ |
| #define BTC_FW_DISABLE_AMSDU_DURING_LIM_AGG_INIT_VAL 1 |
| /* Enable acl based grant for ble scan based on number of 2G slots during NAN */ |
| #define BTC_FW_ENABLE_ACL_GRNT_FOR_BLE_SCAN_INIT_VAL 0 |
| /* Threshold slot count for 2g band to Enable acl based grant for ble |
| * scan during NAN. Setting current value to 8, considering time line is 512ms |
| * Threshold changes dynamically based on different time line |
| */ |
| #define BTC_FW_NAN_THRESHOLD_SLOTS_FOR_2G_INIT_VAL 8 |
| /* BT task bm override for critical chansw slots -initval */ |
| #define BTC_FW_CHANSW_CRT_OVR_BTTASK_BM_L_INIT_VAL 0x0000 |
| #define BTC_FW_CHANSW_CRT_OVR_BTTASK_BM_H_INIT_VAL 0x0020 |
| #define BTC_FW_AGG_AP_GRACE_PERIOD_VAL 1 |
| #define BTC_FW_AGG_AP_BUFLIM_SMPLINTV_VAL 1 |
| #define BTC_FW_AGG_AP_DELBA_SMPLINTV_VAL 5 |
| #define BTC_FW_AGG_AP_DELBA_THRESHOLD_VAL 3 |
| |
| /* NR Coex Params Set/Get via wl btc_params, starting index */ |
| #define NR5GCX_PARAMS_FW_START_IDX 1200 |
| |
| typedef enum NR5GCX_Params { |
| // Min # of PPDU to be tracked for hysteresis |
| NR5GCX_FW_MIN_NUM_PPDU = NR5GCX_PARAMS_FW_START_IDX, |
| // Threshold for data stall detection, percentage |
| NR5GCX_FW_DATA_STALL_TH = NR5GCX_PARAMS_FW_START_IDX + 1, |
| // max number of rate recovery attempts |
| NR5GCX_FW_MAX_NUM_ATTEMPTS = NR5GCX_PARAMS_FW_START_IDX + 2, |
| // Rate recovery rate check duration |
| NR5GCX_FW_RR_RATE_CHK_DUR = NR5GCX_PARAMS_FW_START_IDX + 3, |
| // Rate recovery attempt duration |
| NR5GCX_FW_RR_ATTEMPT_DUR = NR5GCX_PARAMS_FW_START_IDX + 4, |
| // NR grant duration after a unsuccessful rate recovery |
| NR5GCX_FW_RR_UNSC_DUR = NR5GCX_PARAMS_FW_START_IDX + 5, |
| // Threshold for rate recovery, percentage |
| NR5GCX_FW_RECOVERY_TH = NR5GCX_PARAMS_FW_START_IDX + 6, |
| // Threshold for low RSSI |
| NR5GCX_FW_LOWRSSI_TH = NR5GCX_PARAMS_FW_START_IDX + 7, |
| // Maximum number of nr5gcx fw params |
| NR5GCX_FW_MAX_INDICES |
| } NR5GCXParamsFirmwareDefinitions; |
| |
| #define NR5GCX_FW_NUM_INDICES (NR5GCX_FW_MAX_INDICES - NR5GCX_PARAMS_FW_START_IDX) |
| |
| #define NR5GCX_FW_MIN_NUM_PPDU_INIT 10u |
| #define NR5GCX_FW_DATA_STALL_TH_INIT 75u |
| #define NR5GCX_FW_MAX_NUM_ATTEMPTS_INIT 5u |
| #define NR5GCX_FW_RR_RATE_CHK_DUR_INIT_MS 60u /* ms */ |
| #define NR5GCX_FW_RR_ATTEMPT_DUR_INIT_MS 60u /* ms */ |
| #define NR5GCX_FW_RR_UNSC_DUR_INIT_MS 10000u /* ms */ |
| #define NR5GCX_FW_RECOVERY_TH_INIT 50u |
| #define NR5GCX_FW_LOWRSSI_TH_INIT 85u /* dBm */ |
| |
| /* RC1 Coex Params Set/Get via wl btc_params, starting index */ |
| #define RC1CX_PARAMS_FW_START_IDX 1200 |
| |
| typedef enum RC1CX_Params { |
| // Min # of PPDU to be tracked for hysteresis |
| RC1CX_FW_MIN_NUM_PPDU = RC1CX_PARAMS_FW_START_IDX, |
| // Threshold for data stall detection, percentage |
| RC1CX_FW_DATA_STALL_TH = RC1CX_PARAMS_FW_START_IDX + 1, |
| // max number of rate recovery attempts |
| RC1CX_FW_MAX_NUM_ATTEMPTS = RC1CX_PARAMS_FW_START_IDX + 2, |
| // Rate recovery rate check duration |
| RC1CX_FW_RR_RATE_CHK_DUR = RC1CX_PARAMS_FW_START_IDX + 3, |
| // Rate recovery attempt duration |
| RC1CX_FW_RR_ATTEMPT_DUR = RC1CX_PARAMS_FW_START_IDX + 4, |
| // NR grant duration after a unsuccessful rate recovery |
| RC1CX_FW_RR_UNSC_DUR = RC1CX_PARAMS_FW_START_IDX + 5, |
| // Threshold for rate recovery, percentage |
| RC1CX_FW_RECOVERY_TH = RC1CX_PARAMS_FW_START_IDX + 6, |
| // Threshold for low RSSI |
| RC1CX_FW_LOWRSSI_TH = RC1CX_PARAMS_FW_START_IDX + 7, |
| // Maximum number of rc1cx fw params |
| RC1CX_FW_MAX_INDICES |
| } RC1CXParamsFirmwareDefinitions; |
| |
| #define RC1CX_FW_NUM_INDICES (RC1CX_FW_MAX_INDICES - RC1CX_PARAMS_FW_START_IDX) |
| |
| #define RC1CX_FW_MIN_NUM_PPDU_INIT 10u |
| #define RC1CX_FW_DATA_STALL_TH_INIT 75u |
| #define RC1CX_FW_MAX_NUM_ATTEMPTS_INIT 5u |
| #define RC1CX_FW_RR_RATE_CHK_DUR_INIT_MS 60u /* ms */ |
| #define RC1CX_FW_RR_ATTEMPT_DUR_INIT_MS 60u /* ms */ |
| #define RC1CX_FW_RR_UNSC_DUR_INIT_MS 10000u /* ms */ |
| #define RC1CX_FW_RECOVERY_TH_INIT 50u |
| #define RC1CX_FW_LOWRSSI_TH_INIT 85u /* dBm */ |
| |
| #ifdef GPIO_TXINHIBIT |
| /* GPIO based TX_INHIBIT:SWWLAN-109270 */ |
| typedef enum shm_macintstatus_ext_e { |
| C_MISE_GPIO_TXINHIBIT_VAL_NBIT = 0, |
| C_MISE_GPIO_TXINHIBIT_INT_NBIT = 1 |
| } shm_macintstatus_ext_t; |
| #define C_MISE_GPIO_TXINHIBIT_VAL_MASK (1 << C_MISE_GPIO_TXINHIBIT_VAL_NBIT) |
| #define C_MISE_GPIO_TXINHIBIT_INT_MASK (1 << C_MISE_GPIO_TXINHIBIT_INT_NBIT) |
| #endif |
| #define M_PSM_SOFT_REGS 0x0 |
| |
| /** Scratch Reg defs */ |
| typedef enum |
| { |
| S_RSV0 = 0, |
| S_RSV1, |
| S_RSV2, |
| |
| /* scratch registers for Dot11-constants */ |
| S_DOT11_CWMIN, /**< CW-minimum 0x03 */ |
| S_DOT11_CWMAX, /**< CW-maximum 0x04 */ |
| S_DOT11_CWCUR, /**< CW-current 0x05 */ |
| S_DOT11_SRC_LMT, /**< short retry count limit 0x06 */ |
| S_DOT11_LRC_LMT, /**< long retry count limit 0x07 */ |
| S_DOT11_DTIMCOUNT, /**< DTIM-count 0x08 */ |
| |
| /* Tx-side scratch registers */ |
| S_SEQ_NUM, /**< hardware sequence number reg 0x09 */ |
| S_SEQ_NUM_FRAG, /**< seq-num for frags (Set at the start os MSDU 0x0A */ |
| S_FRMRETX_CNT, /**< frame retx count 0x0B */ |
| S_SSRC, /**< Station short retry count 0x0C */ |
| S_SLRC, /**< Station long retry count 0x0D */ |
| S_EXP_RSP, /**< Expected response frame 0x0E */ |
| S_OLD_BREM, /**< Remaining backoff ctr 0x0F */ |
| S_OLD_CWWIN, /**< saved-off CW-cur 0x10 */ |
| S_TXECTL, /**< TXE-Ctl word constructed in scr-pad 0x11 */ |
| S_CTXTST, /**< frm type-subtype as read from Tx-descr 0x12 */ |
| |
| /* Rx-side scratch registers */ |
| S_RXTST, /**< Type and subtype in Rxframe 0x13 */ |
| |
| /* Global state register */ |
| S_STREG, /**< state storage actual bit maps below 0x14 */ |
| |
| S_TXPWR_SUM, /**< Tx power control: accumulator 0x15 */ |
| S_TXPWR_ITER, /**< Tx power control: iteration 0x16 */ |
| S_RX_FRMTYPE, /**< Rate and PHY type for frames 0x17 */ |
| S_THIS_AGG, /**< Size of this AGG (A-MSDU) 0x18 */ |
| |
| S_KEYINDX, /* 0x19 */ |
| S_RXFRMLEN, /**< Receive MPDU length in bytes 0x1A */ |
| |
| /* Receive TSF time stored in SCR */ |
| S_RXTSFTMRVAL_WD3, /**< TSF value at the start of rx 0x1B */ |
| S_RXTSFTMRVAL_WD2, /**< TSF value at the start of rx 0x1C */ |
| S_RXTSFTMRVAL_WD1, /**< TSF value at the start of rx 0x1D */ |
| S_RXTSFTMRVAL_WD0, /**< TSF value at the start of rx 0x1E */ |
| S_RXSSN, /**< Received start seq number for A-MPDU BA 0x1F */ |
| S_RXQOSFLD, /**< Rx-QoS field (if present) 0x20 */ |
| |
| /* Scratch pad regs used in microcode as temp storage */ |
| S_TMP0, /**< stmp0 0x21 */ |
| S_TMP1, /**< stmp1 0x22 */ |
| S_TMP2, /**< stmp2 0x23 */ |
| S_TMP3, /**< stmp3 0x24 */ |
| S_TMP4, /**< stmp4 0x25 */ |
| S_TMP5, /**< stmp5 0x26 */ |
| S_PRQPENALTY_CTR, /**< Probe response queue penalty counter 0x27 */ |
| S_ANTCNT, /**< unsuccessful attempts on current ant. 0x28 */ |
| S_SYMBOL, /**< flag for possible symbol ctl frames 0x29 */ |
| S_RXTP, /**< rx frame type 0x2A */ |
| S_STREG2, /**< extra state storage 0x2B */ |
| S_STREG3, /**< even more extra state storage 0x2C */ |
| S_STREG4, /**< ... 0x2D */ |
| S_STREG5, /**< remember to initialize it to zero 0x2E */ |
| |
| S_UNUSED_0X2F, /**< No longer used 0x2F */ |
| S_UPTR, /* Use this to initialize utrace 0x30 */ |
| S_ADJPWR_IDX, /**< PR 37101 WAR, adj_pwr_idx 0x31 */ |
| S_CUR_PTR, /**< Temp pointer for A-MPDU re-Tx SHM table 0x32 */ |
| S_REVID4, /**< 0x33 */ |
| S_INDX, /**< 0x34 */ |
| S_ADDR0, /**< 0x35 */ |
| S_ADDR1, /**< 0x36 */ |
| S_ADDR2, /**< 0x37 */ |
| S_ADDR3, /**< 0x38 */ |
| S_ADDR4, /**< 0x39 */ |
| S_ADDR5, /**< 0x3A */ |
| S_TMP6, /**< 0x3B */ |
| S_KEYINDX_BU, /**< Backup for Key index 0x3C */ |
| S_MFGTEST_TMP0, /**< Temp register used for RX test calculations 0x3D */ |
| S_RXESN, /**< Received end sequence number for A-MPDU BA 0x3E */ |
| S_STREG6, /**< 0x3F */ |
| } ePsmScratchPadRegDefinitions; |
| |
| #define C_STREG_SLOWCAL_PD_NBIT 0x00000004 /* BIT 2 slow clock cal is pending */ |
| #define C_STREG_SLOWCAL_DN_NBIT 0x00000008 /* BIT 3 slow clock cal is done */ |
| |
| #define S_BEACON_INDX S_OLD_BREM |
| #define S_PRS_INDX S_OLD_CWWIN |
| #define S_BTCX_BT_DUR S_REVID4 |
| #define S_PHYTYPE S_SSRC |
| #define S_PHYVER S_SLRC |
| |
| /* IHR GPT_2 is corerev >= 3 */ |
| #define TSF_GPT_2_STAT 0x133 |
| #define TSF_GPT_2_CTR_L 0x134 |
| #define TSF_GPT_2_CTR_H 0x135 |
| #define TSF_GPT_2_VAL_L 0x136 |
| #define TSF_GPT_2_VAL_H 0x137 |
| |
| /* IHR TSF_GPT STAT values */ |
| #define TSF_GPT_PERIODIC (1 << 12) |
| #define TSF_GPT_ADJTSF (1 << 13) |
| #define TSF_GPT_USETSF (1 << 14) |
| #define TSF_GPT_ENABLE (1 << 15) |
| |
| /** ucode mac statistic counters in shared memory */ |
| #define MACSTAT_OFFSET_SZ 64 |
| #define MACSTAT_REV80_OFFSET_SZ 118 |
| |
| /* ucode macstat txfunflw offset */ |
| #define UCODEMSTAT_TXFUNFL_BLK ((0x70 * 2) + (0x76 * 2)) |
| |
| /* MACSTAT offset to SHM address */ |
| #define MACSTAT_ADDR(x, offset) (M_PSM2HOST_STATS(x) + (offset)) |
| |
| /** ucode mac statistic counters in shared memory, base addr defined in M_UCODE_MACSTAT1 */ |
| typedef struct macstat1 { |
| uint16 txndpa; /* + 0 (0x0) */ |
| uint16 txndp; /* + 1*2 (0x2) */ |
| uint16 txsf; /* + 2*2 (0x4) */ |
| uint16 txcwrts; /* + 3*2 (0x6) */ |
| uint16 txcwcts; /* + 4*2 (0x8) */ |
| uint16 txbfm; /* + 5*2 (0xa) */ |
| uint16 rxndpaucast; /* + 6*2 (0xc) */ |
| uint16 bferptrdy; /* + 7*2 (0xe) */ |
| uint16 rxsfucast; /* + 8*2 (0x10) */ |
| uint16 rxcwrtsucast; /* + 9*2 (0x12) */ |
| uint16 rxcwctsucast; /* +10*2 (0x14) */ |
| uint16 rx20s; /* +11*2 (0x16) */ |
| uint16 bcntrim; /* +12*2 (0x18) */ |
| uint16 btc_rfact_l; /* +13*2 (0x1a) */ |
| uint16 btc_rfact_h; /* +14*2 (0x1c) */ |
| uint16 btc_txconf_l; /* +15*2 (0x1e) : cnt */ |
| uint16 btc_txconf_h; /* +16*2 (0x20) : cnt */ |
| uint16 btc_txconf_durl; /* +17*2 (0x22) : dur */ |
| uint16 btc_txconf_durh; /* +18*2 (0x24) : dur */ |
| uint16 rxsecrssi0; /* +19*2 (0x26) : high bin */ |
| uint16 rxsecrssi1; /* +20*2 (0x28) : med bin */ |
| uint16 rxsecrssi2; /* +21*2 (0x2a) : low bin */ |
| uint16 rxpri_durl; /* +22*2 (0x2c) : dur */ |
| uint16 rxpri_durh; /* +23*2 (0x2e) : dur */ |
| uint16 rxsec20_durl; /* +24*2 (0x30) : dur */ |
| uint16 rxsec20_durh; /* +25*2 (0x32) : dur */ |
| uint16 rxsec40_durl; /* +26*2 (0x34) : dur */ |
| uint16 rxsec40_durh; /* +27*2 (0x36) : dur */ |
| } macstat1_t; |
| |
| #define MX_UCODEX_MACSTAT (0x40 * 2) |
| /* ucodex mac statistic counters in shared memory */ |
| #define MACXSTAT_OFFSET_SZ 6 |
| |
| /* psm2 statistic counters in shared memory, base addr defined in MX_PSM2HOST_STATS */ |
| typedef enum { |
| MCXSTOFF_MACXSUSP = 0, |
| MCXSTOFF_M2VMSG = 1, |
| MCXSTOFF_V2MMSG = 2, |
| MCXSTOFF_MBOXOUT = 3, |
| MCXSTOFF_MUSND = 4, |
| MCXSTOFF_SFB2V = 5 |
| } macxstat_offset_t; |
| |
| /* dot11 core-specific control flags */ |
| #define SICF_MCLKE 0x0001 /* Mac core clock Enable */ |
| #define SICF_FCLKON 0x0002 /* Force clocks On */ |
| #define SICF_PCLKE 0x0004 /**< PHY clock enable */ |
| #define SICF_PRST 0x0008 /**< PHY reset */ |
| #define SICF_MPCLKE 0x0010 /**< MAC PHY clockcontrol enable */ |
| #define SICF_FREF 0x0020 /**< PLL FreqRefSelect (corerev >= 5) */ |
| /* NOTE: the following bw bits only apply when the core is attached |
| * to a NPHY (and corerev >= 11 which it will always be for NPHYs). |
| */ |
| #ifdef SICF_160M_BWMASK_DEF |
| #define SICF_BWMASK(macrev) (D11REV_GE(macrev, 86) ? 0x00e0 : 0x00c0) /**< phy clkmsk */ |
| #define SICF_BW160(macrev) (D11REV_GE(macrev, 86) ? 0x0080 : 0x00c0) /**< 160MHz BW */ |
| #define SICF_BW80(macrev) (D11REV_GE(macrev, 86) ? 0x0060 : 0x00c0) /**< 80MHz BW */ |
| #define SICF_BW40(macrev) (D11REV_GE(macrev, 86) ? 0x0040 : 0x0080) /**< 40MHz BW */ |
| #define SICF_BW20(macrev) (D11REV_GE(macrev, 86) ? 0x0020 : 0x0040) /**< 20MHz BW */ |
| #define SICF_BW10(macrev) (D11REV_GE(macrev, 86) ? 0x0000 : 0x0000) /**< 10MHz BW */ |
| #else |
| #define SICF_BWMASK 0x00c0 /**< phy clock mask (b6 & b7) */ |
| #define SICF_BW160 0x00c0 /**< 160MHz BW */ |
| #define SICF_BW80 0x00c0 /**< 80MHz BW */ |
| #define SICF_BW40 0x0080 /**< 40MHz BW (160MHz phyclk) */ |
| #define SICF_BW20 0x0040 /**< 20MHz BW (80MHz phyclk) */ |
| #define SICF_BW10 0x0000 /**< 10MHz BW (40MHz phyclk) */ |
| #endif |
| #define SICF_DAC 0x0300 /**< Highspeed DAC mode control field */ |
| #define SICF_GMODE 0x2000 /**< gmode enable */ |
| |
| /* Macmode / Phymode / Opmode are used interchangebly sometimes |
| * even though they all mean the same. Going ahead with the HW |
| * signal name - using phymode here on (even though we know its |
| * a misnomer). Applicable to d11 corerev >= 50 ---- ACPHY only |
| */ |
| #define SICF_PHYMODE_SHIFT 16 |
| #define SICF_PHYMODE 0xf0000 /**< mask */ |
| |
| #define SICF_160CLKSEL 0x100000u /* main phy clock speed selection */ |
| |
| /* dot11 core-specific status flags */ |
| #define SISF_2G_PHY 0x0001 /**< 2.4G capable phy (corerev >= 5) */ |
| #define SISF_5G_PHY 0x0002 /**< 5G capable phy (corerev >= 5) */ |
| #define SISF_FCLKA 0x0004 /**< FastClkAvailable (corerev >= 5) */ |
| #define SISF_DB_PHY 0x0008 /**< Dualband phy (corerev >= 11) */ |
| |
| /* === End of MAC reg, Beginning of PHY(b/a/g/n) reg, radio and LPPHY regs are separated === */ |
| |
| /* Bits in phytest(0x0a): */ |
| #define TST_DDFS 0x2000 |
| #define TST_TXFILT1 0x0800 |
| #define TST_UNSCRAM 0x0400 |
| #define TST_CARR_SUPP 0x0200 |
| #define TST_DC_COMP_LOOP 0x0100 |
| #define TST_LOOPBACK 0x0080 |
| #define TST_TXFILT0 0x0040 |
| #define TST_TXTEST_ENABLE 0x0020 |
| #define TST_TXTEST_RATE 0x0018 |
| #define TST_TXTEST_PHASE 0x0007 |
| |
| /* phytest txTestRate values */ |
| #define TST_TXTEST_RATE_1MBPS 0 |
| #define TST_TXTEST_RATE_2MBPS 1 |
| #define TST_TXTEST_RATE_5_5MBPS 2 |
| #define TST_TXTEST_RATE_11MBPS 3 |
| #define TST_TXTEST_RATE_SHIFT 3 |
| |
| typedef struct shm_mbss_prq_entry_s shm_mbss_prq_entry_t; |
| BWL_PRE_PACKED_STRUCT struct shm_mbss_prq_entry_s { |
| struct ether_addr ta; |
| uint8 prq_info[2]; |
| uint8 time_stamp; |
| uint8 flags; /**< bit 0 HT STA Indication, bit 7:1 Reserved */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| typedef enum shm_mbss_prq_ft_e { |
| SHM_MBSS_PRQ_FT_CCK, |
| SHM_MBSS_PRQ_FT_OFDM, |
| SHM_MBSS_PRQ_FT_MIMO, |
| SHM_MBSS_PRQ_FT_RESERVED |
| } shm_mbss_prq_ft_t; |
| |
| #define SHM_MBSS_PRQ_FT_COUNT SHM_MBSS_PRQ_FT_RESERVED |
| |
| #define SHM_MBSS_PRQ_ENT_FRAMETYPE(entry) ((entry)->prq_info[0] & 0x3) |
| #define SHM_MBSS_PRQ_ENT_UPBAND(entry) ((((entry)->prq_info[0] >> 2) & 0x1) != 0) |
| |
| /** What was the index matched? */ |
| #define SHM_MBSS_PRQ_ENT_UC_BSS_IDX(entry) (((entry)->prq_info[0] >> 2) & 0x3) |
| #define SHM_MBSS_PRQ_ENT_PLCP0(entry) ((entry)->prq_info[1]) |
| |
| /** Was this directed to a specific SSID or BSSID? If bit clear, quantity known */ |
| #define SHM_MBSS_PRQ_ENT_DIR_SSID(entry) \ |
| ((((entry)->prq_info[0] >> 6) == 0) || ((entry)->prq_info[0] >> 6) == 1) |
| #define SHM_MBSS_PRQ_ENT_DIR_BSSID(entry) \ |
| ((((entry)->prq_info[0] >> 6) == 0) || ((entry)->prq_info[0] >> 6) == 2) |
| |
| #define SHM_MBSS_PRQ_ENT_TIMESTAMP(entry) ((entry)->time_stamp) |
| /** Was the probe request from a ht STA or a legacy STA */ |
| #define SHM_MBSS_PRQ_ENT_HTSTA(entry) ((entry)->flags & 0x1) |
| |
| typedef struct d11ac_tso_s d11ac_tso_t; |
| |
| BWL_PRE_PACKED_STRUCT struct d11ac_tso_s { |
| uint8 flag[3]; |
| uint8 sfh_hdr_offset; |
| uint16 tso_mss; /**< tso segment size */ |
| uint16 msdu_siz; /**< msdu size */ |
| uint32 tso_payload_siz; /**< total byte cnt in tcp payload */ |
| uint16 ip_hdr_offset; /**< relative to the start of txd header */ |
| uint16 tcp_hdr_offset; /**< relative to start of txd header */ |
| } BWL_POST_PACKED_STRUCT; |
| |
| /* toe_ctl TCP offload engine register definitions */ |
| #define TOE_CTL_DISAB (1u << 0) |
| #define TOE_CTL_MASK (1u << 0) |
| #define TOE_CTL_ENAB (0xFFFEu) |
| #define TOE_CLK_GATING_DISAB (1u << 1) |
| |
| #define TSO_HDR_TOE_FLAG_OFFSET (0u) |
| |
| #define TOE_F0_HDRSIZ_NORMAL (1u << 0) |
| #define TOE_F0_PASSTHROUGH (1u << 1) |
| #define TOE_F0_TCPSEG_EN (1u << 3) |
| #define TOE_F0_IPV4 (1u << 4) |
| #define TOE_F0_IPV6 (1u << 5) |
| #define TOE_F0_TCP (1u << 6) |
| #define TOE_F0_UDP (1u << 7) |
| |
| #define TOE_F1_IPV4_CSUM_EN (1u << 0) |
| #define TOE_F1_TCPUDP_CSUM_EN (1u << 1) |
| #define TOE_F1_PSEUDO_CSUM_EN (1u << 2) |
| #define TOE_F1_FRAG_ALLOW (1u << 5) |
| #define TOE_F1_FRAMETYPE_1 (1u << 6) |
| #define TOE_F1_FRAMETYPE_2 (1u << 7) |
| #define TOE_F1_FT_MASK (TOE_F1_FRAMETYPE_1 | TOE_F1_FRAMETYPE_2) |
| #define TOE_F1_FT_SHIFT (6u) |
| |
| #define TOE_F2_TXD_HEAD_SHORT (1u << 0) |
| #define TOE_F2_EPOCH_SHIFT (1u) |
| #define TOE_F2_EPOCH (1u << TOE_F2_EPOCH_SHIFT) |
| #define TOE_F2_EPOCH_EXT (1u << 2) |
| #define TOE_F2_EPOCH_EXT_MASK (TOE_F2_EPOCH | TOE_F2_EPOCH_EXT) |
| #define TOE_F2_AMSDU_AGGR_EN (1u << 4) |
| #define TOE_F2_AMSDU_CSUM_EN (1u << 5) |
| #define TOE_F2_AMSDU_FS_MID (1u << 6) |
| #define TOE_F2_AMSDU_FS_LAST (1u << 7) |
| |
| #define TOE_TXDMA_FLAGS_AMSDU_FIRST (0x14u) |
| #define TOE_TXDMA_FLAGS_AMSDU_MID (0x24u) |
| #define TOE_TXDMA_FLAGS_AMSDU_LAST (0x34u) |
| |
| /* This marks the end of a packed structure section. */ |
| #include <packed_section_end.h> |
| |
| #define SHM_BYT_CNT 0x2 /**< IHR location */ |
| #define MAX_BYT_CNT 0x600 /**< Maximum frame len */ |
| |
| /* WOWL Template Regions */ |
| #define WOWL_NS_CHKSUM (0x57 * 2) |
| #define WOWL_PSP_TPL_BASE (0x334 * 2) |
| #define WOWL_GTK_MSG2 (0x434 * 2) |
| #define WOWL_NS_OFFLOAD (0x634 * 2) |
| #define T_KEEPALIVE_0 (0x6b4 * 2) |
| #define T_KEEPALIVE_1 ((0x6b4 + 0x40) * 2) |
| #define WOWL_ARP_OFFLOAD (0x734 * 2) |
| #define WOWL_TX_FIFO_TXRAM_BASE (0x774 * 2) /**< conservative, leave 1KB for GTKM2 */ |
| |
| /* template regions for 11ac */ |
| #define D11AC_WOWL_PSP_TPL_BASE (0x4c0 * 2) |
| #define D11AC_WOWL_GTK_MSG2 (0x5c0 * 2) /**< for core rev >= 42 */ |
| #define WOWL_NS_OFFLOAD_GE42 (0x7c0 * 2) |
| #define T_KEEPALIVE_0_GE42 (0x840 * 2) |
| #define T_KEEPALIVE_1_GE42 ((0x840 + 0x40) * 2) |
| #define WOWL_ARP_OFFLOAD_GE42 (0x8c0 * 2) |
| #define D11AC_WOWL_TX_FIFO_TXRAM_BASE (0x900 * 2) /**< GTKM2 for core rev >= 42 */ |
| |
| /* Event definitions */ |
| #define WOWL_MAGIC (1 << 0) /**< Wakeup on Magic packet */ |
| #define WOWL_NET (1 << 1) /**< Wakeup on Netpattern */ |
| #define WOWL_DIS (1 << 2) /**< Wakeup on loss-of-link due to Disassoc/Deauth */ |
| #define WOWL_RETR (1 << 3) /**< Wakeup on retrograde TSF */ |
| #define WOWL_BCN (1 << 4) /**< Wakeup on loss of beacon */ |
| #define WOWL_TST (1 << 5) /**< Wakeup after test */ |
| #define WOWL_M1 (1 << 6) /**< Wakeup after PTK refresh */ |
| #define WOWL_EAPID (1 << 7) /**< Wakeup after receipt of EAP-Identity Req */ |
| #define WOWL_PME_GPIO (1 << 8) /**< Wakeind via PME(0) or GPIO(1) */ |
| #define WOWL_NEEDTKIP1 (1 << 9) /**< need tkip phase 1 key to be updated by the driver */ |
| #define WOWL_GTK_FAILURE (1 << 10) /**< enable wakeup if GTK fails */ |
| #define WOWL_EXTMAGPAT (1 << 11) /**< support extended magic packets */ |
| #define WOWL_ARPOFFLOAD (1 << 12) /**< support ARP/NS offloading */ |
| #define WOWL_WPA2 (1 << 13) /**< read protocol version for EAPOL frames */ |
| #define WOWL_KEYROT (1 << 14) /**< If the bit is set, use key rotaton */ |
| #define WOWL_BCAST (1 << 15) /**< If the bit is set, frm received was bcast frame */ |
| |
| #define MAXBCNLOSS (1 << 13) - 1 /**< max 12-bit value for bcn loss */ |
| |
| /* UCODE shm view: |
| * typedef struct { |
| * uint16 offset; // byte offset |
| * uint16 patternsize; // the length of value[.] in bytes |
| * uchar bitmask[MAXPATTERNSIZE/8]; // 16 bytes, the effect length is (patternsize+7)/8 |
| * uchar value[MAXPATTERNSIZE]; // 128 bytes, the effect length is patternsize. |
| * } netpattern_t; |
| */ |
| #define NETPATTERNSIZE (148) /* 128 value + 16 mask + 4 offset + 4 patternsize */ |
| #define MAXPATTERNSIZE 128 |
| #define MAXMASKSIZE MAXPATTERNSIZE/8 |
| |
| /** Security Algorithm defines */ |
| #define WOWL_TSCPN_SIZE 6 |
| #define WOWL_TSCPN_COUNT 4 /**< 4 ACs */ |
| #define WOWL_TSCPN_BLK_SIZE (WOWL_TSCPN_SIZE * WOWL_TSCPN_COUNT) |
| |
| #define WOWL_SECSUITE_GRP_ALGO_MASK 0x0007 |
| #define WOWL_SECSUITE_GRP_ALGO_SHIFT 0 |
| #define WOWL_SECSUITE_ALGO_MASK 0x0700 |
| #define WOWL_SECSUITE_ALGO_SHIFT 8 |
| |
| #define EXPANDED_KEY_RNDS 10 |
| #define EXPANDED_KEY_LEN 176 /* the expanded key from KEK (4*11*4, 16-byte state, 11 rounds) */ |
| |
| /* Organization of Template RAM is as follows |
| * typedef struct { |
| * uint8 AES_XTIME9DBE[1024]; |
| * uint8 AES_INVSBOX[256]; |
| * uint8 AES_KEYW[176]; |
| * } AES_TABLES_t; |
| */ |
| /* See dot11_firmware/diag/wmac_tcl/wmac_762_wowl_gtk_aes: proc write_aes_tables, |
| * for an example of writing those tables into the tx fifo buffer. |
| */ |
| |
| typedef struct { |
| uint16 MacTxControlLow; /**< mac-tx-ctl-low word */ |
| uint16 MacTxControlHigh; /**< mac-tx-ctl-high word */ |
| uint16 PhyTxControlWord; /**< phy control word */ |
| uint16 PhyTxControlWord_1; /**< extra phy control word for mimophy */ |
| union { |
| uint16 XtraFrameTypes; /**< frame type for RTS/FRAG fallback (used only for AES) */ |
| uint16 bssenc_pos; /**< BssEnc includes key ID , for corerev >= 42 */ |
| } u1; |
| uint8 plcp[6]; /**< plcp of template */ |
| |
| uint16 mac_frmtype; /**< MAC frame type for GTK MSG2, can be |
| * dot11_data frame (0x20) or dot11_QoS_Data frame (0x22). |
| */ |
| uint16 frm_bytesize; /**< number of bytes in the template, it includes: |
| * PLCP, MAC header, IV/EIV, the data payload |
| * (eth-hdr and EAPOL-Key), TKIP MIC |
| */ |
| uint16 payload_wordoffset; /**< the word offset of the data payload */ |
| |
| /* ALIGN */ |
| uint16 seqnum; /**< Sequence number for this frame */ |
| uint8 seciv[18]; /**< 10-byte TTAK used for TKIP, 8-byte IV/EIV. |
| * See <SecurityInitVector> in the general tx descriptor. |
| */ |
| } wowl_templ_ctxt_t; |
| |
| #define WOWL_TEMPL_CTXT_LEN 42 /**< For making sure that no PADs are needed */ |
| #define WOWL_TEMPL_CTXT_FRMTYPE_DATA 0x2 |
| #define WOWL_TEMPL_CTXT_FRMTYPE_QOS 0x22 |
| |
| /** constant tables required for AES key unwrapping for key rotation */ |
| extern uint16 aes_invsbox[128]; |
| extern uint16 aes_xtime9dbe[512]; |
| |
| #define MAX_MPDU_SPACE (D11_TXH_LEN + 1538) |
| |
| /* Bits in TXE_BMCCTL */ |
| #define BMCCTL_INITREQ_SHIFT 0 |
| #define BMC_CTL_DONE (1 << BMCCTL_INITREQ_SHIFT) |
| #define BMCCTL_RESETSTATS_SHIFT 1 |
| #define BMCCTL_TXBUFSIZE_SHIFT 2 |
| #define BMCCTL_LOOPBACK_SHIFT 5 |
| #define BMCCTL_TXBUFSZ_MASK ((1 << BMCCTL_LOOPBACK_SHIFT) - (1 << BMCCTL_TXBUFSIZE_SHIFT)) |
| #define BMCCTL_CLKGATEEN_SHIFT 8 |
| |
| /* Bits in TXE_BMCConfig */ |
| #define BMCCONFIG_BUFCNT_SHIFT 0 |
| #define BMCCONFIG_DISCLKGATE_SHIFT 13 |
| #define BMCCONFIG_BUFCNT_MASK ((1 << BMCCONFIG_DISCLKGATE_SHIFT) - (1 << BMCCONFIG_BUFCNT_SHIFT)) |
| |
| /* Bits in TXE_BMCStartAddr */ |
| #define BMCSTARTADDR_STRTADDR_MASK 0x3ff |
| |
| /* Bits in TXE_BMCDescrLen */ |
| #define BMCDescrLen_ShortLen_SHIFT 0 |
| #define BMCDescrLen_LongLen_SHIFT 8 |
| |
| /* Bits in TXE_BMCAllocCtl */ |
| #define BMCAllocCtl_AllocCount_SHIFT 0 |
| /* Rev==50 || Rev>52 |
| * BMCAllocCtl.AllocCount [0:10] |
| * BMCAllocCtl.AllocThreshold [11:14] |
| * !Rev50 |
| * BMCAllocCtl.AllocCount [0:7] |
| * BMCAllocCtl.AllocThreshold [8:15] |
| */ |
| #define BMCAllocCtl_AllocThreshold_SHIFT_Rev50 11 |
| #define BMCAllocCtl_AllocThreshold_SHIFT 8 |
| |
| /* Bits in TXE_BMCCmd1 */ |
| #define BMCCMD1_TIDSEL_SHIFT 1 |
| #define BMCCMD1_RDSRC_SHIFT 6 |
| #define BMCCmd1_RXMapPassThru_SHIFT 12 |
| #define BMCCMD1_BQSelNum_SHIFT 1u |
| #define BMCCMD1_BQSelType_SHIFT 7u |
| #define BMCCMD1_RDSRC_Group0 0u /* register itself */ |
| #define BMCCMD1_RDSRC_Group1 1u /* staged max/min */ |
| #define BMCCMD1_RDSRC_Group2 2u /* staged max/previous min */ |
| #define BMCCMD1_RDSRC_Group3 3u /* active max/min */ |
| #define BMCCMD1_RDSRC_SHIFT_rev80 10u |
| #define BMCCMD1_CoreSel_SHIFT 13u |
| #define BMCCMD1_CoreSel_SHIFT_rev80 15u |
| |
| /* Bits in TXE_BMCCmd */ |
| #define BMCCmd_TIDSel_SHIFT 0 |
| #define BMCCmd_Enable_SHIFT 4 |
| #define BMCCmd_ReleasePreAlloc_SHIFT 5 |
| #define BMCCmd_ReleasePreAllocAll_SHIFT 6 |
| #define BMCCmd_UpdateBA_SHIFT 7 |
| #define BMCCmd_Consume_SHIFT 8 |
| #define BMCCmd_Aggregate_SHIFT 9 |
| #define BMCCmd_UpdateRetryCount_SHIFT 10 |
| #define BMCCmd_DisableTID_SHIFT 11 |
| |
| #define BMCCmd_BQSelType_TX 0 |
| #define BMCCmd_BQSelType_RX 1 |
| #define BMCCmd_BQSelType_Templ 2 |
| |
| /* Bits in TXE_BMCCMD for rev >= 80 */ |
| #define BMCCmd_BQSelType_MASK_Rev80 0x00c0 |
| #define BMCCmd_BQSelType_SHIFT_Rev80 6 |
| #define BMCCmd_Enable_SHIFT_rev80 8 |
| #define BMCCmd_ReleasePreAllocAll_SHIFT_rev80 10 |
| |
| /* Bits in TXE_BMCCmd1 */ |
| #define BMCCmd1_Minmaxappall_SHIFT 0 |
| #define BMCCmd1_Minmaxlden_SHIFT 5 |
| #define BMCCmd1_Minmaxffszlden_SHIFT 8 |
| #define BMCCmd_Core1_Sel_MASK 0x2000 |
| |
| /* Bits in TXE_BMCStatCtl */ |
| #define BMCStatCtl_TIDSel_SHIFT 0u |
| #define BMCStatCtl_STATSel_SHIFT 4u |
| #define BMCStatCtl_BQSelNum_SHIFT 0u |
| #define BMCStatCtl_BQSelType_SHIFT 6u |
| #define BMCStatCtl_STATSel_SHIFT_rev80 8u |
| |
| /* Bits in BMVpConfig */ |
| #define BMCVPConfig_SingleVpModePortA_SHIFT 4 |
| |
| /* Bits in TXE_PsmMSDUAccess */ |
| #define PsmMSDUAccess_TIDSel_SHIFT 0 |
| #define PsmMSDUAccess_MSDUIdx_SHIFT 4 |
| #define PsmMSDUAccess_ReadBusy_SHIFT 14 |
| #define PsmMSDUAccess_WriteBusy_SHIFT 15 |
| |
| /* Bits in TXE_PsmMSDUAccess for rev >= 80 */ |
| #define PsmMSDUAccess_BQSelType_SHIFT 5 |
| #define PsmMSDUAccess_MSDUIdx_SHIFT_rev80 7 |
| #define PsmMSDUAccess_BQSelType_Templ 2 |
| #define PsmMSDUAccess_BQSelType_TX 0 |
| |
| #ifdef WLRSDB |
| #define MAX_RSDB_MAC_NUM 2 |
| #else |
| #define MAX_RSDB_MAC_NUM 1 |
| #endif |
| #define MAX_MIMO_MAC_NUM 1 |
| |
| #ifdef WL_SCAN_CORE |
| #define MAX_MAC_CORE_NUM (MAX_RSDB_MAC_NUM + 1) |
| #else |
| #define MAX_MAC_CORE_NUM (MAX_RSDB_MAC_NUM) |
| #endif /* WL_SCAN_CORE */ |
| |
| #define MAC_CORE_UNIT_0 0x0u /**< First mac core unit */ |
| #define MAC_CORE_UNIT_1 0x1u /**< Second mac core unit */ |
| |
| /* HW unit of scan core. |
| * This is used to overwrite the tunables specific to scan core |
| */ |
| #define SCAN_CORE_UNIT 0x2u |
| |
| /* Supported phymodes / macmodes / opmodes */ |
| #define SINGLE_MAC_MODE 0x0 /**< only single mac is enabled */ |
| #define DUAL_MAC_MODE 0x1 /**< enables dual mac */ |
| /* (JIRA: CRDOT11ACPHY-652) Following two #defines support |
| * exclusive reg access to core 0/1 in MIMO mode |
| */ |
| #define SUPPORT_EXCLUSIVE_REG_ACCESS_CORE0 0x2 |
| #define SUPPORT_EXCLUSIVE_REG_ACCESS_CORE1 0x4 /**< not functional in 4349A0 */ |
| #define SUPPORT_CHANNEL_BONDING 0x8 /**< enables channel bonding, |
| * supported in single mac mode only |
| */ |
| #define SCAN_CORE_ACTIVE 0x10 /* scan core enabled for background DFS */ |
| |
| #define PHYMODE_MIMO (SINGLE_MAC_MODE) |
| #define PHYMODE_80P80 (SINGLE_MAC_MODE | SUPPORT_CHANNEL_BONDING) |
| #define PHYMODE_RSDB_SISO_0 (DUAL_MAC_MODE | SUPPORT_EXCLUSIVE_REG_ACCESS_CORE0) |
| #define PHYMODE_RSDB_SISO_1 (DUAL_MAC_MODE | SUPPORT_EXCLUSIVE_REG_ACCESS_CORE1) |
| #define PHYMODE_RSDB (PHYMODE_RSDB_SISO_0 | PHYMODE_RSDB_SISO_1) |
| #define PHYMODE_BGDFS 31 |
| #define PHYMODE_3x3_1x1 31 |
| |
| #define RX_INTR_FIFO_0 0x1 /**< FIFO-0 interrupt */ |
| #define RX_INTR_FIFO_1 0x2 /**< FIFO-1 interrupt */ |
| #define RX_INTR_FIFO_2 0x4 /**< FIFO-2 interrupt */ |
| |
| #define MAX_RX_FIFO 3 |
| |
| #define RX_CTL_FIFOSEL_SHIFT 8 |
| #define RX_CTL_FIFOSEL_MASK (0x3 << RX_CTL_FIFOSEL_SHIFT) |
| |
| #define RCO_EN (0x1u) /**< Receive checksum offload */ |
| |
| /* MAC_PTM_CTRL1 bit definitions */ |
| #define PTM_RX_TMSTMP_CAPTURE_EN 0x0001u |
| #define PTM_TX_TMSTMP_CAPTURE_EN 0x0001u |
| #define PTM_TMSTMP_OVERRIDE_EN 0x1000u |
| |
| /* For corerev >= 64 |
| * Additional DMA descriptor flags for AQM Descriptor. These are used in |
| * conjunction with the descriptor control flags defined in sbhnddma.h |
| */ |
| /* AQM DMA Descriptor control flags 1 */ |
| #define D64_AQM_CTRL1_SOFPTR 0x0000FFFF /* index of the descr which |
| * is SOF decriptor in DMA table |
| */ |
| #define D64_AQM_CTRL1_EPOCH 0x00010000 /* Epoch bit for the frame */ |
| #define D64_AQM_CTRL1_NUMD_MASK 0x00F00000 /* NumberofDescriptors(NUMD) */ |
| #define D64_AQM_CTRL1_NUMD_SHIFT 20 |
| #define D64_AQM_CTRL1_AC_MASK 0x0F000000 /* AC of the current frame */ |
| #define D64_AQM_CTRL1_AC_SHIFT 24 |
| |
| /* AQM DMA Descriptor control flags 2 */ |
| #define D64_AQM_CTRL2_MPDULEN_MASK 0x00003FFF /* Length of the entire MPDU */ |
| #define D64_AQM_CTRL2_TXDTYPE 0x00080000 /* When set to 1 the long form of the |
| * TXD is used for the frame. |
| */ |
| /* For corerev >= 83 |
| * DMA descriptor flags for AQM Descriptor. These are used in |
| * conjunction with the descriptor control flags defined in sbhnddma.h |
| */ |
| /* AQM DMA Descriptor control flags 1 */ |
| #define D11_REV83_AQM_DESC_CTRL1_SOFPTR 0x0000FFFFu /* index of the descr which |
| * is SOF decriptor in DMA table |
| */ |
| #define D11_REV83_AQM_DESC_CTRL1_EPOCH_SHIFT 16u |
| #define D11_REV83_AQM_DESC_CTRL1_EPOCH (1u << D11_REV83_AQM_DESC_CTRL1_EPOCH_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL1_EPOCH_EXT_SHIFT 17u |
| #define D11_REV83_AQM_DESC_CTRL1_EPOCH_EXT (1u << \ |
| D11_REV83_AQM_DESC_CTRL1_EPOCH_EXT_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL1_EPOCH_MASK (D11_REV83_AQM_DESC_CTRL1_EPOCH | \ |
| D11_REV83_AQM_DESC_CTRL1_EPOCH_EXT) |
| #define D11_REV83_AQM_DESC_CTRL1_RESV1 0x00040000u /* RESERVED */ |
| #define D11_REV83_AQM_DESC_CTRL1_FRAGALLOW_SHIFT 19u /* Fragmentation allowance flag |
| * shift. |
| */ |
| #define D11_REV83_AQM_DESC_CTRL1_FRAGALLOW (1u << D11_REV83_AQM_DESC_CTRL1_FRAGALLOW_SHIFT) |
| /* Fragmentation allowance flag |
| * of the frame |
| */ |
| #define D11_REV83_AQM_DESC_CTRL1_NUMD_SHIFT 20u /* NumberofDescriptors(NUMD) */ |
| #define D11_REV83_AQM_DESC_CTRL1_NUMD_MASK (0xFu << D11_REV83_AQM_DESC_CTRL1_NUMD_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL1_AC_SHIFT 24u /* AC of the current frame */ |
| #define D11_REV83_AQM_DESC_CTRL1_AC_MASK (0xFu << D11_REV83_AQM_DESC_CTRL1_AC_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL1_ET 0x10000000u /* End of table */ |
| #define D11_REV83_AQM_DESC_CTRL1_IC 0x20000000u /* Interrupt on Completion */ |
| #define D11_REV83_AQM_DESC_CTRL1_RESV2 0x40000000u /* Used to be EF: End of frame, |
| * and would have been set to 1. |
| */ |
| #define D11_REV83_AQM_DESC_CTRL1_RESV3 0x80000000u /* Used to be SF: Start of Frame, |
| * and would have been set to 1 |
| */ |
| |
| /* AQM DMA Descriptor control flags 2 */ |
| #define D11_REV83_AQM_DESC_CTRL2_MPDULEN_MASK 0x00003FFFu /* Length of the entire MPDU */ |
| #define D11_REV83_AQM_DESC_CTRL2_FTYPE_SHIFT 14u /* Frame Type, Indicate whether |
| * frame is Data, Management or |
| * Control Frame. 2 bits: |
| * 2'b00=Data, 2'b01=Management, |
| * 2'b10=Control, 2'b11=Invalid |
| * value |
| */ |
| #define D11_REV83_AQM_DESC_CTRL2_FTYPE_MASK (0x3u << D11_REV83_AQM_DESC_CTRL2_FTYPE_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL2_PTXDLENIDX_SHIFT 16u /* pTxD length index in 4-deep table */ |
| #define D11_REV83_AQM_DESC_CTRL2_PTXDLENIDX_MASK (0x3u << \ |
| D11_REV83_AQM_DESC_CTRL2_PTXDLENIDX_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL2_PT 0x00040000u /* Parity bit. Choose a |
| * value such that the entire |
| * descriptor haseven parity |
| */ |
| #define D11_REV83_AQM_DESC_CTRL2_USERIT 0x00080000u /* If set, the Rate Table Index and |
| * RIT entry are fetched into SHM by |
| * hardware. Otherwise, software |
| * uses pTxD to convey this |
| * information to ucode |
| */ |
| #define D11_REV83_AQM_DESC_CTRL2_USELIT 0x00100000u /* If set, the Link Info Table Index |
| * and LIT entry are fetched into |
| * SHM by hardware. Otherwise, |
| * software uses pTxD to convey this |
| * information to ucode |
| */ |
| #define D11_REV83_AQM_DESC_CTRL2_LIT_SHIFT 21u /* LTI(Link info Table Index) */ |
| #define D11_REV83_AQM_DESC_CTRL2_LIT_MASK (0x3Fu << D11_REV83_AQM_DESC_CTRL2_LIT_SHIFT) |
| #define D11_REV83_AQM_DESC_CTRL2_RIT_SHIFT 27u /* bit[4:0] of RTI(Rate info Table Index) */ |
| #define D11_REV83_AQM_DESC_CTRL2_RIT_MASK (0x1Fu << D11_REV83_AQM_DESC_CTRL2_RIT_SHIFT) |
| |
| /* AQM DMA Descriptor control flags 3 */ |
| #define D11_REV86_AQM_DESC_CTRL3_RTI_BIT5 0x00000001u /* bit[5] of RTI (cont'd from ctrl2) */ |
| #define D11_REV86_AQM_DESC_CTRL3_RTI_BIT5_MASK 1u /* bit[5] of RTI (cont'd from ctrl2) */ |
| #define D11_REV86_AQM_DESC_CTRL3_RTI_BIT5_SHIFT 0u |
| #define D11_REV83_AQM_DESC_CTRL3_AGGR_ID 0x0000000Eu /* Aggregation ID */ |
| #define D11_REV83_AQM_DESC_CTRL3_CO 0x00000010u /* Coherency */ |
| #define D11_REV84_AQM_DESC_CTRL3_TXDPTR_SHIFT 5u /* TxD ptr */ |
| #define D11_REV84_AQM_DESC_CTRL3_TXDPTR_MASK 0xFFFFFFu /* bit[23:0] of TxD addr */ |
| #define D11_REV86_AQM_DESC_CTRL3_TID_SHIFT 29u /* TID for BSR */ |
| #define D11_REV86_AQM_DESC_CTRL3_TID_MASK (0x7u << D11_REV86_AQM_DESC_CTRL3_TID_SHIFT) |
| |
| /* values for psm_patchcopy_ctrl (0x1AC) post corerev 60 */ |
| #define PSM_PATCHCC_PMODE_MASK (0x3) |
| #define PSM_PATCHCC_PMODE_RAM (0) /* default */ |
| #define PSM_PATCHCC_PMODE_ROM_RO (1) |
| #define PSM_PATCHCC_PMODE_ROM_PATCH (2) |
| |
| #define PSM_PATCHCC_PENG_TRIGGER_SHIFT (2) |
| #define PSM_PATCHCC_PENG_TRIGGER_MASK (1 << PSM_PATCHCC_PENG_TRIGGER_SHIFT) |
| #define PSM_PATCHCC_PENG_TRIGGER (1 << PSM_PATCHCC_PENG_TRIGGER_SHIFT) |
| |
| #define PSM_PATCHCC_PCTRL_RST_SHIFT (3) |
| #define PSM_PATCHCC_PCTRL_RST_MASK (0x3 << PSM_PATCHCC_PCTRL_RST_SHIFT) |
| #define PSM_PATCHCC_PCTRL_RST_RESET (0x0 << PSM_PATCHCC_PCTRL_RST_SHIFT) |
| #define PSM_PATCHCC_PCTRL_RST_HW (0x1 << PSM_PATCHCC_PCTRL_RST_SHIFT) |
| |
| #define PSM_PATCHCC_COPYEN_SHIFT (5) |
| #define PSM_PATCHCC_COPYEN_MASK (1 << PSM_PATCHCC_COPYEN_SHIFT) |
| #define PSM_PATCHCC_COPYEN (1 << PSM_PATCHCC_COPYEN_SHIFT) |
| |
| #define PSM_PATCHCC_UCIMGSEL_SHIFT (16) |
| #define PSM_PATCHCC_UCIMGSEL_MASK (0x30000) |
| #define PSM_PATCHCC_UCIMGSEL_DS0 (0x00000) /* default image */ |
| #define PSM_PATCHCC_UCIMGSEL_DS1 (0x10000) /* image 1 */ |
| |
| /* patch copy delay for psm: 2millisec */ |
| #define PSM_PATCHCOPY_DELAY (2000) |
| |
| /* START-below WAS in d11_if_shm.h which we can move to auto shm. |
| * Some of them are offsets, but some of them are not given by ucode [possibly legacy] |
| * so, not taken care by autoshm. |
| */ |
| |
| /* Addr is byte address used by SW; offset is word offset used by uCode */ |
| |
| /** Per AC TX limit settings */ |
| #define M_AC_TXLMT_ADDR(x, _ac) (M_AC_TXLMT_BLK(x) + (2 * (_ac))) |
| |
| /** delay from end of PLCP reception to RxTSFTime */ |
| #define M_APHY_PLCPRX_DLY 3 |
| #define M_BPHY_PLCPRX_DLY 4 |
| |
| /* btcx debug shmem size */ |
| #define C_BTCX_DBGBLK_SZ 6 /**< Number of 16bit words */ |
| #define C_BTCX_DBGBLK2_SZ 11 /* size of statistics at 2nd SHM segment */ |
| |
| #define C_BTCX_STATS_DBGBLK_SZ 18 /* total size of statistics at A2DP stats */ |
| #define C_BTCX_A2DP_PRI_SZ 6 /* size of a2dp priority counters stats */ |
| #define C_BTCX_A2DP_BUFCNT_SZ 8 /* size of a2dp buffer counters stats */ |
| #define C_BTCX_ANT_GRANT_SZ 4 /* size of ant granted duration to BT */ |
| #define C_BTCX_STATS_ECNTR_BLK_SZ C_BTCX_STATS_DBGBLK_SZ /* blk size for btcx ecounters */ |
| |
| #define D11_DMA_CHANNELS 6 |
| |
| /* WME shared memory */ |
| #define M_EDCF_STATUS_OFF(x) (0x007 * 2) |
| |
| /* Beacon-related parameters */ |
| #define M_BCN_LI(x) M_PS_MORE_DTIM_TBTT(x) /**< beacon listen interval */ |
| |
| /* prerev 40 defines */ |
| #define D11_PRE40_M_SECKINDXALGO_BLK(x) (0x2ea * 2) |
| |
| /* corerev 40 defines */ |
| /* BLK SIZE needs to change for GE64 */ |
| #define D11_POST80_MAX_KEY_SIZE 32 |
| #define D11_PRE80_MAX_KEY_SIZE 16 |
| |
| #define D11_MAX_KEY_SIZE(_corerev) ((D11REV_GE(_corerev, 80)) ? \ |
| D11_POST80_MAX_KEY_SIZE : D11_PRE80_MAX_KEY_SIZE) |
| |
| #define M_SECKINDXALGO_BLK_SZ(_corerev) (AMT_SIZE(_corerev) + 4 /* default keys */) |
| |
| #define C_CTX_PCTLWD_POS (0x4 * 2) |
| |
| #define D11_MAX_TX_FRMS 32 /**< max frames allowed in tx fifo */ |
| |
| /* Current channel number plus upper bits */ |
| #define D11_CURCHANNEL_5G 0x0100; |
| #define D11_CURCHANNEL_40 0x0200; |
| #define D11_CURCHANNEL_MAX 0x00FF; |
| |
| #define INVALIDFID 0xffff |
| |
| #define D11_RT_DIRMAP_SIZE 16 |
| |
| /** Rate table entry offsets */ |
| #define M_RT_PRS_PLCP_POS(x) 10 |
| #define M_RT_PRS_DUR_POS(x) 16 |
| #define M_RT_OFDM_PCTL1_POS(x) 18 |
| #define M_RT_TXPWROFF_POS(x) 20 |
| #define M_REV40_RT_TXPWROFF_POS(x) 14 |
| |
| #define MIMO_MAXSYM_DEF 0x8000 /* 32k */ |
| #define MIMO_MAXSYM_MAX 0xffff /* 64k */ |
| |
| #define WATCHDOG_8TU_DEF_LT42 5 |
| #define WATCHDOG_8TU_MAX_LT42 10 |
| #define WATCHDOG_8TU_DEF 3 |
| #define WATCHDOG_8TU_MAX 4 |
| |
| #define M_PKTENG_RXAVGPWR_ANT(x, w) (M_MFGTEST_RXAVGPWR_ANT0(x) + (w) * 2) |
| |
| /* M_MFGTEST_NUM (pkt eng) bit definitions */ |
| #define MFGTEST_TXMODE 0x0001 /* TX frames indefinitely */ |
| #define MFGTEST_RXMODE 0x0002 /* RX frames */ |
| #define MFGTEST_RXMODE_ACK 0x0402 /* RX frames with sending ACKs back */ |
| #define MFGTEST_RXMODE_FWD2FW 0x8000 /* RX frames - forward packet to the fw */ |
| #define MFGTEST_TXMODE_FRMCNT 0x0101 /* TX frames by frmcnt */ |
| #define MFGTEST_RU_TXMODE 0x0011 /* RU frames TX indefinetly */ |
| #define MFGTEST_RU_TXMODE_FRMCNT 0x0111 /* RU TX frames by frmcnt */ |
| |
| /* UOTA interface bit definitions */ |
| enum { |
| C_UOTA_CNTSRT_NBIT = 0, /* 0 OTA rx frame count start bit (14 LSB's) */ |
| C_UOTA_RXFST_NBIT = 14, /* 14 indicating first frame */ |
| C_UOTA_RSSION_NBIT = 15, /* 15 OTA rx ON bit position */ |
| }; |
| |
| #define M_EDCF_QLEN(x) (M_EDCF_QINFO1_OFFSET(x)) |
| #define M_PWRIND_MAP(x, core) (M_PWRIND_BLKS(x) + ((core)<<1)) |
| |
| #define M_BTCX_MAX_INDEX 320u |
| #define M_BTCX_BACKUP_SIZE 130 |
| #define BTCX_AMPDU_MAX_DUR 2500 |
| |
| #define ADDR_STAMON_NBIT (1 << 10) /* STA monitor bit in AMT_INFO_BLK entity */ |
| |
| #ifdef WLP2P_UCODE |
| |
| /** The number of scheduling blocks */ |
| #ifdef BCMFUZZ /* need more for fuzzing */ |
| #define M_P2P_BSS_MAX 8 |
| #else |
| #define M_P2P_BSS_MAX 4 |
| #endif /* BCMFUZZ */ |
| |
| /** WiFi P2P interrupt block positions */ |
| #define M_P2P_I_BLK_SZ 4 |
| #define M_P2P_I_BLK_OFFSET(x) (M_P2P_INTR_BLK(x) - M_P2P_INTF_BLK(x)) |
| #define M_P2P_I_BLK(x, b) (M_P2P_I_BLK_OFFSET(x) + (M_P2P_I_BLK_SZ * (b) * 2)) |
| #define M_P2P_I(x, b, i) (M_P2P_I_BLK(x, b) + ((i) * 2)) |
| |
| #define M_P2P_I_PRE_TBTT 0 /**< pretbtt, wake up just before beacon reception */ |
| #define M_P2P_I_CTW_END 1 /**< CTWindow ends */ |
| #define M_P2P_I_ABS 2 /**< absence period start, trigger for switching channels */ |
| #define M_P2P_I_PRS 3 /**< presence period starts */ |
| |
| /** P2P hps flags */ |
| #define M_P2P_HPS_CTW(b) (1 << (b)) |
| #define M_P2P_HPS_NOA(b) (1 << ((b) + M_P2P_BSS_MAX)) |
| |
| /** WiFi P2P address attribute block */ |
| #define M_ADDR_BMP_BLK_SZ 12 |
| #define M_ADDR_RANDMAC_BMP_BLK_SZ 40u |
| |
| #define M_ADDR_BMP_BLK(x, b) (M_ADDR_BMP_BLK_OFFSET(x) + ((b) * 2)) |
| |
| #define ADDR_BMP_RA (1 << 0) /**< Receiver Address (RA) */ |
| #define ADDR_BMP_TA (1 << 1) /**< Transmitter Address (TA) */ |
| #define ADDR_BMP_BSSID (1 << 2) /**< BSSID */ |
| #define ADDR_BMP_AP (1 << 3) /**< Infra-BSS Access Point (AP) */ |
| #define ADDR_BMP_STA (1 << 4) /**< Infra-BSS Station (STA) */ |
| #define ADDR_BMP_P2P_DISC (1 << 5) /**< P2P Device */ |
| #define ADDR_BMP_P2P_GO (1 << 6) /**< P2P Group Owner */ |
| #define ADDR_BMP_P2P_GC (1 << 7) /**< P2P Client */ |
| #define ADDR_BMP_BSS_IDX_MASK (3 << 8) /**< BSS control block index */ |
| #define ADDR_BMP_BSS_IDX_SHIFT 8 |
| |
| /** WiFi P2P address starts from this entry in RCMTA */ |
| #define P2P_ADDR_STRT_INDX (RCMTA_SIZE - M_ADDR_BMP_BLK_SZ) |
| |
| /* WiFi P2P per BSS control block positions. |
| * all time related fields are in units of (1<<P2P_UCODE_TIME_SHIFT)us unless noted otherwise. |
| */ |
| |
| #define P2P_UCODE_TIME_SHIFT 7 |
| #define M_P2P_BSS_BLK_SZ 12 |
| #define M_P2P_BSS_BLK_OFFSET(x) (M_P2P_PERBSS_BLK(x) - M_P2P_INTF_BLK(x)) |
| #define M_P2P_BSS_BLK(x, b) (M_P2P_BSS_BLK_OFFSET(x) + (M_P2P_BSS_BLK_SZ * (b) * 2)) |
| #define M_P2P_BSS(x, b, p) (M_P2P_BSS_BLK(x, b) + (p) * 2) |
| #define M_P2P_BSS_BCN_INT(x, b) (M_P2P_BSS_BLK(x, b) + (0 * 2)) /**< beacon interval */ |
| #define M_P2P_BSS_DTIM_PRD(x, b) (M_P2P_BSS_BLK(x, b) + (1 * 2)) /**< DTIM period */ |
| #define M_P2P_BSS_ST(x, b) (M_P2P_BSS_BLK(x, b) + (2 * 2)) /**< current state */ |
| #define M_P2P_BSS_N_PRE_TBTT(x, b) (M_P2P_BSS_BLK(x, b) + (3 * 2)) /**< next pretbtt time */ |
| #define M_P2P_BSS_CTW(x, b) (M_P2P_BSS_BLK(x, b) + (4 * 2)) /**< CTWindow duration */ |
| #define M_P2P_BSS_N_CTW_END(x, b) (M_P2P_BSS_BLK(x, b) + (5 * 2)) /**< next CTWindow end */ |
| #define M_P2P_BSS_NOA_CNT(x, b) (M_P2P_BSS_BLK(x, b) + (6 * 2)) /**< NoA count */ |
| #define M_P2P_BSS_N_NOA(x, b) (M_P2P_BSS_BLK(x, b) + (7 * 2)) /**< next absence time */ |
| #define M_P2P_BSS_NOA_DUR(x, b) (M_P2P_BSS_BLK(x, b) + (8 * 2)) /**< absence period */ |
| #define M_P2P_BSS_NOA_TD(x, b) (M_P2P_BSS_BLK(x, b) + (9 * 2)) |
| /**< presence period (int - dur) */ |
| #define M_P2P_BSS_NOA_OFS(x, b) (M_P2P_BSS_BLK(x, b) + (10 * 2)) |
| /* last 7 bits of interval in us */ |
| #define M_P2P_BSS_DTIM_CNT(x, b) (M_P2P_BSS_BLK(x, b) + (11 * 2)) |
| /**< DTIM count */ |
| |
| /* M_P2P_BSS_ST word positions. */ |
| #define M_P2P_BSS_ST_CTW (1 << 0) /**< BSS is in CTWindow */ |
| #define M_P2P_BSS_ST_SUPR (1 << 1) /**< BSS is suppressing frames */ |
| #define M_P2P_BSS_ST_ABS (1 << 2) /**< BSS is in absence period */ |
| #define M_P2P_BSS_ST_WAKE (1 << 3) |
| #define M_P2P_BSS_ST_AP (1 << 4) /**< BSS is Infra-BSS AP */ |
| #define M_P2P_BSS_ST_STA (1 << 5) /**< BSS is Infra-BSS STA */ |
| #define M_P2P_BSS_ST_GO (1 << 6) /**< BSS is P2P Group Owner */ |
| #define M_P2P_BSS_ST_GC (1 << 7) /**< BSS is P2P Client */ |
| #define M_P2P_BSS_ST_IBSS (1 << 8) /**< BSS is an IBSS */ |
| #define M_P2P_BSS_ST_AWDL (1 << 9) /* BSS is AWDL */ |
| #define M_P2P_BSS_ST_NAN (1 << 10) /**< BSS is NAN */ |
| #define M_P2P_BSS_ST_MULTIDTIM (1 << 11) /* BSS is Muti-DTIM enabled */ |
| |
| /** WiFi P2P TSF block positions */ |
| #define M_P2P_TSF_BLK_SZ 4 |
| #define M_P2P_TSF_BLK_OFFSET(x) (M_P2P_TSF_OFFSET_BLK(x) - M_P2P_INTF_BLK(x)) |
| #define M_P2P_TSF_BLK(x, b) (M_P2P_TSF_BLK_OFFSET(x) + (M_P2P_TSF_BLK_SZ * (b) * 2)) |
| #define M_P2P_TSF(x, b, w) (M_P2P_TSF_BLK(x, b) + (w) * 2) |
| |
| #define M_P2P_TSF_DRIFT_OFFSET(x) (M_P2P_TSF_DRIFT_WD0(x) - M_P2P_INTF_BLK(x)) |
| #define M_P2P_TSF_DRIFT(x, w) (M_P2P_TSF_DRIFT_OFFSET(x) + (w) * 2) |
| |
| #define M_P2P_GO_CHANNEL_OFFSET(x) (M_P2P_GO_CHANNEL(x) - M_P2P_INTF_BLK(x)) |
| #define M_P2P_GO_IND_BMP_OFFSET(x) (M_P2P_GO_IND_BMP(x) - M_P2P_INTF_BLK(x)) |
| |
| /** |
| * M_P2P_GO_IND_BMP now has multiple fields: |
| * 7:0 - GO_IND_BMP |
| * 10:8 - BSS Index |
| * 15:11 - Reserved |
| */ |
| #define M_P2P_GO_IND_BMP_MASK (0xFF) |
| #define M_P2P_BSS_INDEX_MASK (0x700) |
| #define M_P2P_BSS_INDEX_SHIFT_BITS (8) |
| |
| /* per BSS PreTBTT */ |
| /* BOM 768.0 and above */ |
| #define M_P2P_PRE_TBTT_OFFSET(x) (M_P2P_PRETBTT_BLK(x) - M_P2P_INTF_BLK(x)) |
| #define M_P2P_PRE_TBTT(x, b) (M_P2P_PRE_TBTT_OFFSET(x) + ((b) * 2)) /**< in us */ |
| |
| /* Reserve bottom of RCMTA for P2P Addresses */ |
| #define WSEC_MAX_RCMTA_KEYS (54 - M_ADDR_BMP_BLK_SZ) |
| #else |
| #define WSEC_MAX_RCMTA_KEYS 54 |
| #endif /* WLP2P_UCODE */ |
| |
| #define TXCOREMASK 0x0F |
| #define SPATIAL_SHIFT 8 |
| #define MAX_COREMASK_BLK 5 |
| #define COREMASK_BLK_TRIG_FRAMES (MAX_COREMASK_BLK + 1) |
| |
| #define BPHY_ONE_CORE_TX (1 << 15) /**< enable TX ant diversity for 11b frames */ |
| |
| #define M_WLCX_CONFIG_EN(x) 0x1 /**< 1: enable wifi coex */ |
| #define M_WLCX_CONFIG_MASTER(x) 0x2 /**< 1: Coex Master(5357) */ |
| |
| /* ucode debug status codes */ |
| #define DBGST_INACTIVE 0 /**< not valid really */ |
| #define DBGST_INIT 1 /**< after zeroing SHM, before suspending at init */ |
| #define DBGST_ACTIVE 2 /**< "normal" state */ |
| #define DBGST_SUSPENDED 3 /**< suspended */ |
| #define DBGST_ASLEEP 4 /**< asleep (PS mode) */ |
| #define DBGST_SLP2WAKE 7 /* On wake up path. */ |
| |
| /** |
| * Defines for Self Mac address (used currently for CTS2SELF frames |
| * generated by BTCX ucode for protection purposes) in SHM. GE40 only. |
| */ |
| #define M_MYMAC_ADDR_L(x) (M_MYMAC_ADDR(x)) |
| #define M_MYMAC_ADDR_M(x) (M_MYMAC_ADDR(x) + (1*2)) |
| #define M_MYMAC_ADDR_H(x) (M_MYMAC_ADDR(x) + (2*2)) |
| |
| /* Re-uses M_SSID */ |
| #define SHM_MBSS_BCNLEN0(x) M_SSID(x) |
| |
| #define SHM_MBSS_CLOSED_NET(x) (0x80) /**< indicates closed network */ |
| |
| /** SSID Search Engine entries */ |
| #define SHM_MBSS_SSIDSE_BASE_ADDR(x) (0) |
| #define SHM_MBSS_SSIDSE_BLKSZ(x) (36) |
| #define SHM_MBSS_SSIDLEN_BLKSZ (4) |
| #define SHM_MBSS_SSID_BLKSZ (32) |
| |
| /* END New for ucode template based mbss */ |
| |
| /** Definitions for PRQ fifo data */ |
| |
| #define SHM_MBSS_PRQ_ENTRY_BYTES 10 /**< Size of each PRQ entry */ |
| #define SHM_MBSS_PRQ_ENTRY_COUNT 12 /**< Number of PRQ entries */ |
| #define SHM_MBSS_PRQ_TOT_BYTES (SHM_MBSS_PRQ_ENTRY_BYTES * SHM_MBSS_PRQ_ENTRY_COUNT) |
| |
| #define M_WOWL_NOBCN (0x06c * 2) /**< loss of bcn value */ |
| |
| #define M_KEK(x) M_EAPOLMICKEY_BLK(x) + (0x10 * 2) /* < KEK for WEP/TKIP */ |
| |
| #define M_ARPRESP_BYTESZ_OFFSET 0 /**< 2 bytes; ARP resp pkt size */ |
| #define M_NA_BYTESZ_0_OFFSET 2 /**< 2 bytes ; NA pkt size */ |
| #define M_NA_BYTESZ_1_OFFSET 4 /**< 2 bytes ; NA pkt size */ |
| #define M_KEEPALIVE_BYTESZ_0_OFFSET 6 /**< 2 bytes; size of first keepalive */ |
| #define M_KEEPALIVE_BYTESZ_1_OFFSET 8 /**< 2 bytes; size of second keepalive */ |
| #define M_NPAT_ARPIDX_OFFSET 10 /**< 2 bytes; net pattern index of ARP */ |
| #define M_NPAT_NS0IDX_OFFSET 12 /**< 2 bytes; net pattern index of NS 0 */ |
| #define M_NPAT_NS1IDX_OFFSET 14 /**< 2 bytes; net pattern index of NS 1 */ |
| #define M_EXTWAKEPATTERN_0_OFFSET 16 /**< 6 bytes; ext magic pattern */ |
| #define M_EXTWAKEPATTERN_U0_OFFSET 22 /**< 8 bytes; unaligned ext magic pattern */ |
| #define M_KEEPALIVE_INTVL_0_OFFSET 30 /**< 2 bytes; in no of beacon intervals */ |
| #define M_KEEPALIVE_INTVL_1_OFFSET 32 /**< 2 bytes; in no of beacon intervals */ |
| |
| #define M_COREMASK_BLK_WOWL_L30 (0x298 * 2) |
| |
| /* corerev > 29 && corerev < 40 */ |
| #define M_COREMASK_BLK_WOWL (0x7e8 *2) |
| |
| /* corerev >= 42 */ |
| #define D11AC_M_COREMASK_BLK_WOWL (0x1b0*2) |
| |
| #define M_EXTLNA_PWRSAVE(x) M_RADIO_PWR(x) /**< External LNA power control support */ |
| |
| /* D11AC shm location changes */ |
| #define D11AC_T_NULL_TPL_BASE (0x16 * 2) |
| #define D11AC_T_NULL_TPL_SIZE_BYTES (24) |
| #define D11_T_BCN0_TPL_BASE T_BCN0_TPL_BASE |
| #define D11AC_T_BCN0_TPL_BASE (0x100 * 2) |
| #define D11_T_BCN1_TPL_BASE T_BCN1_TPL_BASE |
| #define D11AC_T_BCN1_TPL_BASE (0x240 * 2) |
| #define D11AC_T_GACT_TWT_INFO_TPL_BASE (0xB0 * 2) |
| #define D11AC_T_GACT_TWT_INFO_TPL_SIZE_BYTES (36) |
| |
| /* The response (ACK/BA) phyctrl words */ |
| #define D11AC_RSP_TXPCTL0 (0x4c * 2) |
| #define D11AC_RSP_TXPCTL1 (0x4d * 2) |
| |
| #define D11AC_T_PRS_TPL_BASE (0x380 * 2) |
| |
| #define D11_M_RT_PRS_PLCP_POS(x) M_RT_PRS_PLCP_POS(x) |
| #define D11_M_RT_PRS_DUR_POS(x) M_RT_PRS_DUR_POS(x) |
| #define D11AC_M_RT_PRS_PLCP_POS 8 |
| #define D11AC_M_RT_PRS_DUR_POS 12 |
| |
| /* Field definitions for M_REV40_RT_TXPWROFF_POS */ |
| #define M_REV40_RT_HTTXPWR_OFFSET_MASK 0x01f8 /**< bit 8:3 */ |
| #define M_REV40_RT_HTTXPWR_OFFSET_SHIFT 3 |
| |
| /* for axphy */ |
| #define M_REV80_RT_TXPWR_OFFSET_MASK 0xff00 /* bit 15:8 */ |
| #define M_REV80_RT_TXPWR_OFFSET_SHIFT 9 /* 8 (byte align) + 1 (convert from S5.1 to S5.2) */ |
| |
| /* shmem locations for Beamforming */ |
| /* shmem defined with prefix M_ are in shmem */ |
| #define shm_addr(base, offset) (((base)+(offset))*2) |
| |
| #define C_BFI_REFRESH_THR_OFFSET (1u) |
| #define C_BFI_NDPA_TXLMT_OFFSET (2u) |
| #define C_BFI_NRXC_OFFSET (3u) |
| #define C_BFI_MLBF_LUT_OFFSET (4u) // for corerev < 64 only |
| |
| #define C_BFI_BLK_SIZE(corerev) ((D11REV_GE(corerev, 86) ? 18u: 16u)) |
| |
| /* BFI block definitions (Beamforming) */ |
| #define C_BFI_BFRIDX_POS (0) |
| #define C_BFI_NDPA_TST_POS (1) |
| #define C_BFI_NDPA_TXCNT_POS (2) |
| #define C_BFI_NDPA_SEQ_POS (3) |
| #define C_BFI_NDPA_FCTST_POS (4) |
| #define C_BFI_BFRCTL_POS (5) |
| #define C_BFI_BFR_CONFIG0_POS (6) |
| #define C_BFI_BFE_CONFIG0_POS (7) |
| #define C_BFI_BFE_MIMOCTL_POS (8) |
| #define C_BFI_BSSID0_POS (9) |
| #define C_BFI_BSSID1_POS (10) |
| #define C_BFI_BSSID2_POS (11) |
| #define C_BFI_STAINFO_POS (12) |
| #define C_BFI_STAINFO1_POS (13) |
| #define C_BFI_BFE_MYAID_POS (13) /* stainfo1 is mutually exclusive */ |
| #define C_BFI_BFMSTAT_POS (14) |
| #define C_BFI_BFE_MIMOCTL_EXT_POS (15) |
| /* below SHMs for rev >= 86 */ |
| #define C_BFI_BFE_11AXMIMOCTL_POS (16) /* phyreg bfeMimoCtlReg for 11AX */ |
| #define C_BFI_BFE_NDPNR_POS (17) |
| /* used by BFR */ |
| #define C_BFI_STA_ADDR_POS C_BFI_BSSID0_POS |
| |
| /* to be removed -start */ |
| #define M_BFI_BLK_SIZE (16u) |
| #define BFI_BLK_SIZE 18 |
| /* to be removed -end */ |
| |
| /* Phy cache index Bit<8> indicates the validity. Cleared during TxBf link Init |
| * to trigger a new sounding sequence. |
| */ |
| #define C_BFRIDX_VLD_NBIT 8 /* valid */ |
| #define C_BFRIDX_EN_NBIT 7 /* BFI block is enabled (has valid info), |
| * applicable only for MU BFI block in shmemx |
| */ |
| #define C_BFRIDX_BW_NBIT 12 |
| |
| #define C_STAINFO_FBT_NBIT 12 /* 0: SU; 1: MU */ |
| #define C_STAINFO_NCIDX_NBIT 13 /* Bits13-15: NC IDX; Reserved if Feedback Type is SU */ |
| |
| /* NDP control blk */ |
| #define C_BFI_BFRCTL_POS_NDP_TYPE_SHIFT (0) /* 0: HT NDP; 1: VHT NDP; HE no need */ |
| #define C_BFI_BFRCTL_POS_NSTS_SHIFT (1) /* 0: 2ss; 1: 3ss; 2: 4ss */ |
| #define C_BFI_BFRCTL_POS_MLBF_SHIFT (4) /* 1 enable MLBF(used for corerev < 64) */ |
| #define C_BFI_BFRCTL_POS_BFM_SHIFT (8) /* Bits15-8: BFM mask for BFM frame tx */ |
| |
| /** dynamic rflo ucode WAR defines */ |
| #define UCODE_WAR_EN 1 |
| #define UCODE_WAR_DIS 0 |
| |
| /** LTE coex definitions */ |
| #define LTECX_FLAGS_LPBK_OFF 0 |
| |
| /** LTECX shares BTCX shmem block */ |
| #define M_LTECX_BLK_PTR(x) M_BTCX_BLK_PTR(x) |
| |
| /** NR5GCX shares BTCX shmem block */ |
| #define M_NR5GCX_BLK_PTR(x) M_BTCX_BLK_PTR(x) |
| |
| /** RC1CX shares BTCX shmem block */ |
| #define M_RC1CX_BLK_PTR(x) M_BTCX_BLK_PTR(x) |
| |
| /** RC2CX shares BTCX shmem block */ |
| #define M_RC2CX_BLK_PTR(x) M_BTCX_BLK_PTR(x) |
| |
| /* CORE0 MODE */ |
| #define CORE0_MODE_RSDB 0x0 |
| #define CORE0_MODE_MIMO 0x1 |
| #define CORE0_MODE_80P80 0x2 |
| |
| #define CORE1_MODE_RSDB 0x100 |
| |
| #define HWACI_HOST_FLAG_ADDR (0x186) |
| #define HWACI_SET_SW_MITIGATION_MODE (0x0008) |
| |
| /* split RX war shm locations */ |
| #define RXFIFO_0_OFFSET 0x1A0 |
| #define RXFIFO_1_OFFSET 0x19E |
| #define HDRCONV_FIFO0_STSLEN 0x4 /* status length in header conversion mode */ |
| |
| /* GE80: |
| * [15:8]: Phy status length |
| * [7:0]: Ucode status length |
| */ |
| #define DEFAULT_FIFO0_STSLEN(corerev, corerev_minor) \ |
| (D11REV_MAJ_MIN_GE(corerev, corerev_minor, 87, 1) ? 0x2018 : \ |
| D11REV_GE(corerev, 80) ? 0x2010: 0x24) |
| |
| /* M_ULP_WAKEIND bits */ |
| #define C_WATCHDOG_EXPIRY (1 << 0) |
| #define C_FCBS_ERROR (1 << 1) |
| #define C_RETX_FAILURE (1 << 2) |
| #define C_HOST_WAKEUP (1 << 3) |
| #define C_INVALID_FCBS_BLOCK (1 << 4) |
| #define C_HUDI_DS1_EXIT (1 << 5) |
| #define C_LOB_SLEEP (1 << 6) |
| |
| /* values for M_ULP_FEATURES */ |
| #define C_P2P_NOA (0x0001) |
| #define C_INFINITE_NOA (0x0002) |
| #define C_P2P_CTWIN (0x0004) |
| #define C_P2P_GC (0x0008) |
| #define C_BCN_TRIM (0x0010) |
| #define C_BT_COEX (0x0020) |
| #define C_LTE_COEX (0x0040) |
| #define C_ADS1 (0x0080) |
| #define C_LTECX_PSPOLL_PRIO_EN (0x0100) |
| #define C_ULP_SLOWCAL_SKIP (0x0200) |
| #define C_HUDI_ENABLE (0x0400) |
| |
| #define M_WOWL_ULP_SW_DAT_BLK (0xBFF * 2) /* (0xFFF * 2) - 1024 */ |
| #define M_WOWL_ULP_SW_DAT_BLK_MAX_SZ (0x400) /* 1024 bytes */ |
| |
| #define RX_INTR_FIFO_0 0x1 /* FIFO-0 interrupt */ |
| #define RX_INTR_FIFO_1 0x2 /* FIFO-1 interrupt */ |
| #define RX_INTR_FIFO_2 0x4 /* FIFO-2 interrupt */ |
| |
| /* M_TOF_FLAG bits */ |
| typedef enum { |
| TOF_RX_FTM_NBIT = 0, |
| TOF_SEQ_DISRXENTX_RFCTL = 1, |
| TOF_IS_TARGET = 2, |
| TOF_TPC_FREEZE = 3 |
| } eTOFFlags; |
| |
| /* TOF feature flags */ |
| #define M_UCODE_F2_TOF_BIT 7 /* part of features_2 shm */ |
| #define M_UCODE_F3_AVB_BIT 2 /* part of features_3 shm */ |
| #define M_UCODE_F3_SEQ_BIT 3 /* part of features_3 shm */ |
| |
| /* New SHM definitions required for tsync based time stamping of FTM frames. |
| * More details in below conf |
| * http://confluence.broadcom.com/display/WLAN/NewUcodeInterfaceForProxdFeature |
| */ |
| #define FTM_TIMESTAMP_SHIFT 16 |
| #define TXS_ACK_INDEX_SHIFT 3 |
| #define FTM_ACK_TS_BLOCK_SIZE 3 |
| #define RXH_ACK_SHIFT(corerev) (D11REV_GE((corerev), 80) ? 12u:8u) |
| #define FTM_INVALID_SHM_INDEX(corerev) (D11REV_GE((corerev), 80) ? 0x04u:0x0Fu) |
| #define FTM_ACK_INDEX_MASK 0x0F |
| #define NUM_UCODE_ACK_TS_BLKS 4 |
| |
| #define FTM_TXSTATUS_ACK_RSPEC_BLOCK_MASK 0xFF |
| #define FTM_TXSTATUS_ACK_RSPEC_BW_MASK 0x3 |
| #define FTM_TXSTATUS_ACK_RSPEC_BW_SHIFT 2 |
| #define FTM_TXSTATUS_ACK_RSPEC_BW_20 0 |
| #define FTM_TXSTATUS_ACK_RSPEC_BW_40 1 |
| #define FTM_TXSTATUS_ACK_RSPEC_BW_80 2 |
| #define FTM_TXSTATUS_ACK_RSPEC_BW_160 3 |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_SHIFT 4 |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_MASK 0x7 |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_CCK 0 |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_LEG 1 /* Legacy */ |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_HT 2 |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_VHT 3 |
| #define FTM_TXSTATUS_ACK_RSPEC_TYPE_HE 4 |
| #define FTM_TXSTATUS_ACK_RSPEC_RATE_6M(ackword) (ackword >> 7) |
| /* Following are the offsets in M_DRVR_UCODE_IF_PTR block. Start address of |
| * M_DRVR_UCODE_IF_PTR block is present in M_DRVR_UCODE_IF_PTR. |
| */ |
| #define M_ULP_FEATURES (0x0 * 2) |
| |
| /* M_HOST_FLAGS5 offset changed in ULP ucode */ |
| #define M_ULP_HOST_FLAGS5 (0x3d * 2) |
| |
| #define M_RADAR_REG_TMP (0x033 * 2) |
| |
| /* Bit masks for ClkGateUcodeReq2: Ucode MAC Clock Request2 (IHR Address 0x375) register */ |
| #define D11_FUNC16_MAC_CLOCKREQ_MASK (0x3) |
| |
| /* |
| * Clock gating registers |
| */ |
| #define CLKREQ_BLOCK 0 |
| #define CLKREQ_MAC_ILP 1 |
| #define CLKREQ_MAC_ALP 2 |
| #define CLKREQ_MAC_HT 3 |
| |
| /* ClkGateSts */ |
| #define CLKGTE_FORCE_MAC_CLK_REQ_SHIFT 0 |
| #define CLKGTE_MAC_PHY_CLK_REQ_SHIFT 4 |
| |
| /* ClkGateReqCtrl0 */ |
| #define CLKGTE_PSM_PATCHCOPY_CLK_REQ_SHIFT 0 |
| #define CLKGTE_RXKEEP_OCP_CLK_REQ_SHIFT 2 |
| #define CLKGTE_PSM_MAC_CLK_REQ_SHIFT 4 |
| #define CLKGTE_TSF_CLK_REQ_SHIFT 6 |
| #define CLKGTE_AQM_CLK_REQ_SHIFT 8 |
| #define CLKGTE_SERIAL_CLK_REQ_SHIFT 10 |
| #define CLKGTE_TX_CLK_REQ_SHIFT 12 |
| #define CLKGTE_POSTTX_CLK_REQ_SHIFT 14 |
| |
| /* ClkGateReqCtrl1 */ |
| #define CLKGTE_RX_CLK_REQ_SHIFT 0 |
| #define CLKGTE_TXKEEP_OCP_CLK_REQ_SHIFT 2 |
| #define CLKGTE_HOST_RW_CLK_REQ_SHIFT 4 |
| #define CLKGTE_IHR_WR_CLK_REQ_SHIFT 6 |
| #define CLKGTE_TKIP_KEY_CLK_REQ_SHIFT 8 |
| #define CLKGTE_TKIP_MISC_CLK_REQ_SHIFT 10 |
| #define CLKGTE_AES_CLK_REQ_SHIFT 12 |
| #define CLKGTE_WAPI_CLK_REQ_SHIFT 14 |
| |
| /* ClkGateReqCtrl2 */ |
| #define CLKGTE_WEP_CLK_REQ_SHIFT 0 |
| #define CLKGTE_PSM_CLK_REQ_SHIFT 2 |
| #define CLKGTE_MACPHY_CLK_REQ_BY_PHY_SHIFT 4 |
| #define CLKGTE_FCBS_CLK_REQ_SHIFT 6 |
| #define CLKGTE_HIN_AXI_MAC_CLK_REQ_SHIFT 8 |
| |
| /* ClkGateStretch0 */ |
| #define CLKGTE_MAC_HT_CLOCK_STRETCH_SHIFT 0 |
| #define CLKGTE_MAC_ALP_CLOCK_STRETCH_SHIFT 8 |
| #define CLKGTE_MAC_HT_CLOCK_STRETCH_VAL 0x4 |
| |
| /* ClkGateStretch1 */ |
| #define CLKGTE_MAC_PHY_CLOCK_STRETCH_SHIFT 13 |
| |
| /* ClkGateMisc */ |
| #define CLKGTE_TPF_CLK_REQTHRESH 0xF |
| #define CLKGTE_AQM_CLK_REQEXT 0x70 |
| |
| /* ClkGateDivCtrl */ |
| #define CLKGTE_MAC_ILP_OFF_COUNT_MASK 0x0007 |
| #define CLKGTE_MAC_ILP_OFF_COUNT_SHIFT 0 |
| #define CLKGTE_MAC_ILP_ON_COUNT_MASK 0x0020 |
| #define CLKGTE_MAC_ILP_ON_COUNT_MASK_GE_REV80 0x0030 |
| #define CLKGTE_MAC_ALP_OFF_COUNT_MASK 0x03C0 |
| #define CLKGTE_MAC_ALP_OFF_COUNT_SHIFT 6 |
| |
| /* ClkGatePhyClkCtrl */ |
| #define CLKGTE_PHY_MAC_PHY_CLK_REQ_EN_SHIFT 0 |
| #define CLKGTE_O2C_HIN_PHY_CLK_EN_SHIFT 1 |
| #define CLKGTE_HIN_PHY_CLK_EN_SHIFT 2 |
| #define CLKGTE_IHRP_PHY_CLK_EN_SHIFT 3 |
| #define CLKGTE_CCA_MAC_PHY_CLK_REQ_EN_SHIFT 4 |
| #define CLKGTE_TX_MAC_PHY_CLK_REQ_EN_SHIFT 5 |
| #define CLKGTE_HRP_MAC_PHY_CLK_REQ_EN_SHIFT 6 |
| #define CLKGTE_SYNC_MAC_PHY_CLK_REQ_EN_SHIFT 7 |
| #define CLKGTE_RX_FRAME_MAC_PHY_CLK_REQ_EN_SHIFT 8 |
| #define CLKGTE_RX_START_MAC_PHY_CLK_REQ_EN_SHIFT 9 |
| #define CLKGTE_FCBS_MAC_PHY_CLK_REQ_SHIFT 10 |
| #define CLKGTE_POSTRX_MAC_PHY_CLK_REQ_EN_SHIFT 11 |
| #define CLKGTE_DOT11_MAC_PHY_RXVALID_SHIFT 12 |
| #define CLKGTE_NOT_PHY_FIFO_EMPTY_SHIFT 13 |
| #define CLKGTE_DOT11_MAC_PHY_BFE_REPORT_DATA_READY 14 |
| #define CLKGTE_DOT11_MAC_PHY_CLK_BIT15 15 |
| |
| /* ClkGateExtReq0 */ |
| #define CLKGTE_TOE_SYNC_MAC_CLK_REQ_SHIFT 0 |
| #define CLKGTE_TXBF_SYNC_MAC_CLK_REQ_SHIFT 2 |
| #define CLKGTE_HIN_SYNC_MAC_CLK_REQ_SHIFT 4 |
| #define CLKGTE_SLOW_SYNC_CLK_REQ_SHIFT 6 |
| #define CLKGTE_ERCX_SYNC_CLK_REQ_SHIFT 8 |
| #define CLKGTE_BTCX_SYNC_CLK_REQ_SHIFT 10 |
| #define CLKGTE_IFS_CRS_SYNC_CLK_REQ_SHIFT 12 |
| #define CLKGTE_IFS_GCI_SYNC_CLK_REQ_SHIFT 14 |
| |
| #define CLKGTE_TOE_SYNC_MAC_CLK_REQ_80_SHIFT 2 |
| #define CLKGTE_TXBF_SYNC_MAC_CLK_REQ_80_SHIFT 4 |
| #define CLKGTE_HIN_SYNC_MAC_CLK_REQ_80_SHIFT 6 |
| #define CLKGTE_SLOW_SYNC_CLK_REQ_80_SHIFT 8 |
| #define CLKGTE_ERCX_SYNC_CLK_REQ_80_SHIFT 10 |
| #define CLKGTE_BTCX_SYNC_CLK_REQ_80_SHIFT 12 |
| #define CLKGTE_IFS_CRS_SYNC_CLK_REQ_80_SHIFT 14 |
| |
| #define CLKGTE_TOE_SYNC_MAC_CLK_REQ_83_SHIFT 2 |
| #define CLKGTE_TXBF_SYNC_MAC_CLK_REQ_83_SHIFT 4 |
| #define CLKGTE_HIN_SYNC_MAC_CLK_REQ_83_SHIFT 6 |
| #define CLKGTE_SLOW_SYNC_CLK_REQ_83_SHIFT 8 |
| #define CLKGTE_ERCX_SYNC_CLK_REQ_83_SHIFT 10 |
| #define CLKGTE_BTCX2_SYNC_CLK_REQ_83_SHIFT 12 |
| #define CLKGTE_BTCX_SYNC_CLK_REQ_83_SHIFT 14 |
| |
| /* ClkGateExtReq1 */ |
| #define CLKGTE_PHY_FIFO_SYNC_CLK_REQ_SHIFT 0 |
| #define CLKGTE_RXE_CHAN_SYNC_CLK_REQ_SHIFT 2 |
| #define CLKGTE_PMU_MDIS_SYNC_MAC_CLK_REQ_SHIFT 4 |
| #define CLKGTE_PSM_IPC_SYNC_CLK_REQ_SHIFT 6 |
| |
| #define CLKGTE_IFS_GCI_SYNC_CLK_REQ_80_SHIFT 0 |
| #define CLKGTE_PHY_FIFO_SYNC_CLK_REQ_80_SHIFT 2 |
| #define CLKGTE_RXE_CHAN_SYNC_CLK_REQ_80_SHIFT 4 |
| #define CLKGTE_PMU_MDIS_SYNC_MAC_CLK_REQ_80_SHIFT 6 |
| #define CLKGTE_PSM_IPC_SYNC_CLK_REQ_80_SHIFT 8 |
| |
| #define CLKGTE_IFS_CRS_SYNC_CLK_REQ_83_SHIFT 0 |
| #define CLKGTE_IFS_GCI_SYNC_CLK_REQ_83_SHIFT 2 |
| #define CLKGTE_PHY_FIFO_SYNC_CLK_REQ_83_SHIFT 4 |
| #define CLKGTE_RXE_CHAN_SYNC_CLK_REQ_83_SHIFT 6 |
| #define CLKGTE_PMU_MDIS_SYNC_MAC_CLK_REQ_83_SHIFT 8 |
| #define CLKGTE_PSM_IPC_SYNC_CLK_REQ_83_SHIFT 10 |
| |
| /* PFE CtlStat1 register */ |
| #define PFE_CTLSTAT1_ROUTE_PFE_TO_BMSTAT (1u << 15u) |
| #define PFE_CTLSTAT1_PFE_ENABLE (1u << 0u) |
| |
| /* PPR Ctrl1 register */ |
| #define PPR_CTMODE_SHIFT 8u |
| #define PPR_CTMODE_MASK (3u << PPR_CTMODE_SHIFT) |
| |
| #define PPR_CTMODE_A (0u << PPR_CTMODE_SHIFT) |
| #define PPR_CTMODE_B (1u << PPR_CTMODE_SHIFT) |
| #define PPR_CTMODE_C (2u << PPR_CTMODE_SHIFT) |
| |
| /* Ptxd Len */ |
| #define PTXD_LEN0_SHIFT (0u) |
| #define PTXD_LEN1_SHIFT (8u) |
| #define PTXD_LEN2_SHIFT (0u) |
| #define PTXD_LEN3_SHIFT (8u) |
| /* =========== LHL regs =========== */ |
| /* WL ARM Timer0 Interrupt Status (lhl_wl_armtim0_st_adr) */ |
| #define LHL_WL_ARMTIM0_ST_WL_ARMTIM_INT_ST 0x00000001 |
| |
| #define D11_AUTO_MEM_STBY_RET_SHIFT (4u) |
| #define D11_AUTO_MEM_STBY_RET_83_SHIFT (5u) |
| #define D11_AUTO_MEM_STBY_NON_RET_SHIFT (6u) |
| #define D11_AUTO_MEM_STBY_BM_SHIFT (9u) |
| |
| #define D11_AUTO_MEM_STBY_RET_SHIFT_REV(d11rev) \ |
| (((d11rev) >= 83) ? D11_AUTO_MEM_STBY_RET_83_SHIFT : D11_AUTO_MEM_STBY_RET_SHIFT) |
| |
| /* WiFi P2P TX stop timestamp block (only applicable with AC ucode) */ |
| #define P2P_TXSTOP_SHMPERBSS 2u /* 2 shmems per BSS */ |
| #define M_P2P_TXSTOP_TS(x, b, w) (M_P2P_TXSTOP_T_BLK(x) +\ |
| (P2P_TXSTOP_SHMPERBSS * (b) + (w)) * 2) |
| |
| #define D11TXHDR_RATEINFO_ACCESS_VAL(txh, corerev, member) \ |
| ((((txh)->corerev).RateInfo[3]).member) |
| |
| /* QoS + BSR information */ |
| #define D11_QOS_BSR_TIDQS_SHIFT 0u |
| #define D11_QOS_BSR_TIDQS_SZ 8u |
| #define D11_QOS_BSR_TIDQS_MASK (((1 << D11_QOS_BSR_TIDQS_SZ) - 1) << D11_QOS_BSR_TIDQS_SHIFT) |
| |
| #define D11_QOS_BSR_UV_SHIFT 8u |
| #define D11_QOS_BSR_UV_SZ 6u |
| #define D11_QOS_BSR_UV_MASK (((1 << D11_QOS_BSR_UV_SZ) - 1) << D11_QOS_BSR_UV_SHIFT) |
| |
| #define D11_QOS_BSR_SF_SHIFT 14u |
| #define D11_QOS_BSR_SF_SZ 2u |
| #define D11_QOS_BSR_SF_MASK (((1 << D11_QOS_BSR_SF_SZ) - 1) << D11_QOS_BSR_SF_SHIFT) |
| |
| /* Queue size in QoS control */ |
| #define D11_QOS_BSR_SF_0 0u |
| #define D11_QOS_BSR_SF_1 1u |
| #define D11_QOS_BSR_SF_2 2u |
| #define D11_QOS_BSR_SF_3 3u |
| |
| #define D11_QS_OFFSET_SF_0 0u |
| #define D11_QS_OFFSET_SF_1 1024u |
| #define D11_QS_OFFSET_SF_2 17408u |
| #define D11_QS_OFFSET_SF_3 148480u |
| |
| #define D11_QOS_BSR_SF_0_SHIFT 4u /* Scale: 16 bytes */ |
| #define D11_QOS_BSR_SF_1_SHIFT 8u /* Scale: 256 bytes */ |
| #define D11_QOS_BSR_SF_2_SHIFT 11u /* Scale: 2048 bytes */ |
| #define D11_QOS_BSR_SF_3_SHIFT 15u /* Scale: 32768 bytes */ |
| |
| #define D11_MIN_QS_UV 0u |
| #define D11_MAX_QS_UV 63u |
| #define D11_MAX_QS_UV_SF3 ((D11_MAX_QS_UV) - 1) |
| |
| /* 1008: 16 * UV when the Scaling Factor subfield is 0 */ |
| #define D11_MAX_QS_SF_0 (D11_QS_OFFSET_SF_0 + (D11_MAX_QS_UV << D11_QOS_BSR_SF_0_SHIFT)) |
| /* 17152: 1024 + 256 * UV when the Scaling Factor subfield is 1 */ |
| #define D11_MAX_QS_SF_1 (D11_QS_OFFSET_SF_1 + (D11_MAX_QS_UV << D11_QOS_BSR_SF_1_SHIFT)) |
| /* 146432: 17408 + 2048 * UV when the Scaling Factor subfield is 2 */ |
| #define D11_MAX_QS_SF_2 (D11_QS_OFFSET_SF_2 + (D11_MAX_QS_UV << D11_QOS_BSR_SF_2_SHIFT)) |
| /* 2147328: 148480 + 32768 * UV when the Scaling Factor subfield is 3 */ |
| #define D11_MAX_QS_SF_3 (D11_QS_OFFSET_SF_3 + ((D11_MAX_QS_UV_SF3-1) << D11_QOS_BSR_SF_3_SHIFT)) |
| |
| /* 2 bits for HE signature and 4 bits for control ID */ |
| #define D11_BSR_HE_SIG_SHIFT 6u |
| /* HE Variant with BSR control ID */ |
| #define D11_BSR_HE_SIG (0xf) |
| #define D11_BSR_ACI_BMAP_SHIFT (0 + D11_BSR_HE_SIG_SHIFT) |
| #define D11_BSR_DELTA_TID_SHIFT (4 + D11_BSR_HE_SIG_SHIFT) |
| #define D11_BSR_SF_SHIFT (8 + D11_BSR_HE_SIG_SHIFT) |
| #define D11_BSR_QUEUE_SIZE_HIGH_SHIFT (10 + D11_BSR_HE_SIG_SHIFT) |
| #define D11_BSR_QUEUE_SIZE_ALL_SHIFT (18 + D11_BSR_HE_SIG_SHIFT) |
| |
| #define D11_BSR_DELTA_TID_ALLTID_SIGNATURE 3u |
| |
| #define D11_BSR_QUEUE_SIZE_WIDTH 8u |
| #define D11_BSR_QUEUE_SIZE_WIDTH_VAL ((1 << D11_BSR_QUEUE_SIZE_WIDTH) - 1) |
| #define D11_BSR_QUEUE_SIZE_UNKNOWN (255u) |
| #define D11_BSR_QUEUE_SIZE_MAX (254u) |
| #define D11_BSR_QUEUE_SIZE_HIGH_MASK (D11_BSR_QUEUE_SIZE_WIDTH_VAL <<\ |
| D11_BSR_QUEUE_SIZE_HIGH_SHIFT) |
| #define D11_BSR_QUEUE_SIZE_ALL_MASK (D11_BSR_QUEUE_SIZE_WIDTH_VAL <<\ |
| D11_BSR_QUEUE_SIZE_ALL_SHIFT) |
| |
| #define D11_BSR_WD1_SHIFT 16u |
| |
| enum { |
| D11_BSR_SF_ID_16 = 0, /* 0 */ |
| D11_BSR_SF_ID_256 = 1, /* 1 */ |
| D11_BSR_SF_ID_2048 = 2, /* 2 */ |
| D11_BSR_SF_ID_32768 = 3 /* 3 */ |
| }; |
| |
| enum { |
| D11_PING_BLOCK_VALID = 0, /* 0 */ |
| D11_PONG_BLOCK_VALID = 1, /* 1 */ |
| D11_UC_READING_PING_BLOCK = 2, /* 2 */ |
| D11_UC_READING_PONG_BLOCK = 3 /* 3 */ |
| }; |
| |
| enum { |
| D11_BSR_TID0_POS = 0, /* 0 */ |
| D11_BSR_TID1_POS = 1, /* 1 */ |
| D11_BSR_TID2_POS = 2, /* 2 */ |
| D11_BSR_TID3_POS = 3, /* 3 */ |
| D11_BSR_TID4_POS = 4, /* 4 */ |
| D11_BSR_TID5_POS = 5, /* 5 */ |
| D11_BSR_TID6_POS = 6, /* 6 */ |
| D11_BSR_TID7_POS = 7, /* 7 */ |
| D11_BSR_WD0_POS = 8, /* 8 */ |
| D11_BSR_WD1_POS = 9, /* 9 */ |
| }; |
| |
| #define D11_IS_PING_PONG_IN_RESET(i) (((i) & ((1 << D11_PING_BLOCK_VALID) |\ |
| (1 << D11_UC_READING_PING_BLOCK) | (1 << D11_PONG_BLOCK_VALID) |\ |
| (1 << D11_UC_READING_PONG_BLOCK))) == 0) |
| #define D11_PING_BLOCK_VALID_MASK ((1 << D11_PONG_BLOCK_VALID) |\ |
| (1 << D11_UC_READING_PING_BLOCK)) |
| #define D11_PONG_BLOCK_VALID_MASK ((1 << D11_PING_BLOCK_VALID) |\ |
| (1 << D11_UC_READING_PONG_BLOCK)) |
| #define D11_PING_PONG_UPDATE_MASK ((1 << D11_PING_BLOCK_VALID) |\ |
| (1 << D11_PONG_BLOCK_VALID)) |
| #define D11_IS_PING_BLOCK_WRITABLE(i) (((i) & D11_PING_BLOCK_VALID_MASK) == \ |
| (1 << D11_PONG_BLOCK_VALID)) |
| #define D11_IS_PONG_BLOCK_WRITABLE(i) (((i) & D11_PONG_BLOCK_VALID_MASK) == \ |
| (1 << D11_PING_BLOCK_VALID)) |
| #define D11_SET_PING_BLOCK_VALID(i) (((i) & ~(1 << D11_PONG_BLOCK_VALID)) |\ |
| (1 << D11_PING_BLOCK_VALID)) |
| #define D11_SET_PONG_BLOCK_VALID(i) (((i) & ~(1 << D11_PING_BLOCK_VALID)) |\ |
| (1 << D11_PONG_BLOCK_VALID)) |
| #define D11_SET_PING_PONG_INVALID(i) (((i) & ~(1 << D11_PING_BLOCK_VALID)) |\ |
| ((i) & ~(1 << D11_PONG_BLOCK_VALID))) |
| |
| /* valid rx plcp check */ |
| #define PLCP_VALID(plcp) (((plcp)[0] | (plcp)[1] | (plcp)[2]) != 0) |
| enum { |
| D11_TXTRIG_EN = 0, /* 0 */ |
| D11_TXTRIG_PROG = 1, /* 1 */ |
| D11_TXTRIG_DONE = 2, /* 2 */ |
| D11_TXTRIG_TYPE = 4, /* 4 */ |
| }; |
| |
| #define D11_SET_TXTRIG_EN (1 << D11_TXTRIG_EN) |
| #define D11_TXTRIG_TYPE_MASK ((1 << D11_TXTRIG_TYPE) | (1 << (D11_TXTRIG_TYPE+1))) |
| #define D11_SET_TXTRIG_TYPE(i) (((i) << D11_TXTRIG_TYPE) & D11_TXTRIG_TYPE_MASK) |
| |
| enum { |
| D11_MUEDCA_AIFSN = 0, /* 0 */ |
| D11_MUEDCA_CWMIN = 1, /* 1 */ |
| D11_MUEDCA_CWMAX = 2, /* 2 */ |
| D11_MUEDCA_TIMER = 3, /* 3 */ |
| D11_MUEDCA_SU_AIFSN = 4, /* 4 */ |
| D11_MUEDCA_SU_CWMIN = 5, /* 5 */ |
| D11_MUEDCA_SU_CWMAX = 6, /* 6 */ |
| D11_MUEDCA_EXPIRY_TSF = 7, /* 7 */ |
| D11_MUEDCA_QINFO = 8, /* 8 */ |
| D11_MUEDCA_STAT = 9, /* 9 */ |
| D11_MUEDCA_BLK_SIZE = 10 /* 10 */ |
| }; |
| #define D11_MUEDCA_BLK(x, idx, offset) (M_MUEDCA_BLK((x)) +\ |
| (idx * (D11_MUEDCA_BLK_SIZE << 1)) + (offset << 1)) |
| |
| #define D11_BSSCOLOR_VALID_SHIFT 15u |
| #define D11_BSSCOLOR_VALID_MASK (1 << D11_BSSCOLOR_VALID_SHIFT) |
| |
| #ifdef BCMPCIE_HP2P |
| /* HP2P (High Priority P2P) shared memory EDCA parameters */ |
| typedef struct shm_hp2p_edca_params { |
| uint16 txop; |
| uint16 cwmin; |
| uint16 cwmax; |
| uint16 cwcur; |
| uint16 aifs; |
| uint16 bslots; |
| uint16 reggap; |
| uint16 status; |
| } shm_hp2p_edca_params_t; |
| |
| #define HP2P_STATUS_NEWPARAMS (1u << 8u) |
| #endif /* BCMPCIE_HP2P */ |
| |
| #define MAX_D11_GPIOS 16 |
| |
| /* Workaround register */ |
| #define WAR_TXDMA_NONMODIFIABLE_EN 0x00000010 /* For TxDMA initiated AXI reads */ |
| #define WAR_AQMDMA_NONMODIFIABLE_EN 0x00000020 /* For AQMDMA initiated AXI reads */ |
| |
| /* noise cal timeout when NAN is enabled. |
| * 54 * 256 = ~14ms . |
| * smallest NAN CRB possible is 16ms..choose 14ms |
| * as timeout to ensure noise cal happens within this 16ms |
| */ |
| #define M_NOISE_CALTIMEOUT_FOR_NAN 54u |
| |
| #define TXPU_CMD_SET 1u /**< txpu set command */ |
| |
| #endif /* _D11_H */ |