RE: [PATCH v2 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning

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

 



> -----Original Message-----
> From: Rizvi, Mohammad Faiz Abbas [mailto:faiz_abbas@xxxxxx]
> Sent: Tuesday, March 12, 2019 7:35 PM
> To: Hunter, Adrian <adrian.hunter@xxxxxxxxx>; linux-
> kernel@xxxxxxxxxxxxxxx; linux-mmc@xxxxxxxxxxxxxxx; linux-
> omap@xxxxxxxxxxxxxxx
> Cc: ulf.hansson@xxxxxxxxxx; kishon@xxxxxx
> Subject: Re: [PATCH v2 2/2] mmc: sdhci-omap: Don't finish_mrq() on a
> command error during tuning
> 
> Hi Adrian,
> 
> On 3/6/2019 5:39 PM, Adrian Hunter wrote:
> > On 1/03/19 10:38 AM, Faiz Abbas wrote:
> >> commit 5b0d62108b46 ("mmc: sdhci-omap: Add platform specific reset
> >> callback") skips data resets during tuning operation. Because of
> >> this, a data error or data finish interrupt might still arrive after
> >> a command error has been handled and the mrq ended. This ends up with
> >> a "mmc0: Got data interrupt 0x00000002 even though no data operation
> was in progress"
> >> error message.
> >>
> >> Fix this by adding a platform specific callback for command errors.
> >> Mark the mrq as a failure but wait for a data interrupt instead of
> >> calling finish_mrq().
> >>
> >> Fixes: 5b0d62108b46 ("mmc: sdhci-omap: Add platform specific reset
> >> callback")
> >> Signed-off-by: Faiz Abbas <faiz_abbas@xxxxxx>
> >> ---
> >>  drivers/mmc/host/sdhci-omap.c | 24 ++++++++++++++++++++++++
> >>  1 file changed, 24 insertions(+)
> >>
> >> diff --git a/drivers/mmc/host/sdhci-omap.c
> >> b/drivers/mmc/host/sdhci-omap.c index b1a66ca3821a..67b361a403bc
> >> 100644
> >> --- a/drivers/mmc/host/sdhci-omap.c
> >> +++ b/drivers/mmc/host/sdhci-omap.c
> >> @@ -797,6 +797,29 @@ void sdhci_omap_reset(struct sdhci_host *host,
> u8 mask)
> >>  	sdhci_reset(host, mask);
> >>  }
> >>
> >> +void sdhci_omap_cmd_err(struct sdhci_host *host, u32 intmask, u32
> >> +*intmask_p) {
> >> +	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> +	struct sdhci_omap_host *omap_host =
> sdhci_pltfm_priv(pltfm_host);
> >> +
> >> +	if (omap_host->is_tuning) {
> >> +		/*
> >> +		 * Since we are not resetting data lines during tuning
> >> +		 * operation, data error or data complete interrupts
> >> +		 * might still arrive. Mark this request as a failure
> >> +		 * but still wait for the data interrupt
> >> +		 */
> >> +		if (intmask & SDHCI_INT_TIMEOUT)
> >> +			host->cmd->error = -ETIMEDOUT;
> >> +		else
> >> +			host->cmd->error = -EILSEQ;
> >> +
> >> +		sdhci_finish_command(host);
> >> +	} else {
> >> +		sdhci_cmd_err(host, intmask, intmask_p);
> >> +	}
> >> +}
> >
> > Could this be done by the existing ->irq() callback? i.e. mask the
> > error bits in intmask (have to write them back to SDHCI_INT_STATUS
> > also) but set
> > cmd->error.
> >
> 
> It is possible but I really don't want the callback to be unnecessarily called for
> every single interrupt that happens. I think we should only use the callback in
> the case of an actual error interrupt :-)

You mean for performance reasons?  I would have thought it would be
only a handful of cycles to call into a function, find nothing to do, and return.
That should be negligible compared to the rest of the interrupt handler.
If that is the concern, then it might be worth measuring it.





[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux