diff mbox

libertas: don't reset card on error when it is being removed

Message ID 20120730215804.4BFA89D401E@zog.reactivated.net (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Daniel Drake July 30, 2012, 9:58 p.m. UTC
On an OLPC XO-1.5 we have seen the following situation:
 - the system starts going into suspend
 - no wake params are set, so the mmc layer removes the card
 - during remove, we send a command to the card
 - that command fails, causing if_sdio's reset method to try and remove
   the mmc card in attempt to reset it
 - the mmc layer is not happy about being asked to remove a card that
   it is already removing, and the kernel crashes

While the MMC layer could possibly be taught to behave better here,
it also seems sensible for libertas not to try and reset a card if
we're in the process of removing it anyway.

Signed-off-by: Daniel Drake <dsd@laptop.org>
---
 drivers/net/wireless/libertas/main.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Dan Williams July 30, 2012, 11:31 p.m. UTC | #1
On Mon, 2012-07-30 at 22:58 +0100, Daniel Drake wrote:
> On an OLPC XO-1.5 we have seen the following situation:
>  - the system starts going into suspend
>  - no wake params are set, so the mmc layer removes the card
>  - during remove, we send a command to the card
>  - that command fails, causing if_sdio's reset method to try and remove
>    the mmc card in attempt to reset it
>  - the mmc layer is not happy about being asked to remove a card that
>    it is already removing, and the kernel crashes
> 
> While the MMC layer could possibly be taught to behave better here,
> it also seems sensible for libertas not to try and reset a card if
> we're in the process of removing it anyway.
> 
> Signed-off-by: Daniel Drake <dsd@laptop.org>

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

> ---
>  drivers/net/wireless/libertas/main.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index e96ee0a..8d17cac 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -565,7 +565,10 @@ static int lbs_thread(void *data)
>  			netdev_info(dev, "Timeout submitting command 0x%04x\n",
>  				    le16_to_cpu(cmdnode->cmdbuf->command));
>  			lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
> -			if (priv->reset_card)
> +
> +			/* Reset card, but only when it isn't in the process
> +			 * of being shutdown anyway. */
> +			if (!dev->dismantle && priv->reset_card)
>  				priv->reset_card(priv);
>  		}
>  		priv->cmd_timed_out = 0;


--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index e96ee0a..8d17cac 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -565,7 +565,10 @@  static int lbs_thread(void *data)
 			netdev_info(dev, "Timeout submitting command 0x%04x\n",
 				    le16_to_cpu(cmdnode->cmdbuf->command));
 			lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
-			if (priv->reset_card)
+
+			/* Reset card, but only when it isn't in the process
+			 * of being shutdown anyway. */
+			if (!dev->dismantle && priv->reset_card)
 				priv->reset_card(priv);
 		}
 		priv->cmd_timed_out = 0;