diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2018-12-04 14:02:35 +0100 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2019-01-28 13:16:35 +0100 |
commit | 9190213486803d4b9926d18a6dd156e6356b95fb (patch) | |
tree | 19f1f7ce9c770ae47c25c555b222d54e852c90dd | |
parent | a5511c25e0ee155e075ccfd891c24a00c141a1c8 (diff) |
mmc: mmci: Test stop command to abort a data transferdebug_mmci_abort_no_stop
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r-- | drivers/mmc/host/mmci.c | 20 | ||||
-rw-r--r-- | drivers/mmc/host/mmci.h | 2 |
2 files changed, 21 insertions, 1 deletions
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index e352f5ad5801..2dd891578afb 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -453,6 +453,8 @@ void mmci_dma_release(struct mmci_host *host) void mmci_dma_setup(struct mmci_host *host) { + return; + if (!host->ops || !host->ops->dma_setup) return; @@ -1198,8 +1200,13 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data, if (!data->stop || (host->mrq->sbc && !data->error)) mmci_request_end(host, data->mrq); - else + else { + if (host->mrq->sbc && data->error && host->fake_data_err) { + host->fake_data_err = 0; + dev_err(mmc_dev(host->mmc), "******** send STOP\n"); + } mmci_start_command(host, data->stop, 0); + } } } @@ -1421,6 +1428,8 @@ static irqreturn_t mmci_pio_irq(int irq, void *dev_id) void __iomem *base = host->base; u32 status; + static int fake_err_count = 0; + status = readl(base + MMCISTATUS); dev_dbg(mmc_dev(host->mmc), "irq1 (pio) %08x\n", status); @@ -1429,6 +1438,8 @@ static irqreturn_t mmci_pio_irq(int irq, void *dev_id) unsigned int remain, len; char *buffer; + fake_err_count++; + /* * For write, we only need to test the half-empty flag * here - if the FIFO is completely empty, then by @@ -1442,6 +1453,13 @@ static irqreturn_t mmci_pio_irq(int irq, void *dev_id) if (!sg_miter_next(sg_miter)) break; + if (fake_err_count % 1000 == 0) { + dev_err(mmc_dev(host->mmc), "******* fake_err_count %u\n", fake_err_count); + host->data->error = -ETIMEDOUT; + host->fake_data_err = 1; + break; + } + buffer = sg_miter->addr; remain = sg_miter->length; diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h index 24229097d05c..b1c9a53245b0 100644 --- a/drivers/mmc/host/mmci.h +++ b/drivers/mmc/host/mmci.h @@ -382,6 +382,8 @@ struct mmci_host { struct clk *clk; u8 singleirq:1; + u32 fake_data_err; + struct reset_control *rst; spinlock_t lock; |