Hi Chris, Could you merge this patch in your tree. We've verified. Thanks, Seungwon Jeon On Tuesday, January 22, 2013, Kyoungil Kim wrote: > In dwc manual, the below contents are described. > "During end of packet, interrupt is not generated if threshold > programming is larger than any remaining data. It is responsibility > of host to read remaining bytes on seeing Data Transfer Done > interrupt" > We also have seen the data cannot be read fully > when "sg_miter->length" is less than FIFO size. > > Signed-off-by: Kyoungil Kim <ki0351.kim@xxxxxxxxxxx> > Signed-off-by: Seungwon Jeon <tgih.jun@xxxxxxxxxxx> > Acked-by: Jaehoon Chung <jh80.chung@xxxxxxxxxxx> > --- > drivers/mmc/host/dw_mmc.c | 10 ++++++---- > 1 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 323c502..41d59da 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -1430,7 +1430,7 @@ static void dw_mci_pull_data(struct dw_mci *host, void *buf, int cnt) > host->pull_data(host, buf, cnt); > } > > -static void dw_mci_read_data_pio(struct dw_mci *host) > +static void dw_mci_read_data_pio(struct dw_mci *host, bool dto) > { > struct sg_mapping_iter *sg_miter = &host->sg_miter; > void *buf; > @@ -1465,7 +1465,9 @@ static void dw_mci_read_data_pio(struct dw_mci *host) > sg_miter->consumed = offset; > status = mci_readl(host, MINTSTS); > mci_writel(host, RINTSTS, SDMMC_INT_RXDR); > - } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ > + /* if the RXDR is ready read again */ > + } while ((status & SDMMC_INT_RXDR) || > + (dto && SDMMC_GET_FCNT(mci_readl(host, STATUS)))); > data->bytes_xfered += nbytes; > > if (!remain) { > @@ -1597,7 +1599,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) > smp_wmb(); > if (host->dir_status == DW_MCI_RECV_STATUS) { > if (host->sg != NULL) > - dw_mci_read_data_pio(host); > + dw_mci_read_data_pio(host, true); > } > set_bit(EVENT_DATA_COMPLETE, &host->pending_events); > tasklet_schedule(&host->tasklet); > @@ -1606,7 +1608,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) > if (pending & SDMMC_INT_RXDR) { > mci_writel(host, RINTSTS, SDMMC_INT_RXDR); > if (host->dir_status == DW_MCI_RECV_STATUS && host->sg) > - dw_mci_read_data_pio(host); > + dw_mci_read_data_pio(host, false); > } > > if (pending & SDMMC_INT_TXDR) { > -- > 1.7.4.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html