Re: [PATCH] mmc: rtsx: Don't attempt to use 'Low-Voltage' VDD for SD cards

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

 



On Mon, 26 Aug 2019 at 20:02, Philip Langdale <philipl@xxxxxxxxx> wrote:
>
> There have been multiple reports of failures for newer SD cards
> with Realtek readers using the rtsx_pci_sdmmc driver in recent
> months, including myself.
>
> One common theme was that Sandisk A2 cards all failed while older
> cards worked fine. The first reports in bugzilla showed up in late
> 2018 corresponding with the availabilty of these cards.
>
> After some false starts, what I realised was that these new cards
> have bit 7 set in OCR which means they claim to support the 'Low
> Voltage Range' for VDD. This is an incompletely defined concept
> in the SD spec - in fact, there is no precise voltage associated
> with the 'Low Voltage Range'. We have to go to the MMC spec to
> see that it is 1.65-1.95V.
>
> So, I believe there is currently no legitimate way for an SD
> card to operate in the low voltage range, and a card that claims
> support by setting bit 7 is simply wrong, although technically
> not out of spec. Because the spec doesn't cover how to handle a
> card that sets this bit, we really need to act as if the bit is
> not set and do normal VDD initialisation.
>
> And, in fact, this is exactly what happens in the sdhci driver.
> By default, it elides MMC_VDD_165_195 for SD cards, and there is
> core logic that allows different values of ocr_avail for SD and
> MMC (and SDIO, even).
>
> As such, an equivalent change should be made in the two rtsx
> drivers (pci and usb) to explicitly set ocr_avail_sd, leaving
> out the low voltage range.
>
> There's a valid question about whether this elidation should be
> moved into the core logic, so that we never try and bring up an
> SD card in the low voltage range, for all host controllers.
>
> For now, at least, I'm going to punt on that question and use
> the existing infrastructure to fix the driver I can test.
>
> I considered setting ocr_avail_sdio as well, but I noted that
> the sdhci driver does not do this implicit elidation in that
> case, and so didn't want to make the change blindly; I am not
> in a position to test it.
>
> Needless to say, after this change, the Sandisk A2 card works
> correctly.

Thanks for all the details in the changelog, much appreciated!

To put it simple. mmc->ocr_avail_sd|sdio|mmc should never have been
introduced in the first place. It's a workaround to something that
should have been taken care of better by the core layer, which you
also suggests.

>
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=201447
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=202473

Ah, I forgot to add these links in my just posted patch. Will do when
I apply, if the tests works as expected, of course.

Kind regards
Uffe

> Signed-off-by: Philip Langdale <philipl@xxxxxxxxx>
> ---
>  drivers/mmc/host/rtsx_pci_sdmmc.c | 4 ++++
>  drivers/mmc/host/rtsx_usb_sdmmc.c | 4 ++++
>  2 files changed, 8 insertions(+)
>
> diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
> index bd50935dc37d..ff78b2abfe8b 100644
> --- a/drivers/mmc/host/rtsx_pci_sdmmc.c
> +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
> @@ -1342,6 +1342,10 @@ static void realtek_init_host(struct realtek_pci_sdmmc *host)
>         mmc->f_min = 250000;
>         mmc->f_max = 208000000;
>         mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
> +       /* MMC_VDD_165_195 is not really defined for SD cards. Ensure we
> +        * never attempt to initialise a card with the bit set in OCR.
> +        */
> +       mmc->ocr_avail_sd = MMC_VDD_32_33 | MMC_VDD_33_34;
>         mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
>                 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
>                 MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | MMC_CAP_ERASE;
> diff --git a/drivers/mmc/host/rtsx_usb_sdmmc.c b/drivers/mmc/host/rtsx_usb_sdmmc.c
> index 81d0dfe553a8..590c7c4c189b 100644
> --- a/drivers/mmc/host/rtsx_usb_sdmmc.c
> +++ b/drivers/mmc/host/rtsx_usb_sdmmc.c
> @@ -1311,6 +1311,10 @@ static void rtsx_usb_init_host(struct rtsx_usb_sdmmc *host)
>         mmc->f_min = 250000;
>         mmc->f_max = 208000000;
>         mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
> +       /* MMC_VDD_165_195 is not really defined for SD cards. Ensure we
> +        * never attempt to initialise a card with the bit set in OCR.
> +        */
> +       mmc->ocr_avail_sd = MMC_VDD_32_33 | MMC_VDD_33_34;
>         mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
>                 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
>                 MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR50 |
> --
> 2.20.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