blob: c2a871fef95150632181143d8dd9a38e76eb8a09 [file] [log] [blame]
developer8eb72a32023-03-30 08:32:07 +08001From a9cef32c4ffc9a23e14f72efc49e9ec4743eff23 Mon Sep 17 00:00:00 2001
developer1413c882023-02-15 00:01:06 +08002From: Johannes Berg <johannes.berg@intel.com>
3Date: Mon, 9 Jan 2023 13:07:21 +0200
developer8eb72a32023-03-30 08:32:07 +08004Subject: [PATCH 01/15] mac80211: support minimal EHT rate reporting on RX
developer1413c882023-02-15 00:01:06 +08005
6Add minimal support for RX EHT rate reporting, not yet
7adding (modifying) any radiotap headers, just statistics
8for cfg80211.
9
10Signed-off-by: Johannes Berg <johannes.berg@intel.com>
11---
12 include/net/mac80211.h | 19 ++++++++++++++++---
13 net/mac80211/rx.c | 9 +++++++++
14 net/mac80211/sta_info.c | 9 ++++++++-
15 net/mac80211/sta_info.h | 24 ++++++++++++++++++------
16 net/mac80211/util.c | 13 +++++++++++++
17 5 files changed, 64 insertions(+), 10 deletions(-)
18
19diff --git a/include/net/mac80211.h b/include/net/mac80211.h
developer8eb72a32023-03-30 08:32:07 +080020index 1ca00b5..73df564 100644
developer1413c882023-02-15 00:01:06 +080021--- a/include/net/mac80211.h
22+++ b/include/net/mac80211.h
developer8eb72a32023-03-30 08:32:07 +080023@@ -1462,6 +1462,7 @@ enum mac80211_rx_encoding {
developer1413c882023-02-15 00:01:06 +080024 RX_ENC_HT,
25 RX_ENC_VHT,
26 RX_ENC_HE,
27+ RX_ENC_EHT,
28 };
29
30 /**
developer8eb72a32023-03-30 08:32:07 +080031@@ -1495,7 +1496,7 @@ enum mac80211_rx_encoding {
developer1413c882023-02-15 00:01:06 +080032 * @antenna: antenna used
33 * @rate_idx: index of data rate into band's supported rates or MCS index if
34 * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
35- * @nss: number of streams (VHT and HE only)
36+ * @nss: number of streams (VHT, HE and EHT only)
37 * @flag: %RX_FLAG_\*
38 * @encoding: &enum mac80211_rx_encoding
39 * @bw: &enum rate_info_bw
developer8eb72a32023-03-30 08:32:07 +080040@@ -1503,6 +1504,8 @@ enum mac80211_rx_encoding {
developer1413c882023-02-15 00:01:06 +080041 * @he_ru: HE RU, from &enum nl80211_he_ru_alloc
42 * @he_gi: HE GI, from &enum nl80211_he_gi
43 * @he_dcm: HE DCM value
44+ * @eht.ru: EHT RU, from &enum nl80211_eht_ru_alloc
45+ * @eht.gi: EHT GI, from &enum nl80211_eht_gi
46 * @rx_flags: internal RX flags for mac80211
47 * @ampdu_reference: A-MPDU reference number, must be a different value for
48 * each A-MPDU but the same for each subframe within one A-MPDU
developer8eb72a32023-03-30 08:32:07 +080049@@ -1524,8 +1527,18 @@ struct ieee80211_rx_status {
developer1413c882023-02-15 00:01:06 +080050 u32 flag;
51 u16 freq: 13, freq_offset: 1;
52 u8 enc_flags;
53- u8 encoding:2, bw:3, he_ru:3;
54- u8 he_gi:2, he_dcm:1;
55+ u8 encoding:3, bw:4;
56+ union {
57+ struct {
58+ u8 he_ru:3;
59+ u8 he_gi:2;
60+ u8 he_dcm:1;
61+ };
62+ struct {
63+ u8 ru:4;
64+ u8 gi:2;
65+ } eht;
66+ };
67 u8 rate_idx;
68 u8 nss;
69 u8 rx_flags;
70diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
developer8eb72a32023-03-30 08:32:07 +080071index 45aeb01..376e131 100644
developer1413c882023-02-15 00:01:06 +080072--- a/net/mac80211/rx.c
73+++ b/net/mac80211/rx.c
developer8eb72a32023-03-30 08:32:07 +080074@@ -5331,6 +5331,15 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
developer1413c882023-02-15 00:01:06 +080075 status->rate_idx, status->nss))
76 goto drop;
77 break;
78+ case RX_ENC_EHT:
79+ if (WARN_ONCE(status->rate_idx > 15 ||
80+ !status->nss ||
81+ status->nss > 8 ||
82+ status->eht.gi > NL80211_RATE_INFO_EHT_GI_3_2,
83+ "Rate marked as an EHT rate but data is invalid: MCS:%d, NSS:%d, GI:%d\n",
84+ status->rate_idx, status->nss, status->eht.gi))
85+ goto drop;
86+ break;
87 default:
88 WARN_ON_ONCE(1);
89 fallthrough;
90diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
developer8eb72a32023-03-30 08:32:07 +080091index 8edee5d..8cdeb96 100644
developer1413c882023-02-15 00:01:06 +080092--- a/net/mac80211/sta_info.c
93+++ b/net/mac80211/sta_info.c
94@@ -4,7 +4,7 @@
95 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
96 * Copyright 2013-2014 Intel Mobile Communications GmbH
97 * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
98- * Copyright (C) 2018-2021 Intel Corporation
99+ * Copyright (C) 2018-2022 Intel Corporation
100 */
101
102 #include <linux/module.h>
developer8eb72a32023-03-30 08:32:07 +0800103@@ -2372,6 +2372,13 @@ static void sta_stats_decode_rate(struct ieee80211_local *local, u32 rate,
developer1413c882023-02-15 00:01:06 +0800104 rinfo->he_ru_alloc = STA_STATS_GET(HE_RU, rate);
105 rinfo->he_dcm = STA_STATS_GET(HE_DCM, rate);
106 break;
107+ case STA_STATS_RATE_TYPE_EHT:
108+ rinfo->flags = RATE_INFO_FLAGS_EHT_MCS;
109+ rinfo->mcs = STA_STATS_GET(EHT_MCS, rate);
110+ rinfo->nss = STA_STATS_GET(EHT_NSS, rate);
111+ rinfo->eht_gi = STA_STATS_GET(EHT_GI, rate);
112+ rinfo->eht_ru_alloc = STA_STATS_GET(EHT_RU, rate);
113+ break;
114 }
115 }
116
117diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
developer8eb72a32023-03-30 08:32:07 +0800118index 759a1a8..ec8dff0 100644
developer1413c882023-02-15 00:01:06 +0800119--- a/net/mac80211/sta_info.h
120+++ b/net/mac80211/sta_info.h
developer8eb72a32023-03-30 08:32:07 +0800121@@ -930,6 +930,7 @@ enum sta_stats_type {
developer1413c882023-02-15 00:01:06 +0800122 STA_STATS_RATE_TYPE_VHT,
123 STA_STATS_RATE_TYPE_HE,
124 STA_STATS_RATE_TYPE_S1G,
125+ STA_STATS_RATE_TYPE_EHT,
126 };
127
128 #define STA_STATS_FIELD_HT_MCS GENMASK( 7, 0)
developer8eb72a32023-03-30 08:32:07 +0800129@@ -939,12 +940,16 @@ enum sta_stats_type {
developer1413c882023-02-15 00:01:06 +0800130 #define STA_STATS_FIELD_VHT_NSS GENMASK( 7, 4)
131 #define STA_STATS_FIELD_HE_MCS GENMASK( 3, 0)
132 #define STA_STATS_FIELD_HE_NSS GENMASK( 7, 4)
133-#define STA_STATS_FIELD_BW GENMASK(11, 8)
134-#define STA_STATS_FIELD_SGI GENMASK(12, 12)
135-#define STA_STATS_FIELD_TYPE GENMASK(15, 13)
136-#define STA_STATS_FIELD_HE_RU GENMASK(18, 16)
137-#define STA_STATS_FIELD_HE_GI GENMASK(20, 19)
138-#define STA_STATS_FIELD_HE_DCM GENMASK(21, 21)
139+#define STA_STATS_FIELD_EHT_MCS GENMASK( 3, 0)
140+#define STA_STATS_FIELD_EHT_NSS GENMASK( 7, 4)
141+#define STA_STATS_FIELD_BW GENMASK(12, 8)
142+#define STA_STATS_FIELD_SGI GENMASK(13, 13)
143+#define STA_STATS_FIELD_TYPE GENMASK(16, 14)
144+#define STA_STATS_FIELD_HE_RU GENMASK(19, 17)
145+#define STA_STATS_FIELD_HE_GI GENMASK(21, 20)
146+#define STA_STATS_FIELD_HE_DCM GENMASK(22, 22)
147+#define STA_STATS_FIELD_EHT_RU GENMASK(20, 17)
148+#define STA_STATS_FIELD_EHT_GI GENMASK(22, 21)
149
150 #define STA_STATS_FIELD(_n, _v) FIELD_PREP(STA_STATS_FIELD_ ## _n, _v)
151 #define STA_STATS_GET(_n, _v) FIELD_GET(STA_STATS_FIELD_ ## _n, _v)
developer8eb72a32023-03-30 08:32:07 +0800152@@ -983,6 +988,13 @@ static inline u32 sta_stats_encode_rate(struct ieee80211_rx_status *s)
developer1413c882023-02-15 00:01:06 +0800153 r |= STA_STATS_FIELD(HE_RU, s->he_ru);
154 r |= STA_STATS_FIELD(HE_DCM, s->he_dcm);
155 break;
156+ case RX_ENC_EHT:
157+ r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_EHT);
158+ r |= STA_STATS_FIELD(EHT_NSS, s->nss);
159+ r |= STA_STATS_FIELD(EHT_MCS, s->rate_idx);
160+ r |= STA_STATS_FIELD(EHT_GI, s->eht.gi);
161+ r |= STA_STATS_FIELD(EHT_RU, s->eht.ru);
162+ break;
163 default:
164 WARN_ON(1);
165 return STA_STATS_RATE_INVALID;
166diff --git a/net/mac80211/util.c b/net/mac80211/util.c
167index 005a730..608f927 100644
168--- a/net/mac80211/util.c
169+++ b/net/mac80211/util.c
170@@ -3926,6 +3926,19 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
171
172 /* Fill cfg80211 rate info */
173 switch (status->encoding) {
174+ case RX_ENC_EHT:
175+ ri.flags |= RATE_INFO_FLAGS_EHT_MCS;
176+ ri.mcs = status->rate_idx;
177+ ri.nss = status->nss;
178+ ri.eht_ru_alloc = status->eht.ru;
179+ if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
180+ ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
181+ /* TODO/FIXME: is this right? handle other PPDUs */
182+ if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
183+ mpdu_offset += 2;
184+ ts += 36;
185+ }
186+ break;
187 case RX_ENC_HE:
188 ri.flags |= RATE_INFO_FLAGS_HE_MCS;
189 ri.mcs = status->rate_idx;
190--
developer8eb72a32023-03-30 08:32:07 +08001912.18.0
developer1413c882023-02-15 00:01:06 +0800192