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 #define NR_XMIT_EXTBUFF (32)
81
82 #define MAX_CMDBUF_SZ   (5120)  //(4096)
83
84 #define MAX_NUMBLKS             (1)
85
86 #define XMIT_VO_QUEUE (0)
87 #define XMIT_VI_QUEUE (1)
88 #define XMIT_BE_QUEUE (2)
89 #define XMIT_BK_QUEUE (3)
90
91 #define VO_QUEUE_INX            0
92 #define VI_QUEUE_INX            1
93 #define BE_QUEUE_INX            2
94 #define BK_QUEUE_INX            3
95 #define BCN_QUEUE_INX           4
96 #define MGT_QUEUE_INX           5
97 #define HIGH_QUEUE_INX          6
98 #define TXCMD_QUEUE_INX 7
99
100 #define HW_QUEUE_ENTRY  8
101
102 #ifdef CONFIG_PCI_HCI
103 //#define TXDESC_NUM                                            64
104 #define TXDESC_NUM                                              128
105 #define TXDESC_NUM_BE_QUEUE                     128
106 #endif
107
108 #define WEP_IV(pattrib_iv, dot11txpn, keyidx)\
109 do{\
110         pattrib_iv[0] = dot11txpn._byte_.TSC0;\
111         pattrib_iv[1] = dot11txpn._byte_.TSC1;\
112         pattrib_iv[2] = dot11txpn._byte_.TSC2;\
113         pattrib_iv[3] = ((keyidx & 0x3)<<6);\
114         dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\
115 }while(0)
116
117
118 #define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\
119 do{\
120         pattrib_iv[0] = dot11txpn._byte_.TSC1;\
121         pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\
122         pattrib_iv[2] = dot11txpn._byte_.TSC0;\
123         pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
124         pattrib_iv[4] = dot11txpn._byte_.TSC2;\
125         pattrib_iv[5] = dot11txpn._byte_.TSC3;\
126         pattrib_iv[6] = dot11txpn._byte_.TSC4;\
127         pattrib_iv[7] = dot11txpn._byte_.TSC5;\
128         dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\
129 }while(0)
130
131 #define AES_IV(pattrib_iv, dot11txpn, keyidx)\
132 do{\
133         pattrib_iv[0] = dot11txpn._byte_.TSC0;\
134         pattrib_iv[1] = dot11txpn._byte_.TSC1;\
135         pattrib_iv[2] = 0;\
136         pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
137         pattrib_iv[4] = dot11txpn._byte_.TSC2;\
138         pattrib_iv[5] = dot11txpn._byte_.TSC3;\
139         pattrib_iv[6] = dot11txpn._byte_.TSC4;\
140         pattrib_iv[7] = dot11txpn._byte_.TSC5;\
141         dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\
142 }while(0)
143
144
145 #define HWXMIT_ENTRY    4
146
147 // For Buffer Descriptor ring architecture
148 #ifdef BUF_DESC_ARCH    
149 #if defined (CONFIG_RTL8192E)
150 #define TX_BUFFER_SEG_NUM       1 // 0:2 seg, 1: 4 seg, 2: 8 seg.       
151 #endif
152 #endif
153
154 #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B)
155 #define TXDESC_SIZE 40
156 //8192EE_TODO
157 #elif defined (CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
158         #ifdef CONFIG_PCI_HCI
159                 #define TXDESC_SIZE ((TX_BUFFER_SEG_NUM ==0)?16: ((TX_BUFFER_SEG_NUM ==1)? 32:64) )
160                 #define TX_WIFI_INFO_SIZE 40  
161         #else  //USB or SDIO
162                 #define TXDESC_SIZE 40
163         #endif
164 //8192EE_TODO
165 #else
166 #define TXDESC_SIZE 32
167 #endif
168
169 #ifdef CONFIG_TX_EARLY_MODE
170 #define EARLY_MODE_INFO_SIZE    8
171 #endif
172
173
174 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
175 #define TXDESC_OFFSET TXDESC_SIZE
176 #endif
177
178 #ifdef CONFIG_USB_HCI
179 #ifdef USB_PACKET_OFFSET_SZ
180 #define PACKET_OFFSET_SZ (USB_PACKET_OFFSET_SZ)
181 #else
182 #define PACKET_OFFSET_SZ (8)
183 #endif
184 #define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ)
185 #endif
186
187 #ifdef CONFIG_PCI_HCI
188 #if defined(CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
189 #define TXDESC_OFFSET TX_WIFI_INFO_SIZE
190 #else
191 #define TXDESC_OFFSET 0
192 #endif 
193 #define TX_DESC_NEXT_DESC_OFFSET        (TXDESC_SIZE + 8)
194 #endif //CONFIG_PCI_HCI
195
196 enum TXDESC_SC{
197         SC_DONT_CARE = 0x00,
198         SC_UPPER= 0x01, 
199         SC_LOWER=0x02,
200         SC_DUPLICATE=0x03
201 };
202
203 #ifdef CONFIG_PCI_HCI
204 #define TXDESC_64_BYTES
205 #elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8723B)
206 #define TXDESC_40_BYTES
207 #endif
208
209 #if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) //8192ee
210 //8192EE_TODO
211 struct tx_desc
212 {
213         unsigned int txdw0;
214         unsigned int txdw1;
215         unsigned int txdw2;
216         unsigned int txdw3;
217         unsigned int txdw4;
218         unsigned int txdw5;
219         unsigned int txdw6;
220         unsigned int txdw7;
221 };
222 #else
223 struct tx_desc
224 {
225         unsigned int txdw0;
226         unsigned int txdw1;
227         unsigned int txdw2;
228         unsigned int txdw3;
229         unsigned int txdw4;
230         unsigned int txdw5;
231         unsigned int txdw6;
232         unsigned int txdw7;
233
234 #if defined(TXDESC_40_BYTES) || defined(TXDESC_64_BYTES)
235         unsigned int txdw8;
236         unsigned int txdw9;
237 #endif // TXDESC_40_BYTES
238
239 #ifdef TXDESC_64_BYTES
240         unsigned int txdw10;
241         unsigned int txdw11;
242
243         // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now,  our descriptor
244         // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute
245         // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor
246         // number or enlarge descriptor size as 64 bytes.
247         unsigned int txdw12;
248         unsigned int txdw13;
249         unsigned int txdw14;
250         unsigned int txdw15;
251 #endif
252 };
253 #endif
254
255 union txdesc {
256         struct tx_desc txdesc;
257         unsigned int value[TXDESC_SIZE>>2];
258 };
259
260 #ifdef CONFIG_PCI_HCI
261 #define PCI_MAX_TX_QUEUE_COUNT  8
262
263 struct rtw_tx_ring {
264         unsigned char   qid;
265         struct tx_desc  *desc;
266         dma_addr_t      dma;
267         unsigned int    idx;
268         unsigned int    entries;
269         _queue          queue;
270         u32             qlen;
271 };
272 #endif
273
274 struct  hw_xmit {
275         //_lock xmit_lock;
276         //_list pending;
277         _queue *sta_queue;
278         //struct hw_txqueue *phwtxqueue;
279         //sint  txcmdcnt;
280         int     accnt;
281 };
282
283 #if 0
284 struct pkt_attrib
285 {
286         u8      type;
287         u8      subtype;
288         u8      bswenc;
289         u8      dhcp_pkt;
290         u16     ether_type;
291         int     pktlen;         //the original 802.3 pkt raw_data len (not include ether_hdr data)
292         int     pkt_hdrlen;     //the original 802.3 pkt header len
293         int     hdrlen;         //the WLAN Header Len
294         int     nr_frags;
295         int     last_txcmdsz;
296         int     encrypt;        //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
297         u8      iv[8];
298         int     iv_len;
299         u8      icv[8];
300         int     icv_len;
301         int     priority;
302         int     ack_policy;
303         int     mac_id;
304         int     vcs_mode;       //virtual carrier sense method
305
306         u8      dst[ETH_ALEN];
307         u8      src[ETH_ALEN];
308         u8      ta[ETH_ALEN];
309         u8      ra[ETH_ALEN];
310
311         u8      key_idx;
312
313         u8      qos_en;
314         u8      ht_en;
315         u8      raid;//rate adpative id
316         u8      bwmode;
317         u8      ch_offset;//PRIME_CHNL_OFFSET
318         u8      sgi;//short GI
319         u8      ampdu_en;//tx ampdu enable
320         u8      mdata;//more data bit
321         u8      eosp;
322
323         u8      triggered;//for ap mode handling Power Saving sta
324
325         u32     qsel;
326         u16     seqnum;
327
328         struct sta_info * psta;
329 #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
330         u8      hw_tcp_csum;
331 #endif
332 };
333 #else
334 //reduce size
335 struct pkt_attrib
336 {
337         u8      type;
338         u8      subtype;
339         u8      bswenc;
340         u8      dhcp_pkt;
341         u16     ether_type;
342         u16     seqnum;
343         u16     pkt_hdrlen;     //the original 802.3 pkt header len
344         u16     hdrlen;         //the WLAN Header Len
345         u32     pktlen;         //the original 802.3 pkt raw_data len (not include ether_hdr data)
346         u32     last_txcmdsz;
347         u8      nr_frags;
348         u8      encrypt;        //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
349         u8      iv_len;
350         u8      icv_len;
351         u8      iv[18];
352         u8      icv[16];
353         u8      priority;
354         u8      ack_policy;
355         u8      mac_id;
356         u8      vcs_mode;       //virtual carrier sense method
357         u8      dst[ETH_ALEN];
358         u8      src[ETH_ALEN];
359         u8      ta[ETH_ALEN];
360         u8      ra[ETH_ALEN];
361         u8      key_idx;
362         u8      qos_en;
363         u8      ht_en;
364         u8      raid;//rate adpative id
365         u8      bwmode;
366         u8      ch_offset;//PRIME_CHNL_OFFSET
367         u8      sgi;//short GI
368         u8      ampdu_en;//tx ampdu enable
369         u8      ampdu_spacing; //ampdu_min_spacing for peer sta's rx
370         u8      mdata;//more data bit
371         u8      pctrl;//per packet txdesc control enable
372         u8      triggered;//for ap mode handling Power Saving sta
373         u8      qsel;
374         u8      order;//order bit
375         u8      eosp;
376         u8      rate;
377         u8      intel_proxim;
378         u8      retry_ctrl;
379         u8   mbssid;
380         u8      ldpc;
381         u8      stbc;
382         struct sta_info * psta;
383 #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
384         u8      hw_tcp_csum;
385 #endif
386
387         u8 rtsen;
388         u8 cts2self;
389         union Keytype   dot11tkiptxmickey;
390         //union Keytype dot11tkiprxmickey;
391         union Keytype   dot118021x_UncstKey;
392
393 #ifdef CONFIG_TDLS
394         u8 direct_link;
395         struct sta_info *ptdls_sta;
396 #endif //CONFIG_TDLS
397
398         u8 icmp_pkt;
399         
400 };
401 #endif
402
403 #ifdef PLATFORM_FREEBSD
404 #define ETH_ALEN        6               /* Octets in one ethernet addr   */
405 #define ETH_HLEN        14              /* Total octets in header.       */
406 #define ETH_P_IP        0x0800          /* Internet Protocol packet     */
407
408 /*struct rtw_ieee80211_hdr {
409         uint16_t frame_control;
410         uint16_t duration_id;
411         u8 addr1[6];
412         u8 addr2[6];
413         u8 addr3[6];
414         uint16_t seq_ctrl;
415         u8 addr4[6];
416 } ;*/
417 #endif //PLATFORM_FREEBSD
418
419 #define WLANHDR_OFFSET  64
420
421 #define NULL_FRAMETAG           (0x0)
422 #define DATA_FRAMETAG           0x01
423 #define L2_FRAMETAG             0x02
424 #define MGNT_FRAMETAG           0x03
425 #define AMSDU_FRAMETAG  0x04
426
427 #define EII_FRAMETAG            0x05
428 #define IEEE8023_FRAMETAG  0x06
429
430 #define MP_FRAMETAG             0x07
431
432 #define TXAGG_FRAMETAG  0x08
433
434 enum {
435         XMITBUF_DATA = 0,
436         XMITBUF_MGNT = 1,
437         XMITBUF_CMD = 2,
438 };
439
440 struct  submit_ctx{
441         u32 submit_time; /* */
442         u32 timeout_ms; /* <0: not synchronous, 0: wait forever, >0: up to ms waiting */
443         int status; /* status for operation */
444 #ifdef PLATFORM_LINUX
445         struct completion done;
446 #endif
447 };
448
449 enum {
450         RTW_SCTX_SUBMITTED = -1,
451         RTW_SCTX_DONE_SUCCESS = 0,
452         RTW_SCTX_DONE_UNKNOWN,
453         RTW_SCTX_DONE_TIMEOUT,
454         RTW_SCTX_DONE_BUF_ALLOC,
455         RTW_SCTX_DONE_BUF_FREE,
456         RTW_SCTX_DONE_WRITE_PORT_ERR,
457         RTW_SCTX_DONE_TX_DESC_NA,
458         RTW_SCTX_DONE_TX_DENY,
459         RTW_SCTX_DONE_CCX_PKT_FAIL,
460         RTW_SCTX_DONE_DRV_STOP,
461         RTW_SCTX_DONE_DEV_REMOVE,
462         RTW_SCTX_DONE_CMD_ERROR,
463 };
464
465
466 void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms);
467 int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg);
468 void rtw_sctx_done_err(struct submit_ctx **sctx, int status);
469 void rtw_sctx_done(struct submit_ctx **sctx);
470
471 struct xmit_buf
472 {
473         _list   list;
474
475         _adapter *padapter;
476
477         u8 *pallocated_buf;
478
479         u8 *pbuf;
480
481         void *priv_data;
482
483         u16 buf_tag; // 0: Normal xmitbuf, 1: extension xmitbuf, 2:cmd xmitbuf
484         u16 flags;
485         u32 alloc_sz;
486
487         u32  len;
488
489         struct submit_ctx *sctx;
490
491 #ifdef CONFIG_USB_HCI
492
493         //u32 sz[8];
494         u32     ff_hwaddr;
495
496 #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
497         PURB    pxmit_urb[8];
498         dma_addr_t dma_transfer_addr;   /* (in) dma addr for transfer_buffer */
499 #endif
500
501 #ifdef PLATFORM_OS_XP
502         PIRP            pxmit_irp[8];
503 #endif
504
505 #ifdef PLATFORM_OS_CE
506         USB_TRANSFER    usb_transfer_write_port;
507 #endif
508
509         u8 bpending[8];
510
511         sint last[8];
512
513 #endif
514
515 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
516         u8 *phead;
517         u8 *pdata;
518         u8 *ptail;
519         u8 *pend;
520         u32 ff_hwaddr;
521         u8      pg_num; 
522         u8      agg_num;
523 #ifdef PLATFORM_OS_XP
524         PMDL pxmitbuf_mdl;
525         PIRP  pxmitbuf_irp;
526         PSDBUS_REQUEST_PACKET pxmitbuf_sdrp;
527 #endif
528 #endif
529
530 #ifdef CONFIG_PCI_HCI
531         struct tx_desc *desc;
532 #endif
533
534 #if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT)
535         u8 no;
536 #endif
537
538 };
539
540
541 struct xmit_frame
542 {
543         _list   list;
544
545         struct pkt_attrib attrib;
546
547         _pkt *pkt;
548
549         int     frame_tag;
550
551         _adapter *padapter;
552
553         u8      *buf_addr;
554
555         struct xmit_buf *pxmitbuf;
556
557 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
558         u8      pg_num;
559         u8      agg_num;
560 #endif
561
562 #ifdef CONFIG_USB_HCI
563 #ifdef CONFIG_USB_TX_AGGREGATION
564         u8      agg_num;
565 #endif
566         s8      pkt_offset;
567 #ifdef CONFIG_RTL8192D
568         u8      EMPktNum;
569         u16     EMPktLen[5];//The max value by HW
570 #endif
571 #endif
572
573 #ifdef CONFIG_XMIT_ACK
574         u8 ack_report;
575 #endif
576
577         u8 *alloc_addr; /* the actual address this xmitframe allocated */
578         u8 ext_tag; /* 0:data, 1:mgmt */
579
580 };
581
582 struct tx_servq {
583         _list   tx_pending;
584         _queue  sta_pending;
585         int qcnt;
586 };
587
588
589 struct sta_xmit_priv
590 {
591         _lock   lock;
592         sint    option;
593         sint    apsd_setting;   //When bit mask is on, the associated edca queue supports APSD.
594
595
596         //struct tx_servq blk_q[MAX_NUMBLKS];
597         struct tx_servq be_q;                   //priority == 0,3
598         struct tx_servq bk_q;                   //priority == 1,2
599         struct tx_servq vi_q;                   //priority == 4,5
600         struct tx_servq vo_q;                   //priority == 6,7
601         _list   legacy_dz;
602         _list  apsd;
603
604         u16 txseq_tid[16];
605
606         //uint  sta_tx_bytes;
607         //u64   sta_tx_pkts;
608         //uint  sta_tx_fail;
609
610
611 };
612
613
614 struct  hw_txqueue      {
615         volatile sint   head;
616         volatile sint   tail;
617         volatile sint   free_sz;        //in units of 64 bytes
618         volatile sint      free_cmdsz;
619         volatile sint    txsz[8];
620         uint    ff_hwaddr;
621         uint    cmd_hwaddr;
622         sint    ac_tag;
623 };
624
625 struct agg_pkt_info{
626         u16 offset;
627         u16 pkt_len;
628 };
629
630 enum cmdbuf_type {
631         CMDBUF_BEACON = 0x00,
632         CMDBUF_RSVD,
633         CMDBUF_MAX
634 };
635
636 struct  xmit_priv       {
637
638         _lock   lock;
639
640         _sema   xmit_sema;
641         _sema   terminate_xmitthread_sema;
642
643         //_queue        blk_strms[MAX_NUMBLKS];
644         _queue  be_pending;
645         _queue  bk_pending;
646         _queue  vi_pending;
647         _queue  vo_pending;
648         _queue  bm_pending;
649
650         //_queue        legacy_dz_queue;
651         //_queue        apsd_queue;
652
653         u8 *pallocated_frame_buf;
654         u8 *pxmit_frame_buf;
655         uint free_xmitframe_cnt;
656         _queue  free_xmit_queue;
657
658         //uint mapping_addr;
659         //uint pkt_sz;
660
661         u8 *xframe_ext_alloc_addr;
662         u8 *xframe_ext;
663         uint free_xframe_ext_cnt;
664         _queue free_xframe_ext_queue;
665
666         //struct        hw_txqueue      be_txqueue;
667         //struct        hw_txqueue      bk_txqueue;
668         //struct        hw_txqueue      vi_txqueue;
669         //struct        hw_txqueue      vo_txqueue;
670         //struct        hw_txqueue      bmc_txqueue;
671
672         uint    frag_len;
673
674         _adapter        *adapter;
675
676         u8   vcs_setting;
677         u8      vcs;
678         u8      vcs_type;
679         //u16  rts_thresh;
680
681         u64     tx_bytes;
682         u64     tx_pkts;
683         u64     tx_drop;
684         u64     last_tx_pkts;
685
686         struct hw_xmit *hwxmits;
687         u8      hwxmit_entry;
688
689         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.
690
691 #ifdef CONFIG_USB_HCI
692         _sema   tx_retevt;//all tx return event;
693         u8              txirp_cnt;//
694
695 #ifdef PLATFORM_OS_CE
696         USB_TRANSFER    usb_transfer_write_port;
697 //      USB_TRANSFER    usb_transfer_write_mem;
698 #endif
699 #ifdef PLATFORM_LINUX
700         struct tasklet_struct xmit_tasklet;
701 #endif
702 #ifdef PLATFORM_FREEBSD
703         struct task xmit_tasklet;
704 #endif
705         //per AC pending irp
706         int beq_cnt;
707         int bkq_cnt;
708         int viq_cnt;
709         int voq_cnt;
710
711 #endif
712
713 #ifdef CONFIG_PCI_HCI
714         // Tx
715         struct rtw_tx_ring      tx_ring[PCI_MAX_TX_QUEUE_COUNT];
716         int     txringcount[PCI_MAX_TX_QUEUE_COUNT];
717         u8      beaconDMAing;           //flag of indicating beacon is transmiting to HW by DMA
718 #ifdef PLATFORM_LINUX
719         struct tasklet_struct xmit_tasklet;
720 #endif
721 #endif
722
723 #if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
724 #ifdef CONFIG_SDIO_TX_TASKLET
725         #ifdef PLATFORM_LINUX
726         struct tasklet_struct xmit_tasklet;
727         #endif /* PLATFORM_LINUX */
728 #else
729         _thread_hdl_    SdioXmitThread;
730         _sema           SdioXmitSema;
731         _sema           SdioXmitTerminateSema;
732 #endif /* CONFIG_SDIO_TX_TASKLET */
733 #endif /* CONFIG_SDIO_HCI */
734
735         _queue free_xmitbuf_queue;
736         _queue pending_xmitbuf_queue;
737         u8 *pallocated_xmitbuf;
738         u8 *pxmitbuf;
739         uint free_xmitbuf_cnt;
740
741         _queue free_xmit_extbuf_queue;
742         u8 *pallocated_xmit_extbuf;
743         u8 *pxmit_extbuf;
744         uint free_xmit_extbuf_cnt;
745
746         struct xmit_buf pcmd_xmitbuf[CMDBUF_MAX];
747
748         u16     nqos_ssn;
749         #ifdef CONFIG_TX_EARLY_MODE
750
751         #ifdef CONFIG_SDIO_HCI
752         #define MAX_AGG_PKT_NUM 20      
753         #else
754         #define MAX_AGG_PKT_NUM 256 //Max tx ampdu coounts              
755         #endif
756         
757         struct agg_pkt_info agg_pkt[MAX_AGG_PKT_NUM];
758         #endif
759
760 #ifdef CONFIG_XMIT_ACK
761         int     ack_tx;
762         _mutex ack_tx_mutex;
763         struct submit_ctx ack_tx_ops;
764         u8 seq_no;
765 #endif
766         _lock lock_sctx;
767 };
768
769 extern struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
770                 enum cmdbuf_type buf_type);
771 #define rtw_alloc_cmdxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_RSVD)
772 #define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON)
773
774 extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);
775 extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
776
777 extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv);
778 extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
779
780 void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz);
781 extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len);
782 static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
783 static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
784 extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib);
785 extern s32 rtw_put_snap(u8 *data, u16 h_proto);
786
787 extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv);
788 struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv);
789 struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv);
790 extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe);
791 extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue);
792 struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac);
793 extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
794 extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry);
795
796 extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe);
797 extern u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib);
798 #define rtw_wlan_pkt_size(f) rtw_calculate_wlan_pkt_size_by_attribue(&f->attrib)
799 extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);
800 #ifdef CONFIG_IEEE80211W
801 extern s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);
802 #endif //CONFIG_IEEE80211W
803 #ifdef CONFIG_TDLS
804 extern struct tdls_txmgmt *ptxmgmt;
805 s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, struct tdls_txmgmt *ptxmgmt);
806 s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
807 #endif
808 s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag);
809 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv);
810
811
812 s32 rtw_txframes_pending(_adapter *padapter);
813 s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib);
814 void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry);
815
816
817 s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter);
818 void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv);
819
820
821 void rtw_alloc_hwxmits(_adapter *padapter);
822 void rtw_free_hwxmits(_adapter *padapter);
823
824
825 s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
826 bool xmitframe_hiq_filter(struct xmit_frame *xmitframe);
827 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
828 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
829 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
830 void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta);
831 void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta);
832 #endif
833
834 u8      query_ra_short_GI(struct sta_info *psta);
835
836 u8      qos_acm(u8 acm_mask, u8 priority);
837
838 #ifdef CONFIG_XMIT_THREAD_MODE
839 void    enqueue_pending_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
840 void enqueue_pending_xmitbuf_to_head(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
841 struct xmit_buf*        dequeue_pending_xmitbuf(struct xmit_priv *pxmitpriv);
842 struct xmit_buf*        dequeue_pending_xmitbuf_under_survey(struct xmit_priv *pxmitpriv);
843 sint    check_pending_xmitbuf(struct xmit_priv *pxmitpriv);
844 thread_return   rtw_xmit_thread(thread_context context);
845 #endif
846
847 static void do_queue_select(_adapter * padapter, struct pkt_attrib * pattrib);
848 u32     rtw_get_ff_hwaddr(struct xmit_frame     *pxmitframe);
849
850 #ifdef CONFIG_XMIT_ACK
851 int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms);
852 void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status);
853 #endif //CONFIG_XMIT_ACK
854
855
856 //include after declaring struct xmit_buf, in order to avoid warning
857 #include <xmit_osdep.h>
858
859 #endif  //_RTL871X_XMIT_H_
860