[PATCH v2 4/4] mmc: dw_mmc: Do not wait for DTO in case of error

Ulf Hansson ulf.hansson at linaro.org
Wed Dec 8 06:53:54 PST 2021


On Mon, 6 Dec 2021 at 15:29, Mårten Lindahl <marten.lindahl at axis.com> wrote:
>
> When running the ARTPEC-8 DWMMC IP version, and a data error interrupt
> comes during a data read transfer, there is no guarantee for the data
> transfer over interrupt (DTO) to come within the specified data timeout.
> This case is handled by the dto_timer handler which will complete the
> request with the comment:
>
>  /*
>   * If DTO interrupt does NOT come in sending data state,
>   * we should notify the driver to terminate current transfer
>   * and report a data timeout to the core.
>   */
>
> But since the ARTPEC-8 DWMMC IP version, supports an extended TMOUT
> register which allows longer timeouts than the non ARTPEC-8 version
> does, waiting for the dto_timer to complete the request in error cases
> may cause the request to take significantly longer time than necessary.
> This is specifically true for the failing steps during tuning of a
> device.
>
> Fix this by completing the request when the error interrupt comes.
>
> Signed-off-by: Mårten Lindahl <marten.lindahl at axis.com>

Okay, this change looks a bit inconvenient to move into variant
specific callbacks. So, maybe the "quirks" flag makes sense, after
all. However, I would still look at using callbacks and library
functions, for the part implemented in patch3.

When it comes to the order of the patches in the series, I suggest
flipping things around and making patch2 the final piece. Otherwise
the support for the artpec variant will be broken between patch2 and
patch4, right?

Kind regards
Uffe

> ---
>  drivers/mmc/host/dw_mmc.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 45ea9fd97a6a..d6b76f47b1a2 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -2777,11 +2777,19 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
>                 if (pending & DW_MCI_DATA_ERROR_FLAGS) {
>                         spin_lock(&host->irq_lock);
>
> +                       if (host->quirks & DW_MMC_QUIRK_EXTENDED_TMOUT)
> +                               del_timer(&host->dto_timer);
> +
>                         /* if there is an error report DATA_ERROR */
>                         mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS);
>                         host->data_status = pending;
>                         smp_wmb(); /* drain writebuffer */
>                         set_bit(EVENT_DATA_ERROR, &host->pending_events);
> +
> +                       if (host->quirks & DW_MMC_QUIRK_EXTENDED_TMOUT)
> +                               /* In case of error, we cannot expect a DTO */
> +                               set_bit(EVENT_DATA_COMPLETE, &host->pending_events);
> +
>                         tasklet_schedule(&host->tasklet);
>
>                         spin_unlock(&host->irq_lock);
> --
> 2.20.1
>



More information about the linux-arm-kernel mailing list