--- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -1740,6 +1740,16 @@ static void ath11k_peer_assoc_h_he(struc he_tx_mcs = v; break; } + + if ((he_mcs_mask[0] == 0 || he_mcs_mask[1] == 0) && + (he_cap->he_cap_elem.phy_cap_info[HECAP_PHYDWORD_4] & + IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE)) { + arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; + arg->peer_he_cap_macinfo_internal |= + IEEE80211_HE_DL_MU_SUPPORT_DISABLE << + IEEE80211_HE_DL_MUMIMO_SUPP_S; + } + /* Calculate peer NSS capability from HE capabilities if STA * supports HE. */ @@ -6761,7 +6771,7 @@ ath11k_mac_op_set_bitrate_mask(struct ie * RATEMASK CMD */ ath11k_warn(ar->ab, - "Setting more than one MCS Value in bitrate mask not supported\n"); + "Setting VHT MCS range other than 0-7, 0-8 and 0-9 in bitrate mask not supported\n"); return -EINVAL; } @@ -6771,7 +6781,7 @@ ath11k_mac_op_set_bitrate_mask(struct ie if (!ath11k_mac_he_mcs_range_present(ar, band, mask) && num_rates > 1) { ath11k_warn(ar->ab, - "Setting more than one HE MCS Value in bitrate mask not supported\n"); + "Setting HE MCS range other than 0-7, 0-9 and 0-11 in bitrate mask not supported\n"); return -EINVAL; } --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -2006,8 +2006,8 @@ int ath11k_wmi_send_peer_assoc_cmd(struc FIELD_PREP(WMI_TLV_LEN, sizeof(*he_mcs) - TLV_HDR_SIZE); - he_mcs->rx_mcs_set = param->peer_he_rx_mcs_set[i]; - he_mcs->tx_mcs_set = param->peer_he_tx_mcs_set[i]; + he_mcs->rx_mcs_set = param->peer_he_tx_mcs_set[i]; + he_mcs->tx_mcs_set = param->peer_he_rx_mcs_set[i]; ptr += sizeof(*he_mcs); } --- a/drivers/net/wireless/ath/ath11k/wmi.h +++ b/drivers/net/wireless/ath/ath11k/wmi.h @@ -3956,8 +3956,8 @@ struct wmi_vht_rate_set { struct wmi_he_rate_set { u32 tlv_header; - u32 rx_mcs_set; - u32 tx_mcs_set; + u32 rx_mcs_set; /* MCS at which the peer can receive */ + u32 tx_mcs_set; /* MCS at which the peer can transmit */ } __packed; #define MAX_REG_RULES 10 --- a/drivers/net/wireless/ath/ath11k/mac.h +++ b/drivers/net/wireless/ath/ath11k/mac.h @@ -122,6 +122,14 @@ struct ath11k_generic_iter { #define ATH11K_OBSS_PD_SRG_EN BIT(30) #define ATH11K_OBSS_PD_NON_SRG_EN BIT(31) +/* HECAP info internal bits */ +#define IEEE80211_HE_DL_MUMIMO_SUPP_S 5 + +#define IEEE80211_HE_DL_MU_SUPPORT_DEFAULT 0 +#define IEEE80211_HE_DL_MU_SUPPORT_DISABLE 1 +#define IEEE80211_HE_DL_MU_SUPPORT_ENABLE 2 +#define IEEE80211_HE_DL_MU_SUPPORT_INVALID 3 + extern const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default; int ath11k_mac_ap_ps_recalc(struct ath11k *ar);