mac80211: add rate control support for 4 spatial streams, improve precision
authorFelix Fietkau <nbd@nbd.name>
Fri, 7 Jun 2019 17:10:25 +0000 (19:10 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 25 Jun 2019 11:24:49 +0000 (13:24 +0200)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/kernel/mac80211/patches/subsys/361-mac80211-minstrel_ht-add-support-for-rates-with-4-sp.patch [new file with mode: 0644]
package/kernel/mac80211/patches/subsys/362-mac80211-minstrel_ht-automatically-calculate-rate-du.patch [new file with mode: 0644]

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 (file)
index 0000000..07b30df
--- /dev/null
@@ -0,0 +1,78 @@
+From: Felix Fietkau <nbd@nbd.name>
+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 <nbd@nbd.name>
+---
+
+--- 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 (file)
index 0000000..81d1496
--- /dev/null
@@ -0,0 +1,189 @@
+From: Felix Fietkau <nbd@nbd.name>
+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 <nbd@nbd.name>
+---
+
+--- 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;