aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2014-02-22 07:48:19 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-24 14:55:27 -0500
commit558ff225de80ac95b132d3a115ddadcd64498b4f (patch)
tree781f54dfb404cb9e5a8f01275ef7bcd75d26dc01
parente4ceb0f40da5dc26f84025d121c2fe6ff7d8a947 (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.c5
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)