When the interface is down, the hardware is powered off.
However, the suspend handler currently tries to send host sleep commands
(when wakeup params are set) in this configuration, causing a system hang
when going into suspend (the commands will never complete).
Avoid this by detecting this situation and simply returning from
the suspend handler without doing anything special.
Signed-off-by: Daniel Drake <[email protected]>
---
drivers/net/wireless/libertas/if_sdio.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index e970897..4cb2343 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -1326,6 +1326,11 @@ static int if_sdio_suspend(struct device *dev)
mmc_pm_flag_t flags = sdio_get_host_pm_caps(func);
+ /* If we're powered off anyway, just let the mmc layer remove the
+ * card. */
+ if (!lbs_iface_active(card->priv))
+ return -ENOSYS;
+
dev_info(dev, "%s: suspend: PM flags = 0x%x\n",
sdio_func_id(func), flags);
--
1.7.11.4
On Mon, 2012-09-03 at 15:49 -0400, Daniel Drake wrote:
> When the interface is down, the hardware is powered off.
> However, the suspend handler currently tries to send host sleep commands
> (when wakeup params are set) in this configuration, causing a system hang
> when going into suspend (the commands will never complete).
>
> Avoid this by detecting this situation and simply returning from
> the suspend handler without doing anything special.
>
> Signed-off-by: Daniel Drake <[email protected]>
Acked-by: Dan Williams <[email protected]>
> ---
> drivers/net/wireless/libertas/if_sdio.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
> index e970897..4cb2343 100644
> --- a/drivers/net/wireless/libertas/if_sdio.c
> +++ b/drivers/net/wireless/libertas/if_sdio.c
> @@ -1326,6 +1326,11 @@ static int if_sdio_suspend(struct device *dev)
>
> mmc_pm_flag_t flags = sdio_get_host_pm_caps(func);
>
> + /* If we're powered off anyway, just let the mmc layer remove the
> + * card. */
> + if (!lbs_iface_active(card->priv))
> + return -ENOSYS;
> +
> dev_info(dev, "%s: suspend: PM flags = 0x%x\n",
> sdio_func_id(func), flags);
>