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

Commit 763480e5 authored by Asutosh Das's avatar Asutosh Das Committed by Matt Wagantall
Browse files

mmc: sdhci: propagate error to command queue engine



eMMC controller detects error, generates error interrupt and
notifies the CQE. Hence, parse the correct error and propagate
it to CQE handler for further processing.

Command queue interrupt handler may return IRQ_NONE
or IRQ_HANDLED. Check for the return value and either
proceed or return from handler.

Change-Id: I29c7b22848d3d728a79ba215f8d2f594d19fba63
Signed-off-by: default avatarAsutosh Das <asutoshd@codeaurora.org>
Signed-off-by: default avatarVenkat Gopalakrishnan <venkatg@codeaurora.org>
parent f3b653b1
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -2929,9 +2929,37 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
}

#ifdef CONFIG_MMC_CQ_HCI
static int sdhci_get_cmd_err(u32 intmask)
{
	if (intmask & SDHCI_INT_TIMEOUT)
		return -ETIMEDOUT;
	else if (intmask & (SDHCI_INT_CRC | SDHCI_INT_END_BIT |
			    SDHCI_INT_INDEX))
		return -EILSEQ;
	return 0;
}

static int sdhci_get_data_err(u32 intmask)
{
	if (intmask & SDHCI_INT_DATA_TIMEOUT)
		return -ETIMEDOUT;
	else if (intmask & (SDHCI_INT_DATA_END_BIT | SDHCI_INT_DATA_CRC))
		return -EILSEQ;
	else if (intmask & SDHCI_INT_ADMA_ERROR)
		return -EIO;
	return 0;
}

static irqreturn_t sdhci_cmdq_irq(struct mmc_host *mmc, u32 intmask)
{
	return cmdq_irq(mmc, intmask);
	int err = 0;

	if (intmask & SDHCI_INT_CMD_MASK)
		err = sdhci_get_cmd_err(intmask);
	else if (intmask & SDHCI_INT_DATA_MASK)
		err = sdhci_get_data_err(intmask);

	return cmdq_irq(mmc, err);
}

#else
@@ -2969,6 +2997,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
					mmc_hostname(host->mmc),
					intmask);
			result = sdhci_cmdq_irq(host->mmc, intmask);
			if (result == IRQ_HANDLED)
				goto out;
		}