rtw_xmit.h 27 KB

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