mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user