mmc: mtk-sd: fix possible incomplete read ops

The code is checking for incomplete read when it see the INT_XFER_COMPL
flag, but it forget to first check whether there is anything left in the
FIFO to copy to the RX buffer. This means that sometimes we will get
errors because of erroneous incomplete read operation.

This commit fixes the driver re-ordering the code so that we first
check for data inside the RX fifo and only after check the status
of the INT_XFER_COMPL flag.

Signed-off-by: Fabien Parent <fparent@baylibre.com>
This commit is contained in:
Fabien Parent 2019-01-17 18:06:00 +01:00 committed by Tom Rini
parent 246fb9dd9c
commit 924ed344a7

View File

@ -554,6 +554,14 @@ static int msdc_pio_read(struct msdc_host *host, u8 *ptr, u32 size)
break; break;
} }
chksz = min(size, (u32)MSDC_FIFO_SIZE);
if (msdc_fifo_rx_bytes(host) >= chksz) {
msdc_fifo_read(host, ptr, chksz);
ptr += chksz;
size -= chksz;
}
if (status & MSDC_INT_XFER_COMPL) { if (status & MSDC_INT_XFER_COMPL) {
if (size) { if (size) {
pr_err("data not fully read\n"); pr_err("data not fully read\n");
@ -562,15 +570,7 @@ static int msdc_pio_read(struct msdc_host *host, u8 *ptr, u32 size)
break; break;
} }
}
chksz = min(size, (u32)MSDC_FIFO_SIZE);
if (msdc_fifo_rx_bytes(host) >= chksz) {
msdc_fifo_read(host, ptr, chksz);
ptr += chksz;
size -= chksz;
}
}
return ret; return ret;
} }