diff options
author | Felix Fietkau <nbd@openwrt.org> | 2014-02-22 07:48:19 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-02-24 14:55:27 -0500 |
commit | 558ff225de80ac95b132d3a115ddadcd64498b4f (patch) | |
tree | 781f54dfb404cb9e5a8f01275ef7bcd75d26dc01 | |
parent | e4ceb0f40da5dc26f84025d121c2fe6ff7d8a947 (diff) |
ath9k: fix ps-poll responses under a-mpdu sessions
When passing tx frames to the U-APSD queue for powersave poll responses,
the ath_atx_tid pointer needs to be passed to ath_tx_setup_buffer for
proper sequence number accounting.
This fixes high latency and connection stability issues with ath9k
running as AP and a few kinds of mobile phones as client, when PS-Poll
is heavily used
Cc: stable@vger.kernel.org
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 4f4ce83f7ab4..f042a18c8495 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -2186,14 +2186,15 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2186 | txq->stopped = true; | 2186 | txq->stopped = true; |
2187 | } | 2187 | } |
2188 | 2188 | ||
2189 | if (txctl->an) | ||
2190 | tid = ath_get_skb_tid(sc, txctl->an, skb); | ||
2191 | |||
2189 | if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { | 2192 | if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { |
2190 | ath_txq_unlock(sc, txq); | 2193 | ath_txq_unlock(sc, txq); |
2191 | txq = sc->tx.uapsdq; | 2194 | txq = sc->tx.uapsdq; |
2192 | ath_txq_lock(sc, txq); | 2195 | ath_txq_lock(sc, txq); |
2193 | } else if (txctl->an && | 2196 | } else if (txctl->an && |
2194 | ieee80211_is_data_present(hdr->frame_control)) { | 2197 | ieee80211_is_data_present(hdr->frame_control)) { |
2195 | tid = ath_get_skb_tid(sc, txctl->an, skb); | ||
2196 | |||
2197 | WARN_ON(tid->ac->txq != txctl->txq); | 2198 | WARN_ON(tid->ac->txq != txctl->txq); |
2198 | 2199 | ||
2199 | if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) | 2200 | if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) |