]> git.karo-electronics.de Git - karo-tx-linux.git/commit
mmc: mxcmmc: fix bug that may block a data transfer forever
authorJavier Martin <javier.martin@vista-silicon.com>
Fri, 7 Sep 2012 10:43:37 +0000 (10:43 +0000)
committerChris Ball <cjb@laptop.org>
Wed, 19 Sep 2012 08:30:00 +0000 (16:30 +0800)
commitfe6cac412f8cd6bb2736f4de8f15199c3d9dc375
tree7687b604144f7be7f40f2c23cddfdccd9c1a9545
parente44c35faea3200410d95051d95ef6a14925d9d51
mmc: mxcmmc: fix bug that may block a data transfer forever

The problem can be easily reproduced using a script that loops
copying a file in an SD card to another place in the same SD card
and its related to read transfers. This only happens with DMA enabled.

This is related to the fact that, when reading, an MMC irq signals
the fact that all data from the SD card has been copied to the
internal buffers. However, it doesn't signal whether the DMA transfer
that is in charge of moving data from these internal buffers to RAM
has finished or not. Thus, calling dmaengine_terminate_all() in the
MMC irq routine can cancel an ongoing DMA transfer leaving some data
in the internal buffers that produces an accumulative effect which,
in the end, blocks a read data transfer forever.

The following patch watches DMA irq for reading and MMC irqs for
writing transfers. The 'dangerous' usage of dmaengine_terminate_all()
is removed and a timeout of 10 seconds is added so that the MMC won't
block forever anymore.

Signed-off-by: Javier Martin <javier.martin@vista-silicon.com>
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/mxcmmc.c