ath10k: Fix bug in max. VHT A-MPDU size
For VHT peers, the maximum A-MPDU size has to be calculated from the VHT capabilities element and not the HT-cap. The formula is the same, but a higher value is used in VHT, allowing larger aggregates to be transmitted. The patch contains a workaround for some Netgear/Linksys APs that report Rx A-MPDU factor incorrectly. Tested-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
0d1a28f241
commit
a24b88b560
|
@ -1033,14 +1033,27 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||||
struct wmi_peer_assoc_complete_arg *arg)
|
struct wmi_peer_assoc_complete_arg *arg)
|
||||||
{
|
{
|
||||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||||
|
u8 ampdu_factor;
|
||||||
|
|
||||||
if (!vht_cap->vht_supported)
|
if (!vht_cap->vht_supported)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
arg->peer_flags |= WMI_PEER_VHT;
|
arg->peer_flags |= WMI_PEER_VHT;
|
||||||
|
|
||||||
arg->peer_vht_caps = vht_cap->cap;
|
arg->peer_vht_caps = vht_cap->cap;
|
||||||
|
|
||||||
|
|
||||||
|
ampdu_factor = (vht_cap->cap &
|
||||||
|
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
|
||||||
|
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
|
||||||
|
|
||||||
|
/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
|
||||||
|
* zero in VHT IE. Using it would result in degraded throughput.
|
||||||
|
* arg->peer_max_mpdu at this point contains HT max_mpdu so keep
|
||||||
|
* it if VHT max_mpdu is smaller. */
|
||||||
|
arg->peer_max_mpdu = max(arg->peer_max_mpdu,
|
||||||
|
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||||
|
ampdu_factor)) - 1);
|
||||||
|
|
||||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||||
arg->peer_flags |= WMI_PEER_80MHZ;
|
arg->peer_flags |= WMI_PEER_80MHZ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue