aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/main.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2010-09-20 13:35:28 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-09-21 11:05:31 -0400
commit231c3a1f0630c07a584905507a1cb7b705a56ab7 (patch)
tree10ad974e6c1b55aa986fe2136fbbea2125e1eff3 /drivers/net/wireless/ath/ath9k/main.c
parent81ee13ba7ef8c9eaebe91ed06edb844ab6403d4e (diff)
ath9k: fix an aggregation start related race condition
A new aggregation session start can be issued by mac80211, even when the cleanup of the previous session has not completed yet. Since the data structure for the session is not recreated, this could corrupt the block ack window and lock up the aggregation session. Fix this by delaying the new session until the old one has been cleaned up. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Cc: stable@kernel.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.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 5056733e6f66..8b327bcad695 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1970,8 +1970,9 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
1970 break; 1970 break;
1971 case IEEE80211_AMPDU_TX_START: 1971 case IEEE80211_AMPDU_TX_START:
1972 ath9k_ps_wakeup(sc); 1972 ath9k_ps_wakeup(sc);
1973 ath_tx_aggr_start(sc, sta, tid, ssn); 1973 ret = ath_tx_aggr_start(sc, sta, tid, ssn);
1974 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1974 if (!ret)
1975 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1975 ath9k_ps_restore(sc); 1976 ath9k_ps_restore(sc);
1976 break; 1977 break;
1977 case IEEE80211_AMPDU_TX_STOP: 1978 case IEEE80211_AMPDU_TX_STOP: