| From ec30326ea773900da210c495e14cfeb532550ba2 Mon Sep 17 00:00:00 2001 |
| From: Felix Fietkau <nbd@openwrt.org> |
| Date: Sat, 5 Oct 2013 14:09:30 +0200 |
| Subject: ath9k: fix tx queue scheduling after channel changes |
| |
| From: Felix Fietkau <nbd@openwrt.org> |
| |
| commit ec30326ea773900da210c495e14cfeb532550ba2 upstream. |
| |
| Otherwise, if queues are full during a scan, tx scheduling does not |
| resume after switching back to the home channel. |
| |
| 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/main.c | 23 +++++++++++------------ |
| 1 file changed, 11 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/net/wireless/ath/ath9k/main.c |
| +++ b/drivers/net/wireless/ath/ath9k/main.c |
| @@ -209,6 +209,7 @@ static bool ath_complete_reset(struct at |
| struct ath_hw *ah = sc->sc_ah; |
| struct ath_common *common = ath9k_hw_common(ah); |
| unsigned long flags; |
| + int i; |
| |
| if (ath_startrecv(sc) != 0) { |
| ath_err(common, "Unable to restart recv logic\n"); |
| @@ -236,6 +237,15 @@ static bool ath_complete_reset(struct at |
| } |
| work: |
| ath_restart_work(sc); |
| + |
| + for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
| + if (!ATH_TXQ_SETUP(sc, i)) |
| + continue; |
| + |
| + spin_lock_bh(&sc->tx.txq[i].axq_lock); |
| + ath_txq_schedule(sc, &sc->tx.txq[i]); |
| + spin_unlock_bh(&sc->tx.txq[i].axq_lock); |
| + } |
| } |
| |
| if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) |
| @@ -543,21 +553,10 @@ chip_reset: |
| |
| static int ath_reset(struct ath_softc *sc) |
| { |
| - int i, r; |
| + int r; |
| |
| ath9k_ps_wakeup(sc); |
| - |
| r = ath_reset_internal(sc, NULL); |
| - |
| - for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
| - if (!ATH_TXQ_SETUP(sc, i)) |
| - continue; |
| - |
| - spin_lock_bh(&sc->tx.txq[i].axq_lock); |
| - ath_txq_schedule(sc, &sc->tx.txq[i]); |
| - spin_unlock_bh(&sc->tx.txq[i].axq_lock); |
| - } |
| - |
| ath9k_ps_restore(sc); |
| |
| return r; |