| From c01fac1c77a00227f706a1654317023e3f4ac7f0 Mon Sep 17 00:00:00 2001 |
| From: Felix Fietkau <nbd@openwrt.org> |
| Date: Wed, 23 Jul 2014 15:40:54 +0200 |
| Subject: ath9k: fix aggregation session lockup |
| |
| From: Felix Fietkau <nbd@openwrt.org> |
| |
| commit c01fac1c77a00227f706a1654317023e3f4ac7f0 upstream. |
| |
| If an aggregation session fails, frames still end up in the driver queue |
| with IEEE80211_TX_CTL_AMPDU set. |
| This causes tx for the affected station/tid to stall, since |
| ath_tx_get_tid_subframe returning packets to send. |
| |
| Fix this by clearing IEEE80211_TX_CTL_AMPDU as long as no aggregation |
| session is running. |
| |
| Reported-by: Antonio Quartulli <antonio@open-mesh.com> |
| Signed-off-by: Felix Fietkau <nbd@openwrt.org> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/ath/ath9k/xmit.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/drivers/net/wireless/ath/ath9k/xmit.c |
| +++ b/drivers/net/wireless/ath/ath9k/xmit.c |
| @@ -890,6 +890,15 @@ ath_tx_get_tid_subframe(struct ath_softc |
| |
| tx_info = IEEE80211_SKB_CB(skb); |
| tx_info->flags &= ~IEEE80211_TX_CTL_CLEAR_PS_FILT; |
| + |
| + /* |
| + * No aggregation session is running, but there may be frames |
| + * from a previous session or a failed attempt in the queue. |
| + * Send them out as normal data frames |
| + */ |
| + if (!tid->active) |
| + tx_info->flags &= ~IEEE80211_TX_CTL_AMPDU; |
| + |
| if (!(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) { |
| bf->bf_state.bf_type = 0; |
| return bf; |