Re: [PATCH 1/3] mmc: core: do power-off with resume failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 21 August 2013 14:42, Seungwon Jeon <tgih.jun@xxxxxxxxxxx> wrote:
> Currently there is no mmc_power_off() when resume failed.
> Somehow, state from mmc_power_on() will be kept. This change
> makes a pair with its use in case of failure.

Hi Seungwon,

To be safe, we can not power off, even if a resume failures. The
reason is that the bus/card/host is still available for sending
commands to it and those will then likely hang since IP controllers
internal registers is configured for "power off" state.

Instead, we must leave the power off to be handled from the next
rescan work when the card is no longer properly "detected". For
NONREMOVABLE we will instead at error path try to do a
"power_restore_host".

Kind regards
Ulf Hansson


>
> Signed-off-by: Seungwon Jeon <tgih.jun@xxxxxxxxxxx>
> ---
>  drivers/mmc/core/mmc.c  |    3 +++
>  drivers/mmc/core/sd.c   |    3 +++
>  drivers/mmc/core/sdio.c |    3 +++
>  3 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index 6d02012..704a561 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1536,6 +1536,9 @@ static int mmc_resume(struct mmc_host *host)
>         mmc_power_up(host);
>         mmc_select_voltage(host, host->ocr);
>         err = mmc_init_card(host, host->ocr, host->card);
> +       if (err)
> +               mmc_power_off(host);
> +
>         mmc_release_host(host);
>
>         return err;
> diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
> index 176d125..2690ae1 100644
> --- a/drivers/mmc/core/sd.c
> +++ b/drivers/mmc/core/sd.c
> @@ -1099,6 +1099,9 @@ static int mmc_sd_resume(struct mmc_host *host)
>         mmc_power_up(host);
>         mmc_select_voltage(host, host->ocr);
>         err = mmc_sd_init_card(host, host->ocr, host->card);
> +       if (err)
> +               mmc_power_off(host);
> +
>         mmc_release_host(host);
>
>         return err;
> diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
> index 80d89cf..8c65669 100644
> --- a/drivers/mmc/core/sdio.c
> +++ b/drivers/mmc/core/sdio.c
> @@ -1033,6 +1033,9 @@ static int mmc_sdio_resume(struct mmc_host *host)
>                 }
>         }
>
> +       if (err && !mmc_card_keep_power(host))
> +               mmc_power_off(host);
> +
>         host->pm_flags &= ~MMC_PM_KEEP_POWER;
>         return err;
>  }
> --
> 1.7.0.4
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux