2009-06-18 02:13:59

by Andrey Yurovsky

[permalink] [raw]
Subject: [PATCH] libertas: fix card cleanup order in SDIO driver

The SDIO driver sets the surpriseremoved flag before calling
lbs_remove_card. With IEEE PS enabled, lbs_remove_card must issue a
command to exit IEEE PS mode, however with that flag set the command
path is blocked and the card is never taken out of IEEE PS mode. This
step is required to ensure that the driver can be reloaded. This patch
moves the setting of surpriseremoved after lbs_remove_card is called.

Tested with V9 firmware by ensuring that IEEE PS is disabled when the
driver is removed. Reloading the driver is not fully tested due to a
separate issue with module reload in the SDIO driver, however this
patch at least leaves the card in a better state when we bring the
driver down.

Signed-off-by: Andrey Yurovsky <[email protected]>
---
drivers/net/wireless/libertas/if_sdio.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 8cdb88c..d48ed62 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -1096,11 +1096,11 @@ static void if_sdio_remove(struct sdio_func *func)
lbs_pr_alert("CMD_FUNC_SHUTDOWN cmd failed\n");
}

- card->priv->surpriseremoved = 1;

lbs_deb_sdio("call remove card\n");
lbs_stop_card(card->priv);
lbs_remove_card(card->priv);
+ card->priv->surpriseremoved = 1;

flush_workqueue(card->workqueue);
destroy_workqueue(card->workqueue);
--
1.5.6.3



2009-06-22 14:48:01

by Dan Williams

[permalink] [raw]
Subject: Re: [PATCH] libertas: fix card cleanup order in SDIO driver

On Wed, 2009-06-17 at 19:15 -0700, Andrey Yurovsky wrote:
> The SDIO driver sets the surpriseremoved flag before calling
> lbs_remove_card. With IEEE PS enabled, lbs_remove_card must issue a
> command to exit IEEE PS mode, however with that flag set the command
> path is blocked and the card is never taken out of IEEE PS mode. This
> step is required to ensure that the driver can be reloaded. This patch
> moves the setting of surpriseremoved after lbs_remove_card is called.
>
> Tested with V9 firmware by ensuring that IEEE PS is disabled when the
> driver is removed. Reloading the driver is not fully tested due to a
> separate issue with module reload in the SDIO driver, however this
> patch at least leaves the card in a better state when we bring the
> driver down.
>
> Signed-off-by: Andrey Yurovsky <[email protected]>

Acked-by: Dan Williams <[email protected]>

> ---
> drivers/net/wireless/libertas/if_sdio.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
> index 8cdb88c..d48ed62 100644
> --- a/drivers/net/wireless/libertas/if_sdio.c
> +++ b/drivers/net/wireless/libertas/if_sdio.c
> @@ -1096,11 +1096,11 @@ static void if_sdio_remove(struct sdio_func *func)
> lbs_pr_alert("CMD_FUNC_SHUTDOWN cmd failed\n");
> }
>
> - card->priv->surpriseremoved = 1;
>
> lbs_deb_sdio("call remove card\n");
> lbs_stop_card(card->priv);
> lbs_remove_card(card->priv);
> + card->priv->surpriseremoved = 1;
>
> flush_workqueue(card->workqueue);
> destroy_workqueue(card->workqueue);