wlan-ap-Telecominfraproject/feeds/ipq95xx/mac80211/patches/qca/662-mac80211-add-eht_capa-for-debugfs_sta.patch
John Crispin 144c5d00f4 ipq95xx/mac80211: update to ATH12.3-CS
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00

250 lines
11 KiB
Diff

From 124e17f9432730f979e8a8c0da329595b11e39e1 Mon Sep 17 00:00:00 2001
From: Sidhanta Sahu <quic_sidhanta@quicinc.com>
Date: Wed, 24 Aug 2022 12:16:37 -0700
Subject: [PATCH] mac80211: add eht_capa for debugfs_sta
---
include/linux/ieee80211.h | 3 +
net/mac80211/debugfs_sta.c | 210 +++++++++++++++++++++++++++++++++++++
2 files changed, 213 insertions(+)
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -2817,6 +2817,10 @@ ieee80211_he_spr_size(const u8 *he_spr_i
#define IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_MASK 0x01
+#define IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_EXP 0x01
+#define IEEE80211_EHT_MAC_CAP1_EHT_TRS 0x02
+#define IEEE80211_EHT_MAC_CAP1_TXOP_SHARE_MODE2 0x04
+
/* EHT PHY capabilities as defined in P802.11be_D2.0 section 9.4.2.313.3 */
#define IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ 0x02
#define IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ 0x04
--- a/net/mac80211/debugfs_sta.c
+++ b/net/mac80211/debugfs_sta.c
@@ -1056,6 +1056,215 @@ out:
}
STA_OPS(he_capa);
+static ssize_t sta_eht_capa_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
+{
+ char *buf, *p;
+ size_t buf_sz = PAGE_SIZE;
+ struct sta_info *sta = file->private_data;
+ struct ieee80211_sta_eht_cap *ehtc = &sta->sta.deflink.eht_cap;
+ struct ieee80211_eht_mcs_nss_supp *nss = &ehtc->eht_mcs_nss_supp;
+ u8 ppe_size;
+ u8 *cap;
+ int i;
+ ssize_t ret;
+
+ buf = kmalloc(buf_sz, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+ p = buf;
+
+ p += scnprintf(p, buf_sz + buf - p, "EHT %ssupported\n",
+ ehtc->has_eht ? "" : "not ");
+ if (!ehtc->has_eht)
+ goto out;
+ cap = ehtc->eht_cap_elem.mac_cap_info;
+ p += scnprintf(p, buf_sz + buf - p, "MAC-CAP: %#.2x %#.2x\n", cap[0],
+ cap[1]);
+
+#define PRINT(fmt, ...) \
+ p += scnprintf(p, buf_sz + buf - p, "\t\t" fmt "\n", \
+ ##__VA_ARGS__)
+
+#define PFLAG(t, n, a, b) \
+ do { \
+ if (cap[n] & IEEE80211_EHT_##t##_CAP##n##_##a) \
+ PRINT("%s", b); \
+ } while (0)
+
+#define PFLAG_RANGE(t, n, li, _ls, ri, _rs, fmt) \
+ do { \
+ u8 msk = IEEE80211_EHT_##t##_CAP##ri##_##n##_MASK; \
+ u8 msk1 = 0; \
+ if (_ls) { \
+ msk1 = IEEE80211_EHT_##t##_CAP##li##_##n##_MASK; \
+ PRINT(fmt, ((cap[li] << _ls) | (cap[ri] >> _rs)) & (msk1 <<_ls | msk >> _rs)); \
+ } \
+ else { \
+ PRINT(fmt, ((cap[ri] >> _rs) & (msk >> _rs))); \
+ } \
+ } while (0)
+
+ PFLAG(MAC, 0, EPCS_PRIO_ACCESS, "EPCS Priority Access Support");
+ PFLAG(MAC, 0, OM_CONTROL, "EHT OM Control Support");
+ PFLAG(MAC, 0, TRIG_TXOP_SHARING_MODE1, "Triggered TXOP Sharing Mode 1 Support");
+ PFLAG(MAC, 0, TRIG_TXOP_SHARING_MODE2, "Triggered TXOP Sharing Mode 2 Support");
+ PFLAG(MAC, 0, RESTRICTED_TWT, "Restrived TWT Support");
+ PFLAG(MAC, 0, SCS_TRAFFIC_DESC, "SCS Traffic Description Support");
+ PFLAG_RANGE(MAC, MAX_MPDU_LEN, 0, 0, 0, 6, "Maximum MPDU Length-%d");
+ PFLAG(MAC, 1, MAX_AMPDU_LEN_EXP, "Maximum A-MPDU Length Exponent Extension");
+ PFLAG(MAC, 1, EHT_TRS, "EHT TRS Support");
+ PFLAG(MAC, 1, TXOP_SHARE_MODE2, "TXOP Return Support In TXOP Sharing Mode 2");
+
+ cap = ehtc->eht_cap_elem.phy_cap_info;
+ p += scnprintf(p, buf_sz + buf - p,
+ "PHY CAP: %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x\n",
+ cap[0], cap[1], cap[2], cap[3], cap[4], cap[5], cap[6],
+ cap[7], cap[8]);
+
+ PFLAG(PHY, 0, 320MHZ_IN_6GHZ,
+ "320 MHz in 6 GHz Support");
+ PFLAG(PHY, 0, 242_TONE_RU_GT20MHZ,
+ "242-tone RU in BW Wider Than 20 MHz Support");
+ PFLAG(PHY, 0, NDP_4_EHT_LFT_32_GI,
+ "NDP With 4x EHT-LTF and 3.2us GI");
+ PFLAG(PHY, 0, PARTIAL_BW_UL_MU_MIMO,
+ "Partial Bandwidth UL MU-MIMO");
+ PFLAG(PHY, 0, SU_BEAMFORMER,
+ "SU Beamformer");
+ PFLAG(PHY, 0, SU_BEAMFORMEE,
+ "SU Beamformee");
+ PFLAG_RANGE(PHY, BEAMFORMEE_SS_80MHZ, 1, 1, 0, 7,
+ "Beamformee STS <= 80Mhz-%d");
+ PFLAG_RANGE(PHY, BEAMFORMEE_SS_160MHZ, 1, 0, 1, 2,
+ "Beamformee STS = 160Mhz-%d");
+ PFLAG_RANGE(PHY, BEAMFORMEE_SS_320MHZ, 1, 0, 1, 5,
+ "Beamformee STS = 320Mhz-%d");
+ PFLAG_RANGE(PHY, SOUNDING_DIM_80MHZ, 2, 0, 2, 0,
+ "Sounding Dimensions <= 80Mhz-%d");
+ PFLAG_RANGE(PHY, SOUNDING_DIM_160MHZ, 2, 0, 2, 3,
+ "Sounding Dimensions = 160Mhz-%d");
+ PFLAG_RANGE(PHY, SOUNDING_DIM_320MHZ, 3, 2, 2, 6,
+ "Sounding Dimensions = 320Mhz-%d");
+ PFLAG(PHY, 3, NG_16_SU_FEEDBACK, "Ng = 16 SU Feedback");
+ PFLAG(PHY, 3, NG_16_MU_FEEDBACK, "Ng = 16 MU Feedback");
+ PFLAG(PHY, 3, CODEBOOK_4_2_SU_FDBK, "Codebook Size SU Feedback");
+ PFLAG(PHY, 3, CODEBOOK_7_5_MU_FDBK, "Codebook Size MU Feedback");
+ PFLAG(PHY, 3, TRIG_SU_BF_FDBK,
+ "Triggered SU Beamforming Feedback");
+ PFLAG(PHY, 3, TRIG_MU_BF_PART_BW_FDBK,
+ "Triggered MU Beamforming Partial BW Feedback");
+ PFLAG(PHY, 3, TRIG_CQI_FDBK,
+ "Triggered CQI Feedback");
+ PFLAG(PHY, 4, PART_BW_DL_MU_MIMO,
+ "Partial Bandwidth DL MU-MIMO");
+ PFLAG(PHY, 4, PSR_SR_SUPP,
+ "EHT PSR-based SR Support");
+ PFLAG(PHY, 4, POWER_BOOST_FACT_SUPP,
+ "Power Boost Factor Support");
+ PFLAG(PHY, 4, EHT_MU_PPDU_4_EHT_LTF_08_GI,
+ "EHT MU PPDU With 4x EHT-LTF and 0.8us GI");
+ PFLAG_RANGE(PHY, MAX_NC, 4, 0, 4, 4, "Max Nc-%d");
+ PFLAG(PHY, 5, NON_TRIG_CQI_FEEDBACK,
+ "Non-Triggered CQI Feedback");
+ PFLAG(PHY, 5, TX_LESS_242_TONE_RU_SUPP,
+ "TX 1024-QAM and 4096-QAM");
+ PFLAG(PHY, 5, RX_LESS_242_TONE_RU_SUPP,
+ "RX 1024-QAM and 4096-QAM");
+ PFLAG(PHY, 5, PPE_THRESHOLD_PRESENT,
+ "PPE Thresholds Present");
+ PFLAG_RANGE(PHY, COMMON_NOMINAL_PKT_PAD, 5, 0, 5, 4,
+ "Common Nominal Packet Padding-%d");
+ PFLAG_RANGE(PHY, MAX_NUM_SUPP_EHT_LTF, 6, 2, 5, 6,
+ "Max Number of Supported EHT-LTFs-%d");
+ PFLAG_RANGE(PHY, MCS15_SUPP, 6, 0, 6, 3,
+ "MCS 15 Support-%d");
+ PFLAG(PHY, 6, EHT_DUP_6GHZ_SUPP,
+ "EHT DUP (MCS 14) in 6 GHz Support");
+ PFLAG(PHY, 7, 20MHZ_STA_RX_NDP_WIDER_BW,
+ "20 MHz Operating STA Recieving NDP With Wider BW");
+ PFLAG(PHY, 7, NON_OFDMA_UL_MU_MIMO_80MHZ,
+ "Non-OFDMA UL MU-MIMO <= 80Mhz");
+ PFLAG(PHY, 7, NON_OFDMA_UL_MU_MIMO_160MHZ,
+ "Non-OFDMA UL MU-MIMO = 160Mhz");
+ PFLAG(PHY, 7, NON_OFDMA_UL_MU_MIMO_320MHZ,
+ "Non-OFDMA UL MU-MIMO = 320Mhz");
+ PFLAG(PHY, 7, MU_BEAMFORMER_80MHZ,
+ "MU Beamformer <= 80Mhz");
+ PFLAG(PHY, 7, MU_BEAMFORMER_160MHZ,
+ "MU Beamformer = 160Mhz");
+ PFLAG(PHY, 7, MU_BEAMFORMER_320MHZ,
+ "MU Beamformer <= 320Mhz");
+ PFLAG(PHY, 7, TB_SOUNDING_FDBK_RATE_LIMIT,
+ "TB Sounding Feedback Rate Limit");
+ PFLAG(PHY, 8, RX_1024QAM_WIDER_BW_DL_OFDMA,
+ "Rx 1024-QAM In Wider Bandwidth DL OFDMA Support");
+ PFLAG(PHY, 8, RX_4096QAM_WIDER_BW_DL_OFDMA,
+ "Rx 4096-QAM In Wider Bandwidth DL OFDMA Support");
+
+#undef PFLAG_RANGE
+#undef PFLAG
+
+#define PRINT_NSS_SUPP(f, g, n) \
+ do { \
+ u8 _i; \
+ u8 mcs13, mcs11, mcs9; \
+ if(g) { \
+ mcs13 = f.rx_tx_mcs13_max_nss & 0x0F; \
+ mcs11 = f.rx_tx_mcs11_max_nss & 0x0F; \
+ mcs9 = f.rx_tx_mcs9_max_nss & 0x0F; \
+ } else { \
+ mcs13 = (f.rx_tx_mcs13_max_nss >> 4) & 0x0F; \
+ mcs11 = (f.rx_tx_mcs11_max_nss >> 4) & 0x0F; \
+ mcs9 = (f.rx_tx_mcs9_max_nss >> 4) & 0x0F; \
+ } \
+ p += scnprintf(p, buf_sz + buf - p, n ": %#.2x %#.2x %#.2x\n", mcs13, mcs11, mcs9);\
+ for (_i = 0; _i < 8; _i++) { \
+ if (_i < mcs13) \
+ PRINT(n "-%d-SUPPORT-12-13", _i + 1); \
+ else if (_i < mcs11) \
+ PRINT(n "-%d-SUPPORT-10-11", _i + 1); \
+ else if (_i < mcs9) \
+ PRINT(n "-%d-SUPPORT-0-9", _i + 1); \
+ else \
+ PRINT(n "-%d-NOT-SUPPORTED", _i + 1); \
+ } \
+ } while (0)
+
+ PRINT_NSS_SUPP(nss->bw._80, 1, "RX-MCS-80");
+ PRINT_NSS_SUPP(nss->bw._80, 0, "TX-MCS-80");
+ PRINT_NSS_SUPP(nss->bw._160, 1, "RX-MCS-160");
+ PRINT_NSS_SUPP(nss->bw._160, 0, "TX-MCS-160");
+
+ if (cap[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ) {
+ PRINT_NSS_SUPP(nss->bw._320, 1, "RX-MCS-320");
+ PRINT_NSS_SUPP(nss->bw._320, 0, "TX-MCS-320");
+ }
+
+#undef PRINT_NSS_SUPP
+#undef PRINT
+
+ if (!(cap[5] & IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT))
+ goto out;
+
+ p += scnprintf(p, buf_sz + buf - p, "PPE-THRESHOLDS: %#.2x",
+ ehtc->eht_ppe_thres[0]);
+
+ ppe_size = ieee80211_eht_ppe_size(ehtc->eht_ppe_thres[0], cap);
+ for (i = 1; i < ppe_size; i++) {
+ p += scnprintf(p, buf_sz + buf - p, " %#.2x",
+ ehtc->eht_ppe_thres[i]);
+ }
+ p += scnprintf(p, buf_sz + buf - p, "\n");
+
+
+out:
+ ret = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
+ kfree(buf);
+ return ret;
+}
+STA_OPS(eht_capa);
+
static ssize_t
sta_reset_mac80211_tx_pkts_flow_read(struct file *file,
char __user *userbuf,
@@ -1264,6 +1473,7 @@ void ieee80211_sta_debugfs_add(struct st
DEBUGFS_ADD(ht_capa);
DEBUGFS_ADD(vht_capa);
DEBUGFS_ADD(he_capa);
+ DEBUGFS_ADD(eht_capa);
DEBUGFS_ADD(reset_mac80211_tx_pkts_flow);
DEBUGFS_ADD(reset_mac80211_rx_pkts_flow);
DEBUGFS_ADD(mac80211_tx_pkts_flow);