From 24bd8b95d9063ad4be0d484fb4e2a1956ea9977e Mon Sep 17 00:00:00 2001 From: Ritesh Harjani Date: Tue, 15 Sep 2015 19:21:32 +0530 Subject: [PATCH] mmc: cmdq_hci: Add retry mechanism for cmdq_halt Currently all functions which calls cmdq_halt relies upon HALT to pass other wise considers it as a FATAL error (like clk scaling). So add retry mechanism in halt - retry if halt completion timesout & HALT also did not complete(by doing register read). Change-Id: I59e199681e46085f804636f4c07249e6f21de1d5 Signed-off-by: Ritesh Harjani --- drivers/mmc/host/cmdq_hci.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index 021ba4cc4ec8..4e79db942a04 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -778,17 +778,27 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt) { struct cmdq_host *cq_host = (struct cmdq_host *)mmc_cmdq_private(mmc); u32 ret = 0; + int retries = 3; cmdq_runtime_pm_get(cq_host); if (halt) { - cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) | HALT, - CQCTL); - ret = wait_for_completion_timeout(&cq_host->halt_comp, + while (retries) { + cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) | HALT, + CQCTL); + ret = wait_for_completion_timeout(&cq_host->halt_comp, msecs_to_jiffies(HALT_TIMEOUT_MS)); - /* halt done: re-enable legacy interrupts */ - if (cq_host->ops->clear_set_irqs) - cq_host->ops->clear_set_irqs(mmc, false); - ret = ret ? 0 : -ETIMEDOUT; + if (!ret && !(cmdq_readl(cq_host, CQCTL) & HALT)) { + retries--; + continue; + } else { + /* halt done: re-enable legacy interrupts */ + if (cq_host->ops->clear_set_irqs) + cq_host->ops->clear_set_irqs(mmc, + false); + break; + } + } + return retries ? 0 : -ETIMEDOUT; } else { if (cq_host->ops->set_data_timeout) cq_host->ops->set_data_timeout(mmc, 0xf);