blob: 27ed002f49937bb3e381a2181e92a1d3de373775 [file] [log] [blame]
From a1d426d8bb909612b66c31d450fd717177862d2f Mon Sep 17 00:00:00 2001
From: Bo Jiao <Bo.Jiao@mediatek.com>
Date: Sun, 25 Dec 2022 22:43:46 +0800
Subject: [PATCH 101/102] mac80211: mtk: add rate duration for EHT rate.
---
net/mac80211/airtime.c | 349 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 346 insertions(+), 3 deletions(-)
diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
index e8ebd34..b1de6d0 100644
--- a/net/mac80211/airtime.c
+++ b/net/mac80211/airtime.c
@@ -55,10 +55,21 @@
#define HE_DURATION_S(shift, streams, gi, bps) \
(HE_DURATION(streams, gi, bps) >> shift)
+/* Transmit duration for the raw data part of an average sized packet */
+#define EHT_GI_08 HE_GI_08
+#define EHT_GI_16 HE_GI_16
+#define EHT_GI_32 HE_GI_32
+
+#define EHT_DURATION(streams, gi, bps) \
+ HE_DURATION(streams, gi, bps)
+#define EHT_DURATION_S(shift, streams, gi, bps) \
+ HE_DURATION_S(shift, streams, gi, bps)
+
#define BW_20 0
#define BW_40 1
#define BW_80 2
#define BW_160 3
+#define BW_320 4
/*
* Define group sort order: HT40 -> SGI -> #streams
@@ -68,17 +79,26 @@
#define IEEE80211_VHT_STREAM_GROUPS 8 /* BW(=4) * SGI(=2) */
#define IEEE80211_HE_MAX_STREAMS 8
+#define IEEE80211_HE_STREAM_GROUPS 12 /* BW(=4) * GI(=3) */
+
+#define IEEE80211_EHT_MAX_STREAMS 16
+#define IEEE80211_EHT_STREAM_GROUPS 15 /* BW(=5) * GI(=3) */
#define IEEE80211_HT_GROUPS_NB (IEEE80211_MAX_STREAMS * \
IEEE80211_HT_STREAM_GROUPS)
#define IEEE80211_VHT_GROUPS_NB (IEEE80211_MAX_STREAMS * \
IEEE80211_VHT_STREAM_GROUPS)
+#define IEEE80211_HE_GROUPS_NB (IEEE80211_HE_MAX_STREAMS * \
+ IEEE80211_HE_STREAM_GROUPS)
+#define IEEE80211_EHT_GROUPS_NB (IEEE80211_EHT_MAX_STREAMS * \
+ IEEE80211_EHT_STREAM_GROUPS)
#define IEEE80211_HT_GROUP_0 0
#define IEEE80211_VHT_GROUP_0 (IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
#define IEEE80211_HE_GROUP_0 (IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
+#define IEEE80211_EHT_GROUP_0 (IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
-#define MCS_GROUP_RATES 12
+#define MCS_GROUP_RATES 14
#define HT_GROUP_IDX(_streams, _sgi, _ht40) \
IEEE80211_HT_GROUP_0 + \
@@ -203,6 +223,59 @@
#define HE_GROUP(_streams, _gi, _bw) \
__HE_GROUP(_streams, _gi, _bw, \
HE_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1) \
+ (_bw == BW_320 ? r5 : _bw == BW_160 ? r4 : _bw == BW_80 ? r3 : _bw == BW_40 ? r2 : r1)
+
+#define EHT_GROUP_IDX(_streams, _gi, _bw) \
+ (IEEE80211_EHT_GROUP_0 + \
+ IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) + \
+ IEEE80211_EHT_MAX_STREAMS * (_gi) + \
+ (_streams) - 1)
+
+#define __EHT_GROUP(_streams, _gi, _bw, _s) \
+ [EHT_GROUP_IDX(_streams, _gi, _bw)] = { \
+ .shift = _s, \
+ .duration = { \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 1960, 979, 489, 230, 115)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 3920, 1958, 979, 475, 230)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 5880, 2937, 1468, 705, 345)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 7840, 3916, 1958, 936, 475)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 11760, 5875, 2937, 1411, 705)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 15680, 7833, 3916, 1872, 936)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 17640, 8827, 4406, 2102, 1051)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 19600, 9806, 4896, 2347, 1166)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 23520, 11764, 5875, 2808, 1411)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 26133, 13060, 6523, 3124, 1555)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 29400, 14702, 7344, 3513, 1756)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 32666, 16329, 8164, 3902, 1944)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)), \
+ EHT_DURATION_S(_s, _streams, _gi, \
+ EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340)) \
+ } \
+}
+
+#define EHT_GROUP_SHIFT(_streams, _gi, _bw) \
+ GROUP_SHIFT(EHT_DURATION(_streams, _gi, \
+ EHT_BW2VBPS(_bw, 1960, 979, 489, 230, 115)))
+
+#define EHT_GROUP(_streams, _gi, _bw) \
+ __EHT_GROUP(_streams, _gi, _bw, \
+ EHT_GROUP_SHIFT(_streams, _gi, _bw))
+
struct mcs_group {
u8 shift;
u16 duration[MCS_GROUP_RATES];
@@ -376,6 +449,262 @@ static const struct mcs_group airtime_mcs_groups[] = {
HE_GROUP(6, HE_GI_32, BW_160),
HE_GROUP(7, HE_GI_32, BW_160),
HE_GROUP(8, HE_GI_32, BW_160),
+
+ /* EHT */
+ EHT_GROUP( 1, EHT_GI_08, BW_20),
+ EHT_GROUP( 2, EHT_GI_08, BW_20),
+ EHT_GROUP( 3, EHT_GI_08, BW_20),
+ EHT_GROUP( 4, EHT_GI_08, BW_20),
+ EHT_GROUP( 5, EHT_GI_08, BW_20),
+ EHT_GROUP( 6, EHT_GI_08, BW_20),
+ EHT_GROUP( 7, EHT_GI_08, BW_20),
+ EHT_GROUP( 8, EHT_GI_08, BW_20),
+ EHT_GROUP( 9, EHT_GI_08, BW_20),
+ EHT_GROUP(10, EHT_GI_08, BW_20),
+ EHT_GROUP(11, EHT_GI_08, BW_20),
+ EHT_GROUP(12, EHT_GI_08, BW_20),
+ EHT_GROUP(13, EHT_GI_08, BW_20),
+ EHT_GROUP(14, EHT_GI_08, BW_20),
+ EHT_GROUP(15, EHT_GI_08, BW_20),
+ EHT_GROUP(16, EHT_GI_08, BW_20),
+
+ EHT_GROUP( 1, EHT_GI_16, BW_20),
+ EHT_GROUP( 2, EHT_GI_16, BW_20),
+ EHT_GROUP( 3, EHT_GI_16, BW_20),
+ EHT_GROUP( 4, EHT_GI_16, BW_20),
+ EHT_GROUP( 5, EHT_GI_16, BW_20),
+ EHT_GROUP( 6, EHT_GI_16, BW_20),
+ EHT_GROUP( 7, EHT_GI_16, BW_20),
+ EHT_GROUP( 8, EHT_GI_16, BW_20),
+ EHT_GROUP( 9, EHT_GI_16, BW_20),
+ EHT_GROUP(10, EHT_GI_16, BW_20),
+ EHT_GROUP(11, EHT_GI_16, BW_20),
+ EHT_GROUP(12, EHT_GI_16, BW_20),
+ EHT_GROUP(13, EHT_GI_16, BW_20),
+ EHT_GROUP(14, EHT_GI_16, BW_20),
+ EHT_GROUP(15, EHT_GI_16, BW_20),
+ EHT_GROUP(16, EHT_GI_16, BW_20),
+
+ EHT_GROUP( 1, EHT_GI_32, BW_20),
+ EHT_GROUP( 2, EHT_GI_32, BW_20),
+ EHT_GROUP( 3, EHT_GI_32, BW_20),
+ EHT_GROUP( 4, EHT_GI_32, BW_20),
+ EHT_GROUP( 5, EHT_GI_32, BW_20),
+ EHT_GROUP( 6, EHT_GI_32, BW_20),
+ EHT_GROUP( 7, EHT_GI_32, BW_20),
+ EHT_GROUP( 8, EHT_GI_32, BW_20),
+ EHT_GROUP( 9, EHT_GI_32, BW_20),
+ EHT_GROUP(10, EHT_GI_32, BW_20),
+ EHT_GROUP(11, EHT_GI_32, BW_20),
+ EHT_GROUP(12, EHT_GI_32, BW_20),
+ EHT_GROUP(13, EHT_GI_32, BW_20),
+ EHT_GROUP(14, EHT_GI_32, BW_20),
+ EHT_GROUP(15, EHT_GI_32, BW_20),
+ EHT_GROUP(16, EHT_GI_32, BW_20),
+
+ EHT_GROUP( 1, EHT_GI_08, BW_40),
+ EHT_GROUP( 2, EHT_GI_08, BW_40),
+ EHT_GROUP( 3, EHT_GI_08, BW_40),
+ EHT_GROUP( 4, EHT_GI_08, BW_40),
+ EHT_GROUP( 5, EHT_GI_08, BW_40),
+ EHT_GROUP( 6, EHT_GI_08, BW_40),
+ EHT_GROUP( 7, EHT_GI_08, BW_40),
+ EHT_GROUP( 8, EHT_GI_08, BW_40),
+ EHT_GROUP( 9, EHT_GI_08, BW_40),
+ EHT_GROUP(10, EHT_GI_08, BW_40),
+ EHT_GROUP(11, EHT_GI_08, BW_40),
+ EHT_GROUP(12, EHT_GI_08, BW_40),
+ EHT_GROUP(13, EHT_GI_08, BW_40),
+ EHT_GROUP(14, EHT_GI_08, BW_40),
+ EHT_GROUP(15, EHT_GI_08, BW_40),
+ EHT_GROUP(16, EHT_GI_08, BW_40),
+
+ EHT_GROUP( 1, EHT_GI_16, BW_40),
+ EHT_GROUP( 2, EHT_GI_16, BW_40),
+ EHT_GROUP( 3, EHT_GI_16, BW_40),
+ EHT_GROUP( 4, EHT_GI_16, BW_40),
+ EHT_GROUP( 5, EHT_GI_16, BW_40),
+ EHT_GROUP( 6, EHT_GI_16, BW_40),
+ EHT_GROUP( 7, EHT_GI_16, BW_40),
+ EHT_GROUP( 8, EHT_GI_16, BW_40),
+ EHT_GROUP( 9, EHT_GI_16, BW_40),
+ EHT_GROUP(10, EHT_GI_16, BW_40),
+ EHT_GROUP(11, EHT_GI_16, BW_40),
+ EHT_GROUP(12, EHT_GI_16, BW_40),
+ EHT_GROUP(13, EHT_GI_16, BW_40),
+ EHT_GROUP(14, EHT_GI_16, BW_40),
+ EHT_GROUP(15, EHT_GI_16, BW_40),
+ EHT_GROUP(16, EHT_GI_16, BW_40),
+
+ EHT_GROUP( 1, EHT_GI_32, BW_40),
+ EHT_GROUP( 2, EHT_GI_32, BW_40),
+ EHT_GROUP( 3, EHT_GI_32, BW_40),
+ EHT_GROUP( 4, EHT_GI_32, BW_40),
+ EHT_GROUP( 5, EHT_GI_32, BW_40),
+ EHT_GROUP( 6, EHT_GI_32, BW_40),
+ EHT_GROUP( 7, EHT_GI_32, BW_40),
+ EHT_GROUP( 8, EHT_GI_32, BW_40),
+ EHT_GROUP( 9, EHT_GI_32, BW_40),
+ EHT_GROUP(10, EHT_GI_32, BW_40),
+ EHT_GROUP(11, EHT_GI_32, BW_40),
+ EHT_GROUP(12, EHT_GI_32, BW_40),
+ EHT_GROUP(13, EHT_GI_32, BW_40),
+ EHT_GROUP(14, EHT_GI_32, BW_40),
+ EHT_GROUP(15, EHT_GI_32, BW_40),
+ EHT_GROUP(16, EHT_GI_32, BW_40),
+
+ EHT_GROUP( 1, EHT_GI_08, BW_80),
+ EHT_GROUP( 2, EHT_GI_08, BW_80),
+ EHT_GROUP( 3, EHT_GI_08, BW_80),
+ EHT_GROUP( 4, EHT_GI_08, BW_80),
+ EHT_GROUP( 5, EHT_GI_08, BW_80),
+ EHT_GROUP( 6, EHT_GI_08, BW_80),
+ EHT_GROUP( 7, EHT_GI_08, BW_80),
+ EHT_GROUP( 8, EHT_GI_08, BW_80),
+ EHT_GROUP( 9, EHT_GI_08, BW_80),
+ EHT_GROUP(10, EHT_GI_08, BW_80),
+ EHT_GROUP(11, EHT_GI_08, BW_80),
+ EHT_GROUP(12, EHT_GI_08, BW_80),
+ EHT_GROUP(13, EHT_GI_08, BW_80),
+ EHT_GROUP(14, EHT_GI_08, BW_80),
+ EHT_GROUP(15, EHT_GI_08, BW_80),
+ EHT_GROUP(16, EHT_GI_08, BW_80),
+
+ EHT_GROUP( 1, EHT_GI_16, BW_80),
+ EHT_GROUP( 2, EHT_GI_16, BW_80),
+ EHT_GROUP( 3, EHT_GI_16, BW_80),
+ EHT_GROUP( 4, EHT_GI_16, BW_80),
+ EHT_GROUP( 5, EHT_GI_16, BW_80),
+ EHT_GROUP( 6, EHT_GI_16, BW_80),
+ EHT_GROUP( 7, EHT_GI_16, BW_80),
+ EHT_GROUP( 8, EHT_GI_16, BW_80),
+ EHT_GROUP( 9, EHT_GI_16, BW_80),
+ EHT_GROUP(10, EHT_GI_16, BW_80),
+ EHT_GROUP(11, EHT_GI_16, BW_80),
+ EHT_GROUP(12, EHT_GI_16, BW_80),
+ EHT_GROUP(13, EHT_GI_16, BW_80),
+ EHT_GROUP(14, EHT_GI_16, BW_80),
+ EHT_GROUP(15, EHT_GI_16, BW_80),
+ EHT_GROUP(16, EHT_GI_16, BW_80),
+
+ EHT_GROUP( 1, EHT_GI_32, BW_80),
+ EHT_GROUP( 2, EHT_GI_32, BW_80),
+ EHT_GROUP( 3, EHT_GI_32, BW_80),
+ EHT_GROUP( 4, EHT_GI_32, BW_80),
+ EHT_GROUP( 5, EHT_GI_32, BW_80),
+ EHT_GROUP( 6, EHT_GI_32, BW_80),
+ EHT_GROUP( 7, EHT_GI_32, BW_80),
+ EHT_GROUP( 8, EHT_GI_32, BW_80),
+ EHT_GROUP( 9, EHT_GI_32, BW_80),
+ EHT_GROUP(10, EHT_GI_32, BW_80),
+ EHT_GROUP(11, EHT_GI_32, BW_80),
+ EHT_GROUP(12, EHT_GI_32, BW_80),
+ EHT_GROUP(13, EHT_GI_32, BW_80),
+ EHT_GROUP(14, EHT_GI_32, BW_80),
+ EHT_GROUP(15, EHT_GI_32, BW_80),
+ EHT_GROUP(16, EHT_GI_32, BW_80),
+
+ EHT_GROUP( 1, EHT_GI_08, BW_160),
+ EHT_GROUP( 2, EHT_GI_08, BW_160),
+ EHT_GROUP( 3, EHT_GI_08, BW_160),
+ EHT_GROUP( 4, EHT_GI_08, BW_160),
+ EHT_GROUP( 5, EHT_GI_08, BW_160),
+ EHT_GROUP( 6, EHT_GI_08, BW_160),
+ EHT_GROUP( 7, EHT_GI_08, BW_160),
+ EHT_GROUP( 8, EHT_GI_08, BW_160),
+ EHT_GROUP( 9, EHT_GI_08, BW_160),
+ EHT_GROUP(10, EHT_GI_08, BW_160),
+ EHT_GROUP(11, EHT_GI_08, BW_160),
+ EHT_GROUP(12, EHT_GI_08, BW_160),
+ EHT_GROUP(13, EHT_GI_08, BW_160),
+ EHT_GROUP(14, EHT_GI_08, BW_160),
+ EHT_GROUP(15, EHT_GI_08, BW_160),
+ EHT_GROUP(16, EHT_GI_08, BW_160),
+
+ EHT_GROUP( 1, EHT_GI_16, BW_160),
+ EHT_GROUP( 2, EHT_GI_16, BW_160),
+ EHT_GROUP( 3, EHT_GI_16, BW_160),
+ EHT_GROUP( 4, EHT_GI_16, BW_160),
+ EHT_GROUP( 5, EHT_GI_16, BW_160),
+ EHT_GROUP( 6, EHT_GI_16, BW_160),
+ EHT_GROUP( 7, EHT_GI_16, BW_160),
+ EHT_GROUP( 8, EHT_GI_16, BW_160),
+ EHT_GROUP( 9, EHT_GI_16, BW_160),
+ EHT_GROUP(10, EHT_GI_16, BW_160),
+ EHT_GROUP(11, EHT_GI_16, BW_160),
+ EHT_GROUP(12, EHT_GI_16, BW_160),
+ EHT_GROUP(13, EHT_GI_16, BW_160),
+ EHT_GROUP(14, EHT_GI_16, BW_160),
+ EHT_GROUP(15, EHT_GI_16, BW_160),
+ EHT_GROUP(16, EHT_GI_16, BW_160),
+
+ EHT_GROUP( 1, EHT_GI_32, BW_160),
+ EHT_GROUP( 2, EHT_GI_32, BW_160),
+ EHT_GROUP( 3, EHT_GI_32, BW_160),
+ EHT_GROUP( 4, EHT_GI_32, BW_160),
+ EHT_GROUP( 5, EHT_GI_32, BW_160),
+ EHT_GROUP( 6, EHT_GI_32, BW_160),
+ EHT_GROUP( 7, EHT_GI_32, BW_160),
+ EHT_GROUP( 8, EHT_GI_32, BW_160),
+ EHT_GROUP( 9, EHT_GI_32, BW_160),
+ EHT_GROUP(10, EHT_GI_32, BW_160),
+ EHT_GROUP(11, EHT_GI_32, BW_160),
+ EHT_GROUP(12, EHT_GI_32, BW_160),
+ EHT_GROUP(13, EHT_GI_32, BW_160),
+ EHT_GROUP(14, EHT_GI_32, BW_160),
+ EHT_GROUP(15, EHT_GI_32, BW_160),
+ EHT_GROUP(16, EHT_GI_32, BW_160),
+
+ EHT_GROUP( 1, EHT_GI_08, BW_320),
+ EHT_GROUP( 2, EHT_GI_08, BW_320),
+ EHT_GROUP( 3, EHT_GI_08, BW_320),
+ EHT_GROUP( 4, EHT_GI_08, BW_320),
+ EHT_GROUP( 5, EHT_GI_08, BW_320),
+ EHT_GROUP( 6, EHT_GI_08, BW_320),
+ EHT_GROUP( 7, EHT_GI_08, BW_320),
+ EHT_GROUP( 8, EHT_GI_08, BW_320),
+ EHT_GROUP( 9, EHT_GI_08, BW_320),
+ EHT_GROUP(10, EHT_GI_08, BW_320),
+ EHT_GROUP(11, EHT_GI_08, BW_320),
+ EHT_GROUP(12, EHT_GI_08, BW_320),
+ EHT_GROUP(13, EHT_GI_08, BW_320),
+ EHT_GROUP(14, EHT_GI_08, BW_320),
+ EHT_GROUP(15, EHT_GI_08, BW_320),
+ EHT_GROUP(16, EHT_GI_08, BW_320),
+
+ EHT_GROUP( 1, EHT_GI_16, BW_320),
+ EHT_GROUP( 2, EHT_GI_16, BW_320),
+ EHT_GROUP( 3, EHT_GI_16, BW_320),
+ EHT_GROUP( 4, EHT_GI_16, BW_320),
+ EHT_GROUP( 5, EHT_GI_16, BW_320),
+ EHT_GROUP( 6, EHT_GI_16, BW_320),
+ EHT_GROUP( 7, EHT_GI_16, BW_320),
+ EHT_GROUP( 8, EHT_GI_16, BW_320),
+ EHT_GROUP( 9, EHT_GI_16, BW_320),
+ EHT_GROUP(10, EHT_GI_16, BW_320),
+ EHT_GROUP(11, EHT_GI_16, BW_320),
+ EHT_GROUP(12, EHT_GI_16, BW_320),
+ EHT_GROUP(13, EHT_GI_16, BW_320),
+ EHT_GROUP(14, EHT_GI_16, BW_320),
+ EHT_GROUP(15, EHT_GI_16, BW_320),
+ EHT_GROUP(16, EHT_GI_16, BW_320),
+
+ EHT_GROUP( 1, EHT_GI_32, BW_320),
+ EHT_GROUP( 2, EHT_GI_32, BW_320),
+ EHT_GROUP( 3, EHT_GI_32, BW_320),
+ EHT_GROUP( 4, EHT_GI_32, BW_320),
+ EHT_GROUP( 5, EHT_GI_32, BW_320),
+ EHT_GROUP( 6, EHT_GI_32, BW_320),
+ EHT_GROUP( 7, EHT_GI_32, BW_320),
+ EHT_GROUP( 8, EHT_GI_32, BW_320),
+ EHT_GROUP( 9, EHT_GI_32, BW_320),
+ EHT_GROUP(10, EHT_GI_32, BW_320),
+ EHT_GROUP(11, EHT_GI_32, BW_320),
+ EHT_GROUP(12, EHT_GI_32, BW_320),
+ EHT_GROUP(13, EHT_GI_32, BW_320),
+ EHT_GROUP(14, EHT_GI_32, BW_320),
+ EHT_GROUP(15, EHT_GI_32, BW_320),
+ EHT_GROUP(16, EHT_GI_32, BW_320),
};
static u32
@@ -422,6 +751,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
case RATE_INFO_BW_160:
bw = BW_160;
break;
+ case RATE_INFO_BW_320:
+ bw = BW_320;
+ break;
default:
WARN_ON_ONCE(1);
return 0;
@@ -443,11 +775,20 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
idx = status->rate_idx;
group = HE_GROUP_IDX(streams, status->he_gi, bw);
break;
+ case RX_ENC_EHT:
+ streams = status->nss;
+ idx = status->rate_idx;
+ group = EHT_GROUP_IDX(streams, status->he_gi, bw);
+ break;
default:
WARN_ON_ONCE(1);
return 0;
}
+ if (WARN_ON_ONCE((status->encoding != RX_ENC_EHT && streams > 8) ||
+ (status->encoding == RX_ENC_EHT && streams > 16)))
+ return 0;
+
if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
(status->encoding == RX_ENC_HE && streams > 8)))
return 0;
@@ -517,7 +858,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
stat->nss = ri->nss;
stat->rate_idx = ri->mcs;
- if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
+ if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
+ stat->encoding = RX_ENC_EHT;
+ else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
stat->encoding = RX_ENC_HE;
else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
stat->encoding = RX_ENC_VHT;
@@ -529,7 +872,7 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
- stat->he_gi = ri->he_gi;
+ stat->he_gi = (ri->flags & RATE_INFO_FLAGS_EHT_MCS) ? ri->eht_gi : ri->he_gi;
if (stat->encoding != RX_ENC_LEGACY)
return true;
--
2.18.0