Re: [PATCH 1/2] mmc: host: meson-mx-sdhc: fix manual RX FIFO flushing

From: Thomas Graichen
Date: Mon May 25 2020 - 02:14:43 EST


On Mon, May 18, 2020 at 12:29 AM Martin Blumenstingl
<martin.blumenstingl@xxxxxxxxxxxxxx> wrote:
>
> For Meson8 and Meson8b SoCs the vendor driver follows the following
> pattern:
> - for eMMC and SD cards in .set_pdma it sets:
> pdma->rxfifo_manual_flush = 1;
> - for SDIO cards in .set_pdma it sets:
> pdma->rxfifo_manual_flush = 0;
> - before syncing the DMA read buffer is sets:
> pdma->rxfifo_manual_flush |= 0x02;
>
> Set the second bit of MESON_SDHC_PDMA_RXFIFO_MANUAL_FLUSH without
> clearing the first bit before syncing the DMA read buffer. This fixes a
> problem where Meson8 and Meson8b SoCs would read random garbage from SD
> cards. It is not clear why it worked for eMMC cards. This manifested in
> the following errors when plugging in an SD card:
> unrecognised SCR structure version <random number>
>
> Fixes: 53ded1b676d199 ("mmc: host: meson-mx-sdhc: new driver for the Amlogic Meson SDHC host")
> Cc: Thomas Graichen <thomas.graichen@xxxxxxxxx>
> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx>

Tested-by: thomas graichen <thomas.graichen@xxxxxxxxx>

BEFORE: on my meson8 based mxiii i got the above error and the sd card
was not useable

AFTER: no more error and sd cards works fine

> ---
> drivers/mmc/host/meson-mx-sdhc.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/meson-mx-sdhc.c b/drivers/mmc/host/meson-mx-sdhc.c
> index 5c00958d7754..53e3f6a4245a 100644
> --- a/drivers/mmc/host/meson-mx-sdhc.c
> +++ b/drivers/mmc/host/meson-mx-sdhc.c
> @@ -586,10 +586,17 @@ static irqreturn_t meson_mx_sdhc_irq_thread(int irq, void *irq_data)
> cmd->data->flags & MMC_DATA_READ) {
> meson_mx_sdhc_wait_cmd_ready(host->mmc);
>
> + /*
> + * If MESON_SDHC_PDMA_RXFIFO_MANUAL_FLUSH was
> + * previously 0x1 then it has to be set to 0x3. If it
> + * was 0x0 before then it has to be set to 0x2. Without
> + * this reading SD cards sometimes transfers garbage,
> + * which results in cards not being detected due to:
> + * unrecognised SCR structure version <random number>
> + */
> val = FIELD_PREP(MESON_SDHC_PDMA_RXFIFO_MANUAL_FLUSH,
> 2);
> - regmap_update_bits(host->regmap, MESON_SDHC_PDMA,
> - MESON_SDHC_PDMA_RXFIFO_MANUAL_FLUSH,
> + regmap_update_bits(host->regmap, MESON_SDHC_PDMA, val,
> val);
> }
>
> --
> 2.26.2
>