On 13/08/21 3:34 pm, haibo.chen@xxxxxxx wrote: > From: Haibo Chen <haibo.chen@xxxxxxx> > > If sdhci use PIO mode, and use mmc_send_tuning() to send the > tuning command, system will stuck because of the storm irq > of sdhci. For PIO mode, use mmc_send_tuning(), it will trigger > buffer_read_ready interrupt and data transfer complete interrupt. > In current code logic, it will directly return in sdhci_data_irq, > can not call the sdhci_transfer_pio(). So the buffer_read_ready > interrupt storm happen. So for standard tuning method, need to > excluse this case. > > Signed-off-by: Haibo Chen <haibo.chen@xxxxxxx> Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > drivers/mmc/host/sdhci.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index aba6e10b8605..acee54b368b0 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -3278,8 +3278,14 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) > { > u32 command; > > - /* CMD19 generates _only_ Buffer Read Ready interrupt */ > - if (intmask & SDHCI_INT_DATA_AVAIL) { > + /* > + * CMD19 generates _only_ Buffer Read Ready interrupt if > + * use sdhci_send_tuning. > + * Need to exclude this case: PIO mode and use mmc_send_tuning, > + * If not, sdhci_transfer_pio will never be called, make the > + * SDHCI_INT_DATA_AVAIL always there, stuck in irq storm. > + */ > + if ((intmask & SDHCI_INT_DATA_AVAIL) && (!host->data)) { > command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)); > if (command == MMC_SEND_TUNING_BLOCK || > command == MMC_SEND_TUNING_BLOCK_HS200) { >