diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-05-18 21:28:15 +0200 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-05-22 14:28:44 -0400 |
commit | 08c96abd611beadf2af414a306fe0fb02ba706ff (patch) | |
tree | 2ee91910a79083004eacad4a05fe0699d4a7e534 /drivers/net/wireless/ath/ath9k/main.c | |
parent | 323a98db4d51e4fefc74290adfb5493047cbbe22 (diff) | |
download | lwn-08c96abd611beadf2af414a306fe0fb02ba706ff.tar.gz lwn-08c96abd611beadf2af414a306fe0fb02ba706ff.zip |
ath9k: prevent aggregation session deadlocks
Waiting for all subframes of an existing aggregation session to drain
before allowing mac80211 to start a new one is fragile and deadlocks
caused by this behavior have been observed.
Since mac80211 has proper synchronization for aggregation session
start/stop handling, a better approach to session handling is to simply
allow mac80211 to start a new session at any time. This requires
changing the code to discard any packets outside of the BlockAck window
in the A-MPDU software retry code.
This patch implements the above and also simplifies the code.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/main.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 2382d1262e7f..5092ecae7706 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -1709,7 +1709,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, flush = true; case IEEE80211_AMPDU_TX_STOP_CONT: ath9k_ps_wakeup(sc); - if (ath_tx_aggr_stop(sc, sta, tid, flush)) + ath_tx_aggr_stop(sc, sta, tid); + if (!flush) ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); ath9k_ps_restore(sc); break; |