mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 15:56:49 +00:00
mac80211: add rate control support for 4 spatial streams, improve precision
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
b16faf9bc7
commit
e08296a851
@ -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) */
|
||||||
|
|
@ -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;
|
Loading…
Reference in New Issue
Block a user