Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: support minimal EHT rate reporting on RX

Add minimal support for RX EHT rate reporting, not yet
adding (modifying) any radiotap headers, just statistics
for cfg80211.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+64 -10
+16 -3
include/net/mac80211.h
··· 1462 1462 RX_ENC_HT, 1463 1463 RX_ENC_VHT, 1464 1464 RX_ENC_HE, 1465 + RX_ENC_EHT, 1465 1466 }; 1466 1467 1467 1468 /** ··· 1496 1495 * @antenna: antenna used 1497 1496 * @rate_idx: index of data rate into band's supported rates or MCS index if 1498 1497 * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) 1499 - * @nss: number of streams (VHT and HE only) 1498 + * @nss: number of streams (VHT, HE and EHT only) 1500 1499 * @flag: %RX_FLAG_\* 1501 1500 * @encoding: &enum mac80211_rx_encoding 1502 1501 * @bw: &enum rate_info_bw ··· 1504 1503 * @he_ru: HE RU, from &enum nl80211_he_ru_alloc 1505 1504 * @he_gi: HE GI, from &enum nl80211_he_gi 1506 1505 * @he_dcm: HE DCM value 1506 + * @eht.ru: EHT RU, from &enum nl80211_eht_ru_alloc 1507 + * @eht.gi: EHT GI, from &enum nl80211_eht_gi 1507 1508 * @rx_flags: internal RX flags for mac80211 1508 1509 * @ampdu_reference: A-MPDU reference number, must be a different value for 1509 1510 * each A-MPDU but the same for each subframe within one A-MPDU ··· 1527 1524 u32 flag; 1528 1525 u16 freq: 13, freq_offset: 1; 1529 1526 u8 enc_flags; 1530 - u8 encoding:2, bw:3, he_ru:3; 1531 - u8 he_gi:2, he_dcm:1; 1527 + u8 encoding:3, bw:4; 1528 + union { 1529 + struct { 1530 + u8 he_ru:3; 1531 + u8 he_gi:2; 1532 + u8 he_dcm:1; 1533 + }; 1534 + struct { 1535 + u8 ru:4; 1536 + u8 gi:2; 1537 + } eht; 1538 + }; 1532 1539 u8 rate_idx; 1533 1540 u8 nss; 1534 1541 u8 rx_flags;
+9
net/mac80211/rx.c
··· 5194 5194 status->rate_idx, status->nss)) 5195 5195 goto drop; 5196 5196 break; 5197 + case RX_ENC_EHT: 5198 + if (WARN_ONCE(status->rate_idx > 15 || 5199 + !status->nss || 5200 + status->nss > 8 || 5201 + status->eht.gi > NL80211_RATE_INFO_EHT_GI_3_2, 5202 + "Rate marked as an EHT rate but data is invalid: MCS:%d, NSS:%d, GI:%d\n", 5203 + status->rate_idx, status->nss, status->eht.gi)) 5204 + goto drop; 5205 + break; 5197 5206 default: 5198 5207 WARN_ON_ONCE(1); 5199 5208 fallthrough;
+8 -1
net/mac80211/sta_info.c
··· 4 4 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 5 5 * Copyright 2013-2014 Intel Mobile Communications GmbH 6 6 * Copyright (C) 2015 - 2017 Intel Deutschland GmbH 7 - * Copyright (C) 2018-2021 Intel Corporation 7 + * Copyright (C) 2018-2022 Intel Corporation 8 8 */ 9 9 10 10 #include <linux/module.h> ··· 2405 2405 rinfo->he_gi = STA_STATS_GET(HE_GI, rate); 2406 2406 rinfo->he_ru_alloc = STA_STATS_GET(HE_RU, rate); 2407 2407 rinfo->he_dcm = STA_STATS_GET(HE_DCM, rate); 2408 + break; 2409 + case STA_STATS_RATE_TYPE_EHT: 2410 + rinfo->flags = RATE_INFO_FLAGS_EHT_MCS; 2411 + rinfo->mcs = STA_STATS_GET(EHT_MCS, rate); 2412 + rinfo->nss = STA_STATS_GET(EHT_NSS, rate); 2413 + rinfo->eht_gi = STA_STATS_GET(EHT_GI, rate); 2414 + rinfo->eht_ru_alloc = STA_STATS_GET(EHT_RU, rate); 2408 2415 break; 2409 2416 } 2410 2417 }
+18 -6
net/mac80211/sta_info.h
··· 936 936 STA_STATS_RATE_TYPE_VHT, 937 937 STA_STATS_RATE_TYPE_HE, 938 938 STA_STATS_RATE_TYPE_S1G, 939 + STA_STATS_RATE_TYPE_EHT, 939 940 }; 940 941 941 942 #define STA_STATS_FIELD_HT_MCS GENMASK( 7, 0) ··· 946 945 #define STA_STATS_FIELD_VHT_NSS GENMASK( 7, 4) 947 946 #define STA_STATS_FIELD_HE_MCS GENMASK( 3, 0) 948 947 #define STA_STATS_FIELD_HE_NSS GENMASK( 7, 4) 949 - #define STA_STATS_FIELD_BW GENMASK(11, 8) 950 - #define STA_STATS_FIELD_SGI GENMASK(12, 12) 951 - #define STA_STATS_FIELD_TYPE GENMASK(15, 13) 952 - #define STA_STATS_FIELD_HE_RU GENMASK(18, 16) 953 - #define STA_STATS_FIELD_HE_GI GENMASK(20, 19) 954 - #define STA_STATS_FIELD_HE_DCM GENMASK(21, 21) 948 + #define STA_STATS_FIELD_EHT_MCS GENMASK( 3, 0) 949 + #define STA_STATS_FIELD_EHT_NSS GENMASK( 7, 4) 950 + #define STA_STATS_FIELD_BW GENMASK(12, 8) 951 + #define STA_STATS_FIELD_SGI GENMASK(13, 13) 952 + #define STA_STATS_FIELD_TYPE GENMASK(16, 14) 953 + #define STA_STATS_FIELD_HE_RU GENMASK(19, 17) 954 + #define STA_STATS_FIELD_HE_GI GENMASK(21, 20) 955 + #define STA_STATS_FIELD_HE_DCM GENMASK(22, 22) 956 + #define STA_STATS_FIELD_EHT_RU GENMASK(20, 17) 957 + #define STA_STATS_FIELD_EHT_GI GENMASK(22, 21) 955 958 956 959 #define STA_STATS_FIELD(_n, _v) FIELD_PREP(STA_STATS_FIELD_ ## _n, _v) 957 960 #define STA_STATS_GET(_n, _v) FIELD_GET(STA_STATS_FIELD_ ## _n, _v) ··· 993 988 r |= STA_STATS_FIELD(HE_GI, s->he_gi); 994 989 r |= STA_STATS_FIELD(HE_RU, s->he_ru); 995 990 r |= STA_STATS_FIELD(HE_DCM, s->he_dcm); 991 + break; 992 + case RX_ENC_EHT: 993 + r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_EHT); 994 + r |= STA_STATS_FIELD(EHT_NSS, s->nss); 995 + r |= STA_STATS_FIELD(EHT_MCS, s->rate_idx); 996 + r |= STA_STATS_FIELD(EHT_GI, s->eht.gi); 997 + r |= STA_STATS_FIELD(EHT_RU, s->eht.ru); 996 998 break; 997 999 default: 998 1000 WARN_ON(1);
+13
net/mac80211/util.c
··· 4020 4020 4021 4021 /* Fill cfg80211 rate info */ 4022 4022 switch (status->encoding) { 4023 + case RX_ENC_EHT: 4024 + ri.flags |= RATE_INFO_FLAGS_EHT_MCS; 4025 + ri.mcs = status->rate_idx; 4026 + ri.nss = status->nss; 4027 + ri.eht_ru_alloc = status->eht.ru; 4028 + if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4029 + ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4030 + /* TODO/FIXME: is this right? handle other PPDUs */ 4031 + if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4032 + mpdu_offset += 2; 4033 + ts += 36; 4034 + } 4035 + break; 4023 4036 case RX_ENC_HE: 4024 4037 ri.flags |= RATE_INFO_FLAGS_HE_MCS; 4025 4038 ri.mcs = status->rate_idx;