On Fri, 2012-09-07 at 12:43 +0200, Javier Martin wrote: > > 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. For a normal transactions why should you call dmaengine_terminate_all(). This should be called when you doing abort or cleanup in some erranous situation. why was it called in first place? -- ~Vinod -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html