rtw_xmit.h 27 KB

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