wlan-ap-Telecominfraproject/feeds/ipq95xx/hostapd.old/patches/q02-024-hostapd-11BE-bringup-Fixes.patch
John Crispin b9b03a6e38 ipq95xx: add Qualcomm wifi-7 support
Signed-off-by: John Crispin <john@phrozen.org>
2023-04-10 14:25:48 +02:00

126 lines
4.1 KiB
Diff

From 4009d6184a38cbc6a7c5bd842913c169b139da7c Mon Sep 17 00:00:00 2001
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Date: Wed, 23 Feb 2022 11:58:52 -0800
Subject: [PATCH] hostapd: 11BE bringup Fixes
- Fix EHT MCS rates length calculation.
- Process PPE Thresholds only if there are additional bytes
available in EHT Caps after MAC CAPS. PHY CAPS and
MCS rates. This is temporary workaround to ignore
other driversnot adding PPE thresholds in EHT CAP
inspite of setting eht_ppe_threshlds_present bit in
EHT PHY CAPS.
- Fix ppe threshold size computation
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
---
src/ap/ieee802_11_eht.c | 33 ++++++++++++++++++---------------
src/common/ieee802_11_defs.h | 13 +++++++------
2 files changed, 25 insertions(+), 21 deletions(-)
--- a/src/ap/ieee802_11_eht.c
+++ b/src/ap/ieee802_11_eht.c
@@ -24,29 +24,29 @@
static u8 ieee80211_eht_ppet_size(const u8 *ppe_thres, const u8 *phy_cap_info)
{
- u8 sz = 0, ru;
+ u8 sz = 0, nss, num_nss = 0;
+ u32 ru;
if ((phy_cap_info[EHT_PHYCAP_PPE_THRESHOLD_PRESENT_IDX] &
EHT_PHYCAP_PPE_THRESHOLD_PRESENT) == 0)
return 0;
- ru = (ppe_thres[0] &
- (EHT_PPE_THRES_RU_INDEX_MASK << EHT_PPE_THRES_RU_INDEX_SHIFT));
+ ru = (u32) ppe_thres[0];
+ ru = (ru & EHT_PPE_THRES_RU_INDEX_MASK) >> EHT_PPE_THRES_RU_INDEX_SHIFT;
while (ru) {
if (ru & 0x1)
sz++;
ru >>= 1;
}
- ru = (ppe_thres[1] & (EHT_PPE_THRES_RU_INDEX_MASK >>
- (8 - EHT_PPE_THRES_RU_INDEX_SHIFT)));
- while (ru) {
- if (ru & 0x1)
- sz++;
- ru >>= 1;
+ nss = (ppe_thres[0] & EHT_PPE_THRES_NSS_MASK) >> EHT_PPE_THRES_NSS_SHIFT;
+ while (nss) {
+ if (nss & 0x1)
+ num_nss++;
+ nss >>= 1;
}
- sz *= (1 + (ppe_thres[0] & EHT_PPE_THRES_NSS_MASK));
+ sz = sz * (1 + num_nss);
sz = (sz * 6) + 9;
if (sz % 8)
sz += 8;
@@ -246,6 +246,7 @@ static int check_valid_eht_mcs(struct ho
{
struct hostapd_hw_modes *mode;
const u8 *ap_mcs, *sta_mcs;
+ u8 len;
mode = hapd->iface->current_mode;
if (!mode)
@@ -254,9 +255,9 @@ static int check_valid_eht_mcs(struct ho
ap_mcs = mode->eht_capab[opmode].mcs;
sta_mcs = ((const struct ieee80211_eht_capabilities *) sta_eht_capab)->optional;
- if (ieee80211_eht_mcs_set_size(mode->he_capab[opmode].phy_cap,
- mode->eht_capab[opmode].phy_cap) ==
- EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY) {
+ len = ieee80211_eht_mcs_set_size(mode->he_capab[opmode].phy_cap,
+ mode->eht_capab[opmode].phy_cap);
+ if (len == EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY) {
return check_valid_eht_mcs_nss(hapd, ap_mcs, sta_mcs, 1,
EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY);
@@ -274,7 +275,7 @@ static int check_valid_eht_mcs(struct ho
}
return check_valid_eht_mcs_nss(hapd, ap_mcs, sta_mcs, mcs_count,
- EHT_PHYCAP_MCS_NSS_LEN_20MHZ_PLUS);
+ len);
}
return 0;
@@ -298,7 +299,9 @@ static int ieee80211_invalid_eht_cap_siz
if (len < cap_len)
return 1;
- cap_len += ieee80211_eht_ppet_size(&eht_cap[cap_len], cap->phy_cap);
+ if ((cap->phy_cap[EHT_PHYCAP_PPE_THRESHOLD_PRESENT_IDX] &
+ EHT_PHYCAP_PPE_THRESHOLD_PRESENT) == 0 && len > cap_len)
+ cap_len += ieee80211_eht_ppet_size(&eht_cap[cap_len], cap->phy_cap);
return (len != cap_len);
}
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -2511,14 +2511,14 @@ struct ieee80211_eht_operation {
#define EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY 4
#define EHT_PHYCAP_MCS_NSS_LEN_20MHZ_PLUS 3
-/* IEEE P802.11be/D1.0, May 2021, 9.4.2.295c.5 EHT PPE Thresholds field */
+/* IEEE P802.11be/D1.4, May 2021, 9.4.2.295c.5 EHT PPE Thresholds field */
#define EHT_PPE_THRES_NSS_SHIFT 0
#define EHT_PPE_THRES_NSS_MASK ((u8) (BIT(0) | BIT(1) | \
- BIT(2) | BIT(3)))
+ BIT(2) | BIT(3)))
#define EHT_PPE_THRES_RU_INDEX_SHIFT 4
-#define EHT_PPE_THRES_RU_INDEX_MASK ((u8) (BIT(0) | BIT(1) | \
- BIT(2) | BIT(3) | \
- BIT(4)))
+#define EHT_PPE_THRES_RU_INDEX_MASK ((u8) (BIT(4) | BIT(5) | \
+ BIT(6) | BIT(7) | \
+ BIT(8)))
#define EHT_OPERATION_CHANNEL_WIDTH_40MHZ 1
#define EHT_OPERATION_CHANNEL_WIDTH_80MHZ 2