diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-09-20 13:35:28 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-09-21 11:05:31 -0400 |
commit | 231c3a1f0630c07a584905507a1cb7b705a56ab7 (patch) | |
tree | 10ad974e6c1b55aa986fe2136fbbea2125e1eff3 /drivers/net/wireless/ath/ath9k/main.c | |
parent | 81ee13ba7ef8c9eaebe91ed06edb844ab6403d4e (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.c | 5 |
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: |