summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/563-ath9k_bits_per_symbol.patch
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-04-17 23:58:21 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-04-17 23:58:21 +0000
commitb4ab847b2d1ec27e3ba5f4d317a97d9c45c49fcb (patch)
tree7cbbcf57e670782dfcbdf551762c71f52e115c9d /package/mac80211/patches/563-ath9k_bits_per_symbol.patch
parent10ee6b3b20c10f4071bd512b22ff89ddf17da16c (diff)
ath9k: enable 3-stream and MCS16-23 support
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20968 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/patches/563-ath9k_bits_per_symbol.patch')
-rw-r--r--package/mac80211/patches/563-ath9k_bits_per_symbol.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/package/mac80211/patches/563-ath9k_bits_per_symbol.patch b/package/mac80211/patches/563-ath9k_bits_per_symbol.patch
new file mode 100644
index 000000000..d842e404d
--- /dev/null
+++ b/package/mac80211/patches/563-ath9k_bits_per_symbol.patch
@@ -0,0 +1,64 @@
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -34,7 +34,7 @@
+
+ #define OFDM_SIFS_TIME 16
+
+-static u32 bits_per_symbol[][2] = {
++static u16 bits_per_symbol[][2] = {
+ /* 20MHz 40MHz */
+ { 26, 54 }, /* 0: BPSK */
+ { 52, 108 }, /* 1: QPSK 1/2 */
+@@ -44,14 +44,6 @@ static u32 bits_per_symbol[][2] = {
+ { 208, 432 }, /* 5: 64-QAM 2/3 */
+ { 234, 486 }, /* 6: 64-QAM 3/4 */
+ { 260, 540 }, /* 7: 64-QAM 5/6 */
+- { 52, 108 }, /* 8: BPSK */
+- { 104, 216 }, /* 9: QPSK 1/2 */
+- { 156, 324 }, /* 10: QPSK 3/4 */
+- { 208, 432 }, /* 11: 16-QAM 1/2 */
+- { 312, 648 }, /* 12: 16-QAM 3/4 */
+- { 416, 864 }, /* 13: 64-QAM 2/3 */
+- { 468, 972 }, /* 14: 64-QAM 3/4 */
+- { 520, 1080 }, /* 15: 64-QAM 5/6 */
+ };
+
+ #define IS_HT_RATE(_rate) ((_rate) & 0x80)
+@@ -601,7 +593,7 @@ static int ath_compute_num_delims(struct
+ u32 nsymbits, nsymbols;
+ u16 minlen;
+ u8 flags, rix;
+- int width, half_gi, ndelim, mindelim;
++ int width, streams, half_gi, ndelim, mindelim;
+
+ /* Select standard number of delimiters based on frame length alone */
+ ndelim = ATH_AGGR_GET_NDELIM(frmlen);
+@@ -641,7 +633,8 @@ static int ath_compute_num_delims(struct
+ if (nsymbols == 0)
+ nsymbols = 1;
+
+- nsymbits = bits_per_symbol[rix][width];
++ streams = HT_RC_2_STREAMS(rix);
++ nsymbits = bits_per_symbol[rix % 8][width] * streams;
+ minlen = (nsymbols * nsymbits) / BITS_PER_BYTE;
+
+ if (frmlen < minlen) {
+@@ -1533,8 +1526,9 @@ static u32 ath_pkt_duration(struct ath_s
+ pktlen = bf_isaggr(bf) ? bf->bf_al : bf->bf_frmlen;
+
+ /* find number of symbols: PLCP + data */
++ streams = HT_RC_2_STREAMS(rix);
+ nbits = (pktlen << 3) + OFDM_PLCP_BITS;
+- nsymbits = bits_per_symbol[rix][width];
++ nsymbits = bits_per_symbol[rix % 8][width] * streams;
+ nsymbols = (nbits + nsymbits - 1) / nsymbits;
+
+ if (!half_gi)
+@@ -1543,7 +1537,6 @@ static u32 ath_pkt_duration(struct ath_s
+ duration = SYMBOL_TIME_HALFGI(nsymbols);
+
+ /* addup duration for legacy/ht training and signal fields */
+- streams = HT_RC_2_STREAMS(rix);
+ duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams);
+
+ return duration;