[U-Boot] [PATCH 08/13] mmc: tmio: Silence transfer errors when tuning

Masahiro Yamada yamada.masahiro at socionext.com
Thu Nov 1 11:42:12 UTC 2018


On Thu, Nov 1, 2018 at 2:22 AM Marek Vasut <marek.vasut at gmail.com> wrote:
>
> In case the controller performs card tuning, that is, sends MMC
> command 19 or 21, silence possible CRC error warning prints. The
> warnings are bound to happen, since the tuning will fail for some
> settings while searching for the optimal configuration of the bus
> and that is perfectly OK.
>
> This patch passes around the MMC command structure and adds check
> into tmio_sd_check_error() to avoid printing CRC error warning
> when the tuning happens.

Make sense, but another solution might be
to delete the message entirely, or to turn it into a debug message.


FWIW,

commit 61f2e5ee12895a2bdaeac8dd13e8d7f50ca7e375
Author: Masahiro Yamada <yamada.masahiro at socionext.com>
Date:   Sat Dec 30 02:00:12 2017 +0900

    mmc: sdhci: change data transfer failure into debug message





> Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
> Cc: Masahiro Yamada <yamada.masahiro at socionext.com>
> ---
>  drivers/mmc/tmio-common.c | 45 +++++++++++++++++++++------------------
>  1 file changed, 24 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/mmc/tmio-common.c b/drivers/mmc/tmio-common.c
> index 8e83584e57..8e1bcd7ed5 100644
> --- a/drivers/mmc/tmio-common.c
> +++ b/drivers/mmc/tmio-common.c
> @@ -95,7 +95,7 @@ static void __dma_unmap_single(dma_addr_t addr, size_t size,
>                 invalidate_dcache_range(addr, addr + size);
>  }
>
> -static int tmio_sd_check_error(struct udevice *dev)
> +static int tmio_sd_check_error(struct udevice *dev, struct mmc_cmd *cmd)
>  {
>         struct tmio_sd_priv *priv = dev_get_priv(dev);
>         u32 info2 = tmio_sd_readl(priv, TMIO_SD_INFO2);
> @@ -116,7 +116,9 @@ static int tmio_sd_check_error(struct udevice *dev)
>
>         if (info2 & (TMIO_SD_INFO2_ERR_END | TMIO_SD_INFO2_ERR_CRC |
>                      TMIO_SD_INFO2_ERR_IDX)) {
> -               dev_err(dev, "communication out of sync\n");
> +               if ((cmd->cmdidx != MMC_CMD_SEND_TUNING_BLOCK) &&
> +                   (cmd->cmdidx != MMC_CMD_SEND_TUNING_BLOCK_HS200))
> +                       dev_err(dev, "communication out of sync\n");
>                 return -EILSEQ;
>         }
>
> @@ -129,8 +131,8 @@ static int tmio_sd_check_error(struct udevice *dev)
>         return 0;
>  }
>
> -static int tmio_sd_wait_for_irq(struct udevice *dev, unsigned int reg,
> -                                   u32 flag)
> +static int tmio_sd_wait_for_irq(struct udevice *dev, struct mmc_cmd *cmd,
> +                               unsigned int reg, u32 flag)
>  {
>         struct tmio_sd_priv *priv = dev_get_priv(dev);
>         long wait = 1000000;
> @@ -142,7 +144,7 @@ static int tmio_sd_wait_for_irq(struct udevice *dev, unsigned int reg,
>                         return -ETIMEDOUT;
>                 }
>
> -               ret = tmio_sd_check_error(dev);
> +               ret = tmio_sd_check_error(dev, cmd);
>                 if (ret)
>                         return ret;
>
> @@ -178,15 +180,15 @@ tmio_pio_read_fifo(64, q)
>  tmio_pio_read_fifo(32, l)
>  tmio_pio_read_fifo(16, w)
>
> -static int tmio_sd_pio_read_one_block(struct udevice *dev, char *pbuf,
> -                                         uint blocksize)
> +static int tmio_sd_pio_read_one_block(struct udevice *dev, struct mmc_cmd *cmd,
> +                                     char *pbuf, uint blocksize)
>  {
>         struct tmio_sd_priv *priv = dev_get_priv(dev);
>         int ret;
>
>         /* wait until the buffer is filled with data */
> -       ret = tmio_sd_wait_for_irq(dev, TMIO_SD_INFO2,
> -                                      TMIO_SD_INFO2_BRE);
> +       ret = tmio_sd_wait_for_irq(dev, cmd, TMIO_SD_INFO2,
> +                                  TMIO_SD_INFO2_BRE);
>         if (ret)
>                 return ret;
>
> @@ -231,15 +233,15 @@ tmio_pio_write_fifo(64, q)
>  tmio_pio_write_fifo(32, l)
>  tmio_pio_write_fifo(16, w)
>
> -static int tmio_sd_pio_write_one_block(struct udevice *dev,
> +static int tmio_sd_pio_write_one_block(struct udevice *dev, struct mmc_cmd *cmd,
>                                            const char *pbuf, uint blocksize)
>  {
>         struct tmio_sd_priv *priv = dev_get_priv(dev);
>         int ret;
>
>         /* wait until the buffer becomes empty */
> -       ret = tmio_sd_wait_for_irq(dev, TMIO_SD_INFO2,
> -                                   TMIO_SD_INFO2_BWE);
> +       ret = tmio_sd_wait_for_irq(dev, cmd, TMIO_SD_INFO2,
> +                                  TMIO_SD_INFO2_BWE);
>         if (ret)
>                 return ret;
>
> @@ -255,7 +257,8 @@ static int tmio_sd_pio_write_one_block(struct udevice *dev,
>         return 0;
>  }
>
> -static int tmio_sd_pio_xfer(struct udevice *dev, struct mmc_data *data)
> +static int tmio_sd_pio_xfer(struct udevice *dev, struct mmc_cmd *cmd,
> +                           struct mmc_data *data)
>  {
>         const char *src = data->src;
>         char *dest = data->dest;
> @@ -263,10 +266,10 @@ static int tmio_sd_pio_xfer(struct udevice *dev, struct mmc_data *data)
>
>         for (i = 0; i < data->blocks; i++) {
>                 if (data->flags & MMC_DATA_READ)
> -                       ret = tmio_sd_pio_read_one_block(dev, dest,
> +                       ret = tmio_sd_pio_read_one_block(dev, cmd, dest,
>                                                              data->blocksize);
>                 else
> -                       ret = tmio_sd_pio_write_one_block(dev, src,
> +                       ret = tmio_sd_pio_write_one_block(dev, cmd, src,
>                                                               data->blocksize);
>                 if (ret)
>                         return ret;
> @@ -468,8 +471,8 @@ int tmio_sd_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
>                 cmd->cmdidx, tmp, cmd->cmdarg);
>         tmio_sd_writel(priv, tmp, TMIO_SD_CMD);
>
> -       ret = tmio_sd_wait_for_irq(dev, TMIO_SD_INFO1,
> -                                      TMIO_SD_INFO1_RSP);
> +       ret = tmio_sd_wait_for_irq(dev, cmd, TMIO_SD_INFO1,
> +                                  TMIO_SD_INFO1_RSP);
>         if (ret)
>                 return ret;
>
> @@ -497,17 +500,17 @@ int tmio_sd_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
>                     tmio_sd_addr_is_dmaable(data->src))
>                         ret = tmio_sd_dma_xfer(dev, data);
>                 else
> -                       ret = tmio_sd_pio_xfer(dev, data);
> +                       ret = tmio_sd_pio_xfer(dev, cmd, data);
>                 if (ret)
>                         return ret;
>
> -               ret = tmio_sd_wait_for_irq(dev, TMIO_SD_INFO1,
> -                                              TMIO_SD_INFO1_CMP);
> +               ret = tmio_sd_wait_for_irq(dev, cmd, TMIO_SD_INFO1,
> +                                          TMIO_SD_INFO1_CMP);
>                 if (ret)
>                         return ret;
>         }
>
> -       return tmio_sd_wait_for_irq(dev, TMIO_SD_INFO2,
> +       return tmio_sd_wait_for_irq(dev, cmd, TMIO_SD_INFO2,
>                                     TMIO_SD_INFO2_SCLKDIVEN);
>  }
>
> --
> 2.18.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot



--
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list