2010-12-03 04:17:58

by Nick Kossifidis

[permalink] [raw]
Subject: [PATCH 2/6] ath5k: Always free tx buffers before reset

* 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];
}


2010-12-03 06:34:49

by Sedat Dilek

[permalink] [raw]
Subject: Re: [PATCH 2/6] ath5k: Always free tx buffers before reset

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];
>        }
>