Commit fefcd115 authored by Venkateswara Rao Naralasetty's avatar Venkateswara Rao Naralasetty Committed by Kalle Valo

ath10k: fix station nss computation

If station advertises diffferent NSS capabilities in Rx_mcs set
of HT and VHT IEs in assoc req, the current NSS computation
logic configures the NSS support only based on Rx_mcs set of
HT capabilities in the driver. This is configuring the station
NSS capabilities incorreclty in the target.

For example, if station advertise Rx_mcs set as 2 spatial streams
in HT capabilities and 1 spatial streams in VHT capabilities in
assoc request, as per current logic we are calculating nss from
HT capabilities and the driver sets peer_num_spatial_streams as
2 for the station which is configured in VHT 1*1.

This patchs fix this issue by calculating the nss from VHT cap if
station supports vht.
Signed-off-by: default avatarVenkateswara Rao Naralasetty <c_vnaral@qti.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent ebeb3667
...@@ -2451,6 +2451,8 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar, ...@@ -2451,6 +2451,8 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
enum nl80211_band band; enum nl80211_band band;
const u16 *vht_mcs_mask; const u16 *vht_mcs_mask;
u8 ampdu_factor; u8 ampdu_factor;
u8 max_nss, vht_mcs;
int i;
if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
return; return;
...@@ -2489,6 +2491,18 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar, ...@@ -2489,6 +2491,18 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
if (sta->bandwidth == IEEE80211_STA_RX_BW_160) if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
arg->peer_flags |= ar->wmi.peer_flags->bw160; arg->peer_flags |= ar->wmi.peer_flags->bw160;
/* Calculate peer NSS capability from VHT capabilities if STA
* supports VHT.
*/
for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
(2 * i) & 3;
if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
vht_mcs_mask[i])
max_nss = i + 1;
}
arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
arg->peer_vht_rates.rx_max_rate = arg->peer_vht_rates.rx_max_rate =
__le16_to_cpu(vht_cap->vht_mcs.rx_highest); __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
arg->peer_vht_rates.rx_mcs_set = arg->peer_vht_rates.rx_mcs_set =
......
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