From a71c0cc8fb1f3d3cf7a7bcdc42a5d4d2b46809c6 Mon Sep 17 00:00:00 2001 From: Shawn Lin <shawn.lin@rock-chips.com> Date: Fri, 22 May 2015 15:38:08 +0800 Subject: [PATCH] mmc: core: skyrocket timeout for cmd erase_group_xxx It shocked me that a buggy emmc need quite a long period of time for setting its erase_group_xxx. Increase timeout value does not harm to normal case which just under constrain. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> Tested-by: Yongzhong Yang <yongzhong.yang@rock-chips.com> cc: Xiao yao <xiaoyao@rock-chips.com> --- drivers/mmc/core/core.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 42f6b20d1c36..012de1e5aedc 100755 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -439,25 +439,31 @@ static void mmc_wait_for_req_done(struct mmc_host *host, u32 timeout = 0; if (!mrq->cmd->data) { - if (mrq->cmd->opcode == MMC_ERASE || (mrq->cmd->opcode == MMC_SEND_STATUS)) + 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; - if(!timeout) - timeout = 1000; - else if (timeout > 8 * 1000) + timeout = mrq->cmd->data->blocks * + mrq->cmd->data->blksz * 500; + + timeout = timeout ? timeout : 1000; + if (timeout > 8000) timeout = 8000; } while (1) { - if (!wait_for_completion_timeout(&mrq->completion, msecs_to_jiffies(timeout))) { + if (!wait_for_completion_timeout(&mrq->completion, + msecs_to_jiffies(timeout))) { 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); + dev_err(mmc_dev(host), + "req failed (CMD%u): error = %d, timeout = %dms\n", + cmd->opcode, cmd->error, timeout); if (!cmd->data) break; } -- 2.34.1