On Mon, 6 Dec 2021 at 15:29, Mårten Lindahl <marten.lindahl@xxxxxxxx> 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@xxxxxxxx> 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 >