From 90b3984e6026b28f90a820c461e11812d5d4e930 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Sat, 14 Mar 2015 02:00:44 +0000
Subject: [PATCH] mac80211: fix a rounding issue in minstrel MCS rate duration
 calculation

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 44749
---
 ...l_ht-fix-rounding-issue-in-MCS-durat.patch | 43 +++++++++++++++++++
 1 file changed, 43 insertions(+)
 create mode 100644 package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch

diff --git a/package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch b/package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch
new file mode 100644
index 0000000000..d13263655e
--- /dev/null
+++ b/package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch
@@ -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
-- 
GitLab