aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2018-12-04 14:02:35 +0100
committerUlf Hansson <ulf.hansson@linaro.org>2019-01-28 13:16:35 +0100
commit9190213486803d4b9926d18a6dd156e6356b95fb (patch)
tree19f1f7ce9c770ae47c25c555b222d54e852c90dd
parenta5511c25e0ee155e075ccfd891c24a00c141a1c8 (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.c20
-rw-r--r--drivers/mmc/host/mmci.h2
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;