1*4882a593Smuzhiyun /** @file mlan_pcie.h 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * @brief This file contains definitions for PCIE interface. 4*4882a593Smuzhiyun * driver. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright 2008-2021 NXP 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This software file (the File) is distributed by NXP 10*4882a593Smuzhiyun * under the terms of the GNU General Public License Version 2, June 1991 11*4882a593Smuzhiyun * (the License). You may use, redistribute and/or modify the File in 12*4882a593Smuzhiyun * accordance with the terms and conditions of the License, a copy of which 13*4882a593Smuzhiyun * is available by writing to the Free Software Foundation, Inc., 14*4882a593Smuzhiyun * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the 15*4882a593Smuzhiyun * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE 18*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 19*4882a593Smuzhiyun * ARE EXPRESSLY DISCLAIMED. The License provides additional details about 20*4882a593Smuzhiyun * this warranty disclaimer. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /******************************************************** 25*4882a593Smuzhiyun Change log: 26*4882a593Smuzhiyun 02/01/2012: initial version 27*4882a593Smuzhiyun ********************************************************/ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #ifndef _MLAN_PCIE_H_ 30*4882a593Smuzhiyun #define _MLAN_PCIE_H_ 31*4882a593Smuzhiyun /** Tx DATA */ 32*4882a593Smuzhiyun #define ADMA_TX_DATA 0 33*4882a593Smuzhiyun /** Rx DATA */ 34*4882a593Smuzhiyun #define ADMA_RX_DATA 1 35*4882a593Smuzhiyun /** EVENT */ 36*4882a593Smuzhiyun #define ADMA_EVENT 2 37*4882a593Smuzhiyun /** CMD */ 38*4882a593Smuzhiyun #define ADMA_CMD 3 39*4882a593Smuzhiyun /** CMD RESP */ 40*4882a593Smuzhiyun #define ADMA_CMDRESP 4 41*4882a593Smuzhiyun /** ADMA direction */ 42*4882a593Smuzhiyun #define ADMA_HOST_TO_DEVICE 0 43*4882a593Smuzhiyun /** ADMA direction Rx */ 44*4882a593Smuzhiyun #define ADMA_DEVICE_TO_HOST 1 45*4882a593Smuzhiyun /** Direct Program mode */ 46*4882a593Smuzhiyun #define DMA_MODE_DIRECT 0 47*4882a593Smuzhiyun /** Single descriptor mode */ 48*4882a593Smuzhiyun #define DMA_MODE_SINGLE_DESC 1 49*4882a593Smuzhiyun /** dual discriptor mode */ 50*4882a593Smuzhiyun #define DMA_MODE_DUAL_DESC 2 51*4882a593Smuzhiyun /** descriptor mode: ring mode */ 52*4882a593Smuzhiyun #define DESC_MODE_RING 0 53*4882a593Smuzhiyun /** descriptor mode: chain mode */ 54*4882a593Smuzhiyun #define DESC_MODE_CHAIN 1 55*4882a593Smuzhiyun /** DMA size start bit */ 56*4882a593Smuzhiyun #define DMA_SIZE_BIT 16 57*4882a593Smuzhiyun /** DMA size mask */ 58*4882a593Smuzhiyun #define DMA_SIZE_MASK 0xffff0000 59*4882a593Smuzhiyun /** Descriptor mode */ 60*4882a593Smuzhiyun #define DESC_MODE_MASK 0x0004 61*4882a593Smuzhiyun /** DMA MODE MASK */ 62*4882a593Smuzhiyun #define DMA_MODE_MASK 0x0003 63*4882a593Smuzhiyun /** Dest Num Descriptor start bits */ 64*4882a593Smuzhiyun #define DST_NUM_DESC_BIT 12 65*4882a593Smuzhiyun /** Destination Num of Descriptor mask */ 66*4882a593Smuzhiyun #define DST_NUM_DESC_MASK 0xf000 67*4882a593Smuzhiyun /** Src Num Descriptor start bits */ 68*4882a593Smuzhiyun #define SRC_NUM_DESC_BIT 8 69*4882a593Smuzhiyun /** Destination Num of Descriptor mask */ 70*4882a593Smuzhiyun #define SRC_NUM_DESC_MASK 0x0f00 71*4882a593Smuzhiyun /** Virtual Q priority mask */ 72*4882a593Smuzhiyun #define Q_PRIO_WEIGHT_MASK 0x00f0 73*4882a593Smuzhiyun /** DMA cfg register offset*/ 74*4882a593Smuzhiyun #define ADMA_DMA_CFG 0x0000 75*4882a593Smuzhiyun /** source base low */ 76*4882a593Smuzhiyun #define ADMA_SRC_LOW 0x0004 77*4882a593Smuzhiyun /** source base high */ 78*4882a593Smuzhiyun #define ADMA_SRC_HIGH 0x0008 79*4882a593Smuzhiyun /** destination base low */ 80*4882a593Smuzhiyun #define ADMA_DST_LOW 0x000C 81*4882a593Smuzhiyun /** destination base high */ 82*4882a593Smuzhiyun #define ADMA_DST_HIGH 0x0010 83*4882a593Smuzhiyun /** source rd/wr pointer */ 84*4882a593Smuzhiyun #define ADMA_SRC_RW_PTR 0x0014 85*4882a593Smuzhiyun /** destination rd/wr pointer */ 86*4882a593Smuzhiyun #define ADMA_DST_RW_PTR 0x0018 87*4882a593Smuzhiyun /** interrupt direction mapping reg, for each virtual Q, used for 88*4882a593Smuzhiyun * dual-descriptor only, only valid for Q0 */ 89*4882a593Smuzhiyun #define ADMA_INT_MAPPING 0x001C 90*4882a593Smuzhiyun /** destination interrupt to device */ 91*4882a593Smuzhiyun #define DEST_INT_TO_DEVICE MBIT(0) 92*4882a593Smuzhiyun /** destination interrupt to host */ 93*4882a593Smuzhiyun #define DEST_INT_TO_HOST MBIT(1) 94*4882a593Smuzhiyun /** interrupt pending status for each virtual Q, only valid for Q0 */ 95*4882a593Smuzhiyun #define ADMA_INT_PENDING 0x0020 96*4882a593Smuzhiyun /** Default ADMA INT mask, We only enable dma done */ 97*4882a593Smuzhiyun #define DEF_ADMA_INT_MASK MBIT(0) 98*4882a593Smuzhiyun /** source interrupt status mask reg */ 99*4882a593Smuzhiyun #define ADMA_SRC_INT_STATUS_MASK 0x0024 100*4882a593Smuzhiyun /** source interrupt mask reg */ 101*4882a593Smuzhiyun #define ADMA_SRC_INT_MASK 0x0028 102*4882a593Smuzhiyun /** source interrupt status reg */ 103*4882a593Smuzhiyun #define ADMA_SRC_INT_STATUS 0x002C 104*4882a593Smuzhiyun /** destination interrupt status mask reg */ 105*4882a593Smuzhiyun #define ADMA_DST_INT_STATUS_MASK 0x0030 106*4882a593Smuzhiyun /** destination interrupt mask reg */ 107*4882a593Smuzhiyun #define ADMA_DST_INT_MASK 0x0034 108*4882a593Smuzhiyun /** destination interrupt status reg */ 109*4882a593Smuzhiyun #define ADMA_DST_INT_STATUS 0x0038 110*4882a593Smuzhiyun /** DMA cfg2 register */ 111*4882a593Smuzhiyun #define ADMA_DMA_CFG2 0x003C 112*4882a593Smuzhiyun /** ADMA_MSI_LEGACY_DST_DMA_DONE_INT_BYPASS_EN */ 113*4882a593Smuzhiyun #define ADMA_MSI_LEGACY_DST_DMA_DONE_INT_BYPASS_EN MBIT(22) 114*4882a593Smuzhiyun /** ADMA_MSI_LEGACY_SRC_DMA_DONE_INT_BYPASS_EN */ 115*4882a593Smuzhiyun #define ADMA_MSI_LEGACY_SRC_DMA_DONE_INT_BYPASS_EN MBIT(21) 116*4882a593Smuzhiyun /* If this bit is set, MSIX trigger event will be from DST, other wise MSIX 117*4882a593Smuzhiyun * trigger event will be from SRC */ 118*4882a593Smuzhiyun #define ADMA_MSIX_INT_SRC_DST_SEL MBIT(20) 119*4882a593Smuzhiyun /** Enable MSI/Legacy for this Queue */ 120*4882a593Smuzhiyun #define ADMA_MSI_LEGACY_ENABLE MBIT(19) 121*4882a593Smuzhiyun /** Enable MSIX for this queue */ 122*4882a593Smuzhiyun #define ADMA_MSIX_ENABLE MBIT(18) 123*4882a593Smuzhiyun /** ADMA_DST_DMA_DONE_INT_BYPASS_EN */ 124*4882a593Smuzhiyun #define ADMA_DST_DMA_DONE_INT_BYPASS_EN MBIT(17) 125*4882a593Smuzhiyun /** SRC_DMA_DONE_INT_BYPASS_EN */ 126*4882a593Smuzhiyun #define ADMA_SRC_DMA_DONE_INT_BYPASS_EN MBIT(16) 127*4882a593Smuzhiyun /* Destination Read Pointer Memory Copy Enable */ 128*4882a593Smuzhiyun #define ADMA_DST_RPTR_MEM_COPY_EN MBIT(11) 129*4882a593Smuzhiyun /* Source Read Pointer Memory Copy Enable */ 130*4882a593Smuzhiyun #define ADMA_SRC_RPTR_MEM_COPY_EN MBIT(10) 131*4882a593Smuzhiyun /** Destination address is host */ 132*4882a593Smuzhiyun #define ADMA_DST_ADDR_IS_HOST MBIT(2) 133*4882a593Smuzhiyun /** Source address is host */ 134*4882a593Smuzhiyun #define ADMA_SRC_ADDR_IS_HOST MBIT(1) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /** DMA cfg3 register */ 137*4882a593Smuzhiyun #define ADMA_DMA_CFG3 0x0040 138*4882a593Smuzhiyun /** ADMA Queue pointer clear */ 139*4882a593Smuzhiyun #define ADMA_Q_PTR_CLR MBIT(0) 140*4882a593Smuzhiyun /** source rd ptr address low */ 141*4882a593Smuzhiyun #define ADMA_SRC_RD_PTR_LOW 0x0044 142*4882a593Smuzhiyun /** source rd ptr address high */ 143*4882a593Smuzhiyun #define ADMA_SRC_RD_PTR_HIGH 0x0048 144*4882a593Smuzhiyun /** destination rd ptr address low */ 145*4882a593Smuzhiyun #define ADMA_DST_RD_PTR_LOW 0x004C 146*4882a593Smuzhiyun /** destination rd ptr address high */ 147*4882a593Smuzhiyun #define ADMA_DST_RD_PTR_HIGH 0x0050 148*4882a593Smuzhiyun /** source active interrupt mask */ 149*4882a593Smuzhiyun #define ADMA_SRC_ACTV_INT_MASK 0x0054 150*4882a593Smuzhiyun /** destination active interrupt mask */ 151*4882a593Smuzhiyun #define ADMA_DST_ACTV_INT_MASK 0x0058 152*4882a593Smuzhiyun /** Read pointer start from bit 16 */ 153*4882a593Smuzhiyun #define ADMA_RPTR_START 16 154*4882a593Smuzhiyun /** write pointer start from bit 0 */ 155*4882a593Smuzhiyun #define ADMA_WPTR_START 0 156*4882a593Smuzhiyun /** Tx/Rx Read/Write pointer's mask */ 157*4882a593Smuzhiyun #define TXRX_RW_PTR_MASK (ADMA_MAX_TXRX_BD - 1) 158*4882a593Smuzhiyun /** Tx/Rx Read/Write pointer's rollover indicate bit */ 159*4882a593Smuzhiyun #define TXRX_RW_PTR_ROLLOVER_IND ADMA_MAX_TXRX_BD 160*4882a593Smuzhiyun /** Start of packet flag */ 161*4882a593Smuzhiyun #define ADMA_BD_FLAG_SOP MBIT(0) 162*4882a593Smuzhiyun /** End of packet flag */ 163*4882a593Smuzhiyun #define ADMA_BD_FLAG_EOP MBIT(1) 164*4882a593Smuzhiyun /** interrupt enable flag */ 165*4882a593Smuzhiyun #define ADMA_BD_FLAG_INT_EN MBIT(2) 166*4882a593Smuzhiyun /** Source address is host side flag */ 167*4882a593Smuzhiyun #define ADMA_BD_FLAG_SRC_HOST MBIT(3) 168*4882a593Smuzhiyun /** Destination address is host side flag */ 169*4882a593Smuzhiyun #define ADMA_BD_FLAG_DST_HOST MBIT(4) 170*4882a593Smuzhiyun /** ADMA MIN PKT SIZE */ 171*4882a593Smuzhiyun #define ADMA_MIN_PKT_SIZE 128 172*4882a593Smuzhiyun /** ADMA dual descriptor mode requir 8 bytes alignment in buf size */ 173*4882a593Smuzhiyun #define ADMA_ALIGN_SIZE 8 174*4882a593Smuzhiyun /** ADMA RW_PTR wrap mask */ 175*4882a593Smuzhiyun #define ADMA_RW_PTR_WRAP_MASK 0x00001FFF 176*4882a593Smuzhiyun /** ADMA MSIX DOORBEEL DATA */ 177*4882a593Smuzhiyun #define ADMA_MSIX_DOORBELL_DATA 0x0064 178*4882a593Smuzhiyun /** MSIX VECTOR MASK: BIT 0-10 */ 179*4882a593Smuzhiyun #define ADMA_MSIX_VECTOR_MASK 0x3f 180*4882a593Smuzhiyun /** PF mask: BIT 24-28 */ 181*4882a593Smuzhiyun #define ADMA_MSIX_PF_MASK 0x1f000000 182*4882a593Smuzhiyun /** PF start bit */ 183*4882a593Smuzhiyun #define ADMA_MSIX_PF_BIT 24 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X) 186*4882a593Smuzhiyun /** PCIE9098 dev_id/vendor id reg */ 187*4882a593Smuzhiyun #define PCIE9098_DEV_ID_REG 0x0000 188*4882a593Smuzhiyun /** PCIE revision ID register */ 189*4882a593Smuzhiyun #define PCIE9098_REV_ID_REG 0x0008 190*4882a593Smuzhiyun /** PCIE IP revision register */ 191*4882a593Smuzhiyun #define PCIE9098_IP_REV_REG 0x1000 192*4882a593Smuzhiyun /** PCIE CPU interrupt events */ 193*4882a593Smuzhiyun #define PCIE9098_CPU_INT_EVENT 0x1C20 194*4882a593Smuzhiyun /** PCIE CPU interrupt status */ 195*4882a593Smuzhiyun #define PCIE9098_CPU_INT_STATUS 0x1C24 196*4882a593Smuzhiyun /** PCIe CPU Interrupt Status Mask */ 197*4882a593Smuzhiyun #define PCIE9098_CPU_INT2ARM_ISM 0x1C28 198*4882a593Smuzhiyun /** PCIE host interrupt status */ 199*4882a593Smuzhiyun #define PCIE9098_HOST_INT_STATUS 0x1C44 200*4882a593Smuzhiyun /** PCIE host interrupt mask */ 201*4882a593Smuzhiyun #define PCIE9098_HOST_INT_MASK 0x1C48 202*4882a593Smuzhiyun /** PCIE host interrupt clear select*/ 203*4882a593Smuzhiyun #define PCIE9098_HOST_INT_CLR_SEL 0x1C4C 204*4882a593Smuzhiyun /** PCIE host interrupt status mask */ 205*4882a593Smuzhiyun #define PCIE9098_HOST_INT_STATUS_MASK 0x1C50 206*4882a593Smuzhiyun /** PCIE host interrupt status */ 207*4882a593Smuzhiyun #define PCIE9097_B0_HOST_INT_STATUS 0x3C44 208*4882a593Smuzhiyun /** PCIE host interrupt mask */ 209*4882a593Smuzhiyun #define PCIE9097_B0_HOST_INT_MASK 0x3C48 210*4882a593Smuzhiyun /** PCIE host interrupt clear select*/ 211*4882a593Smuzhiyun #define PCIE9097_B0_HOST_INT_CLR_SEL 0x3C4C 212*4882a593Smuzhiyun /** PCIE host interrupt status mask */ 213*4882a593Smuzhiyun #define PCIE9097_B0_HOST_INT_STATUS_MASK 0x3C50 214*4882a593Smuzhiyun /** PCIE host interrupt select*/ 215*4882a593Smuzhiyun #define PCIE9098_HOST_INT_SEL 0x1C58 216*4882a593Smuzhiyun /** PCIE data exchange register 0 */ 217*4882a593Smuzhiyun #define PCIE9098_SCRATCH_0_REG 0x1C60 218*4882a593Smuzhiyun /** PCIE data exchange register 1 */ 219*4882a593Smuzhiyun #define PCIE9098_SCRATCH_1_REG 0x1C64 220*4882a593Smuzhiyun /** PCIE data exchange register 2 */ 221*4882a593Smuzhiyun #define PCIE9098_SCRATCH_2_REG 0x1C68 222*4882a593Smuzhiyun /** PCIE data exchange register 3 */ 223*4882a593Smuzhiyun #define PCIE9098_SCRATCH_3_REG 0x1C6C 224*4882a593Smuzhiyun /** PCIE data exchange register 4 */ 225*4882a593Smuzhiyun #define PCIE9098_SCRATCH_4_REG 0x1C70 226*4882a593Smuzhiyun /** PCIE data exchange register 5 */ 227*4882a593Smuzhiyun #define PCIE9098_SCRATCH_5_REG 0x1C74 228*4882a593Smuzhiyun /** PCIE data exchange register 6 */ 229*4882a593Smuzhiyun #define PCIE9098_SCRATCH_6_REG 0x1C78 230*4882a593Smuzhiyun /** PCIE data exchange register 7 */ 231*4882a593Smuzhiyun #define PCIE9098_SCRATCH_7_REG 0x1C7C 232*4882a593Smuzhiyun /** PCIE data exchange register 8 */ 233*4882a593Smuzhiyun #define PCIE9098_SCRATCH_8_REG 0x1C80 234*4882a593Smuzhiyun /** PCIE data exchange register 9 */ 235*4882a593Smuzhiyun #define PCIE9098_SCRATCH_9_REG 0x1C84 236*4882a593Smuzhiyun /** PCIE data exchange register 10 */ 237*4882a593Smuzhiyun #define PCIE9098_SCRATCH_10_REG 0x1C88 238*4882a593Smuzhiyun /** PCIE data exchange register 11 */ 239*4882a593Smuzhiyun #define PCIE9098_SCRATCH_11_REG 0x1C8C 240*4882a593Smuzhiyun /** PCIE data exchange register 12 */ 241*4882a593Smuzhiyun #define PCIE9098_SCRATCH_12_REG 0x1C90 242*4882a593Smuzhiyun /** PCIE data exchange register 13 */ 243*4882a593Smuzhiyun #define PCIE9098_SCRATCH_13_REG 0x1C94 244*4882a593Smuzhiyun /** PCIE data exchange register 14 */ 245*4882a593Smuzhiyun #define PCIE9098_SCRATCH_14_REG 0x1C98 246*4882a593Smuzhiyun /** PCIE data exchange register 15 */ 247*4882a593Smuzhiyun #define PCIE9098_SCRATCH_15_REG 0x1C9C 248*4882a593Smuzhiyun /** ADMA CHAN0_Q0 start address, Tx Data */ 249*4882a593Smuzhiyun #define ADMA_CHAN0_Q0 0x10000 250*4882a593Smuzhiyun /** ADMA CHAN1_Q0 start address, Rx Data */ 251*4882a593Smuzhiyun #define ADMA_CHAN1_Q0 0x10800 252*4882a593Smuzhiyun /** ADMA CHAN1_Q1 start address, Rx Event */ 253*4882a593Smuzhiyun #define ADMA_CHAN1_Q1 0x10880 254*4882a593Smuzhiyun /** ADMA CHAN2_Q0 start address, Tx Command */ 255*4882a593Smuzhiyun #define ADMA_CHAN2_Q0 0x11000 256*4882a593Smuzhiyun /** ADMA CHAN2_Q1 start address, Command Resp */ 257*4882a593Smuzhiyun #define ADMA_CHAN2_Q1 0x11080 258*4882a593Smuzhiyun /** CH0-Q0' src rd/wr ptr */ 259*4882a593Smuzhiyun #define ADMA_SRC_PTR_CH0_Q0 (ADMA_CHAN0_Q0 + ADMA_SRC_RW_PTR) 260*4882a593Smuzhiyun /** CH1-Q1' dest rd/wr ptr */ 261*4882a593Smuzhiyun #define ADMA_DST_PTR_CH1_Q0 (ADMA_CHAN1_Q0 + ADMA_DST_RW_PTR) 262*4882a593Smuzhiyun /** CH1-Q1' dest rd/wr ptr */ 263*4882a593Smuzhiyun #define ADMA_DST_PTR_CH1_Q1 (ADMA_CHAN1_Q1 + ADMA_DST_RW_PTR) 264*4882a593Smuzhiyun /* TX buffer description read pointer */ 265*4882a593Smuzhiyun #define PCIE9098_TXBD_RDPTR ADMA_SRC_PTR_CH0_Q0 266*4882a593Smuzhiyun /* TX buffer description write pointer */ 267*4882a593Smuzhiyun #define PCIE9098_TXBD_WRPTR ADMA_SRC_PTR_CH0_Q0 268*4882a593Smuzhiyun /* RX buffer description read pointer */ 269*4882a593Smuzhiyun #define PCIE9098_RXBD_RDPTR ADMA_DST_PTR_CH1_Q0 270*4882a593Smuzhiyun /* RX buffer description write pointer */ 271*4882a593Smuzhiyun #define PCIE9098_RXBD_WRPTR ADMA_DST_PTR_CH1_Q0 272*4882a593Smuzhiyun /* Event buffer description read pointer */ 273*4882a593Smuzhiyun #define PCIE9098_EVTBD_RDPTR ADMA_DST_PTR_CH1_Q1 274*4882a593Smuzhiyun /* Event buffer description write pointer */ 275*4882a593Smuzhiyun #define PCIE9098_EVTBD_WRPTR ADMA_DST_PTR_CH1_Q1 276*4882a593Smuzhiyun /* Driver ready signature write pointer */ 277*4882a593Smuzhiyun #define PCIE9098_DRV_READY PCIE9098_SCRATCH_12_REG 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /** interrupt bit define for ADMA CHAN0 Q0, For Tx DATA */ 280*4882a593Smuzhiyun #define ADMA_INT_CHAN0_Q0 MBIT(0) 281*4882a593Smuzhiyun /** interrupt bit define for ADMA CHAN1 Q0, For Rx Data */ 282*4882a593Smuzhiyun #define AMDA_INT_CHAN1_Q0 MBIT(16) 283*4882a593Smuzhiyun /** interrupt bit define for ADMA CHAN1 Q1, For Rx Event */ 284*4882a593Smuzhiyun #define AMDA_INT_CHAN1_Q1 MBIT(17) 285*4882a593Smuzhiyun /** interrupt bit define for ADMA CHAN2 Q0, For Tx Command */ 286*4882a593Smuzhiyun #define AMDA_INT_CHAN2_Q0 MBIT(24) 287*4882a593Smuzhiyun /** interrupt bit define for ADMA CHAN2 Q1, For Rx Command Resp */ 288*4882a593Smuzhiyun #define AMDA_INT_CHAN2_Q1 MBIT(25) 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /** interrupt vector number for ADMA CHAN0 Q0, For Tx DATA */ 291*4882a593Smuzhiyun #define ADMA_VECTOR_CHAN0_Q0 0 292*4882a593Smuzhiyun /** interrupt vector number for ADMA CHAN1 Q0, For Rx Data */ 293*4882a593Smuzhiyun #define AMDA_VECTOR_CHAN1_Q0 16 294*4882a593Smuzhiyun /** interrupt vector number for ADMA CHAN1 Q1, For Rx Event */ 295*4882a593Smuzhiyun #define AMDA_VECTOR_CHAN1_Q1 17 296*4882a593Smuzhiyun /** interrupt vector number for ADMA CHAN2 Q0, For Tx Command */ 297*4882a593Smuzhiyun #define AMDA_VECTOR_CHAN2_Q0 24 298*4882a593Smuzhiyun /** interrupt vector number for ADMA CHAN2 Q1, For Rx Command Resp */ 299*4882a593Smuzhiyun #define AMDA_VECTOR_CHAN2_Q1 25 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /** Data sent interrupt for host */ 302*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_DNLD_DONE ADMA_INT_CHAN0_Q0 303*4882a593Smuzhiyun /** Data receive interrupt for host */ 304*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_UPLD_RDY AMDA_INT_CHAN1_Q0 305*4882a593Smuzhiyun /** Command sent interrupt for host */ 306*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_CMD_DONE AMDA_INT_CHAN2_Q1 307*4882a593Smuzhiyun /** Event ready interrupt for host */ 308*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_EVENT_RDY AMDA_INT_CHAN1_Q1 309*4882a593Smuzhiyun /** CMD sent interrupt for host */ 310*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_CMD_DNLD MBIT(7) 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun /** Interrupt mask for host */ 313*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_MASK \ 314*4882a593Smuzhiyun (PCIE9098_HOST_INTR_DNLD_DONE | PCIE9098_HOST_INTR_UPLD_RDY | \ 315*4882a593Smuzhiyun PCIE9098_HOST_INTR_CMD_DONE | PCIE9098_HOST_INTR_CMD_DNLD | \ 316*4882a593Smuzhiyun PCIE9098_HOST_INTR_EVENT_RDY) 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /** Interrupt select mask for host */ 319*4882a593Smuzhiyun #define PCIE9098_HOST_INTR_SEL_MASK \ 320*4882a593Smuzhiyun (PCIE9098_HOST_INTR_DNLD_DONE | PCIE9098_HOST_INTR_UPLD_RDY | \ 321*4882a593Smuzhiyun PCIE9098_HOST_INTR_CMD_DONE | PCIE9098_HOST_INTR_EVENT_RDY) 322*4882a593Smuzhiyun #endif 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #if defined(PCIE8997) || defined(PCIE8897) 325*4882a593Smuzhiyun /* PCIE INTERNAL REGISTERS */ 326*4882a593Smuzhiyun /** PCIE data exchange register 0 */ 327*4882a593Smuzhiyun #define PCIE_SCRATCH_0_REG 0x0C10 328*4882a593Smuzhiyun /** PCIE data exchange register 1 */ 329*4882a593Smuzhiyun #define PCIE_SCRATCH_1_REG 0x0C14 330*4882a593Smuzhiyun /** PCIE CPU interrupt events */ 331*4882a593Smuzhiyun #define PCIE_CPU_INT_EVENT 0x0C18 332*4882a593Smuzhiyun /** PCIE CPU interrupt status */ 333*4882a593Smuzhiyun #define PCIE_CPU_INT_STATUS 0x0C1C 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun /** PCIe CPU Interrupt Status Mask */ 336*4882a593Smuzhiyun #define PCIE_CPU_INT2ARM_ISM 0x0C28 337*4882a593Smuzhiyun /** PCIE host interrupt status */ 338*4882a593Smuzhiyun #define PCIE_HOST_INT_STATUS 0x0C30 339*4882a593Smuzhiyun /** PCIE host interrupt mask */ 340*4882a593Smuzhiyun #define PCIE_HOST_INT_MASK 0x0C34 341*4882a593Smuzhiyun /** PCIE host interrupt status mask */ 342*4882a593Smuzhiyun #define PCIE_HOST_INT_STATUS_MASK 0x0C3C 343*4882a593Smuzhiyun /** PCIE data exchange register 2 */ 344*4882a593Smuzhiyun #define PCIE_SCRATCH_2_REG 0x0C40 345*4882a593Smuzhiyun /** PCIE data exchange register 3 */ 346*4882a593Smuzhiyun #define PCIE_SCRATCH_3_REG 0x0C44 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun #define PCIE_IP_REV_REG 0x0C48 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /** PCIE data exchange register 4 */ 351*4882a593Smuzhiyun #define PCIE_SCRATCH_4_REG 0x0CD0 352*4882a593Smuzhiyun /** PCIE data exchange register 5 */ 353*4882a593Smuzhiyun #define PCIE_SCRATCH_5_REG 0x0CD4 354*4882a593Smuzhiyun /** PCIE data exchange register 6 */ 355*4882a593Smuzhiyun #define PCIE_SCRATCH_6_REG 0x0CD8 356*4882a593Smuzhiyun /** PCIE data exchange register 7 */ 357*4882a593Smuzhiyun #define PCIE_SCRATCH_7_REG 0x0CDC 358*4882a593Smuzhiyun /** PCIE data exchange register 8 */ 359*4882a593Smuzhiyun #define PCIE_SCRATCH_8_REG 0x0CE0 360*4882a593Smuzhiyun /** PCIE data exchange register 9 */ 361*4882a593Smuzhiyun #define PCIE_SCRATCH_9_REG 0x0CE4 362*4882a593Smuzhiyun /** PCIE data exchange register 10 */ 363*4882a593Smuzhiyun #define PCIE_SCRATCH_10_REG 0x0CE8 364*4882a593Smuzhiyun /** PCIE data exchange register 11 */ 365*4882a593Smuzhiyun #define PCIE_SCRATCH_11_REG 0x0CEC 366*4882a593Smuzhiyun /** PCIE data exchange register 12 */ 367*4882a593Smuzhiyun #define PCIE_SCRATCH_12_REG 0x0CF0 368*4882a593Smuzhiyun #endif 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun #ifdef PCIE8997 371*4882a593Smuzhiyun /* PCIE read data pointer for queue 0 and 1 */ 372*4882a593Smuzhiyun #define PCIE8997_RD_DATA_PTR_Q0_Q1 0xC1A4 /* 0x8000C1A4 */ 373*4882a593Smuzhiyun /* PCIE read data pointer for queue 2 and 3 */ 374*4882a593Smuzhiyun #define PCIE8997_RD_DATA_PTR_Q2_Q3 0xC1A8 /* 0x8000C1A8 */ 375*4882a593Smuzhiyun /* PCIE write data pointer for queue 0 and 1 */ 376*4882a593Smuzhiyun #define PCIE8997_WR_DATA_PTR_Q0_Q1 0xC174 /* 0x8000C174 */ 377*4882a593Smuzhiyun /* PCIE write data pointer for queue 2 and 3 */ 378*4882a593Smuzhiyun #define PCIE8997_WR_DATA_PTR_Q2_Q3 0xC178 /* 0x8000C178 */ 379*4882a593Smuzhiyun #endif 380*4882a593Smuzhiyun #ifdef PCIE8897 381*4882a593Smuzhiyun /* PCIE read data pointer for queue 0 and 1 */ 382*4882a593Smuzhiyun #define PCIE8897_RD_DATA_PTR_Q0_Q1 0xC08C /* 0x8000C08C */ 383*4882a593Smuzhiyun /* PCIE read data pointer for queue 2 and 3 */ 384*4882a593Smuzhiyun #define PCIE8897_RD_DATA_PTR_Q2_Q3 0xC090 /* 0x8000C090 */ 385*4882a593Smuzhiyun /* PCIE write data pointer for queue 0 and 1 */ 386*4882a593Smuzhiyun #define PCIE8897_WR_DATA_PTR_Q0_Q1 0xC05C /* 0x8000C05C */ 387*4882a593Smuzhiyun /* PCIE write data pointer for queue 2 and 3 */ 388*4882a593Smuzhiyun #define PCIE8897_WR_DATA_PTR_Q2_Q3 0xC060 /* 0x8000C060 */ 389*4882a593Smuzhiyun #endif 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun /** Download ready interrupt for CPU */ 392*4882a593Smuzhiyun #define CPU_INTR_DNLD_RDY MBIT(0) 393*4882a593Smuzhiyun /** Command ready interrupt for CPU */ 394*4882a593Smuzhiyun #define CPU_INTR_DOOR_BELL MBIT(1) 395*4882a593Smuzhiyun /** Confirmation that sleep confirm message has been processed. 396*4882a593Smuzhiyun Device will enter sleep after receiving this interrupt */ 397*4882a593Smuzhiyun #define CPU_INTR_SLEEP_CFM_DONE MBIT(2) 398*4882a593Smuzhiyun /** Reset interrupt for CPU */ 399*4882a593Smuzhiyun #define CPU_INTR_RESET MBIT(3) 400*4882a593Smuzhiyun /** Set Event Done interupt to the FW*/ 401*4882a593Smuzhiyun #define CPU_INTR_EVENT_DONE MBIT(5) 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun #if defined(PCIE8997) || defined(PCIE8897) 404*4882a593Smuzhiyun /** Data sent interrupt for host */ 405*4882a593Smuzhiyun #define HOST_INTR_DNLD_DONE MBIT(0) 406*4882a593Smuzhiyun /** Data receive interrupt for host */ 407*4882a593Smuzhiyun #define HOST_INTR_UPLD_RDY MBIT(1) 408*4882a593Smuzhiyun /** Command sent interrupt for host */ 409*4882a593Smuzhiyun #define HOST_INTR_CMD_DONE MBIT(2) 410*4882a593Smuzhiyun /** Event ready interrupt for host */ 411*4882a593Smuzhiyun #define HOST_INTR_EVENT_RDY MBIT(3) 412*4882a593Smuzhiyun /** Interrupt mask for host */ 413*4882a593Smuzhiyun #define HOST_INTR_MASK \ 414*4882a593Smuzhiyun (HOST_INTR_DNLD_DONE | HOST_INTR_UPLD_RDY | HOST_INTR_CMD_DONE | \ 415*4882a593Smuzhiyun HOST_INTR_EVENT_RDY) 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun /** Lower 32bits command address holding register */ 418*4882a593Smuzhiyun #define REG_CMD_ADDR_LO PCIE_SCRATCH_0_REG 419*4882a593Smuzhiyun /** Upper 32bits command address holding register */ 420*4882a593Smuzhiyun #define REG_CMD_ADDR_HI PCIE_SCRATCH_1_REG 421*4882a593Smuzhiyun /** Command length holding register */ 422*4882a593Smuzhiyun #define REG_CMD_SIZE PCIE_SCRATCH_2_REG 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /** Lower 32bits command response address holding register */ 425*4882a593Smuzhiyun #define REG_CMDRSP_ADDR_LO PCIE_SCRATCH_4_REG 426*4882a593Smuzhiyun /** Upper 32bits command response address holding register */ 427*4882a593Smuzhiyun #define REG_CMDRSP_ADDR_HI PCIE_SCRATCH_5_REG 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun /** TxBD's Read/Write pointer start from bit 16 */ 430*4882a593Smuzhiyun #define TXBD_RW_PTR_START 16 431*4882a593Smuzhiyun /** RxBD's Read/Write pointer start from bit 0 */ 432*4882a593Smuzhiyun #define RXBD_RW_PTR_STRAT 0 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun #define MLAN_BD_FLAG_SOP MBIT(0) 435*4882a593Smuzhiyun #define MLAN_BD_FLAG_EOP MBIT(1) 436*4882a593Smuzhiyun #define MLAN_BD_FLAG_XS_SOP MBIT(2) 437*4882a593Smuzhiyun #define MLAN_BD_FLAG_XS_EOP MBIT(3) 438*4882a593Smuzhiyun 439*4882a593Smuzhiyun /* Event buffer description write pointer */ 440*4882a593Smuzhiyun #define REG_EVTBD_WRPTR PCIE_SCRATCH_10_REG 441*4882a593Smuzhiyun /* Event buffer description read pointer */ 442*4882a593Smuzhiyun #define REG_EVTBD_RDPTR PCIE_SCRATCH_11_REG 443*4882a593Smuzhiyun /* Driver ready signature write pointer */ 444*4882a593Smuzhiyun #define REG_DRV_READY PCIE_SCRATCH_12_REG 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun /** Event Read/Write pointer mask */ 447*4882a593Smuzhiyun #define EVT_RW_PTR_MASK 0x0f 448*4882a593Smuzhiyun /** Event Read/Write pointer rollover bit */ 449*4882a593Smuzhiyun #define EVT_RW_PTR_ROLLOVER_IND MBIT(7) 450*4882a593Smuzhiyun #endif 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun /* Define PCIE block size for firmware download */ 453*4882a593Smuzhiyun #define MLAN_PCIE_BLOCK_SIZE_FW_DNLD 256 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun /** Extra added macros **/ 456*4882a593Smuzhiyun #define MLAN_EVENT_HEADER_LEN 8 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun /** Max interrupt status register read limit */ 459*4882a593Smuzhiyun #define MAX_READ_REG_RETRY 10000 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun extern mlan_adapter_operations mlan_pcie_ops; 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun /* Get pcie device from card type */ 464*4882a593Smuzhiyun mlan_status wlan_get_pcie_device(pmlan_adapter pmadapter); 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun /** Set PCIE host buffer configurations */ 467*4882a593Smuzhiyun mlan_status wlan_set_pcie_buf_config(mlan_private *pmpriv); 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun /** Init write pointer */ 470*4882a593Smuzhiyun mlan_status wlan_pcie_init_fw(pmlan_adapter pmadapter); 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun #if defined(PCIE8997) || defined(PCIE8897) 473*4882a593Smuzhiyun /** Prepare command PCIE host buffer config */ 474*4882a593Smuzhiyun mlan_status wlan_cmd_pcie_host_buf_cfg(pmlan_private pmpriv, 475*4882a593Smuzhiyun pHostCmd_DS_COMMAND cmd, 476*4882a593Smuzhiyun t_u16 cmd_action, t_pvoid pdata_buf); 477*4882a593Smuzhiyun #endif 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun /** Wakeup PCIE card */ 480*4882a593Smuzhiyun mlan_status wlan_pcie_wakeup(pmlan_adapter pmadapter); 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun /** Set DRV_READY register */ 483*4882a593Smuzhiyun mlan_status wlan_set_drv_ready_reg(mlan_adapter *pmadapter, t_u32 val); 484*4882a593Smuzhiyun /** PCIE init */ 485*4882a593Smuzhiyun mlan_status wlan_pcie_init(mlan_adapter *pmadapter); 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun /** Read interrupt status */ 488*4882a593Smuzhiyun mlan_status wlan_process_msix_int(mlan_adapter *pmadapter); 489*4882a593Smuzhiyun /** Transfer data to card */ 490*4882a593Smuzhiyun mlan_status wlan_pcie_host_to_card(pmlan_private pmpriv, t_u8 type, 491*4882a593Smuzhiyun mlan_buffer *mbuf, mlan_tx_param *tx_param); 492*4882a593Smuzhiyun /** Ring buffer allocation function */ 493*4882a593Smuzhiyun mlan_status wlan_alloc_pcie_ring_buf(pmlan_adapter pmadapter); 494*4882a593Smuzhiyun /** Ring buffer deallocation function */ 495*4882a593Smuzhiyun mlan_status wlan_free_pcie_ring_buf(pmlan_adapter pmadapter); 496*4882a593Smuzhiyun /** Ring buffer cleanup function, e.g. on deauth */ 497*4882a593Smuzhiyun mlan_status wlan_clean_pcie_ring_buf(pmlan_adapter pmadapter); 498*4882a593Smuzhiyun mlan_status wlan_alloc_ssu_pcie_buf(pmlan_adapter pmadapter); 499*4882a593Smuzhiyun mlan_status wlan_free_ssu_pcie_buf(pmlan_adapter pmadapter); 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun #endif /* _MLAN_PCIE_H_ */ 502