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