mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
wifi: mac80211: add eht_capa debugfs field
Output looks like this: [root@ct523c-0b29 ~]# cat /debug/ieee80211/wiphy6/netdev\:wlan6/stations/50\:28\:4a\:bd\:f4\:a7/eht_capa EHT supported MAC-CAP: 0x82 0x00 PHY-CAP: 0x0c 0x00 0x00 0x00 0x00 0x48 0x00 0x00 0x00 OM-CONTROL MAX-MPDU-LEN: 11454 242-TONE-RU-GT20MHZ NDP-4-EHT-LFT-32-GI BEAMFORMEE-80-NSS: 0 BEAMFORMEE-160-NSS: 0 BEAMFORMEE-320-NSS: 0 SOUNDING-DIM-80-NSS: 0 SOUNDING-DIM-160-NSS: 0 SOUNDING-DIM-320-NSS: 0 MAX_NC: 0 PPE_THRESHOLD_PRESENT NOMINAL_PKT_PAD: 0us MAX-NUM-SUPP-EHT-LTF: 1 SUPP-EXTRA-EHT-LTF MCS15-SUPP-MASK: 0 EHT bw <= 80 MHz, max NSS for MCS 8-9: Rx=2, Tx=2 EHT bw <= 80 MHz, max NSS for MCS 10-11: Rx=2, Tx=2 EHT bw <= 80 MHz, max NSS for MCS 12-13: Rx=2, Tx=2 EHT bw <= 160 MHz, max NSS for MCS 8-9: Rx=0, Tx=0 EHT bw <= 160 MHz, max NSS for MCS 10-11: Rx=0, Tx=0 EHT bw <= 160 MHz, max NSS for MCS 12-13: Rx=0, Tx=0 EHT bw <= 320 MHz, max NSS for MCS 8-9: Rx=0, Tx=0 EHT bw <= 320 MHz, max NSS for MCS 10-11: Rx=0, Tx=0 EHT bw <= 320 MHz, max NSS for MCS 12-13: Rx=0, Tx=0 EHT PPE Thresholds: 0xc1 0x0e 0xe0 0x00 0x00 Signed-off-by: Ben Greear <greearb@candelatech.com> Link: https://lore.kernel.org/r/20230517184428.999384-1-greearb@candelatech.com Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
7ec2e4499e
commit
5a0702aac0
@ -1035,6 +1035,190 @@ out:
|
||||
}
|
||||
LINK_STA_OPS(he_capa);
|
||||
|
||||
static ssize_t link_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 link_sta_info *link_sta = file->private_data;
|
||||
struct ieee80211_sta_eht_cap *bec = &link_sta->pub->eht_cap;
|
||||
struct ieee80211_eht_cap_elem_fixed *fixed = &bec->eht_cap_elem;
|
||||
struct ieee80211_eht_mcs_nss_supp *nss = &bec->eht_mcs_nss_supp;
|
||||
u8 *cap;
|
||||
int i;
|
||||
ssize_t ret;
|
||||
static const char *mcs_desc[] = { "0-7", "8-9", "10-11", "12-13"};
|
||||
|
||||
buf = kmalloc(buf_sz, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
p = buf;
|
||||
|
||||
p += scnprintf(p, buf_sz + buf - p, "EHT %ssupported\n",
|
||||
bec->has_eht ? "" : "not ");
|
||||
if (!bec->has_eht)
|
||||
goto out;
|
||||
|
||||
p += scnprintf(p, buf_sz + buf - p,
|
||||
"MAC-CAP: %#.2x %#.2x\n",
|
||||
fixed->mac_cap_info[0], fixed->mac_cap_info[1]);
|
||||
p += scnprintf(p, buf_sz + buf - p,
|
||||
"PHY-CAP: %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x %#.2x\n",
|
||||
fixed->phy_cap_info[0], fixed->phy_cap_info[1],
|
||||
fixed->phy_cap_info[2], fixed->phy_cap_info[3],
|
||||
fixed->phy_cap_info[4], fixed->phy_cap_info[5],
|
||||
fixed->phy_cap_info[6], fixed->phy_cap_info[7],
|
||||
fixed->phy_cap_info[8]);
|
||||
|
||||
#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)
|
||||
|
||||
cap = fixed->mac_cap_info;
|
||||
PFLAG(MAC, 0, EPCS_PRIO_ACCESS, "EPCS-PRIO-ACCESS");
|
||||
PFLAG(MAC, 0, OM_CONTROL, "OM-CONTROL");
|
||||
PFLAG(MAC, 0, TRIG_TXOP_SHARING_MODE1, "TRIG-TXOP-SHARING-MODE1");
|
||||
PFLAG(MAC, 0, TRIG_TXOP_SHARING_MODE2, "TRIG-TXOP-SHARING-MODE2");
|
||||
PFLAG(MAC, 0, RESTRICTED_TWT, "RESTRICTED-TWT");
|
||||
PFLAG(MAC, 0, SCS_TRAFFIC_DESC, "SCS-TRAFFIC-DESC");
|
||||
switch ((cap[0] & 0xc0) >> 6) {
|
||||
case IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_3895:
|
||||
PRINT("MAX-MPDU-LEN: 3985");
|
||||
break;
|
||||
case IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_7991:
|
||||
PRINT("MAX-MPDU-LEN: 7991");
|
||||
break;
|
||||
case IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454:
|
||||
PRINT("MAX-MPDU-LEN: 11454");
|
||||
break;
|
||||
}
|
||||
|
||||
cap = fixed->phy_cap_info;
|
||||
PFLAG(PHY, 0, 320MHZ_IN_6GHZ, "320MHZ-IN-6GHZ");
|
||||
PFLAG(PHY, 0, 242_TONE_RU_GT20MHZ, "242-TONE-RU-GT20MHZ");
|
||||
PFLAG(PHY, 0, NDP_4_EHT_LFT_32_GI, "NDP-4-EHT-LFT-32-GI");
|
||||
PFLAG(PHY, 0, PARTIAL_BW_UL_MU_MIMO, "PARTIAL-BW-UL-MU-MIMO");
|
||||
PFLAG(PHY, 0, SU_BEAMFORMER, "SU-BEAMFORMER");
|
||||
PFLAG(PHY, 0, SU_BEAMFORMEE, "SU-BEAMFORMEE");
|
||||
i = cap[0] >> 7;
|
||||
i |= (cap[1] & 0x3) << 1;
|
||||
PRINT("BEAMFORMEE-80-NSS: %i", i);
|
||||
PRINT("BEAMFORMEE-160-NSS: %i", (cap[1] >> 2) & 0x7);
|
||||
PRINT("BEAMFORMEE-320-NSS: %i", (cap[1] >> 5) & 0x7);
|
||||
PRINT("SOUNDING-DIM-80-NSS: %i", (cap[2] & 0x7));
|
||||
PRINT("SOUNDING-DIM-160-NSS: %i", (cap[2] >> 3) & 0x7);
|
||||
i = cap[2] >> 6;
|
||||
i |= (cap[3] & 0x1) << 3;
|
||||
PRINT("SOUNDING-DIM-320-NSS: %i", i);
|
||||
|
||||
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-4-2-SU-FDBK");
|
||||
PFLAG(PHY, 3, CODEBOOK_7_5_MU_FDBK, "CODEBOOK-7-5-MU-FDBK");
|
||||
PFLAG(PHY, 3, TRIG_SU_BF_FDBK, "TRIG-SU-BF-FDBK");
|
||||
PFLAG(PHY, 3, TRIG_MU_BF_PART_BW_FDBK, "TRIG-MU-BF-PART-BW-FDBK");
|
||||
PFLAG(PHY, 3, TRIG_CQI_FDBK, "TRIG-CQI-FDBK");
|
||||
|
||||
PFLAG(PHY, 4, PART_BW_DL_MU_MIMO, "PART-BW-DL-MU-MIMO");
|
||||
PFLAG(PHY, 4, PSR_SR_SUPP, "PSR-SR-SUPP");
|
||||
PFLAG(PHY, 4, POWER_BOOST_FACT_SUPP, "POWER-BOOST-FACT-SUPP");
|
||||
PFLAG(PHY, 4, EHT_MU_PPDU_4_EHT_LTF_08_GI, "EHT-MU-PPDU-4-EHT-LTF-08-GI");
|
||||
PRINT("MAX_NC: %i", cap[4] >> 4);
|
||||
|
||||
PFLAG(PHY, 5, NON_TRIG_CQI_FEEDBACK, "NON-TRIG-CQI-FEEDBACK");
|
||||
PFLAG(PHY, 5, TX_LESS_242_TONE_RU_SUPP, "TX-LESS-242-TONE-RU-SUPP");
|
||||
PFLAG(PHY, 5, RX_LESS_242_TONE_RU_SUPP, "RX-LESS-242-TONE-RU-SUPP");
|
||||
PFLAG(PHY, 5, PPE_THRESHOLD_PRESENT, "PPE_THRESHOLD_PRESENT");
|
||||
switch (cap[5] >> 4 & 0x3) {
|
||||
case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_0US:
|
||||
PRINT("NOMINAL_PKT_PAD: 0us");
|
||||
break;
|
||||
case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US:
|
||||
PRINT("NOMINAL_PKT_PAD: 8us");
|
||||
break;
|
||||
case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US:
|
||||
PRINT("NOMINAL_PKT_PAD: 16us");
|
||||
break;
|
||||
case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_20US:
|
||||
PRINT("NOMINAL_PKT_PAD: 20us");
|
||||
break;
|
||||
}
|
||||
i = cap[5] >> 6;
|
||||
i |= cap[6] & 0x7;
|
||||
PRINT("MAX-NUM-SUPP-EHT-LTF: %i", i);
|
||||
PFLAG(PHY, 5, SUPP_EXTRA_EHT_LTF, "SUPP-EXTRA-EHT-LTF");
|
||||
|
||||
i = (cap[6] >> 3) & 0xf;
|
||||
PRINT("MCS15-SUPP-MASK: %i", i);
|
||||
PFLAG(PHY, 6, EHT_DUP_6GHZ_SUPP, "EHT-DUP-6GHZ-SUPP");
|
||||
|
||||
PFLAG(PHY, 7, 20MHZ_STA_RX_NDP_WIDER_BW, "20MHZ-STA-RX-NDP-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-FDBK-RATE-LIMIT");
|
||||
|
||||
PFLAG(PHY, 8, RX_1024QAM_WIDER_BW_DL_OFDMA, "RX-1024QAM-WIDER-BW-DL-OFDMA");
|
||||
PFLAG(PHY, 8, RX_4096QAM_WIDER_BW_DL_OFDMA, "RX-4096QAM-WIDER-BW-DL-OFDMA");
|
||||
|
||||
#undef PFLAG
|
||||
|
||||
PRINT(""); /* newline */
|
||||
if (!(link_sta->pub->he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL)) {
|
||||
u8 *mcs_vals = (u8 *)(&nss->only_20mhz);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
PRINT("EHT bw=20 MHz, max NSS for MCS %s: Rx=%u, Tx=%u",
|
||||
mcs_desc[i],
|
||||
mcs_vals[i] & 0xf, mcs_vals[i] >> 4);
|
||||
} else {
|
||||
u8 *mcs_vals = (u8 *)(&nss->bw._80);
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
PRINT("EHT bw <= 80 MHz, max NSS for MCS %s: Rx=%u, Tx=%u",
|
||||
mcs_desc[i + 1],
|
||||
mcs_vals[i] & 0xf, mcs_vals[i] >> 4);
|
||||
|
||||
mcs_vals = (u8 *)(&nss->bw._160);
|
||||
for (i = 0; i < 3; i++)
|
||||
PRINT("EHT bw <= 160 MHz, max NSS for MCS %s: Rx=%u, Tx=%u",
|
||||
mcs_desc[i + 1],
|
||||
mcs_vals[i] & 0xf, mcs_vals[i] >> 4);
|
||||
|
||||
mcs_vals = (u8 *)(&nss->bw._320);
|
||||
for (i = 0; i < 3; i++)
|
||||
PRINT("EHT bw <= 320 MHz, max NSS for MCS %s: Rx=%u, Tx=%u",
|
||||
mcs_desc[i + 1],
|
||||
mcs_vals[i] & 0xf, mcs_vals[i] >> 4);
|
||||
}
|
||||
|
||||
if (cap[5] & IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) {
|
||||
u8 ppe_size = ieee80211_eht_ppe_size(bec->eht_ppe_thres[0], cap);
|
||||
|
||||
p += scnprintf(p, buf_sz + buf - p, "EHT PPE Thresholds: ");
|
||||
for (i = 0; i < ppe_size; i++)
|
||||
p += scnprintf(p, buf_sz + buf - p, "0x%02x ",
|
||||
bec->eht_ppe_thres[i]);
|
||||
PRINT(""); /* newline */
|
||||
}
|
||||
|
||||
out:
|
||||
ret = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
LINK_STA_OPS(eht_capa);
|
||||
|
||||
#define DEBUGFS_ADD(name) \
|
||||
debugfs_create_file(#name, 0400, \
|
||||
sta->debugfs_dir, sta, &sta_ ##name## _ops)
|
||||
@ -1128,6 +1312,7 @@ void ieee80211_link_sta_debugfs_add(struct link_sta_info *link_sta)
|
||||
DEBUGFS_ADD(ht_capa);
|
||||
DEBUGFS_ADD(vht_capa);
|
||||
DEBUGFS_ADD(he_capa);
|
||||
DEBUGFS_ADD(eht_capa);
|
||||
|
||||
DEBUGFS_ADD_COUNTER(rx_duplicates, rx_stats.num_duplicates);
|
||||
DEBUGFS_ADD_COUNTER(rx_fragments, rx_stats.fragments);
|
||||
|
Loading…
Reference in New Issue
Block a user