From: Felix Fietkau Date: Fri, 7 Jun 2019 17:10:25 +0000 (+0200) Subject: mac80211: add rate control support for 4 spatial streams, improve precision X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=e08296a8517d0e0da44afe3689775f6a00bdf57a;p=openwrt%2Fstaging%2F981213.git mac80211: add rate control support for 4 spatial streams, improve precision Signed-off-by: Felix Fietkau --- diff --git a/package/kernel/mac80211/patches/subsys/361-mac80211-minstrel_ht-add-support-for-rates-with-4-sp.patch b/package/kernel/mac80211/patches/subsys/361-mac80211-minstrel_ht-add-support-for-rates-with-4-sp.patch new file mode 100644 index 0000000000..07b30dfbf7 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/361-mac80211-minstrel_ht-add-support-for-rates-with-4-sp.patch @@ -0,0 +1,78 @@ +From: Felix Fietkau +Date: Mon, 25 Mar 2019 09:02:13 +0100 +Subject: [PATCH] mac80211: minstrel_ht: add support for rates with 4 + spatial streams + +This is needed for the upcoming driver for MT7615 4x4 802.11ac chipsets + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -157,44 +157,54 @@ const struct mcs_group minstrel_mcs_grou + MCS_GROUP(1, 0, BW_20, 5), + MCS_GROUP(2, 0, BW_20, 4), + MCS_GROUP(3, 0, BW_20, 4), ++ MCS_GROUP(4, 0, BW_20, 4), + + MCS_GROUP(1, 1, BW_20, 5), + MCS_GROUP(2, 1, BW_20, 4), + MCS_GROUP(3, 1, BW_20, 4), ++ MCS_GROUP(4, 1, BW_20, 4), + + MCS_GROUP(1, 0, BW_40, 4), + MCS_GROUP(2, 0, BW_40, 4), + MCS_GROUP(3, 0, BW_40, 4), ++ MCS_GROUP(4, 0, BW_40, 4), + + MCS_GROUP(1, 1, BW_40, 4), + MCS_GROUP(2, 1, BW_40, 4), + MCS_GROUP(3, 1, BW_40, 4), ++ MCS_GROUP(4, 1, BW_40, 4), + + CCK_GROUP(8), + + VHT_GROUP(1, 0, BW_20, 5), + VHT_GROUP(2, 0, BW_20, 4), + VHT_GROUP(3, 0, BW_20, 4), ++ VHT_GROUP(4, 0, BW_20, 4), + + VHT_GROUP(1, 1, BW_20, 5), + VHT_GROUP(2, 1, BW_20, 4), + VHT_GROUP(3, 1, BW_20, 4), ++ VHT_GROUP(4, 1, BW_20, 4), + + VHT_GROUP(1, 0, BW_40, 4), + VHT_GROUP(2, 0, BW_40, 4), + VHT_GROUP(3, 0, BW_40, 4), ++ VHT_GROUP(4, 0, BW_40, 3), + + VHT_GROUP(1, 1, BW_40, 4), + VHT_GROUP(2, 1, BW_40, 4), + VHT_GROUP(3, 1, BW_40, 4), ++ VHT_GROUP(4, 1, BW_40, 3), + + VHT_GROUP(1, 0, BW_80, 4), + VHT_GROUP(2, 0, BW_80, 4), + VHT_GROUP(3, 0, BW_80, 4), ++ VHT_GROUP(4, 0, BW_80, 2), + + VHT_GROUP(1, 1, BW_80, 4), + VHT_GROUP(2, 1, BW_80, 4), + VHT_GROUP(3, 1, BW_80, 4), ++ VHT_GROUP(4, 1, BW_80, 2), + }; + + static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES] __read_mostly; +--- a/net/mac80211/rc80211_minstrel_ht.h ++++ b/net/mac80211/rc80211_minstrel_ht.h +@@ -13,7 +13,7 @@ + * The number of streams can be changed to 2 to reduce code + * size and memory footprint. + */ +-#define MINSTREL_MAX_STREAMS 3 ++#define MINSTREL_MAX_STREAMS 4 + #define MINSTREL_HT_STREAM_GROUPS 4 /* BW(=2) * SGI(=2) */ + #define MINSTREL_VHT_STREAM_GROUPS 6 /* BW(=3) * SGI(=2) */ + diff --git a/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel_ht-automatically-calculate-rate-du.patch b/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel_ht-automatically-calculate-rate-du.patch new file mode 100644 index 0000000000..81d14966f7 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel_ht-automatically-calculate-rate-du.patch @@ -0,0 +1,189 @@ +From: Felix Fietkau +Date: Mon, 25 Mar 2019 09:02:52 +0100 +Subject: [PATCH] mac80211: minstrel_ht: automatically calculate rate + duration shift + +A per-group shift was added to reduce the size of the per-rate transmit +duration field to u16 without sacrificing a lot of precision +This patch changes the macros to automatically calculate the best value for +this shift based on the lowest rate within the group. +This simplifies adding more groups and slightly improves accuracy for some of +the existing groups. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -51,8 +51,11 @@ + MINSTREL_MAX_STREAMS * _sgi + \ + _streams - 1 + ++#define GROUP_SHIFT(duration) \ ++ (16 - __builtin_clz(duration)) ++ + /* MCS rate information for an MCS group */ +-#define MCS_GROUP(_streams, _sgi, _ht40, _s) \ ++#define __MCS_GROUP(_streams, _sgi, _ht40, _s) \ + [GROUP_IDX(_streams, _sgi, _ht40)] = { \ + .streams = _streams, \ + .shift = _s, \ +@@ -72,6 +75,13 @@ + } \ + } + ++#define MCS_GROUP_SHIFT(_streams, _sgi, _ht40) \ ++ GROUP_SHIFT(MCS_DURATION(_streams, _sgi, _ht40 ? 54 : 26)) ++ ++#define MCS_GROUP(_streams, _sgi, _ht40) \ ++ __MCS_GROUP(_streams, _sgi, _ht40, \ ++ MCS_GROUP_SHIFT(_streams, _sgi, _ht40)) ++ + #define VHT_GROUP_IDX(_streams, _sgi, _bw) \ + (MINSTREL_VHT_GROUP_0 + \ + MINSTREL_MAX_STREAMS * 2 * (_bw) + \ +@@ -81,7 +91,7 @@ + #define BW2VBPS(_bw, r3, r2, r1) \ + (_bw == BW_80 ? r3 : _bw == BW_40 ? r2 : r1) + +-#define VHT_GROUP(_streams, _sgi, _bw, _s) \ ++#define __VHT_GROUP(_streams, _sgi, _bw, _s) \ + [VHT_GROUP_IDX(_streams, _sgi, _bw)] = { \ + .streams = _streams, \ + .shift = _s, \ +@@ -114,6 +124,14 @@ + } \ + } + ++#define VHT_GROUP_SHIFT(_streams, _sgi, _bw) \ ++ GROUP_SHIFT(MCS_DURATION(_streams, _sgi, \ ++ BW2VBPS(_bw, 117, 54, 26))) ++ ++#define VHT_GROUP(_streams, _sgi, _bw) \ ++ __VHT_GROUP(_streams, _sgi, _bw, \ ++ VHT_GROUP_SHIFT(_streams, _sgi, _bw)) ++ + #define CCK_DURATION(_bitrate, _short, _len) \ + (1000 * (10 /* SIFS */ + \ + (_short ? 72 + 24 : 144 + 48) + \ +@@ -129,7 +147,7 @@ + CCK_ACK_DURATION(55, _short) >> _s, \ + CCK_ACK_DURATION(110, _short) >> _s + +-#define CCK_GROUP(_s) \ ++#define __CCK_GROUP(_s) \ + [MINSTREL_CCK_GROUP] = { \ + .streams = 1, \ + .flags = 0, \ +@@ -140,6 +158,12 @@ + } \ + } + ++#define CCK_GROUP_SHIFT \ ++ GROUP_SHIFT(CCK_ACK_DURATION(10, false)) ++ ++#define CCK_GROUP __CCK_GROUP(CCK_GROUP_SHIFT) ++ ++ + static bool minstrel_vht_only = true; + module_param(minstrel_vht_only, bool, 0644); + MODULE_PARM_DESC(minstrel_vht_only, +@@ -154,57 +178,57 @@ MODULE_PARM_DESC(minstrel_vht_only, + * BW -> SGI -> #streams + */ + const struct mcs_group minstrel_mcs_groups[] = { +- MCS_GROUP(1, 0, BW_20, 5), +- MCS_GROUP(2, 0, BW_20, 4), +- MCS_GROUP(3, 0, BW_20, 4), +- MCS_GROUP(4, 0, BW_20, 4), ++ MCS_GROUP(1, 0, BW_20), ++ MCS_GROUP(2, 0, BW_20), ++ MCS_GROUP(3, 0, BW_20), ++ MCS_GROUP(4, 0, BW_20), + +- MCS_GROUP(1, 1, BW_20, 5), +- MCS_GROUP(2, 1, BW_20, 4), +- MCS_GROUP(3, 1, BW_20, 4), +- MCS_GROUP(4, 1, BW_20, 4), ++ MCS_GROUP(1, 1, BW_20), ++ MCS_GROUP(2, 1, BW_20), ++ MCS_GROUP(3, 1, BW_20), ++ MCS_GROUP(4, 1, BW_20), + +- MCS_GROUP(1, 0, BW_40, 4), +- MCS_GROUP(2, 0, BW_40, 4), +- MCS_GROUP(3, 0, BW_40, 4), +- MCS_GROUP(4, 0, BW_40, 4), ++ MCS_GROUP(1, 0, BW_40), ++ MCS_GROUP(2, 0, BW_40), ++ MCS_GROUP(3, 0, BW_40), ++ MCS_GROUP(4, 0, BW_40), + +- MCS_GROUP(1, 1, BW_40, 4), +- MCS_GROUP(2, 1, BW_40, 4), +- MCS_GROUP(3, 1, BW_40, 4), +- MCS_GROUP(4, 1, BW_40, 4), ++ MCS_GROUP(1, 1, BW_40), ++ MCS_GROUP(2, 1, BW_40), ++ MCS_GROUP(3, 1, BW_40), ++ MCS_GROUP(4, 1, BW_40), + +- CCK_GROUP(8), ++ CCK_GROUP, + +- VHT_GROUP(1, 0, BW_20, 5), +- VHT_GROUP(2, 0, BW_20, 4), +- VHT_GROUP(3, 0, BW_20, 4), +- VHT_GROUP(4, 0, BW_20, 4), ++ VHT_GROUP(1, 0, BW_20), ++ VHT_GROUP(2, 0, BW_20), ++ VHT_GROUP(3, 0, BW_20), ++ VHT_GROUP(4, 0, BW_20), + +- VHT_GROUP(1, 1, BW_20, 5), +- VHT_GROUP(2, 1, BW_20, 4), +- VHT_GROUP(3, 1, BW_20, 4), +- VHT_GROUP(4, 1, BW_20, 4), ++ VHT_GROUP(1, 1, BW_20), ++ VHT_GROUP(2, 1, BW_20), ++ VHT_GROUP(3, 1, BW_20), ++ VHT_GROUP(4, 1, BW_20), + +- VHT_GROUP(1, 0, BW_40, 4), +- VHT_GROUP(2, 0, BW_40, 4), +- VHT_GROUP(3, 0, BW_40, 4), +- VHT_GROUP(4, 0, BW_40, 3), ++ VHT_GROUP(1, 0, BW_40), ++ VHT_GROUP(2, 0, BW_40), ++ VHT_GROUP(3, 0, BW_40), ++ VHT_GROUP(4, 0, BW_40), + +- VHT_GROUP(1, 1, BW_40, 4), +- VHT_GROUP(2, 1, BW_40, 4), +- VHT_GROUP(3, 1, BW_40, 4), +- VHT_GROUP(4, 1, BW_40, 3), ++ VHT_GROUP(1, 1, BW_40), ++ VHT_GROUP(2, 1, BW_40), ++ VHT_GROUP(3, 1, BW_40), ++ VHT_GROUP(4, 1, BW_40), + +- VHT_GROUP(1, 0, BW_80, 4), +- VHT_GROUP(2, 0, BW_80, 4), +- VHT_GROUP(3, 0, BW_80, 4), +- VHT_GROUP(4, 0, BW_80, 2), ++ VHT_GROUP(1, 0, BW_80), ++ VHT_GROUP(2, 0, BW_80), ++ VHT_GROUP(3, 0, BW_80), ++ VHT_GROUP(4, 0, BW_80), + +- VHT_GROUP(1, 1, BW_80, 4), +- VHT_GROUP(2, 1, BW_80, 4), +- VHT_GROUP(3, 1, BW_80, 4), +- VHT_GROUP(4, 1, BW_80, 2), ++ VHT_GROUP(1, 1, BW_80), ++ VHT_GROUP(2, 1, BW_80), ++ VHT_GROUP(3, 1, BW_80), ++ VHT_GROUP(4, 1, BW_80), + }; + + static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES] __read_mostly;