summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorFabien Parent <fparent@baylibre.com>2019-01-17 20:06:00 +0300
committerTom Rini <trini@konsulko.com>2019-01-26 16:13:54 +0300
commit924ed344a759f2d699ee397600af13363425ae90 (patch)
tree0c5f868bd2b0f69dda04add44770a971c0457c9c /drivers
parent246fb9dd9c12f365bf3041547f2c4894dad4f1ab (diff)
downloadu-boot-924ed344a759f2d699ee397600af13363425ae90.tar.xz
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/mtk-sd.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/mmc/mtk-sd.c b/drivers/mmc/mtk-sd.c
index 0741a525c0..e668df7017 100644
--- a/drivers/mmc/mtk-sd.c
+++ b/drivers/mmc/mtk-sd.c
@@ -554,6 +554,14 @@ static int msdc_pio_read(struct msdc_host *host, u8 *ptr, u32 size)
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 (size) {
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;
}
-
- 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;
}