On 6/09/19 6:52 AM, Baolin Wang wrote: > Add cqhci_virt_finalize_request() to help to complete a request > from virtual command queue. > > Signed-off-by: Baolin Wang <baolin.wang@xxxxxxxxxx> > --- > drivers/mmc/host/sdhci.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index 4e9ebc8..fb5983e 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -32,6 +32,7 @@ > #include <linux/mmc/slot-gpio.h> > > #include "sdhci.h" > +#include "cqhci.h" > > #define DRIVER_NAME "sdhci" > > @@ -2710,7 +2711,8 @@ static bool sdhci_request_done(struct sdhci_host *host) > > spin_unlock_irqrestore(&host->lock, flags); > > - mmc_request_done(host->mmc, mrq); > + if (!cqhci_virt_finalize_request(host->mmc, mrq)) > + mmc_request_done(host->mmc, mrq); Please add a sdhci_ops callback for request->done then: if (host->ops->request_done) host->ops->request_done(host, mrq); else mmc_request_done(host->mmc, mrq); > > return false; > } > @@ -3133,7 +3135,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) > > /* Process mrqs ready for immediate completion */ > for (i = 0; i < SDHCI_MAX_MRQS; i++) { > - if (mrqs_done[i]) > + if (mrqs_done[i] && > + !cqhci_virt_finalize_request(host->mmc, mrqs_done[i])) sdhci does not support calling mmc->ops->request in interrupt context. So probably, you should avoid immediate completion. > mmc_request_done(host->mmc, mrqs_done[i]); > } > >