diff options
author | Felix Fietkau <nbd@openwrt.org> | 2014-02-22 13:48:19 +0100 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2014-03-22 22:01:50 +0100 |
commit | 7f60220d325b42104f40a4bec8457f3f63da8dd4 (patch) | |
tree | b1b9b6c233582b1ac63c32d1a432672c85d1380c | |
parent | 46e70384f21825caab1a55f64e9fe6d3d16c28cc (diff) | |
download | linux-rt-7f60220d325b42104f40a4bec8457f3f63da8dd4.tar.gz |
ath9k: fix ps-poll responses under a-mpdu sessions
commit 558ff225de80ac95b132d3a115ddadcd64498b4f upstream.
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
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
-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 32891564ed67..ba39178a94ab 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -2201,14 +2201,15 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, txq->stopped = true; } + if (txctl->an) + tid = ath_get_skb_tid(sc, txctl->an, skb); + if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { ath_txq_unlock(sc, txq); txq = sc->tx.uapsdq; ath_txq_lock(sc, txq); } else if (txctl->an && ieee80211_is_data_present(hdr->frame_control)) { - tid = ath_get_skb_tid(sc, txctl->an, skb); - WARN_ON(tid->ac->txq != txctl->txq); if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) |