From 124e17f9432730f979e8a8c0da329595b11e39e1 Mon Sep 17 00:00:00 2001 From: Sidhanta Sahu 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);