mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-21 03:13:17 +00:00
250 lines
11 KiB
Diff
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);
|