Skip to content

Commit

Permalink
ath5k: disable tasklets during reset
Browse files Browse the repository at this point in the history
Based on a patch from Bruno Randolf, attempting useful
work while we are resetting the chip just leads to interface
lockups and bad descriptor data, and possibly DMAing to
freed buffers.  Let's suspend all tasklets while
reprogramming the registers in the card to avoid such
problems.

In the future we can convert the tasklets to threaded
interrupt handlers to simplify things.

Signed-off-by: Bob Copeland <me@bobcopeland.com>
Acked-by: Bruno Randolf <br1@einfach.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Bob Copeland authored and John W. Linville committed Jul 14, 2010
1 parent 5faaff7 commit 450464d
Showing 1 changed file with 14 additions and 6 deletions.
20 changes: 14 additions & 6 deletions drivers/net/wireless/ath/ath5k/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -2639,6 +2639,15 @@ ath5k_stop_locked(struct ath5k_softc *sc)
return 0;
}

static void stop_tasklets(struct ath5k_softc *sc)
{
tasklet_kill(&sc->rxtq);
tasklet_kill(&sc->txtq);
tasklet_kill(&sc->calib);
tasklet_kill(&sc->beacontq);
tasklet_kill(&sc->ani_tasklet);
}

/*
* Stop the device, grabbing the top-level lock to protect
* against concurrent entry through ath5k_init (which can happen
Expand Down Expand Up @@ -2683,11 +2692,7 @@ ath5k_stop_hw(struct ath5k_softc *sc)
mmiowb();
mutex_unlock(&sc->lock);

tasklet_kill(&sc->rxtq);
tasklet_kill(&sc->txtq);
tasklet_kill(&sc->calib);
tasklet_kill(&sc->beacontq);
tasklet_kill(&sc->ani_tasklet);
stop_tasklets(sc);

ath5k_rfkill_hw_stop(sc->ah);

Expand Down Expand Up @@ -2937,8 +2942,11 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan)

ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n");

ath5k_hw_set_imr(ah, 0);
synchronize_irq(sc->pdev->irq);
stop_tasklets(sc);

if (chan) {
ath5k_hw_set_imr(ah, 0);
ath5k_txq_cleanup(sc);
ath5k_rx_stop(sc);

Expand Down

0 comments on commit 450464d

Please sign in to comment.