Bits in Supported Channel Width Set subfield of the HE PHY Capabilities Information field and Support For 320 MHz in 6 GHz of the EHT PHY Capabilities Information field are reserved depending on the current band. Check the current band to make sure the bits that are being read are not reserved. Signed-off-by: Pablo Martin-Gomez --- net/mac80211/debugfs_sta.c | 7 +++-- net/mac80211/he.c | 64 ++++++++++++++++++++------------------ net/mac80211/mlme.c | 5 +-- net/mac80211/vht.c | 2 +- 4 files changed, 41 insertions(+), 37 deletions(-) diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index ef75255d47d5..ea792660fe25 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c @@ -1003,13 +1003,14 @@ static ssize_t link_sta_he_capa_read(struct file *file, char __user *userbuf, PRINT_NSS_SUPP(rx_mcs_80, "RX-MCS-80"); PRINT_NSS_SUPP(tx_mcs_80, "TX-MCS-80"); - if (cap[0] & IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) { + if (band != NL80211_BAND_2GHZ && + cap[0] & IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) { PRINT_NSS_SUPP(rx_mcs_160, "RX-MCS-160"); PRINT_NSS_SUPP(tx_mcs_160, "TX-MCS-160"); } - if (cap[0] & - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) { + if (band != NL80211_BAND_2GHZ && + cap[0] & IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) { PRINT_NSS_SUPP(rx_mcs_80p80, "RX-MCS-80P80"); PRINT_NSS_SUPP(tx_mcs_80p80, "TX-MCS-80P80"); } diff --git a/net/mac80211/he.c b/net/mac80211/he.c index 4f3bafceb243..95ec76eda951 100644 --- a/net/mac80211/he.c +++ b/net/mac80211/he.c @@ -168,38 +168,40 @@ _ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata, &own_he_cap.he_mcs_nss_supp.tx_mcs_80, &he_cap->he_mcs_nss_supp.tx_mcs_80); - own_160 = own_he_cap.he_cap_elem.phy_cap_info[0] & - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; - peer_160 = he_cap->he_cap_elem.phy_cap_info[0] & - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; - - if (peer_160 && own_160) { - ieee80211_he_mcs_intersection(&own_he_cap.he_mcs_nss_supp.rx_mcs_160, - &he_cap->he_mcs_nss_supp.rx_mcs_160, - &own_he_cap.he_mcs_nss_supp.tx_mcs_160, - &he_cap->he_mcs_nss_supp.tx_mcs_160); - } else if (peer_160 && !own_160) { - ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.rx_mcs_160); - ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.tx_mcs_160); - he_cap->he_cap_elem.phy_cap_info[0] &= - ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; - } + if (band != NL80211_BAND_2GHZ) { + own_160 = own_he_cap.he_cap_elem.phy_cap_info[0] & + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; + peer_160 = he_cap->he_cap_elem.phy_cap_info[0] & + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; + + if (peer_160 && own_160) { + ieee80211_he_mcs_intersection(&own_he_cap.he_mcs_nss_supp.rx_mcs_160, + &he_cap->he_mcs_nss_supp.rx_mcs_160, + &own_he_cap.he_mcs_nss_supp.tx_mcs_160, + &he_cap->he_mcs_nss_supp.tx_mcs_160); + } else if (peer_160 && !own_160) { + ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.rx_mcs_160); + ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.tx_mcs_160); + he_cap->he_cap_elem.phy_cap_info[0] &= + ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; + } - own_80p80 = own_he_cap.he_cap_elem.phy_cap_info[0] & - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; - peer_80p80 = he_cap->he_cap_elem.phy_cap_info[0] & - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; - - if (peer_80p80 && own_80p80) { - ieee80211_he_mcs_intersection(&own_he_cap.he_mcs_nss_supp.rx_mcs_80p80, - &he_cap->he_mcs_nss_supp.rx_mcs_80p80, - &own_he_cap.he_mcs_nss_supp.tx_mcs_80p80, - &he_cap->he_mcs_nss_supp.tx_mcs_80p80); - } else if (peer_80p80 && !own_80p80) { - ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.rx_mcs_80p80); - ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.tx_mcs_80p80); - he_cap->he_cap_elem.phy_cap_info[0] &= - ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; + own_80p80 = own_he_cap.he_cap_elem.phy_cap_info[0] & + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; + peer_80p80 = he_cap->he_cap_elem.phy_cap_info[0] & + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; + + if (peer_80p80 && own_80p80) { + ieee80211_he_mcs_intersection(&own_he_cap.he_mcs_nss_supp.rx_mcs_80p80, + &he_cap->he_mcs_nss_supp.rx_mcs_80p80, + &own_he_cap.he_mcs_nss_supp.tx_mcs_80p80, + &he_cap->he_mcs_nss_supp.tx_mcs_80p80); + } else if (peer_80p80 && !own_80p80) { + ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.rx_mcs_80p80); + ieee80211_he_mcs_disable(&he_cap->he_mcs_nss_supp.tx_mcs_80p80); + he_cap->he_cap_elem.phy_cap_info[0] &= + ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; + } } } diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 4c1e5259837e..d840177fcd62 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -716,13 +716,14 @@ ieee80211_get_eht_cap_mcs_nss(const struct ieee80211_sta_he_cap *sta_he_cap, case 0: return sta_eht_cap->eht_mcs_nss_supp.bw._80.rx_tx_max_nss[idx]; case 1: - if (!(he_phy_cap0 & + if (band == NL80211_BAND_2GHZ || !(he_phy_cap0 & (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G))) return 0xff; /* pass check */ return sta_eht_cap->eht_mcs_nss_supp.bw._160.rx_tx_max_nss[idx]; case 2: - if (!(eht_phy_cap0 & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)) + if (band != NL80211_BAND_6GHZ || + !(eht_phy_cap0 & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)) return 0xff; /* pass check */ return sta_eht_cap->eht_mcs_nss_supp.bw._320.rx_tx_max_nss[idx]; } diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c index a6570781740a..8b1e4bf43475 100644 --- a/net/mac80211/vht.c +++ b/net/mac80211/vht.c @@ -595,7 +595,7 @@ void ieee80211_sta_init_nss(struct link_sta_info *link_sta) } } - support_160 = he_cap->he_cap_elem.phy_cap_info[0] & + support_160 = band != NL80211_BAND_2GHZ && he_cap->he_cap_elem.phy_cap_info[0] & IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; if (support_160) -- 2.43.0