[PATCH] libertas: Fix interface driver unload with PS mode
Dan Williams
dcbw at redhat.com
Tue Jun 16 15:57:02 EDT 2009
On Mon, 2009-06-15 at 15:29 -0700, Andrey Yurovsky wrote:
> When IEEE PS mode is enabled, lbs_remove_card needs to exit PS mode
> before returning. It will then set surpriseremoved=1, which blocks any
> further attempts to issue commands. In the SDIO, SPI, and USB drivers,
> lbs_remove_card is called with surpriseremoved already set, which makes
> it impossible to exit PS mode. As a result, reloading the driver while
> PS mode is enabled does not work.
>
> This patch removes the setting of surpriseremoved in the interface
> drivers and corrects the order in which lbs_stop_card and
> lbs_remove_card are called. Tested on SPI with V9 firmware.
Makes me a bit nervious; any chance you can test with usb8388 or SDIO
firmware and hot-unplug or rmmod?
Dan
> Signed-off-by: Andrey Yurovsky <andrey at cozybit.com>
> ---
> drivers/net/wireless/libertas/if_sdio.c | 2 --
> drivers/net/wireless/libertas/if_spi.c | 4 ++--
> drivers/net/wireless/libertas/if_usb.c | 1 -
> 3 files changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
> index 8cdb88c..6bb95ce 100644
> --- a/drivers/net/wireless/libertas/if_sdio.c
> +++ b/drivers/net/wireless/libertas/if_sdio.c
> @@ -1096,8 +1096,6 @@ 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);
> diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c
> index 923ed58..757352c 100644
> --- a/drivers/net/wireless/libertas/if_spi.c
> +++ b/drivers/net/wireless/libertas/if_spi.c
> @@ -1171,12 +1171,12 @@ static int __devexit libertas_spi_remove(struct spi_device *spi)
>
> lbs_deb_spi("libertas_spi_remove\n");
> lbs_deb_enter(LBS_DEB_SPI);
> - priv->surpriseremoved = 1;
>
> lbs_stop_card(priv);
> + lbs_remove_card(priv); /* will call free_netdev */
> +
> free_irq(spi->irq, card);
> if_spi_terminate_spi_thread(card);
> - lbs_remove_card(priv); /* will call free_netdev */
> if (card->pdata->teardown)
> card->pdata->teardown(spi);
> free_if_spi_card(card);
> diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
> index ea3dc03..7e03f0e 100644
> --- a/drivers/net/wireless/libertas/if_usb.c
> +++ b/drivers/net/wireless/libertas/if_usb.c
> @@ -357,7 +357,6 @@ static void if_usb_disconnect(struct usb_interface *intf)
> cardp->surprise_removed = 1;
>
> if (priv) {
> - priv->surpriseremoved = 1;
> lbs_stop_card(priv);
> lbs_remove_card(priv);
> }
More information about the libertas-dev
mailing list