* Always free tx buffers before reset, since we also empty hw queues.
If we don't and a queue gets stuck, we'll never decrease txq_len and sw
will keep thinking the queue is still stuck even after reset.
Signed-off-by: Nick Kossifidis <[email protected]>
---
drivers/net/wireless/ath/ath5k/base.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index a8d380a..047b2a0 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -2512,9 +2512,11 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
synchronize_irq(sc->pdev->irq);
stop_tasklets(sc);
+ /* We are going to empty hw queues
+ * so we should also free any remaining
+ * tx buffers */
+ ath5k_drain_tx_buffs(sc);
if (chan) {
- ath5k_drain_tx_buffs(sc);
-
sc->curchan = chan;
sc->curband = &sc->sbands[chan->band];
}
Tested-by: Sedat Dilek <[email protected]>
On Fri, Dec 3, 2010 at 5:05 AM, Nick Kossifidis <[email protected]> wrote:
> * Always free tx buffers before reset, since we also empty hw queues.
> If we don't and a queue gets stuck, we'll never decrease txq_len and sw
> will keep thinking the queue is still stuck even after reset.
>
> Signed-off-by: Nick Kossifidis <[email protected]>
>
> ---
> drivers/net/wireless/ath/ath5k/base.c | 6 ++++--
> 1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
> index a8d380a..047b2a0 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -2512,9 +2512,11 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan,
> synchronize_irq(sc->pdev->irq);
> stop_tasklets(sc);
>
> + /* We are going to empty hw queues
> + * so we should also free any remaining
> + * tx buffers */
> + ath5k_drain_tx_buffs(sc);
> if (chan) {
> - ath5k_drain_tx_buffs(sc);
> -
> sc->curchan = chan;
> sc->curband = &sc->sbands[chan->band];
> }
>