Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69e71d4f authored by Ritesh Harjani's avatar Ritesh Harjani Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarRitesh Harjani <riteshh@codeaurora.org>
parent 1838c9d2
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -784,17 +784,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) {
		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));
			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);
		ret = ret ? 0 : -ETIMEDOUT;
					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);