1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _DXE_H_
18#define _DXE_H_
19
20#include "wcn36xx.h"
21
22
23
24
25
26
27
28
29
30
31#define WCN36XX_DXE_MEM_REG 0
32
33#define WCN36XX_CCU_DXE_INT_SELECT_RIVA 0x310
34#define WCN36XX_CCU_DXE_INT_SELECT_PRONTO 0x10dc
35
36
37#define WCN36xx_DXE_CTRL_VLD BIT(0)
38
39#define WCN36xx_DXE_CTRL_EOP BIT(3)
40
41#define WCN36xx_DXE_CTRL_BDH BIT(4)
42
43#define WCN36xx_DXE_CTRL_SIQ BIT(5)
44
45#define WCN36xx_DXE_CTRL_DIQ BIT(6)
46
47#define WCN36xx_DXE_CTRL_PIQ BIT(7)
48
49#define WCN36xx_DXE_CTRL_PDU_REL BIT(8)
50
51#define WCN36xx_DXE_CTRL_STOP BIT(16)
52
53#define WCN36xx_DXE_CTRL_INT BIT(17)
54
55#define WCN36xx_DXE_CTRL_SWAP BIT(20)
56
57#define WCN36xx_DXE_CTRL_ENDIANNESS BIT(21)
58
59
60#define WCN36xx_DXE_CTRL_XTYPE_SHIFT 1
61#define WCN36xx_DXE_CTRL_XTYPE_MASK GENMASK(2, WCN36xx_DXE_CTRL_XTYPE_SHIFT)
62#define WCN36xx_DXE_CTRL_XTYPE_SET(x) ((x) << WCN36xx_DXE_CTRL_XTYPE_SHIFT)
63
64
65#define WCN36xx_DXE_CTRL_BTHLD_SEL_SHIFT 9
66#define WCN36xx_DXE_CTRL_BTHLD_SEL_MASK GENMASK(12, WCN36xx_DXE_CTRL_BTHLD_SEL_SHIFT)
67#define WCN36xx_DXE_CTRL_BTHLD_SEL_SET(x) ((x) << WCN36xx_DXE_CTRL_BTHLD_SEL_SHIFT)
68
69
70#define WCN36xx_DXE_CTRL_PRIO_SHIFT 13
71#define WCN36xx_DXE_CTRL_PRIO_MASK GENMASK(15, WCN36xx_DXE_CTRL_PRIO_SHIFT)
72#define WCN36xx_DXE_CTRL_PRIO_SET(x) ((x) << WCN36xx_DXE_CTRL_PRIO_SHIFT)
73
74
75#define WCN36xx_DXE_CTRL_BDT_IDX_SHIFT 18
76#define WCN36xx_DXE_CTRL_BDT_IDX_MASK GENMASK(19, WCN36xx_DXE_CTRL_BDT_IDX_SHIFT)
77#define WCN36xx_DXE_CTRL_BDT_IDX_SET(x) ((x) << WCN36xx_DXE_CTRL_BDT_IDX_SHIFT)
78
79
80
81#define WCN36xx_DXE_XTYPE_H2H (0)
82
83#define WCN36xx_DXE_XTYPE_H2B (2)
84
85#define WCN36xx_DXE_XTYPE_B2H (3)
86
87#define WCN36XX_DXE_CTRL_TX_L (WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
88 WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(5) | \
89 WCN36xx_DXE_CTRL_PRIO_SET(4) | WCN36xx_DXE_CTRL_INT | \
90 WCN36xx_DXE_CTRL_SWAP | WCN36xx_DXE_CTRL_ENDIANNESS)
91
92#define WCN36XX_DXE_CTRL_TX_H (WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
93 WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(7) | \
94 WCN36xx_DXE_CTRL_PRIO_SET(6) | WCN36xx_DXE_CTRL_INT | \
95 WCN36xx_DXE_CTRL_SWAP | WCN36xx_DXE_CTRL_ENDIANNESS)
96
97#define WCN36XX_DXE_CTRL_RX_L (WCN36xx_DXE_CTRL_VLD | \
98 WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
99 WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_SIQ | \
100 WCN36xx_DXE_CTRL_PDU_REL | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(6) | \
101 WCN36xx_DXE_CTRL_PRIO_SET(5) | WCN36xx_DXE_CTRL_INT | \
102 WCN36xx_DXE_CTRL_SWAP)
103
104#define WCN36XX_DXE_CTRL_RX_H (WCN36xx_DXE_CTRL_VLD | \
105 WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
106 WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_SIQ | \
107 WCN36xx_DXE_CTRL_PDU_REL | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(8) | \
108 WCN36xx_DXE_CTRL_PRIO_SET(6) | WCN36xx_DXE_CTRL_INT | \
109 WCN36xx_DXE_CTRL_SWAP)
110
111#define WCN36XX_DXE_CTRL_TX_H_BD (WCN36xx_DXE_CTRL_VLD | \
112 WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
113 WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(7) | \
114 WCN36xx_DXE_CTRL_PRIO_SET(6) | WCN36xx_DXE_CTRL_SWAP | \
115 WCN36xx_DXE_CTRL_ENDIANNESS)
116
117#define WCN36XX_DXE_CTRL_TX_H_SKB (WCN36xx_DXE_CTRL_VLD | \
118 WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
119 WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_DIQ | \
120 WCN36xx_DXE_CTRL_BTHLD_SEL_SET(7) | WCN36xx_DXE_CTRL_PRIO_SET(6) | \
121 WCN36xx_DXE_CTRL_INT | WCN36xx_DXE_CTRL_SWAP | \
122 WCN36xx_DXE_CTRL_ENDIANNESS)
123
124#define WCN36XX_DXE_CTRL_TX_L_BD (WCN36xx_DXE_CTRL_VLD | \
125 WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
126 WCN36xx_DXE_CTRL_DIQ | WCN36xx_DXE_CTRL_BTHLD_SEL_SET(5) | \
127 WCN36xx_DXE_CTRL_PRIO_SET(4) | WCN36xx_DXE_CTRL_SWAP | \
128 WCN36xx_DXE_CTRL_ENDIANNESS)
129
130#define WCN36XX_DXE_CTRL_TX_L_SKB (WCN36xx_DXE_CTRL_VLD | \
131 WCN36xx_DXE_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
132 WCN36xx_DXE_CTRL_EOP | WCN36xx_DXE_CTRL_DIQ | \
133 WCN36xx_DXE_CTRL_BTHLD_SEL_SET(5) | WCN36xx_DXE_CTRL_PRIO_SET(4) | \
134 WCN36xx_DXE_CTRL_INT | WCN36xx_DXE_CTRL_SWAP | \
135 WCN36xx_DXE_CTRL_ENDIANNESS)
136
137
138#define WCN36XX_DXE_WQ_TX_L 0x17
139#define WCN36XX_DXE_WQ_TX_H 0x17
140#define WCN36XX_DXE_WQ_RX_L 0xB
141#define WCN36XX_DXE_WQ_RX_H 0x4
142
143
144#define WCN36xx_DXE_CH_CTRL_EN BIT(0)
145
146#define WCN36xx_DXE_CH_CTRL_EOP BIT(3)
147
148#define WCN36xx_DXE_CH_CTRL_BDH BIT(4)
149
150#define WCN36xx_DXE_CH_CTRL_SIQ BIT(5)
151
152#define WCN36xx_DXE_CH_CTRL_DIQ BIT(6)
153
154#define WCN36xx_DXE_CH_CTRL_PIQ BIT(7)
155
156#define WCN36xx_DXE_CH_CTRL_PDU_REL BIT(8)
157
158#define WCN36xx_DXE_CH_CTRL_STOP BIT(16)
159
160#define WCN36xx_DXE_CH_CTRL_INE_ED BIT(17)
161
162#define WCN36xx_DXE_CH_CTRL_INE_ERR BIT(18)
163
164#define WCN36xx_DXE_CH_CTRL_INE_DONE BIT(19)
165
166#define WCN36xx_DXE_CH_CTRL_EDEN BIT(20)
167
168#define WCN36xx_DXE_CH_CTRL_EDVEN BIT(21)
169
170#define WCN36xx_DXE_CH_CTRL_ENDIANNESS BIT(26)
171
172#define WCN36xx_DXE_CH_CTRL_ABORT BIT(27)
173
174#define WCN36xx_DXE_CH_CTRL_DFMT BIT(28)
175
176#define WCN36xx_DXE_CH_CTRL_SWAP BIT(31)
177
178
179#define WCN36xx_DXE_CH_CTRL_XTYPE_SHIFT 1
180#define WCN36xx_DXE_CH_CTRL_XTYPE_MASK GENMASK(2, WCN36xx_DXE_CH_CTRL_XTYPE_SHIFT)
181#define WCN36xx_DXE_CH_CTRL_XTYPE_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_XTYPE_SHIFT)
182
183
184#define WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SHIFT 9
185#define WCN36xx_DXE_CH_CTRL_BTHLD_SEL_MASK GENMASK(12, WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SHIFT)
186#define WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SHIFT)
187
188
189#define WCN36xx_DXE_CH_CTRL_PRIO_SHIFT 13
190#define WCN36xx_DXE_CH_CTRL_PRIO_MASK GENMASK(15, WCN36xx_DXE_CH_CTRL_PRIO_SHIFT)
191#define WCN36xx_DXE_CH_CTRL_PRIO_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_PRIO_SHIFT)
192
193
194#define WCN36xx_DXE_CH_CTRL_SEL_SHIFT 22
195#define WCN36xx_DXE_CH_CTRL_SEL_MASK GENMASK(25, WCN36xx_DXE_CH_CTRL_SEL_SHIFT)
196#define WCN36xx_DXE_CH_CTRL_SEL_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_SEL_SHIFT)
197
198
199#define WCN36xx_DXE_CH_CTRL_BDT_IDX_SHIFT 29
200#define WCN36xx_DXE_CH_CTRL_BDT_IDX_MASK GENMASK(30, WCN36xx_DXE_CH_CTRL_BDT_IDX_SHIFT)
201#define WCN36xx_DXE_CH_CTRL_BDT_IDX_SET(x) ((x) << WCN36xx_DXE_CH_CTRL_BDT_IDX_SHIFT)
202
203
204#define WCN36XX_DXE_CH_DEFAULT_CTL_RX_L (WCN36xx_DXE_CH_CTRL_EN | \
205 WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
206 WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_SIQ | \
207 WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(6) | \
208 WCN36xx_DXE_CH_CTRL_PRIO_SET(5) | WCN36xx_DXE_CH_CTRL_INE_ED | \
209 WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
210 WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
211 WCN36xx_DXE_CH_CTRL_SEL_SET(1) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
212 WCN36xx_DXE_CH_CTRL_SWAP)
213
214#define WCN36XX_DXE_CH_DEFAULT_CTL_RX_H (WCN36xx_DXE_CH_CTRL_EN | \
215 WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_B2H) | \
216 WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_SIQ | \
217 WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(8) | \
218 WCN36xx_DXE_CH_CTRL_PRIO_SET(6) | WCN36xx_DXE_CH_CTRL_INE_ED | \
219 WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
220 WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
221 WCN36xx_DXE_CH_CTRL_SEL_SET(3) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
222 WCN36xx_DXE_CH_CTRL_SWAP)
223
224#define WCN36XX_DXE_CH_DEFAULT_CTL_TX_H (WCN36xx_DXE_CH_CTRL_EN | \
225 WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
226 WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_DIQ | \
227 WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(7) | \
228 WCN36xx_DXE_CH_CTRL_PRIO_SET(6) | WCN36xx_DXE_CH_CTRL_INE_ED | \
229 WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
230 WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
231 WCN36xx_DXE_CH_CTRL_SEL_SET(4) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
232 WCN36xx_DXE_CH_CTRL_SWAP)
233
234#define WCN36XX_DXE_CH_DEFAULT_CTL_TX_L (WCN36xx_DXE_CH_CTRL_EN | \
235 WCN36xx_DXE_CH_CTRL_XTYPE_SET(WCN36xx_DXE_XTYPE_H2B) | \
236 WCN36xx_DXE_CH_CTRL_EOP | WCN36xx_DXE_CH_CTRL_DIQ | \
237 WCN36xx_DXE_CH_CTRL_PDU_REL | WCN36xx_DXE_CH_CTRL_BTHLD_SEL_SET(5) | \
238 WCN36xx_DXE_CH_CTRL_PRIO_SET(4) | WCN36xx_DXE_CH_CTRL_INE_ED | \
239 WCN36xx_DXE_CH_CTRL_INE_ERR | WCN36xx_DXE_CH_CTRL_INE_DONE | \
240 WCN36xx_DXE_CH_CTRL_EDEN | WCN36xx_DXE_CH_CTRL_EDVEN | \
241 WCN36xx_DXE_CH_CTRL_SEL_SET(0) | WCN36xx_DXE_CH_CTRL_ENDIANNESS | \
242 WCN36xx_DXE_CH_CTRL_SWAP)
243
244
245#define WCN36XX_DXE_MEM_CSR (WCN36XX_DXE_MEM_REG + 0x00)
246#define WCN36XX_DXE_REG_CSR_RESET (WCN36XX_DXE_MEM_REG + 0x00)
247#define WCN36XX_DXE_ENCH_ADDR (WCN36XX_DXE_MEM_REG + 0x04)
248#define WCN36XX_DXE_REG_CH_EN (WCN36XX_DXE_MEM_REG + 0x08)
249#define WCN36XX_DXE_REG_CH_DONE (WCN36XX_DXE_MEM_REG + 0x0C)
250#define WCN36XX_DXE_REG_CH_ERR (WCN36XX_DXE_MEM_REG + 0x10)
251#define WCN36XX_DXE_INT_MASK_REG (WCN36XX_DXE_MEM_REG + 0x18)
252#define WCN36XX_DXE_INT_SRC_RAW_REG (WCN36XX_DXE_MEM_REG + 0x20)
253
254
255 #define WCN36XX_DXE_INT_CH4_MASK 0x00000010
256 #define WCN36XX_DXE_INT_CH3_MASK 0x00000008
257
258 #define WCN36XX_DXE_INT_CH1_MASK 0x00000002
259 #define WCN36XX_DXE_INT_CH0_MASK 0x00000001
260#define WCN36XX_DXE_0_INT_CLR (WCN36XX_DXE_MEM_REG + 0x30)
261#define WCN36XX_DXE_0_INT_ED_CLR (WCN36XX_DXE_MEM_REG + 0x34)
262#define WCN36XX_DXE_0_INT_DONE_CLR (WCN36XX_DXE_MEM_REG + 0x38)
263#define WCN36XX_DXE_0_INT_ERR_CLR (WCN36XX_DXE_MEM_REG + 0x3C)
264
265#define WCN36XX_CH_STAT_INT_DONE_MASK 0x00008000
266#define WCN36XX_CH_STAT_INT_ERR_MASK 0x00004000
267#define WCN36XX_CH_STAT_INT_ED_MASK 0x00002000
268
269#define WCN36XX_DXE_0_CH0_STATUS (WCN36XX_DXE_MEM_REG + 0x404)
270#define WCN36XX_DXE_0_CH1_STATUS (WCN36XX_DXE_MEM_REG + 0x444)
271#define WCN36XX_DXE_0_CH2_STATUS (WCN36XX_DXE_MEM_REG + 0x484)
272#define WCN36XX_DXE_0_CH3_STATUS (WCN36XX_DXE_MEM_REG + 0x4C4)
273#define WCN36XX_DXE_0_CH4_STATUS (WCN36XX_DXE_MEM_REG + 0x504)
274
275#define WCN36XX_DXE_REG_RESET 0x5c89
276
277
278#define WCN36XX_DXE_BMU_WQ_RX_LOW 0xB
279#define WCN36XX_DXE_BMU_WQ_RX_HIGH 0x4
280
281#define WCN36XX_DXE_TX_LOW_OFFSET 0x400
282#define WCN36XX_DXE_TX_HIGH_OFFSET 0x500
283#define WCN36XX_DXE_RX_LOW_OFFSET 0x440
284#define WCN36XX_DXE_RX_HIGH_OFFSET 0x4C0
285
286
287#define WCN36XX_DXE_CH_NEXT_DESC_ADDR 0x001C
288#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_L (WCN36XX_DXE_MEM_REG + \
289 WCN36XX_DXE_TX_LOW_OFFSET + \
290 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
291#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_H (WCN36XX_DXE_MEM_REG + \
292 WCN36XX_DXE_TX_HIGH_OFFSET + \
293 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
294#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
295 WCN36XX_DXE_RX_LOW_OFFSET + \
296 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
297#define WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
298 WCN36XX_DXE_RX_HIGH_OFFSET + \
299 WCN36XX_DXE_CH_NEXT_DESC_ADDR)
300
301
302#define WCN36XX_DXE_CH_SRC_ADDR 0x000C
303#define WCN36XX_DXE_CH_SRC_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
304 WCN36XX_DXE_RX_LOW_OFFSET + \
305 WCN36XX_DXE_CH_SRC_ADDR)
306#define WCN36XX_DXE_CH_SRC_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
307 WCN36XX_DXE_RX_HIGH_OFFSET + \
308 WCN36XX_DXE_CH_SRC_ADDR)
309
310
311#define WCN36XX_DXE_CH_DEST_ADDR 0x0014
312#define WCN36XX_DXE_CH_DEST_ADDR_TX_L (WCN36XX_DXE_MEM_REG + \
313 WCN36XX_DXE_TX_LOW_OFFSET + \
314 WCN36XX_DXE_CH_DEST_ADDR)
315#define WCN36XX_DXE_CH_DEST_ADDR_TX_H (WCN36XX_DXE_MEM_REG + \
316 WCN36XX_DXE_TX_HIGH_OFFSET + \
317 WCN36XX_DXE_CH_DEST_ADDR)
318#define WCN36XX_DXE_CH_DEST_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
319 WCN36XX_DXE_RX_LOW_OFFSET + \
320 WCN36XX_DXE_CH_DEST_ADDR)
321#define WCN36XX_DXE_CH_DEST_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
322 WCN36XX_DXE_RX_HIGH_OFFSET + \
323 WCN36XX_DXE_CH_DEST_ADDR)
324
325
326#define WCN36XX_DXE_CH_STATUS_REG_ADDR 0x0004
327#define WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_L (WCN36XX_DXE_MEM_REG + \
328 WCN36XX_DXE_TX_LOW_OFFSET + \
329 WCN36XX_DXE_CH_STATUS_REG_ADDR)
330#define WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_H (WCN36XX_DXE_MEM_REG + \
331 WCN36XX_DXE_TX_HIGH_OFFSET + \
332 WCN36XX_DXE_CH_STATUS_REG_ADDR)
333#define WCN36XX_DXE_CH_STATUS_REG_ADDR_RX_L (WCN36XX_DXE_MEM_REG + \
334 WCN36XX_DXE_RX_LOW_OFFSET + \
335 WCN36XX_DXE_CH_STATUS_REG_ADDR)
336#define WCN36XX_DXE_CH_STATUS_REG_ADDR_RX_H (WCN36XX_DXE_MEM_REG + \
337 WCN36XX_DXE_RX_HIGH_OFFSET + \
338 WCN36XX_DXE_CH_STATUS_REG_ADDR)
339
340
341
342#define WCN36XX_DXE_REG_CTL_RX_L (WCN36XX_DXE_MEM_REG + \
343 WCN36XX_DXE_RX_LOW_OFFSET)
344#define WCN36XX_DXE_REG_CTL_RX_H (WCN36XX_DXE_MEM_REG + \
345 WCN36XX_DXE_RX_HIGH_OFFSET)
346#define WCN36XX_DXE_REG_CTL_TX_H (WCN36XX_DXE_MEM_REG + \
347 WCN36XX_DXE_TX_HIGH_OFFSET)
348#define WCN36XX_DXE_REG_CTL_TX_L (WCN36XX_DXE_MEM_REG + \
349 WCN36XX_DXE_TX_LOW_OFFSET)
350
351#define WCN36XX_SMSM_WLAN_TX_ENABLE 0x00000400
352#define WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY 0x00000200
353
354
355
356#define WCN36XX_INT_MASK_CHAN_TX_L 0x00000001
357#define WCN36XX_INT_MASK_CHAN_RX_L 0x00000002
358#define WCN36XX_INT_MASK_CHAN_RX_H 0x00000008
359#define WCN36XX_INT_MASK_CHAN_TX_H 0x00000010
360
361#define WCN36XX_BD_CHUNK_SIZE 128
362
363#define WCN36XX_PKT_SIZE 0xF20
364enum wcn36xx_dxe_ch_type {
365 WCN36XX_DXE_CH_TX_L,
366 WCN36XX_DXE_CH_TX_H,
367 WCN36XX_DXE_CH_RX_L,
368 WCN36XX_DXE_CH_RX_H
369};
370
371
372enum wcn36xx_dxe_ch_desc_num {
373 WCN36XX_DXE_CH_DESC_NUMB_TX_L = 128,
374 WCN36XX_DXE_CH_DESC_NUMB_TX_H = 10,
375 WCN36XX_DXE_CH_DESC_NUMB_RX_L = 512,
376 WCN36XX_DXE_CH_DESC_NUMB_RX_H = 40
377};
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406struct wcn36xx_dxe_desc {
407 u32 ctrl;
408 u32 fr_len;
409
410 u32 src_addr_l;
411 u32 dst_addr_l;
412 u32 phy_next_l;
413 u32 src_addr_h;
414 u32 dst_addr_h;
415 u32 phy_next_h;
416} __packed;
417
418
419struct wcn36xx_dxe_ctl {
420 struct wcn36xx_dxe_ctl *next;
421 struct wcn36xx_dxe_desc *desc;
422 unsigned int desc_phy_addr;
423 int ctl_blk_order;
424 struct sk_buff *skb;
425 void *bd_cpu_addr;
426 dma_addr_t bd_phy_addr;
427};
428
429struct wcn36xx_dxe_ch {
430 spinlock_t lock;
431 enum wcn36xx_dxe_ch_type ch_type;
432 void *cpu_addr;
433 dma_addr_t dma_addr;
434 enum wcn36xx_dxe_ch_desc_num desc_num;
435
436 struct wcn36xx_dxe_ctl *head_blk_ctl;
437 struct wcn36xx_dxe_ctl *tail_blk_ctl;
438
439
440 u32 dxe_wq;
441 u32 ctrl_bd;
442 u32 ctrl_skb;
443 u32 reg_ctrl;
444 u32 def_ctrl;
445};
446
447
448struct wcn36xx_dxe_mem_pool {
449 int chunk_size;
450 void *virt_addr;
451 dma_addr_t phy_addr;
452};
453
454struct wcn36xx_tx_bd;
455struct wcn36xx_vif;
456int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn);
457void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn);
458void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn);
459int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn);
460void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn);
461int wcn36xx_dxe_init(struct wcn36xx *wcn);
462void wcn36xx_dxe_deinit(struct wcn36xx *wcn);
463int wcn36xx_dxe_init_channels(struct wcn36xx *wcn);
464int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn,
465 struct wcn36xx_vif *vif_priv,
466 struct wcn36xx_tx_bd *bd,
467 struct sk_buff *skb,
468 bool is_low);
469void wcn36xx_dxe_tx_ack_ind(struct wcn36xx *wcn, u32 status);
470#endif
471