xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlan/mlan_pcie.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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