forked from luck/tmp_suning_uos_patched
ath9k: Fix drain txq failure in flush
While draining the txq in flush, the buffers can be added into the tx queue by tx_tasklet which leads to unneccesary chip reset. This issue was originially found with AR9382 and running heavy uplink udp traffic with higher bandwidth and doing frequent bgscan. Cc: stable@kernel.org Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: Rajkumar Manoharan <rmanoharan@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
890641b251
commit
2f6fc351e6
@ -2261,6 +2261,7 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
|
||||
struct ath_softc *sc = hw->priv;
|
||||
int timeout = 200; /* ms */
|
||||
int i, j;
|
||||
bool drain_txq;
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
cancel_delayed_work_sync(&sc->tx_complete_work);
|
||||
@ -2286,7 +2287,10 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
|
||||
}
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
if (!ath_drain_all_txq(sc, false))
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
drain_txq = ath_drain_all_txq(sc, false);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
if (!drain_txq)
|
||||
ath_reset(sc, false);
|
||||
ath9k_ps_restore(sc);
|
||||
ieee80211_wake_queues(hw);
|
||||
|
Loading…
Reference in New Issue
Block a user