From 21f6d336852a942547ddb218f50ce49c6abb8eaf Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Wed, 19 Nov 2008 17:11:18 +0000 Subject: fix-mmc-busy-loop-on-bytes.patch christer-mmc-byte-alignment.patch reduced the FIFO I/O granularity from words to bytes. This also includes the decision when the FIFO is empty or full. However, we sometimes only want to transfer full words, in which case do_pio_read/do_pio_write busy-loop until the FIFO has filled up or drained enough. In the case of do_pio_write, this can cause an endless loop if the amount of data exceeds the FIFO size, because do_pio_write runs before the transfer is initiated, so the FIFO never drains. Signed-off-by: Werner Almesberger --- drivers/mmc/host/s3cmci.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'drivers/mmc') diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index 2038c93cfd9..bf4df3a82f8 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c @@ -289,8 +289,11 @@ static void do_pio_read(struct s3cmci_host *host) * an even multiple of 4. */ if (fifo >= host->pio_bytes) fifo = host->pio_bytes; - else + else { fifo -= fifo & 3; + if (!fifo) + break; + } host->pio_bytes -= fifo; host->pio_count += fifo; @@ -362,8 +365,11 @@ static void do_pio_write(struct s3cmci_host *host) * words, so round down to an even multiple of 4. */ if (fifo >= host->pio_bytes) fifo = host->pio_bytes; - else + else { fifo -= fifo & 3; + if (!fifo) + break; + } host->pio_bytes -= fifo; host->pio_count += fifo; -- cgit v1.2.3