ARM: 7230/1: mmc: mmci: Fix PIO read for small SDIO packets
Corrects a bug in MMCI host driver which silently causes small reads (< 4 bytes as only used in SDIO) from PL-18X to fail. Signed-off-by: Stefan Nilsson XK <stefan.xk.nilsson@stericsson.com> Signed-off-by: Ulf Hansson <ulf.hansson@stericsson.com> Signed-off-by: Fredrik Soderstedt <fredrik.soderstedt@stericsson.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
7258db7efe
commit
393e5e2416
|
@ -794,7 +794,24 @@ static int mmci_pio_read(struct mmci_host *host, char *buffer, unsigned int rema
|
|||
if (count <= 0)
|
||||
break;
|
||||
|
||||
readsl(base + MMCIFIFO, ptr, count >> 2);
|
||||
/*
|
||||
* SDIO especially may want to send something that is
|
||||
* not divisible by 4 (as opposed to card sectors
|
||||
* etc). Therefore make sure to always read the last bytes
|
||||
* while only doing full 32-bit reads towards the FIFO.
|
||||
*/
|
||||
if (unlikely(count & 0x3)) {
|
||||
if (count < 4) {
|
||||
unsigned char buf[4];
|
||||
readsl(base + MMCIFIFO, buf, 1);
|
||||
memcpy(ptr, buf, count);
|
||||
} else {
|
||||
readsl(base + MMCIFIFO, ptr, count >> 2);
|
||||
count &= ~0x3;
|
||||
}
|
||||
} else {
|
||||
readsl(base + MMCIFIFO, ptr, count >> 2);
|
||||
}
|
||||
|
||||
ptr += count;
|
||||
remain -= count;
|
||||
|
|
Loading…
Reference in a new issue