diff options
-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; |