update 8723bu wifi driver
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / include / rtw_xmit.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #ifndef _RTW_XMIT_H_
21 #define _RTW_XMIT_H_
22
23
24 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
25 #ifdef CONFIG_TX_AGGREGATION
26 #define MAX_XMITBUF_SZ  (20480) // 20k
27 //#define SDIO_TX_AGG_MAX       5
28 #else
29 #define MAX_XMITBUF_SZ (1664)
30 #define SDIO_TX_AGG_MAX 1
31 #endif
32
33 #if defined CONFIG_SDIO_HCI
34 #define NR_XMITBUFF     (16)
35 #endif
36 #if defined(CONFIG_GSPI_HCI)
37 #define NR_XMITBUFF     (128)
38 #endif
39
40 #elif defined (CONFIG_USB_HCI)
41
42 #ifdef CONFIG_USB_TX_AGGREGATION
43         #if defined(CONFIG_PLATFORM_ARM_SUNxI) || defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I) || defined(CONFIG_PLATFORM_ARM_SUN8I)
44                 #define MAX_XMITBUF_SZ (12288)  //12k 1536*8
45         #elif defined (CONFIG_PLATFORM_MSTAR)
46                 #define MAX_XMITBUF_SZ  7680    // 7.5k
47         #else
48         #define MAX_XMITBUF_SZ  (20480) // 20k
49         #endif
50 #else
51 #define MAX_XMITBUF_SZ  (2048)
52 #endif
53
54 #ifdef CONFIG_SINGLE_XMIT_BUF
55 #define NR_XMITBUFF     (1)
56 #else
57 #define NR_XMITBUFF     (4)
58 #endif //CONFIG_SINGLE_XMIT_BUF
59 #elif defined (CONFIG_PCI_HCI)
60 #define MAX_XMITBUF_SZ  (1664)
61 #define NR_XMITBUFF     (128)
62 #endif
63
64 #ifdef PLATFORM_OS_CE
65 #define XMITBUF_ALIGN_SZ 4
66 #else
67 #ifdef CONFIG_PCI_HCI
68 #define XMITBUF_ALIGN_SZ 4
69 #else
70 #ifdef USB_XMITBUF_ALIGN_SZ
71 #define XMITBUF_ALIGN_SZ (USB_XMITBUF_ALIGN_SZ)
72 #else
73 #define XMITBUF_ALIGN_SZ 512
74 #endif
75 #endif
76 #endif
77
78 // xmit extension buff defination
79 #define MAX_XMIT_EXTBUF_SZ      (1536)
80
81 #ifdef CONFIG_SINGLE_XMIT_BUF
82 #define NR_XMIT_EXTBUFF (1)
83 #else
84 #define NR_XMIT_EXTBUFF (32)
85 #endif
86
87 #define MAX_CMDBUF_SZ   (5120)  //(4096)
88
89 #define MAX_NUMBLKS             (1)
90
91 #define XMIT_VO_QUEUE (0)
92 #define XMIT_VI_QUEUE (1)
93 #define XMIT_BE_QUEUE (2)
94 #define XMIT_BK_QUEUE (3)
95
96 #define VO_QUEUE_INX            0
97 #define VI_QUEUE_INX            1
98 #define BE_QUEUE_INX            2
99 #define BK_QUEUE_INX            3
100 #define BCN_QUEUE_INX           4
101 #define MGT_QUEUE_INX           5
102 #define HIGH_QUEUE_INX          6
103 #define TXCMD_QUEUE_INX 7
104
105 #define HW_QUEUE_ENTRY  8
106
107 #ifdef CONFIG_PCI_HCI
108 //#define TXDESC_NUM                                            64
109 #define TXDESC_NUM                                              128
110 #define TXDESC_NUM_BE_QUEUE                     128
111 #endif
112
113 #define WEP_IV(pattrib_iv, dot11txpn, keyidx)\
114 do{\
115         pattrib_iv[0] = dot11txpn._byte_.TSC0;\
116         pattrib_iv[1] = dot11txpn._byte_.TSC1;\
117         pattrib_iv[2] = dot11txpn._byte_.TSC2;\
118         pattrib_iv[3] = ((keyidx & 0x3)<<6);\
119         dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\
120 }while(0)
121
122
123 #define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\
124 do{\
125         pattrib_iv[0] = dot11txpn._byte_.TSC1;\
126         pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\
127         pattrib_iv[2] = dot11txpn._byte_.TSC0;\
128         pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
129         pattrib_iv[4] = dot11txpn._byte_.TSC2;\
130         pattrib_iv[5] = dot11txpn._byte_.TSC3;\
131         pattrib_iv[6] = dot11txpn._byte_.TSC4;\
132         pattrib_iv[7] = dot11txpn._byte_.TSC5;\
133         dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\
134 }while(0)
135
136 #define AES_IV(pattrib_iv, dot11txpn, keyidx)\
137 do{\
138         pattrib_iv[0] = dot11txpn._byte_.TSC0;\
139         pattrib_iv[1] = dot11txpn._byte_.TSC1;\
140         pattrib_iv[2] = 0;\
141         pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
142         pattrib_iv[4] = dot11txpn._byte_.TSC2;\
143         pattrib_iv[5] = dot11txpn._byte_.TSC3;\
144         pattrib_iv[6] = dot11txpn._byte_.TSC4;\
145         pattrib_iv[7] = dot11txpn._byte_.TSC5;\
146         dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\
147 }while(0)
148
149
150 #define HWXMIT_ENTRY    4
151
152 // For Buffer Descriptor ring architecture
153 #ifdef BUF_DESC_ARCH    
154 #if defined (CONFIG_RTL8192E)
155 #define TX_BUFFER_SEG_NUM       1 // 0:2 seg, 1: 4 seg, 2: 8 seg.       
156 #endif
157 #endif
158
159 #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B)
160 #define TXDESC_SIZE 40
161 //8192EE_TODO
162 #elif defined (CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
163         #ifdef CONFIG_PCI_HCI
164                 #define TXDESC_SIZE ((TX_BUFFER_SEG_NUM ==0)?16: ((TX_BUFFER_SEG_NUM ==1)? 32:64) )
165                 #define TX_WIFI_INFO_SIZE 40  
166         #else  //8192E USB or SDIO
167                 #define TXDESC_SIZE 40
168         #endif
169 //8192EE_TODO
170 #else
171 #define TXDESC_SIZE 32
172 #endif
173
174 #ifdef CONFIG_TX_EARLY_MODE
175 #define EARLY_MODE_INFO_SIZE    8
176 #endif
177
178
179 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
180 #define TXDESC_OFFSET TXDESC_SIZE
181 #endif
182
183 #ifdef CONFIG_USB_HCI
184 #ifdef USB_PACKET_OFFSET_SZ
185 #define PACKET_OFFSET_SZ (USB_PACKET_OFFSET_SZ)
186 #else
187 #define PACKET_OFFSET_SZ (8)
188 #endif
189 #define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ)
190 #endif
191
192 #ifdef CONFIG_PCI_HCI
193 #if defined(CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
194 #define TXDESC_OFFSET TX_WIFI_INFO_SIZE
195 #else
196 #define TXDESC_OFFSET 0
197 #endif 
198 #define TX_DESC_NEXT_DESC_OFFSET        (TXDESC_SIZE + 8)
199 #endif //CONFIG_PCI_HCI
200
201 #ifdef CONFIG_WOWLAN
202 // The following foramt is 40 bytes tx description.
203 // It supports 8192E, 8723B, 8812a.
204 // Dword 0
205 #define GET_TX_DESC_OWN(__pTxDesc)                      LE_BITS_TO_4BYTE(__pTxDesc, 31, 1)
206 #define SET_TX_DESC_PKT_SIZE(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)
207 #define SET_TX_DESC_OFFSET(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)
208 #define SET_TX_DESC_BMC(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)
209 #define SET_TX_DESC_HTC(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)
210 #define SET_TX_DESC_LAST_SEG(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)
211 #define SET_TX_DESC_FIRST_SEG(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)
212 #define SET_TX_DESC_LINIP(__pTxDesc, __Value)           SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)
213 #define SET_TX_DESC_NO_ACM(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)
214 #define SET_TX_DESC_GF(__pTxDesc, __Value)              SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)
215 #define SET_TX_DESC_OWN(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)
216 // Dword 1
217 #define SET_TX_DESC_MACID(__pTxDesc, __Value)           SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)
218 #define SET_TX_DESC_QUEUE_SEL(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)
219 #define SET_TX_DESC_RDG_NAV_EXT(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)
220 #define SET_TX_DESC_LSIG_TXOP_EN(__pTxDesc, __Value)    SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)
221 #define SET_TX_DESC_PIFS(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)
222 #define SET_TX_DESC_RATE_ID(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)
223 #define SET_TX_DESC_EN_DESC_ID(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)
224 #define SET_TX_DESC_SEC_TYPE(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)
225 #define SET_TX_DESC_PKT_OFFSET(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)
226 // Dword 2
227 #define SET_TX_DESC_PAID(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) 
228 #define SET_TX_DESC_CCA_RTS(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)
229 #define SET_TX_DESC_AGG_ENABLE(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)
230 #define SET_TX_DESC_RDG_ENABLE(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)
231 #define SET_TX_DESC_AGG_BREAK(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)
232 #define SET_TX_DESC_MORE_FRAG(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)
233 #define SET_TX_DESC_RAW(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)
234 #define SET_TX_DESC_SPE_RPT(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)
235 #define SET_TX_DESC_AMPDU_DENSITY(__pTxDesc, __Value)   SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)
236 #define SET_TX_DESC_BT_INT(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)
237 #define SET_TX_DESC_GID(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)
238 // Dword 3
239 #define SET_TX_DESC_WHEADER_LEN(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)
240 #define SET_TX_DESC_CHK_EN(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)
241 #define SET_TX_DESC_EARLY_MODE(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)
242 #define SET_TX_DESC_HWSEQ_SEL(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)
243 #define SET_TX_DESC_USE_RATE(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)
244 #define SET_TX_DESC_DISABLE_RTS_FB(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)
245 #define SET_TX_DESC_DISABLE_FB(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)
246 #define SET_TX_DESC_CTS2SELF(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)
247 #define SET_TX_DESC_RTS_ENABLE(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)
248 #define SET_TX_DESC_HW_RTS_ENABLE(__pTxDesc, __Value)   SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)
249 #define SET_TX_DESC_NAV_USE_HDR(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)
250 #define SET_TX_DESC_USE_MAX_LEN(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)
251 #define SET_TX_DESC_MAX_AGG_NUM(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)
252 #define SET_TX_DESC_NDPA(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)
253 #define SET_TX_DESC_AMPDU_MAX_TIME(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)
254 // Dword 4
255 #define SET_TX_DESC_TX_RATE(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)
256 #define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)
257 #define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)
258 #define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)
259 #define SET_TX_DESC_DATA_RETRY_LIMIT(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)
260 #define SET_TX_DESC_RTS_RATE(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)
261 // Dword 5
262 #define SET_TX_DESC_DATA_SC(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)
263 #define SET_TX_DESC_DATA_SHORT(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)
264 #define SET_TX_DESC_DATA_BW(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)
265 #define SET_TX_DESC_DATA_LDPC(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)
266 #define SET_TX_DESC_DATA_STBC(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)
267 #define SET_TX_DESC_CTROL_STBC(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)
268 #define SET_TX_DESC_RTS_SHORT(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)
269 #define SET_TX_DESC_RTS_SC(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)
270 // Dword 6
271 #define SET_TX_DESC_SW_DEFINE(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)
272 #define SET_TX_DESC_ANTSEL_A(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)
273 #define SET_TX_DESC_ANTSEL_B(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)
274 #define SET_TX_DESC_ANTSEL_C(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)
275 #define SET_TX_DESC_ANTSEL_D(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)
276 // Dword 7
277 #ifdef CONFIG_PCI_HCI 
278 #define SET_TX_DESC_TX_BUFFER_SIZE(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)
279 #else
280 #define SET_TX_DESC_TX_DESC_CHECKSUM(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)
281 #endif
282 #define SET_TX_DESC_USB_TXAGG_NUM(__pTxDesc, __Value)   SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)
283 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
284 #define SET_TX_DESC_SDIO_TXSEQ(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)
285 #endif
286
287 // Dword 8
288 #define SET_TX_DESC_HWSEQ_EN(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)
289 // Dword 9
290 #define SET_TX_DESC_SEQ(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)
291 // Dword 10
292 #define SET_TX_DESC_TX_BUFFER_ADDRESS(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)
293 #define GET_TX_DESC_TX_BUFFER_ADDRESS(__pTxDesc)        LE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)
294
295 // Dword 11
296 #define SET_TX_DESC_NEXT_DESC_ADDRESS(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)
297 // 40 bytes tx description end.
298 #endif
299
300 enum TXDESC_SC{
301         SC_DONT_CARE = 0x00,
302         SC_UPPER= 0x01, 
303         SC_LOWER=0x02,
304         SC_DUPLICATE=0x03
305 };
306
307 #ifdef CONFIG_PCI_HCI
308 #define TXDESC_64_BYTES
309 #elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8723B)
310 #define TXDESC_40_BYTES
311 #endif
312
313 #if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) //8192ee
314 //8192EE_TODO
315 struct tx_desc
316 {
317         unsigned int txdw0;
318         unsigned int txdw1;
319         unsigned int txdw2;
320         unsigned int txdw3;
321         unsigned int txdw4;
322         unsigned int txdw5;
323         unsigned int txdw6;
324         unsigned int txdw7;
325 };
326 #else
327 struct tx_desc
328 {
329         unsigned int txdw0;
330         unsigned int txdw1;
331         unsigned int txdw2;
332         unsigned int txdw3;
333         unsigned int txdw4;
334         unsigned int txdw5;
335         unsigned int txdw6;
336         unsigned int txdw7;
337
338 #if defined(TXDESC_40_BYTES) || defined(TXDESC_64_BYTES)
339         unsigned int txdw8;
340         unsigned int txdw9;
341 #endif // TXDESC_40_BYTES
342
343 #ifdef TXDESC_64_BYTES
344         unsigned int txdw10;
345         unsigned int txdw11;
346
347         // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now,  our descriptor
348         // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute
349         // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor
350         // number or enlarge descriptor size as 64 bytes.
351         unsigned int txdw12;
352         unsigned int txdw13;
353         unsigned int txdw14;
354         unsigned int txdw15;
355 #endif
356 };
357 #endif
358
359 union txdesc {
360         struct tx_desc txdesc;
361         unsigned int value[TXDESC_SIZE>>2];
362 };
363
364 #ifdef CONFIG_PCI_HCI
365 #define PCI_MAX_TX_QUEUE_COUNT  8
366
367 struct rtw_tx_ring {
368         unsigned char   qid;
369         struct tx_desc  *desc;
370         dma_addr_t      dma;
371         unsigned int    idx;
372         unsigned int    entries;
373         _queue          queue;
374         u32             qlen;
375 };
376 #endif
377
378 struct  hw_xmit {
379         //_lock xmit_lock;
380         //_list pending;
381         _queue *sta_queue;
382         //struct hw_txqueue *phwtxqueue;
383         //sint  txcmdcnt;
384         int     accnt;
385 };
386
387 #if 0
388 struct pkt_attrib
389 {
390         u8      type;
391         u8      subtype;
392         u8      bswenc;
393         u8      dhcp_pkt;
394         u16     ether_type;
395         int     pktlen;         //the original 802.3 pkt raw_data len (not include ether_hdr data)
396         int     pkt_hdrlen;     //the original 802.3 pkt header len
397         int     hdrlen;         //the WLAN Header Len
398         int     nr_frags;
399         int     last_txcmdsz;
400         int     encrypt;        //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
401         u8      iv[8];
402         int     iv_len;
403         u8      icv[8];
404         int     icv_len;
405         int     priority;
406         int     ack_policy;
407         int     mac_id;
408         int     vcs_mode;       //virtual carrier sense method
409
410         u8      dst[ETH_ALEN];
411         u8      src[ETH_ALEN];
412         u8      ta[ETH_ALEN];
413         u8      ra[ETH_ALEN];
414
415         u8      key_idx;
416
417         u8      qos_en;
418         u8      ht_en;
419         u8      raid;//rate adpative id
420         u8      bwmode;
421         u8      ch_offset;//PRIME_CHNL_OFFSET
422         u8      sgi;//short GI
423         u8      ampdu_en;//tx ampdu enable
424         u8      mdata;//more data bit
425         u8      eosp;
426
427         u8      triggered;//for ap mode handling Power Saving sta
428
429         u32     qsel;
430         u16     seqnum;
431
432         struct sta_info * psta;
433 #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
434         u8      hw_tcp_csum;
435 #endif
436 };
437 #else
438 //reduce size
439 struct pkt_attrib
440 {
441         u8      type;
442         u8      subtype;
443         u8      bswenc;
444         u8      dhcp_pkt;
445         u16     ether_type;
446         u16     seqnum;
447         u8      hw_ssn_sel;     //for HW_SEQ0,1,2,3
448         u16     pkt_hdrlen;     //the original 802.3 pkt header len
449         u16     hdrlen;         //the WLAN Header Len
450         u32     pktlen;         //the original 802.3 pkt raw_data len (not include ether_hdr data)
451         u32     last_txcmdsz;
452         u8      nr_frags;
453         u8      encrypt;        //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
454         u8      iv_len;
455         u8      icv_len;
456         u8      iv[18];
457         u8      icv[16];
458         u8      priority;
459         u8      ack_policy;
460         u8      mac_id;
461         u8      vcs_mode;       //virtual carrier sense method
462         u8      dst[ETH_ALEN];
463         u8      src[ETH_ALEN];
464         u8      ta[ETH_ALEN];
465         u8      ra[ETH_ALEN];
466         u8      key_idx;
467         u8      qos_en;
468         u8      ht_en;
469         u8      raid;//rate adpative id
470         u8      bwmode;
471         u8      ch_offset;//PRIME_CHNL_OFFSET
472         u8      sgi;//short GI
473         u8      ampdu_en;//tx ampdu enable
474         u8      ampdu_spacing; //ampdu_min_spacing for peer sta's rx
475         u8      mdata;//more data bit
476         u8      pctrl;//per packet txdesc control enable
477         u8      triggered;//for ap mode handling Power Saving sta
478         u8      qsel;
479         u8      order;//order bit
480         u8      eosp;
481         u8      rate;
482         u8      intel_proxim;
483         u8      retry_ctrl;
484         u8   mbssid;
485         u8      ldpc;
486         u8      stbc;
487         struct sta_info * psta;
488 #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
489         u8      hw_tcp_csum;
490 #endif
491
492         u8 rtsen;
493         u8 cts2self;
494         union Keytype   dot11tkiptxmickey;
495         //union Keytype dot11tkiprxmickey;
496         union Keytype   dot118021x_UncstKey;
497
498 #ifdef CONFIG_TDLS
499         u8 direct_link;
500         struct sta_info *ptdls_sta;
501 #endif //CONFIG_TDLS
502
503         u8 icmp_pkt;
504         
505 };
506 #endif
507
508 #ifdef PLATFORM_FREEBSD
509 #define ETH_ALEN        6               /* Octets in one ethernet addr   */
510 #define ETH_HLEN        14              /* Total octets in header.       */
511 #define ETH_P_IP        0x0800          /* Internet Protocol packet     */
512
513 /*struct rtw_ieee80211_hdr {
514         uint16_t frame_control;
515         uint16_t duration_id;
516         u8 addr1[6];
517         u8 addr2[6];
518         u8 addr3[6];
519         uint16_t seq_ctrl;
520         u8 addr4[6];
521 } ;*/
522 #endif //PLATFORM_FREEBSD
523
524 #define WLANHDR_OFFSET  64
525
526 #define NULL_FRAMETAG           (0x0)
527 #define DATA_FRAMETAG           0x01
528 #define L2_FRAMETAG             0x02
529 #define MGNT_FRAMETAG           0x03
530 #define AMSDU_FRAMETAG  0x04
531
532 #define EII_FRAMETAG            0x05
533 #define IEEE8023_FRAMETAG  0x06
534
535 #define MP_FRAMETAG             0x07
536
537 #define TXAGG_FRAMETAG  0x08
538
539 enum {
540         XMITBUF_DATA = 0,
541         XMITBUF_MGNT = 1,
542         XMITBUF_CMD = 2,
543 };
544
545 struct  submit_ctx{
546         u32 submit_time; /* */
547         u32 timeout_ms; /* <0: not synchronous, 0: wait forever, >0: up to ms waiting */
548         int status; /* status for operation */
549 #ifdef PLATFORM_LINUX
550         struct completion done;
551 #endif
552 };
553
554 enum {
555         RTW_SCTX_SUBMITTED = -1,
556         RTW_SCTX_DONE_SUCCESS = 0,
557         RTW_SCTX_DONE_UNKNOWN,
558         RTW_SCTX_DONE_TIMEOUT,
559         RTW_SCTX_DONE_BUF_ALLOC,
560         RTW_SCTX_DONE_BUF_FREE,
561         RTW_SCTX_DONE_WRITE_PORT_ERR,
562         RTW_SCTX_DONE_TX_DESC_NA,
563         RTW_SCTX_DONE_TX_DENY,
564         RTW_SCTX_DONE_CCX_PKT_FAIL,
565         RTW_SCTX_DONE_DRV_STOP,
566         RTW_SCTX_DONE_DEV_REMOVE,
567         RTW_SCTX_DONE_CMD_ERROR,
568 };
569
570
571 void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms);
572 int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg);
573 void rtw_sctx_done_err(struct submit_ctx **sctx, int status);
574 void rtw_sctx_done(struct submit_ctx **sctx);
575
576 struct xmit_buf
577 {
578         _list   list;
579
580         _adapter *padapter;
581
582         u8 *pallocated_buf;
583
584         u8 *pbuf;
585
586         void *priv_data;
587
588         u16 buf_tag; // 0: Normal xmitbuf, 1: extension xmitbuf, 2:cmd xmitbuf
589         u16 flags;
590         u32 alloc_sz;
591
592         u32  len;
593
594         struct submit_ctx *sctx;
595
596 #ifdef CONFIG_USB_HCI
597
598         //u32 sz[8];
599         u32     ff_hwaddr;
600
601 #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
602         PURB    pxmit_urb[8];
603         dma_addr_t dma_transfer_addr;   /* (in) dma addr for transfer_buffer */
604 #endif
605
606 #ifdef PLATFORM_OS_XP
607         PIRP            pxmit_irp[8];
608 #endif
609
610 #ifdef PLATFORM_OS_CE
611         USB_TRANSFER    usb_transfer_write_port;
612 #endif
613
614         u8 bpending[8];
615
616         sint last[8];
617
618 #endif
619
620 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
621         u8 *phead;
622         u8 *pdata;
623         u8 *ptail;
624         u8 *pend;
625         u32 ff_hwaddr;
626         u8      pg_num; 
627         u8      agg_num;
628 #ifdef PLATFORM_OS_XP
629         PMDL pxmitbuf_mdl;
630         PIRP  pxmitbuf_irp;
631         PSDBUS_REQUEST_PACKET pxmitbuf_sdrp;
632 #endif
633 #endif
634
635 #ifdef CONFIG_PCI_HCI
636         struct tx_desc *desc;
637 #endif
638
639 #if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT)
640         u8 no;
641 #endif
642
643 };
644
645
646 struct xmit_frame
647 {
648         _list   list;
649
650         struct pkt_attrib attrib;
651
652         _pkt *pkt;
653
654         int     frame_tag;
655
656         _adapter *padapter;
657
658         u8      *buf_addr;
659
660         struct xmit_buf *pxmitbuf;
661
662 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
663         u8      pg_num;
664         u8      agg_num;
665 #endif
666
667 #ifdef CONFIG_USB_HCI
668 #ifdef CONFIG_USB_TX_AGGREGATION
669         u8      agg_num;
670 #endif
671         s8      pkt_offset;
672 #ifdef CONFIG_RTL8192D
673         u8      EMPktNum;
674         u16     EMPktLen[5];//The max value by HW
675 #endif
676 #endif
677
678 #ifdef CONFIG_XMIT_ACK
679         u8 ack_report;
680 #endif
681
682         u8 *alloc_addr; /* the actual address this xmitframe allocated */
683         u8 ext_tag; /* 0:data, 1:mgmt */
684
685 };
686
687 struct tx_servq {
688         _list   tx_pending;
689         _queue  sta_pending;
690         int qcnt;
691 };
692
693
694 struct sta_xmit_priv
695 {
696         _lock   lock;
697         sint    option;
698         sint    apsd_setting;   //When bit mask is on, the associated edca queue supports APSD.
699
700
701         //struct tx_servq blk_q[MAX_NUMBLKS];
702         struct tx_servq be_q;                   //priority == 0,3
703         struct tx_servq bk_q;                   //priority == 1,2
704         struct tx_servq vi_q;                   //priority == 4,5
705         struct tx_servq vo_q;                   //priority == 6,7
706         _list   legacy_dz;
707         _list  apsd;
708
709         u16 txseq_tid[16];
710
711         //uint  sta_tx_bytes;
712         //u64   sta_tx_pkts;
713         //uint  sta_tx_fail;
714
715
716 };
717
718
719 struct  hw_txqueue      {
720         volatile sint   head;
721         volatile sint   tail;
722         volatile sint   free_sz;        //in units of 64 bytes
723         volatile sint      free_cmdsz;
724         volatile sint    txsz[8];
725         uint    ff_hwaddr;
726         uint    cmd_hwaddr;
727         sint    ac_tag;
728 };
729
730 struct agg_pkt_info{
731         u16 offset;
732         u16 pkt_len;
733 };
734
735 enum cmdbuf_type {
736         CMDBUF_BEACON = 0x00,
737         CMDBUF_RSVD,
738         CMDBUF_MAX
739 };
740
741 u8 rtw_get_hwseq_no(_adapter *padapter);
742
743 struct  xmit_priv       {
744
745         _lock   lock;
746
747         _sema   xmit_sema;
748         _sema   terminate_xmitthread_sema;
749
750         //_queue        blk_strms[MAX_NUMBLKS];
751         _queue  be_pending;
752         _queue  bk_pending;
753         _queue  vi_pending;
754         _queue  vo_pending;
755         _queue  bm_pending;
756
757         //_queue        legacy_dz_queue;
758         //_queue        apsd_queue;
759
760         u8 *pallocated_frame_buf;
761         u8 *pxmit_frame_buf;
762         uint free_xmitframe_cnt;
763         _queue  free_xmit_queue;
764
765         //uint mapping_addr;
766         //uint pkt_sz;
767
768         u8 *xframe_ext_alloc_addr;
769         u8 *xframe_ext;
770         uint free_xframe_ext_cnt;
771         _queue free_xframe_ext_queue;
772
773         //struct        hw_txqueue      be_txqueue;
774         //struct        hw_txqueue      bk_txqueue;
775         //struct        hw_txqueue      vi_txqueue;
776         //struct        hw_txqueue      vo_txqueue;
777         //struct        hw_txqueue      bmc_txqueue;
778
779         uint    frag_len;
780
781         _adapter        *adapter;
782
783         u8   vcs_setting;
784         u8      vcs;
785         u8      vcs_type;
786         //u16  rts_thresh;
787
788         u64     tx_bytes;
789         u64     tx_pkts;
790         u64     tx_drop;
791         u64     last_tx_pkts;
792
793         struct hw_xmit *hwxmits;
794         u8      hwxmit_entry;
795
796         u8      wmm_para_seq[4];//sequence for wmm ac parameter strength from large to small. it's value is 0->vo, 1->vi, 2->be, 3->bk.
797
798 #ifdef CONFIG_USB_HCI
799         _sema   tx_retevt;//all tx return event;
800         u8              txirp_cnt;//
801
802 #ifdef PLATFORM_OS_CE
803         USB_TRANSFER    usb_transfer_write_port;
804 //      USB_TRANSFER    usb_transfer_write_mem;
805 #endif
806 #ifdef PLATFORM_LINUX
807         struct tasklet_struct xmit_tasklet;
808 #endif
809 #ifdef PLATFORM_FREEBSD
810         struct task xmit_tasklet;
811 #endif
812         //per AC pending irp
813         int beq_cnt;
814         int bkq_cnt;
815         int viq_cnt;
816         int voq_cnt;
817
818 #endif
819
820 #ifdef CONFIG_PCI_HCI
821         // Tx
822         struct rtw_tx_ring      tx_ring[PCI_MAX_TX_QUEUE_COUNT];
823         int     txringcount[PCI_MAX_TX_QUEUE_COUNT];
824         u8      beaconDMAing;           //flag of indicating beacon is transmiting to HW by DMA
825 #ifdef PLATFORM_LINUX
826         struct tasklet_struct xmit_tasklet;
827 #endif
828 #endif
829
830 #if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
831 #ifdef CONFIG_SDIO_TX_TASKLET
832         #ifdef PLATFORM_LINUX
833         struct tasklet_struct xmit_tasklet;
834         #endif /* PLATFORM_LINUX */
835 #else
836         _thread_hdl_    SdioXmitThread;
837         _sema           SdioXmitSema;
838         _sema           SdioXmitTerminateSema;
839 #endif /* CONFIG_SDIO_TX_TASKLET */
840 #endif /* CONFIG_SDIO_HCI */
841
842         _queue free_xmitbuf_queue;
843         _queue pending_xmitbuf_queue;
844         u8 *pallocated_xmitbuf;
845         u8 *pxmitbuf;
846         uint free_xmitbuf_cnt;
847
848         _queue free_xmit_extbuf_queue;
849         u8 *pallocated_xmit_extbuf;
850         u8 *pxmit_extbuf;
851         uint free_xmit_extbuf_cnt;
852
853         struct xmit_buf pcmd_xmitbuf[CMDBUF_MAX];
854         u8   hw_ssn_seq_no;//mapping to REG_HW_SEQ 0,1,2,3
855         u16     nqos_ssn;
856         #ifdef CONFIG_TX_EARLY_MODE
857
858         #ifdef CONFIG_SDIO_HCI
859         #define MAX_AGG_PKT_NUM 20      
860         #else
861         #define MAX_AGG_PKT_NUM 256 //Max tx ampdu coounts              
862         #endif
863         
864         struct agg_pkt_info agg_pkt[MAX_AGG_PKT_NUM];
865         #endif
866
867 #ifdef CONFIG_XMIT_ACK
868         int     ack_tx;
869         _mutex ack_tx_mutex;
870         struct submit_ctx ack_tx_ops;
871         u8 seq_no;
872 #endif
873         _lock lock_sctx;
874 };
875
876 extern struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
877                 enum cmdbuf_type buf_type);
878 #define rtw_alloc_cmdxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_RSVD)
879 #define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON)
880
881 extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);
882 extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
883
884 extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv);
885 extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
886
887 void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz);
888 extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len);
889 static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
890 static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
891 extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib);
892 extern s32 rtw_put_snap(u8 *data, u16 h_proto);
893
894 extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv);
895 struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv);
896 struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv);
897 extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe);
898 extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue);
899 struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac);
900 extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
901 extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry);
902
903 extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe);
904 extern u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib);
905 #define rtw_wlan_pkt_size(f) rtw_calculate_wlan_pkt_size_by_attribue(&f->attrib)
906 extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);
907 #ifdef CONFIG_IEEE80211W
908 extern s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);
909 #endif //CONFIG_IEEE80211W
910 #ifdef CONFIG_TDLS
911 extern struct tdls_txmgmt *ptxmgmt;
912 s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, struct tdls_txmgmt *ptxmgmt);
913 s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
914 #endif
915 s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag);
916 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv);
917
918
919 s32 rtw_txframes_pending(_adapter *padapter);
920 s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib);
921 void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry);
922
923
924 s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter);
925 void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv);
926
927
928 void rtw_alloc_hwxmits(_adapter *padapter);
929 void rtw_free_hwxmits(_adapter *padapter);
930
931
932 s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
933 bool xmitframe_hiq_filter(struct xmit_frame *xmitframe);
934 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
935 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
936 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
937 void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta);
938 void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta);
939 #endif
940
941 u8      query_ra_short_GI(struct sta_info *psta);
942
943 u8      qos_acm(u8 acm_mask, u8 priority);
944
945 #ifdef CONFIG_XMIT_THREAD_MODE
946 void    enqueue_pending_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
947 void enqueue_pending_xmitbuf_to_head(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
948 struct xmit_buf*        dequeue_pending_xmitbuf(struct xmit_priv *pxmitpriv);
949 struct xmit_buf*        dequeue_pending_xmitbuf_under_survey(struct xmit_priv *pxmitpriv);
950 sint    check_pending_xmitbuf(struct xmit_priv *pxmitpriv);
951 thread_return   rtw_xmit_thread(thread_context context);
952 #endif
953
954 static void do_queue_select(_adapter * padapter, struct pkt_attrib * pattrib);
955 u32     rtw_get_ff_hwaddr(struct xmit_frame     *pxmitframe);
956
957 #ifdef CONFIG_XMIT_ACK
958 int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms);
959 void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status);
960 #endif //CONFIG_XMIT_ACK
961
962
963 //include after declaring struct xmit_buf, in order to avoid warning
964 #include <xmit_osdep.h>
965
966 #endif  //_RTL871X_XMIT_H_
967