From 1081e2ee8cda1a9c85dfe262136b8c1699e2a375 Mon Sep 17 00:00:00 2001 From: James Hogan Date: Wed, 29 Jun 2011 09:29:58 +0100 Subject: [PATCH] --- yaml --- r: 255205 b: refs/heads/master c: 55c5efbc0dbcb20b7f0d264d172ab376494d79a1 h: refs/heads/master i: 255203: b92b1568bbe8288104ec29bf9f668c1781394131 v: v3 --- [refs] | 2 +- trunk/drivers/mmc/host/dw_mmc.c | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index cd4eda956f9e..bebddefd9408 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ae837fe6ddb1e4e9238191629baa08c35ed4a6bb +refs/heads/master: 55c5efbc0dbcb20b7f0d264d172ab376494d79a1 diff --git a/trunk/drivers/mmc/host/dw_mmc.c b/trunk/drivers/mmc/host/dw_mmc.c index bf2157a0e511..0dac397f37fd 100644 --- a/trunk/drivers/mmc/host/dw_mmc.c +++ b/trunk/drivers/mmc/host/dw_mmc.c @@ -496,15 +496,16 @@ static void dw_mci_submit_data(struct dw_mci *host, struct mmc_data *data) host->sg = NULL; host->data = data; + if (data->flags & MMC_DATA_READ) + host->dir_status = DW_MCI_RECV_STATUS; + else + host->dir_status = DW_MCI_SEND_STATUS; + if (dw_mci_submit_data_dma(host, data)) { host->sg = data->sg; host->pio_offset = 0; host->part_buf_start = 0; host->part_buf_count = 0; - if (data->flags & MMC_DATA_READ) - host->dir_status = DW_MCI_RECV_STATUS; - else - host->dir_status = DW_MCI_SEND_STATUS; mci_writel(host, RINTSTS, SDMMC_INT_TXDR | SDMMC_INT_RXDR); temp = mci_readl(host, INTMASK); @@ -911,6 +912,16 @@ static void dw_mci_tasklet_func(unsigned long priv) data->error = -ETIMEDOUT; } else if (status & SDMMC_INT_DCRC) { data->error = -EILSEQ; + } else if (status & SDMMC_INT_EBE && + host->dir_status == + DW_MCI_SEND_STATUS) { + /* + * No data CRC status was returned. + * The number of bytes transferred will + * be exaggerated in PIO mode. + */ + data->bytes_xfered = 0; + data->error = -ETIMEDOUT; } else { dev_err(&host->pdev->dev, "data FIFO error "