On 20/08/21 2:04 pm, Adrian Hunter wrote: > 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> Although there are unnecessary parenthesis around !host->data > >> --- >> 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) { >> >