developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 1 | From 2ff2e76bdbbbe8fa6923c274f276110f86acfb6a Mon Sep 17 00:00:00 2001 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 2 | From: Johannes Berg <johannes.berg@intel.com> |
| 3 | Date: Mon, 9 Jan 2023 13:07:21 +0200 |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 4 | Subject: [PATCH 2/9] mac80211: support minimal EHT rate reporting on RX |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 5 | |
| 6 | Add minimal support for RX EHT rate reporting, not yet |
| 7 | adding (modifying) any radiotap headers, just statistics |
| 8 | for cfg80211. |
| 9 | |
| 10 | Signed-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 | |
| 19 | diff --git a/include/net/mac80211.h b/include/net/mac80211.h |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 20 | index 9c59eb8..3388cc7 100644 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 21 | --- a/include/net/mac80211.h |
| 22 | +++ b/include/net/mac80211.h |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 23 | @@ -1468,6 +1468,7 @@ enum mac80211_rx_encoding { |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 24 | RX_ENC_HT, |
| 25 | RX_ENC_VHT, |
| 26 | RX_ENC_HE, |
| 27 | + RX_ENC_EHT, |
| 28 | }; |
| 29 | |
| 30 | /** |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 31 | @@ -1501,7 +1502,7 @@ enum mac80211_rx_encoding { |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 32 | * @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 |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 40 | @@ -1509,6 +1510,8 @@ enum mac80211_rx_encoding { |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 41 | * @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 |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 49 | @@ -1530,8 +1533,18 @@ struct ieee80211_rx_status { |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 50 | 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; |
| 70 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 71 | index 46ae9e9..fadf2be 100644 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 72 | --- a/net/mac80211/rx.c |
| 73 | +++ b/net/mac80211/rx.c |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 74 | @@ -5328,6 +5328,15 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 75 | 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; |
| 90 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 91 | index a13a8fb..50daa22 100644 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 92 | --- 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> |
developer | ed7222c | 2023-04-14 07:19:52 +0800 | [diff] [blame] | 103 | @@ -2384,6 +2384,13 @@ static void sta_stats_decode_rate(struct ieee80211_local *local, u32 rate, |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 104 | 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 | |
| 117 | diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h |
developer | 8eb72a3 | 2023-03-30 08:32:07 +0800 | [diff] [blame] | 118 | index 759a1a8..ec8dff0 100644 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 119 | --- a/net/mac80211/sta_info.h |
| 120 | +++ b/net/mac80211/sta_info.h |
developer | 8eb72a3 | 2023-03-30 08:32:07 +0800 | [diff] [blame] | 121 | @@ -930,6 +930,7 @@ enum sta_stats_type { |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 122 | 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) |
developer | 8eb72a3 | 2023-03-30 08:32:07 +0800 | [diff] [blame] | 129 | @@ -939,12 +940,16 @@ enum sta_stats_type { |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 130 | #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) |
developer | 8eb72a3 | 2023-03-30 08:32:07 +0800 | [diff] [blame] | 152 | @@ -983,6 +988,13 @@ static inline u32 sta_stats_encode_rate(struct ieee80211_rx_status *s) |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 153 | 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; |
| 166 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 167 | index 83f6c56..5a6c091 100644 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 168 | --- a/net/mac80211/util.c |
| 169 | +++ b/net/mac80211/util.c |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 170 | @@ -3900,6 +3900,19 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 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 | -- |
developer | ebaa551 | 2023-04-19 18:23:21 +0800 | [diff] [blame] | 191 | 2.39.2 |
developer | 1413c88 | 2023-02-15 00:01:06 +0800 | [diff] [blame] | 192 | |