Re: [PATCH] mmc: core: improve fallback in mmc_select_timing()

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

 



On Fri, 18 Feb 2022 at 08:00, Heiner Kallweit <hkallweit1@xxxxxxxxx> wrote:
>
> I have a system (cheap Amlogic S905W based TV box) where the eMMC chip
> refuses to switch to HS200 timing. That's not nice, but my bigger
> problem is that the system then falls back to the very slow default
> mode, even though DDR52 is supported and works well.
>
> Therefore, if setting a mode fails with EBADMSG (switch error), try the
> next (in descending performance order) mode instead of immediately
> falling back to the slowest mode.
>
> With the patch it looks like this on my system:
>
> mmc1: mmc_select_hs200 failed, error -74
> mmc1: new DDR MMC card at address 0001
> mmcblk1: mmc1:0001 DG4008 7.28 GiB
>

Overall, I think the approach seems very much reasonable!

Although, I want to have a closer look at the impact on the different
scenarios, as mmc_select_timing() is being called during power
management and reset too.

Allow me a day or so, then I will get back to this, either with some
more detailed suggestions or I may post a patch.

Kind regards
Uffe

> Signed-off-by: Heiner Kallweit <hkallweit1@xxxxxxxxx>
> ---
>  drivers/mmc/core/mmc.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index bbbbcaf70..c0272192d 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1523,11 +1523,23 @@ static int mmc_select_timing(struct mmc_card *card)
>         if (!mmc_can_ext_csd(card))
>                 goto bus_speed;
>
> -       if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES)
> +       if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES) {
>                 err = mmc_select_hs400es(card);
> -       else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
> +               if (!err)
> +                       goto bus_speed;
> +               if (err != -EBADMSG)
> +                       return err;
> +       }
> +
> +       if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200) {
>                 err = mmc_select_hs200(card);
> -       else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
> +               if (!err)
> +                       goto bus_speed;
> +               if (err != -EBADMSG)
> +                       return err;
> +       }
> +
> +       if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
>                 err = mmc_select_hs(card);
>
>         if (err && err != -EBADMSG)
> --
> 2.35.1
>



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

  Powered by Linux