301-rt2x00-Implement-support-for-802.11n.patch 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. From adf33d3a207846709e2a5fb006f17dbc9225f7a9 Mon Sep 17 00:00:00 2001
  2. From: Ivo van Doorn <[email protected]>
  3. Date: Fri, 23 Jan 2009 17:10:06 +0100
  4. Subject: [PATCH] rt2x00: Implement support for 802.11n
  5. Extend rt2x00lib capabilities to support 802.11n,
  6. it still lacks aggregation support, but that can
  7. be added in the future.
  8. Signed-off-by: Ivo van Doorn <[email protected]>
  9. ---
  10. drivers/net/wireless/rt2x00/Kconfig | 3 +
  11. drivers/net/wireless/rt2x00/Makefile | 1 +
  12. drivers/net/wireless/rt2x00/rt2x00.h | 5 ++
  13. drivers/net/wireless/rt2x00/rt2x00config.c | 5 ++
  14. drivers/net/wireless/rt2x00/rt2x00dev.c | 91 ++++++++++++++++++++-------
  15. drivers/net/wireless/rt2x00/rt2x00ht.c | 69 +++++++++++++++++++++
  16. drivers/net/wireless/rt2x00/rt2x00lib.h | 24 +++++++
  17. drivers/net/wireless/rt2x00/rt2x00queue.c | 1 +
  18. drivers/net/wireless/rt2x00/rt2x00queue.h | 26 +++++++-
  19. 9 files changed, 197 insertions(+), 28 deletions(-)
  20. create mode 100644 drivers/net/wireless/rt2x00/rt2x00ht.c
  21. --- a/drivers/net/wireless/rt2x00/Makefile
  22. +++ b/drivers/net/wireless/rt2x00/Makefile
  23. @@ -8,6 +8,7 @@ rt2x00lib-$(CONFIG_RT2X00_LIB_CRYPTO) +=
  24. rt2x00lib-$(CONFIG_RT2X00_LIB_RFKILL) += rt2x00rfkill.o
  25. rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o
  26. rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS) += rt2x00leds.o
  27. +rt2x00lib-$(CONFIG_RT2X00_LIB_HT) += rt2x00ht.o
  28. obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
  29. obj-$(CONFIG_RT2X00_LIB_PCI) += rt2x00pci.o
  30. --- a/drivers/net/wireless/rt2x00/rt2x00.h
  31. +++ b/drivers/net/wireless/rt2x00/rt2x00.h
  32. @@ -108,6 +108,7 @@
  33. */
  34. #define ACK_SIZE 14
  35. #define IEEE80211_HEADER 24
  36. +#define AGGREGATION_SIZE 3840
  37. #define PLCP 48
  38. #define BEACON 100
  39. #define PREAMBLE 144
  40. @@ -357,6 +358,7 @@ static inline struct rt2x00_intf* vif_to
  41. * for @tx_power_a, @tx_power_bg and @channels.
  42. * @channels: Device/chipset specific channel values (See &struct rf_channel).
  43. * @channels_info: Additional information for channels (See &struct channel_info).
  44. + * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
  45. */
  46. struct hw_mode_spec {
  47. unsigned int supported_bands;
  48. @@ -370,6 +372,8 @@ struct hw_mode_spec {
  49. unsigned int num_channels;
  50. const struct rf_channel *channels;
  51. const struct channel_info *channels_info;
  52. +
  53. + struct ieee80211_sta_ht_cap ht;
  54. };
  55. /*
  56. @@ -603,6 +607,7 @@ enum rt2x00_flags {
  57. CONFIG_EXTERNAL_LNA_BG,
  58. CONFIG_DOUBLE_ANTENNA,
  59. CONFIG_DISABLE_LINK_TUNING,
  60. + CONFIG_CHANNEL_HT40,
  61. };
  62. /*
  63. --- a/drivers/net/wireless/rt2x00/rt2x00config.c
  64. +++ b/drivers/net/wireless/rt2x00/rt2x00config.c
  65. @@ -173,6 +173,11 @@ void rt2x00lib_config(struct rt2x00_dev
  66. libconf.conf = conf;
  67. if (ieee80211_flags & IEEE80211_CONF_CHANGE_CHANNEL) {
  68. + if (conf_is_ht40(conf))
  69. + __set_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
  70. + else
  71. + __clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags);
  72. +
  73. memcpy(&libconf.rf,
  74. &rt2x00dev->spec.channels[conf->channel->hw_value],
  75. sizeof(libconf.rf));
  76. --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
  77. +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
  78. @@ -315,18 +315,54 @@ void rt2x00lib_txdone(struct queue_entry
  79. }
  80. EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
  81. +static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev,
  82. + struct rxdone_entry_desc *rxdesc)
  83. +{
  84. + struct ieee80211_supported_band *sband;
  85. + const struct rt2x00_rate *rate;
  86. + unsigned int i;
  87. + int signal;
  88. + int type;
  89. +
  90. + /*
  91. + * For non-HT rates the MCS value needs to contain the
  92. + * actually used rate modulation (CCK or OFDM).
  93. + */
  94. + if (rxdesc->dev_flags & RXDONE_SIGNAL_MCS)
  95. + signal = RATE_MCS(rxdesc->rate_mode, rxdesc->signal);
  96. + else
  97. + signal = rxdesc->signal;
  98. +
  99. + type = (rxdesc->dev_flags & RXDONE_SIGNAL_MASK);
  100. +
  101. + sband = &rt2x00dev->bands[rt2x00dev->curr_band];
  102. + for (i = 0; i < sband->n_bitrates; i++) {
  103. + rate = rt2x00_get_rate(sband->bitrates[i].hw_value);
  104. +
  105. + if (((type == RXDONE_SIGNAL_PLCP) &&
  106. + (rate->plcp == signal)) ||
  107. + ((type == RXDONE_SIGNAL_BITRATE) &&
  108. + (rate->bitrate == signal)) ||
  109. + ((type == RXDONE_SIGNAL_MCS) &&
  110. + (rate->mcs == signal))) {
  111. + return i;
  112. + }
  113. + }
  114. +
  115. + WARNING(rt2x00dev, "Frame received with unrecognized signal, "
  116. + "signal=0x%.4x, type=%d.\n", signal, type);
  117. + return 0;
  118. +}
  119. +
  120. void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
  121. struct queue_entry *entry)
  122. {
  123. struct rxdone_entry_desc rxdesc;
  124. struct sk_buff *skb;
  125. struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
  126. - struct ieee80211_supported_band *sband;
  127. - const struct rt2x00_rate *rate;
  128. unsigned int header_length;
  129. unsigned int align;
  130. - unsigned int i;
  131. - int idx = -1;
  132. + int rate_idx;
  133. /*
  134. * Allocate a new sk_buffer. If no new buffer available, drop the
  135. @@ -375,26 +411,17 @@ void rt2x00lib_rxdone(struct rt2x00_dev
  136. skb_trim(entry->skb, rxdesc.size);
  137. /*
  138. - * Update RX statistics.
  139. - */
  140. - sband = &rt2x00dev->bands[rt2x00dev->curr_band];
  141. - for (i = 0; i < sband->n_bitrates; i++) {
  142. - rate = rt2x00_get_rate(sband->bitrates[i].hw_value);
  143. -
  144. - if (((rxdesc.dev_flags & RXDONE_SIGNAL_PLCP) &&
  145. - (rate->plcp == rxdesc.signal)) ||
  146. - ((rxdesc.dev_flags & RXDONE_SIGNAL_BITRATE) &&
  147. - (rate->bitrate == rxdesc.signal))) {
  148. - idx = i;
  149. - break;
  150. - }
  151. - }
  152. -
  153. - if (idx < 0) {
  154. - WARNING(rt2x00dev, "Frame received with unrecognized signal,"
  155. - "signal=0x%.2x, type=%d.\n", rxdesc.signal,
  156. - (rxdesc.dev_flags & RXDONE_SIGNAL_MASK));
  157. - idx = 0;
  158. + * Check if the frame was received using HT. In that case,
  159. + * the rate is the MCS index and should be passed to mac80211
  160. + * directly. Otherwise we need to translate the signal to
  161. + * the correct bitrate index.
  162. + */
  163. + if (rxdesc.rate_mode == RATE_MODE_CCK ||
  164. + rxdesc.rate_mode == RATE_MODE_OFDM) {
  165. + rate_idx = rt2x00lib_rxdone_read_signal(rt2x00dev, &rxdesc);
  166. + } else {
  167. + rxdesc.flags |= RX_FLAG_HT;
  168. + rate_idx = rxdesc.signal;
  169. }
  170. /*
  171. @@ -404,7 +431,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev
  172. rt2x00debug_update_crypto(rt2x00dev, &rxdesc);
  173. rx_status->mactime = rxdesc.timestamp;
  174. - rx_status->rate_idx = idx;
  175. + rx_status->rate_idx = rate_idx;
  176. rx_status->qual = rt2x00link_calculate_signal(rt2x00dev, rxdesc.rssi);
  177. rx_status->signal = rxdesc.rssi;
  178. rx_status->noise = rxdesc.noise;
  179. @@ -439,72 +466,84 @@ const struct rt2x00_rate rt2x00_supporte
  180. .bitrate = 10,
  181. .ratemask = BIT(0),
  182. .plcp = 0x00,
  183. + .mcs = RATE_MCS(RATE_MODE_CCK, 0),
  184. },
  185. {
  186. .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
  187. .bitrate = 20,
  188. .ratemask = BIT(1),
  189. .plcp = 0x01,
  190. + .mcs = RATE_MCS(RATE_MODE_CCK, 1),
  191. },
  192. {
  193. .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
  194. .bitrate = 55,
  195. .ratemask = BIT(2),
  196. .plcp = 0x02,
  197. + .mcs = RATE_MCS(RATE_MODE_CCK, 2),
  198. },
  199. {
  200. .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE,
  201. .bitrate = 110,
  202. .ratemask = BIT(3),
  203. .plcp = 0x03,
  204. + .mcs = RATE_MCS(RATE_MODE_CCK, 3),
  205. },
  206. {
  207. .flags = DEV_RATE_OFDM,
  208. .bitrate = 60,
  209. .ratemask = BIT(4),
  210. .plcp = 0x0b,
  211. + .mcs = RATE_MCS(RATE_MODE_OFDM, 0),
  212. },
  213. {
  214. .flags = DEV_RATE_OFDM,
  215. .bitrate = 90,
  216. .ratemask = BIT(5),
  217. .plcp = 0x0f,
  218. + .mcs = RATE_MCS(RATE_MODE_OFDM, 1),
  219. },
  220. {
  221. .flags = DEV_RATE_OFDM,
  222. .bitrate = 120,
  223. .ratemask = BIT(6),
  224. .plcp = 0x0a,
  225. + .mcs = RATE_MCS(RATE_MODE_OFDM, 2),
  226. },
  227. {
  228. .flags = DEV_RATE_OFDM,
  229. .bitrate = 180,
  230. .ratemask = BIT(7),
  231. .plcp = 0x0e,
  232. + .mcs = RATE_MCS(RATE_MODE_OFDM, 3),
  233. },
  234. {
  235. .flags = DEV_RATE_OFDM,
  236. .bitrate = 240,
  237. .ratemask = BIT(8),
  238. .plcp = 0x09,
  239. + .mcs = RATE_MCS(RATE_MODE_OFDM, 4),
  240. },
  241. {
  242. .flags = DEV_RATE_OFDM,
  243. .bitrate = 360,
  244. .ratemask = BIT(9),
  245. .plcp = 0x0d,
  246. + .mcs = RATE_MCS(RATE_MODE_OFDM, 5),
  247. },
  248. {
  249. .flags = DEV_RATE_OFDM,
  250. .bitrate = 480,
  251. .ratemask = BIT(10),
  252. .plcp = 0x08,
  253. + .mcs = RATE_MCS(RATE_MODE_OFDM, 6),
  254. },
  255. {
  256. .flags = DEV_RATE_OFDM,
  257. .bitrate = 540,
  258. .ratemask = BIT(11),
  259. .plcp = 0x0c,
  260. + .mcs = RATE_MCS(RATE_MODE_OFDM, 7),
  261. },
  262. };
  263. @@ -580,6 +619,8 @@ static int rt2x00lib_probe_hw_modes(stru
  264. rt2x00dev->bands[IEEE80211_BAND_2GHZ].bitrates = rates;
  265. hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
  266. &rt2x00dev->bands[IEEE80211_BAND_2GHZ];
  267. + memcpy(&rt2x00dev->bands[IEEE80211_BAND_2GHZ].ht_cap,
  268. + &spec->ht, sizeof(spec->ht));
  269. }
  270. /*
  271. @@ -596,6 +637,8 @@ static int rt2x00lib_probe_hw_modes(stru
  272. rt2x00dev->bands[IEEE80211_BAND_5GHZ].bitrates = &rates[4];
  273. hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
  274. &rt2x00dev->bands[IEEE80211_BAND_5GHZ];
  275. + memcpy(&rt2x00dev->bands[IEEE80211_BAND_5GHZ].ht_cap,
  276. + &spec->ht, sizeof(spec->ht));
  277. }
  278. return 0;
  279. --- /dev/null
  280. +++ b/drivers/net/wireless/rt2x00/rt2x00ht.c
  281. @@ -0,0 +1,69 @@
  282. +/*
  283. + Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
  284. + <http://rt2x00.serialmonkey.com>
  285. +
  286. + This program is free software; you can redistribute it and/or modify
  287. + it under the terms of the GNU General Public License as published by
  288. + the Free Software Foundation; either version 2 of the License, or
  289. + (at your option) any later version.
  290. +
  291. + This program is distributed in the hope that it will be useful,
  292. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  293. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  294. + GNU General Public License for more details.
  295. +
  296. + You should have received a copy of the GNU General Public License
  297. + along with this program; if not, write to the
  298. + Free Software Foundation, Inc.,
  299. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  300. + */
  301. +
  302. +/*
  303. + Module: rt2x00lib
  304. + Abstract: rt2x00 HT specific routines.
  305. + */
  306. +
  307. +#include <linux/kernel.h>
  308. +#include <linux/module.h>
  309. +
  310. +#include "rt2x00.h"
  311. +#include "rt2x00lib.h"
  312. +
  313. +void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
  314. + struct txentry_desc *txdesc,
  315. + const struct rt2x00_rate *hwrate)
  316. +{
  317. + struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
  318. + struct ieee80211_tx_rate *txrate = &tx_info->control.rates[0];
  319. +
  320. + if (tx_info->control.sta)
  321. + txdesc->mpdu_density =
  322. + tx_info->control.sta->ht_cap.ampdu_density;
  323. + else
  324. + txdesc->mpdu_density = 0;
  325. +
  326. + txdesc->ba_size = 0; /* FIXME: What value is needed? */
  327. + txdesc->stbc = 0; /* FIXME: What value is needed? */
  328. +
  329. + txdesc->mcs = rt2x00_get_rate_mcs(hwrate->mcs);
  330. + if (txrate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
  331. + txdesc->mcs |= 0x08;
  332. +
  333. + /*
  334. + * Convert flags
  335. + */
  336. + if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
  337. + __set_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags);
  338. +
  339. + /*
  340. + * Determine HT Mix/Greenfield rate mode
  341. + */
  342. + if (txrate->flags & IEEE80211_TX_RC_MCS)
  343. + txdesc->rate_mode = RATE_MODE_HT_MIX;
  344. + if (txrate->flags & IEEE80211_TX_RC_GREEN_FIELD)
  345. + txdesc->rate_mode = RATE_MODE_HT_GREENFIELD;
  346. + if (txrate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
  347. + __set_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags);
  348. + if (txrate->flags & IEEE80211_TX_RC_SHORT_GI)
  349. + __set_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags);
  350. +}
  351. --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
  352. +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
  353. @@ -48,6 +48,7 @@ struct rt2x00_rate {
  354. unsigned short ratemask;
  355. unsigned short plcp;
  356. + unsigned short mcs;
  357. };
  358. extern const struct rt2x00_rate rt2x00_supported_rates[12];
  359. @@ -57,6 +58,14 @@ static inline const struct rt2x00_rate *
  360. return &rt2x00_supported_rates[hw_value & 0xff];
  361. }
  362. +#define RATE_MCS(__mode, __mcs) \
  363. + ( (((__mode) & 0x00ff) << 8) | ((__mcs) & 0x00ff) )
  364. +
  365. +static inline int rt2x00_get_rate_mcs(const u16 mcs_value)
  366. +{
  367. + return (mcs_value & 0x00ff);
  368. +}
  369. +
  370. /*
  371. * Radio control handlers.
  372. */
  373. @@ -330,6 +339,21 @@ static inline void rt2x00crypto_rx_inser
  374. #endif /* CONFIG_RT2X00_LIB_CRYPTO */
  375. /*
  376. + * HT handlers.
  377. + */
  378. +#ifdef CONFIG_RT2X00_LIB_HT
  379. +void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
  380. + struct txentry_desc *txdesc,
  381. + const struct rt2x00_rate *hwrate);
  382. +#else
  383. +static inline void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
  384. + struct txentry_desc *txdesc,
  385. + const struct rt2x00_rate *hwrate)
  386. +{
  387. +}
  388. +#endif /* CONFIG_RT2X00_LIB_HT */
  389. +
  390. +/*
  391. * RFkill handlers.
  392. */
  393. #ifdef CONFIG_RT2X00_LIB_RFKILL
  394. --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
  395. +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
  396. @@ -326,6 +326,7 @@ static void rt2x00queue_create_tx_descri
  397. * Apply TX descriptor handling by components
  398. */
  399. rt2x00crypto_create_tx_descriptor(entry, txdesc);
  400. + rt2x00ht_create_tx_descriptor(entry, txdesc, hwrate);
  401. rt2x00queue_create_tx_descriptor_seq(entry, txdesc);
  402. rt2x00queue_create_tx_descriptor_plcp(entry, txdesc, hwrate);
  403. }
  404. --- a/drivers/net/wireless/rt2x00/rt2x00queue.h
  405. +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
  406. @@ -145,6 +145,7 @@ static inline struct skb_frame_desc* get
  407. *
  408. * @RXDONE_SIGNAL_PLCP: Signal field contains the plcp value.
  409. * @RXDONE_SIGNAL_BITRATE: Signal field contains the bitrate value.
  410. + * @RXDONE_SIGNAL_MCS: Signal field contains the mcs value.
  411. * @RXDONE_MY_BSS: Does this frame originate from device's BSS.
  412. * @RXDONE_CRYPTO_IV: Driver provided IV/EIV data.
  413. * @RXDONE_CRYPTO_ICV: Driver provided ICV data.
  414. @@ -152,9 +153,10 @@ static inline struct skb_frame_desc* get
  415. enum rxdone_entry_desc_flags {
  416. RXDONE_SIGNAL_PLCP = 1 << 0,
  417. RXDONE_SIGNAL_BITRATE = 1 << 1,
  418. - RXDONE_MY_BSS = 1 << 2,
  419. - RXDONE_CRYPTO_IV = 1 << 3,
  420. - RXDONE_CRYPTO_ICV = 1 << 4,
  421. + RXDONE_SIGNAL_MCS = 1 << 2,
  422. + RXDONE_MY_BSS = 1 << 3,
  423. + RXDONE_CRYPTO_IV = 1 << 4,
  424. + RXDONE_CRYPTO_ICV = 1 << 5,
  425. };
  426. /**
  427. @@ -163,7 +165,7 @@ enum rxdone_entry_desc_flags {
  428. * from &rxdone_entry_desc to a signal value type.
  429. */
  430. #define RXDONE_SIGNAL_MASK \
  431. - ( RXDONE_SIGNAL_PLCP | RXDONE_SIGNAL_BITRATE )
  432. + ( RXDONE_SIGNAL_PLCP | RXDONE_SIGNAL_BITRATE | RXDONE_SIGNAL_MCS )
  433. /**
  434. * struct rxdone_entry_desc: RX Entry descriptor
  435. @@ -177,6 +179,7 @@ enum rxdone_entry_desc_flags {
  436. * @size: Data size of the received frame.
  437. * @flags: MAC80211 receive flags (See &enum mac80211_rx_flags).
  438. * @dev_flags: Ralink receive flags (See &enum rxdone_entry_desc_flags).
  439. + * @rate_mode: Rate mode (See @enum rate_modulation).
  440. * @cipher: Cipher type used during decryption.
  441. * @cipher_status: Decryption status.
  442. * @iv: IV/EIV data used during decryption.
  443. @@ -190,6 +193,7 @@ struct rxdone_entry_desc {
  444. int size;
  445. int flags;
  446. int dev_flags;
  447. + u16 rate_mode;
  448. u8 cipher;
  449. u8 cipher_status;
  450. @@ -243,6 +247,9 @@ struct txdone_entry_desc {
  451. * @ENTRY_TXD_ENCRYPT_PAIRWISE: Use pairwise key table (instead of shared).
  452. * @ENTRY_TXD_ENCRYPT_IV: Generate IV/EIV in hardware.
  453. * @ENTRY_TXD_ENCRYPT_MMIC: Generate MIC in hardware.
  454. + * @ENTRY_TXD_HT_AMPDU: This frame is part of an AMPDU.
  455. + * @ENTRY_TXD_HT_BW_40: Use 40MHz Bandwidth.
  456. + * @ENTRY_TXD_HT_SHORT_GI: Use short GI.
  457. */
  458. enum txentry_desc_flags {
  459. ENTRY_TXD_RTS_FRAME,
  460. @@ -258,6 +265,9 @@ enum txentry_desc_flags {
  461. ENTRY_TXD_ENCRYPT_PAIRWISE,
  462. ENTRY_TXD_ENCRYPT_IV,
  463. ENTRY_TXD_ENCRYPT_MMIC,
  464. + ENTRY_TXD_HT_AMPDU,
  465. + ENTRY_TXD_HT_BW_40,
  466. + ENTRY_TXD_HT_SHORT_GI,
  467. };
  468. /**
  469. @@ -271,7 +281,11 @@ enum txentry_desc_flags {
  470. * @length_low: PLCP length low word.
  471. * @signal: PLCP signal.
  472. * @service: PLCP service.
  473. + * @msc: MCS.
  474. + * @stbc: STBC.
  475. + * @ba_size: BA size.
  476. * @rate_mode: Rate mode (See @enum rate_modulation).
  477. + * @mpdu_density: MDPU density.
  478. * @retry_limit: Max number of retries.
  479. * @aifs: AIFS value.
  480. * @ifs: IFS value.
  481. @@ -291,7 +305,11 @@ struct txentry_desc {
  482. u16 signal;
  483. u16 service;
  484. + u16 mcs;
  485. + u16 stbc;
  486. + u16 ba_size;
  487. u16 rate_mode;
  488. + u16 mpdu_density;
  489. short retry_limit;
  490. short aifs;