Commit 9e61589a authored by Kalle Valo's avatar Kalle Valo

wifi: ath11k: mac: fix struct ieee80211_sband_iftype_data handling

Commit e8c18412 ("wifi: cfg80211: annotate iftype_data pointer with
sparse") added sparse checks for struct ieee80211_sband_iftype_data handling
which immediately found an issue in ath11k:

drivers/net/wireless/ath/ath11k/mac.c:7952:22: warning: incorrect type in argument 1 (different address spaces)
drivers/net/wireless/ath/ath11k/mac.c:7952:22:    expected struct ieee80211_sta_he_cap const *he_cap
drivers/net/wireless/ath/ath11k/mac.c:7952:22:    got struct ieee80211_sta_he_cap const [noderef] __iftype_data *

The problem here is that we are accessing sband->iftype_data directly even
though we should use for_each_sband_iftype_data() or similar. Fortunately
there's ieee80211_get_he_iftype_cap_vif() which is just what we need here so
use it to get HE capabilities.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
Reported-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230927142708.2897504-2-kvalo@kernel.org
parent 4fd15bb7
...@@ -7910,12 +7910,14 @@ ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap) ...@@ -7910,12 +7910,14 @@ ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
static bool static bool
ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar, ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
struct ath11k_vif *arvif,
enum nl80211_band band, enum nl80211_band band,
const struct cfg80211_bitrate_mask *mask, const struct cfg80211_bitrate_mask *mask,
int *nss) int *nss)
{ {
struct ieee80211_supported_band *sband = &ar->mac.sbands[band]; struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
const struct ieee80211_sta_he_cap *he_cap;
u16 he_mcs_map = 0; u16 he_mcs_map = 0;
u8 ht_nss_mask = 0; u8 ht_nss_mask = 0;
u8 vht_nss_mask = 0; u8 vht_nss_mask = 0;
...@@ -7946,7 +7948,11 @@ ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar, ...@@ -7946,7 +7948,11 @@ ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
return false; return false;
} }
he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap)); he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
if (!he_cap)
return false;
he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) { for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
if (mask->control[band].he_mcs[i] == 0) if (mask->control[band].he_mcs[i] == 0)
...@@ -8362,7 +8368,7 @@ ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, ...@@ -8362,7 +8368,7 @@ ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
ieee80211_iterate_stations_atomic(ar->hw, ieee80211_iterate_stations_atomic(ar->hw,
ath11k_mac_disable_peer_fixed_rate, ath11k_mac_disable_peer_fixed_rate,
arvif); arvif);
} else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask, } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
&single_nss)) { &single_nss)) {
rate = WMI_FIXED_RATE_NONE; rate = WMI_FIXED_RATE_NONE;
nss = single_nss; nss = single_nss;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment