[PATCH] libertas: correct card cleanup order in SPI driver

Dan Williams dcbw at redhat.com
Mon Jun 22 10:48:13 EDT 2009


On Thu, 2009-06-18 at 09:51 -0700, Andrey Yurovsky wrote:
> The SPI driver does a couple of card cleanup steps in the wrong order on
> module removal.  If IEEE PS is enabled, this results in the card being
> left in IEEE PS mode and subsequent failures to reload the module.  The
> problem is that the surpriseremoved flag is set before calling
> lbs_remove_card, but that function needs to issue a command to exit IEEE
> PS mode (the flag blocks the command path).  In addition, lbs_stop_card
> should be called first because it clears out any pending commands.
> 
> Tested on a GSPI device with V9 firmware by confirming that we can
> reload the module with or without IEEE PS enabled.
> 
> Also fix a warning from the wrong uint format in a printk.
> 
> V2: use z modifier, thanks Sebastian.
> 
> Signed-off-by: Andrey Yurovsky <andrey at cozybit.com>

Acked-by: Dan Williams <dcbw at redhat.com>

> ---
>  drivers/net/wireless/libertas/if_spi.c |    7 ++++---
>  1 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c
> index 923ed58..8d8bc0b 100644
> --- a/drivers/net/wireless/libertas/if_spi.c
> +++ b/drivers/net/wireless/libertas/if_spi.c
> @@ -737,7 +737,7 @@ static int if_spi_c2h_data(struct if_spi_card *card)
>  		goto out;
>  	} else if (len > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
>  		lbs_pr_err("%s: error: card has %d bytes of data, but "
> -			   "our maximum skb size is %lu\n",
> +			   "our maximum skb size is %zu\n",
>  			   __func__, len, MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
>  		err = -EINVAL;
>  		goto out;
> @@ -1171,12 +1171,13 @@ 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 */
> +
> +	priv->surpriseremoved = 1;
>  	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);




More information about the libertas-dev mailing list