mac80211: fix a rounding issue in minstrel MCS rate duration calculation
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 44749
This commit is contained in:
parent
25d13b89ee
commit
90b3984e60
1 changed files with 43 additions and 0 deletions
|
@ -0,0 +1,43 @@
|
||||||
|
From: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
Date: Fri, 13 Mar 2015 10:49:40 +0100
|
||||||
|
Subject: [PATCH] mac80211: minstrel_ht: fix rounding issue in MCS duration
|
||||||
|
calculation
|
||||||
|
|
||||||
|
On very high MCS bitrates, the calculated duration of rates that are
|
||||||
|
next to each other can be very imprecise, due to the small packet size
|
||||||
|
used as reference (1200 bytes).
|
||||||
|
This is most visible in VHT80 nss=2 MCS8/9, for which minstrel shows the
|
||||||
|
same throughput when the probability is also the same. This leads to a
|
||||||
|
bad rate selection for such rates.
|
||||||
|
|
||||||
|
Fix this issue by introducing an average A-MPDU size factor into the
|
||||||
|
calculation.
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||||
|
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||||
|
@@ -17,10 +17,11 @@
|
||||||
|
#include "rc80211_minstrel.h"
|
||||||
|
#include "rc80211_minstrel_ht.h"
|
||||||
|
|
||||||
|
+#define AVG_AMPDU_SIZE 16
|
||||||
|
#define AVG_PKT_SIZE 1200
|
||||||
|
|
||||||
|
/* Number of bits for an average sized packet */
|
||||||
|
-#define MCS_NBITS (AVG_PKT_SIZE << 3)
|
||||||
|
+#define MCS_NBITS ((AVG_PKT_SIZE * AVG_AMPDU_SIZE) << 3)
|
||||||
|
|
||||||
|
/* Number of symbols for a packet with (bps) bits per symbol */
|
||||||
|
#define MCS_NSYMS(bps) DIV_ROUND_UP(MCS_NBITS, (bps))
|
||||||
|
@@ -33,7 +34,8 @@
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Transmit duration for the raw data part of an average sized packet */
|
||||||
|
-#define MCS_DURATION(streams, sgi, bps) MCS_SYMBOL_TIME(sgi, MCS_NSYMS((streams) * (bps)))
|
||||||
|
+#define MCS_DURATION(streams, sgi, bps) \
|
||||||
|
+ (MCS_SYMBOL_TIME(sgi, MCS_NSYMS((streams) * (bps))) / AVG_AMPDU_SIZE)
|
||||||
|
|
||||||
|
#define BW_20 0
|
||||||
|
#define BW_40 1
|
Loading…
Reference in a new issue