Hi Uffe and Adrian, Actually I'm not very sure that software CMD12 won't be sent for data error of multiple blocks r/w command with AUTO CMD12. I will appreciate your help to review changes and confirm. Thanks a lot. Best regards, Yangbo Lu > -----Original Message----- > From: Yangbo Lu <yangbo.lu@xxxxxxx> > Sent: Thursday, November 14, 2019 7:18 PM > To: linux-mmc@xxxxxxxxxxxxxxx; Ulf Hansson <ulf.hansson@xxxxxxxxxx>; Adrian > Hunter <adrian.hunter@xxxxxxxxx> > Cc: Y.b. Lu <yangbo.lu@xxxxxxx> > Subject: [PATCH] mmc: sdhci: fix up CMD12 sending > > The STOP command is disabled for multiple blocks r/w commands with auto > CMD12, when start to send. However, if there is data error, software still needs > to send CMD12 according to SD spec. > This patch is to allow software CMD12 sending for this case. > > Signed-off-by: Yangbo Lu <yangbo.lu@xxxxxxx> > --- > drivers/mmc/host/sdhci.c | 17 +++-------------- > 1 file changed, 3 insertions(+), 14 deletions(-) > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index > 09cdbe8..3041c39 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -1326,12 +1326,12 @@ static void sdhci_finish_data(struct sdhci_host > *host) > > /* > * Need to send CMD12 if - > - * a) open-ended multiblock transfer (no CMD23) > + * a) open-ended multiblock transfer not using auto CMD12 (no CMD23) > * b) error in multiblock transfer > */ > if (data->stop && > - (data->error || > - !data->mrq->sbc)) { > + ((!data->mrq->sbc && !sdhci_auto_cmd12(host, data->mrq)) || > + data->error)) { > /* > * 'cap_cmd_during_tfr' request must not use the command line > * after mmc_command_done() has been called. It is upper layer's > @@ -1825,17 +1825,6 @@ void sdhci_request(struct mmc_host *mmc, struct > mmc_request *mrq) > > sdhci_led_activate(host); > > - /* > - * Ensure we don't send the STOP for non-SET_BLOCK_COUNTED > - * requests if Auto-CMD12 is enabled. > - */ > - if (sdhci_auto_cmd12(host, mrq)) { > - if (mrq->stop) { > - mrq->data->stop = NULL; > - mrq->stop = NULL; > - } > - } > - > if (!present || host->flags & SDHCI_DEVICE_DEAD) { > mrq->cmd->error = -ENOMEDIUM; > sdhci_finish_mrq(host, mrq); > -- > 2.7.4