}
 
        if (!sbc_error && !(events & MSDC_INT_CMDRDY)) {
-               msdc_reset_hw(host);
+               if (cmd->opcode != MMC_SEND_TUNING_BLOCK &&
+                   cmd->opcode != MMC_SEND_TUNING_BLOCK_HS200)
+                       /*
+                        * should not clear fifo/interrupt as the tune data
+                        * may have alreay come.
+                        */
+                       msdc_reset_hw(host);
                if (events & MSDC_INT_RSPCRCERR) {
                        cmd->error = -EILSEQ;
                        host->error |= REQ_CMD_EIO;
 static void msdc_cmd_next(struct msdc_host *host,
                struct mmc_request *mrq, struct mmc_command *cmd)
 {
-       if (cmd->error || (mrq->sbc && mrq->sbc->error))
+       if ((cmd->error &&
+           !(cmd->error == -EILSEQ &&
+             (cmd->opcode == MMC_SEND_TUNING_BLOCK ||
+              cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200))) ||
+           (mrq->sbc && mrq->sbc->error))
                msdc_request_done(host, mrq);
        else if (cmd == mrq->sbc)
                msdc_start_command(host, mrq, mrq->cmd);