mmc: core: avoid recovery flow for tuning failure
authorShawn Lin <shawn.lin@rock-chips.com>
Wed, 17 Jun 2015 10:50:52 +0000 (18:50 +0800)
committerShawn Lin <shawn.lin@rock-chips.com>
Tue, 23 Jun 2015 01:36:43 +0000 (09:36 +0800)
  Communication scenario definitely should fail during
tuning procedure. Already does it reset controller, so
we don't need executing recovery for that case.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
drivers/mmc/core/core.c
drivers/mmc/host/rk_sdmmc.c

index 05b8eaf06d7267349d89479bc7f1a1ddc19c5aaa..4a337b16264435539decbba5efb40900335cd543 100755 (executable)
@@ -419,7 +419,7 @@ static void mmc_get_req_timeout(struct mmc_request *mrq, u32 *timeout)
                *timeout = 8000;
        else if ((mrq->cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200) ||
                 (mrq->cmd->opcode == MMC_SEND_TUNING_BLOCK))
-               *timeout = 30;
+               *timeout = 100;
 }
 
 
@@ -493,32 +493,6 @@ static int mmc_wait_for_data_req_done(struct mmc_host *host,
        return err;
 }
 
-static void mmc_get_req_timeout(struct mmc_request *mrq, u32 *timeout)
-{
-       if (!mrq->cmd->data) {
-               if (mrq->cmd->opcode == MMC_ERASE ||
-                   (mrq->cmd->opcode == MMC_ERASE_GROUP_START) ||
-                   (mrq->cmd->opcode == MMC_ERASE_GROUP_END) ||
-                   (mrq->cmd->opcode == MMC_SEND_STATUS))
-                       *timeout = 2500000;
-               else
-                       *timeout = 500;
-       } else {
-               *timeout = mrq->cmd->data->blocks *
-                       mrq->cmd->data->blksz * 500;
-               *timeout = (*timeout) ? (*timeout) : 1000;
-               if (*timeout > 8000)
-                       *timeout = 8000;
-       }
-
-       if ((mrq->cmd->opcode == SD_IO_RW_DIRECT) ||
-           (mrq->cmd->opcode == SD_IO_RW_EXTENDED))
-               *timeout = 8000;
-       else if ((mrq->cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200) ||
-                (mrq->cmd->opcode == MMC_SEND_TUNING_BLOCK))
-               *timeout = 100;
-}
-
 static void mmc_wait_for_req_done(struct mmc_host *host,
                                  struct mmc_request *mrq)
 {
@@ -533,6 +507,7 @@ static void mmc_wait_for_req_done(struct mmc_host *host,
                        cmd = mrq->cmd;
                        cmd->error = -ETIMEDOUT;
                        host->ops->post_tmo(host);
+
                        dev_err(mmc_dev(host),
                                "req failed (CMD%u): error = %d, timeout = %dms\n",
                                cmd->opcode, cmd->error, timeout);
index f2e4988ec823b22ad7011703694a4a5a7d640202..7f8012ead0cdd76d5e3bc94209b7f42b4e37cb2e 100755 (executable)
@@ -1960,13 +1960,19 @@ static void dw_mci_post_tmo(struct mmc_host *mmc)
        u32 sdio_int;
        unsigned long timeout = 0;
        bool ret_timeout = true;
+       u32 opcode;
 
+       opcode = host->mrq->cmd->opcode;
        host->cur_slot->mrq = NULL;
        host->mrq = NULL;
        host->state = STATE_IDLE;
 
        data = host->data;
 
+       if ((opcode == MMC_SEND_TUNING_BLOCK_HS200) &&
+           (opcode == MMC_SEND_TUNING_BLOCK))
+           return;
+
        printk("[%s] -- Timeout recovery procedure start --\n",
                mmc_hostname(host->mmc));