Linux-libre 5.4.47-gnu
[librecmc/linux-libre.git] / drivers / net / wireless / ath / wcn36xx / dxe.h
1 /*
2  * Copyright (c) 2013 Eugene Krasnikov <k.eugene.e@gmail.com>
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #ifndef _DXE_H_
18 #define _DXE_H_
19
20 #include "wcn36xx.h"
21
22 /*
23 TX_LOW  = DMA0
24 TX_HIGH = DMA4
25 RX_LOW  = DMA1
26 RX_HIGH = DMA3
27 H2H_TEST_RX_TX = DMA2
28 */
29
30 /* DXE registers */
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 /* Descriptor valid */
37 #define WCN36xx_DXE_CTRL_VLD            BIT(0)
38 /* End of packet */
39 #define WCN36xx_DXE_CTRL_EOP            BIT(3)
40 /* BD handling bit */
41 #define WCN36xx_DXE_CTRL_BDH            BIT(4)
42 /* Source is a queue */
43 #define WCN36xx_DXE_CTRL_SIQ            BIT(5)
44 /* Destination is a queue */
45 #define WCN36xx_DXE_CTRL_DIQ            BIT(6)
46 /* Pointer address is a queue */
47 #define WCN36xx_DXE_CTRL_PIQ            BIT(7)
48 /* Release PDU when done */
49 #define WCN36xx_DXE_CTRL_PDU_REL        BIT(8)
50 /* STOP channel processing */
51 #define WCN36xx_DXE_CTRL_STOP           BIT(16)
52 /* INT on descriptor done */
53 #define WCN36xx_DXE_CTRL_INT            BIT(17)
54 /* Endian byte swap enable */
55 #define WCN36xx_DXE_CTRL_SWAP           BIT(20)
56 /* Master endianness */
57 #define WCN36xx_DXE_CTRL_ENDIANNESS     BIT(21)
58
59 /* Transfer type */
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 /* BMU Threshold select */
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 /* Priority */
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 /* BD Template index */
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 /* Transfer types: */
80 /* Host to host */
81 #define WCN36xx_DXE_XTYPE_H2H (0)
82 /* Host to BMU */
83 #define WCN36xx_DXE_XTYPE_H2B (2)
84 /* BMU to host */
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 /* TODO This must calculated properly but not hardcoded */
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 /* Channel enable or restart */
144 #define WCN36xx_DXE_CH_CTRL_EN                  BIT(0)
145 /* End of packet bit */
146 #define WCN36xx_DXE_CH_CTRL_EOP                 BIT(3)
147 /* BD Handling bit */
148 #define WCN36xx_DXE_CH_CTRL_BDH                 BIT(4)
149 /* Source is queue */
150 #define WCN36xx_DXE_CH_CTRL_SIQ                 BIT(5)
151 /* Destination is queue */
152 #define WCN36xx_DXE_CH_CTRL_DIQ                 BIT(6)
153 /* Pointer descriptor is queue */
154 #define WCN36xx_DXE_CH_CTRL_PIQ                 BIT(7)
155 /* Relase PDU when done */
156 #define WCN36xx_DXE_CH_CTRL_PDU_REL             BIT(8)
157 /* Stop channel processing */
158 #define WCN36xx_DXE_CH_CTRL_STOP                BIT(16)
159 /* Enable external descriptor interrupt */
160 #define WCN36xx_DXE_CH_CTRL_INE_ED              BIT(17)
161 /* Enable channel interrupt on errors */
162 #define WCN36xx_DXE_CH_CTRL_INE_ERR             BIT(18)
163 /* Enable Channel interrupt when done */
164 #define WCN36xx_DXE_CH_CTRL_INE_DONE    BIT(19)
165 /* External descriptor enable */
166 #define WCN36xx_DXE_CH_CTRL_EDEN                BIT(20)
167 /* Wait for valid bit */
168 #define WCN36xx_DXE_CH_CTRL_EDVEN               BIT(21)
169 /* Endianness is little endian*/
170 #define WCN36xx_DXE_CH_CTRL_ENDIANNESS  BIT(26)
171 /* Abort transfer */
172 #define WCN36xx_DXE_CH_CTRL_ABORT               BIT(27)
173 /* Long descriptor format */
174 #define WCN36xx_DXE_CH_CTRL_DFMT                BIT(28)
175 /* Endian byte swap enable */
176 #define WCN36xx_DXE_CH_CTRL_SWAP                BIT(31)
177
178 /* Transfer type */
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 /* Channel BMU Threshold select */
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 /* Channel Priority */
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 /* Counter select */
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 /* Channel BD template index */
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 /* DXE default control register values */
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 /* Common DXE registers */
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         /* #define WCN36XX_DXE_INT_CH6_MASK     0x00000040 */
254         /* #define WCN36XX_DXE_INT_CH5_MASK     0x00000020 */
255         #define WCN36XX_DXE_INT_CH4_MASK        0x00000010
256         #define WCN36XX_DXE_INT_CH3_MASK        0x00000008
257         /* #define WCN36XX_DXE_INT_CH2_MASK     0x00000004 */
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 /* Temporary BMU Workqueue 4 */
278 #define WCN36XX_DXE_BMU_WQ_RX_LOW               0xB
279 #define WCN36XX_DXE_BMU_WQ_RX_HIGH              0x4
280 /* DMA channel offset */
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 /* Address of the next DXE descriptor */
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 /* DXE Descriptor source address */
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 /* DXE Descriptor address destination address */
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 /* Interrupt status */
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 /* DXE default control register */
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 /* Interrupt control channel mask */
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
364 enum 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 /* amount of descriptors per channel */
372 enum 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  * struct wcn36xx_dxe_desc - describes descriptor of one DXE buffer
381  *
382  * @ctrl: is a union that consists of following bits:
383  * union {
384  *      u32     valid           :1; //0 = DMA stop, 1 = DMA continue with this
385  *                                  //descriptor
386  *      u32     transfer_type   :2; //0 = Host to Host space
387  *      u32     eop             :1; //End of Packet
388  *      u32     bd_handling     :1; //if transferType = Host to BMU, then 0
389  *                                  // means first 128 bytes contain BD, and 1
390  *                                  // means create new empty BD
391  *      u32     siq             :1; // SIQ
392  *      u32     diq             :1; // DIQ
393  *      u32     pdu_rel         :1; //0 = don't release BD and PDUs when done,
394  *                                  // 1 = release them
395  *      u32     bthld_sel       :4; //BMU Threshold Select
396  *      u32     prio            :3; //Specifies the priority level to use for
397  *                                  // the transfer
398  *      u32     stop_channel    :1; //1 = DMA stops processing further, channel
399  *                                  //requires re-enabling after this
400  *      u32     intr            :1; //Interrupt on Descriptor Done
401  *      u32     rsvd            :1; //reserved
402  *      u32     size            :14;//14 bits used - ignored for BMU transfers,
403  *                                  //only used for host to host transfers?
404  * } ctrl;
405  */
406 struct 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 /* DXE Control block */
419 struct 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
429 struct wcn36xx_dxe_ch {
430         spinlock_t                      lock;   /* protects head/tail ptrs */
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         /* DXE control block ring */
436         struct wcn36xx_dxe_ctl          *head_blk_ctl;
437         struct wcn36xx_dxe_ctl          *tail_blk_ctl;
438
439         /* DXE channel specific configs */
440         u32                             dxe_wq;
441         u32                             ctrl_bd;
442         u32                             ctrl_skb;
443         u32                             reg_ctrl;
444         u32                             def_ctrl;
445 };
446
447 /* Memory Pool for BD headers */
448 struct wcn36xx_dxe_mem_pool {
449         int             chunk_size;
450         void            *virt_addr;
451         dma_addr_t      phy_addr;
452 };
453
454 struct wcn36xx_tx_bd;
455 struct wcn36xx_vif;
456 int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn);
457 void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn);
458 void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn);
459 int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn);
460 void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn);
461 int wcn36xx_dxe_init(struct wcn36xx *wcn);
462 void wcn36xx_dxe_deinit(struct wcn36xx *wcn);
463 int wcn36xx_dxe_init_channels(struct wcn36xx *wcn);
464 int 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);
469 void wcn36xx_dxe_tx_ack_ind(struct wcn36xx *wcn, u32 status);
470 #endif  /* _DXE_H_ */