On 06/12/2013 10:39 PM, Mark Brown wrote:
On Wed, Jun 12, 2013 at 02:15:24PM +0200, Lars-Peter Clausen wrote:
On 06/12/2013 09:43 AM, Vinod Koul wrote:
Yes you need to call dmaengine_terminate_all(). But even then we might have trasaction in flight or some dma controllers cant abort immediately (need to wait till FIFOs are flushed etc). In general it is a good practice to call dma_sync_wait() before you tear down the client. If you still see an issue, then it a buggy driver :)
Even though if the driver can't abort the transfer immediately, I'd still expect to not see any calls to the descriptors callback after dmaengine_terminate_all() has been called.
It'd certainly be much less surprising - if something's terminated it really oughtn't to be generating callbacks.
We should probably still call dma_sync_wait() though before we free any of the DMA transfer buffers. But I guess this will open a whole new can of bugs, since none of the drivers actually seem to mark a descriptor as completed if the transfer is aborted using dmaengine_terminate_all()
Oh joy.
Mark, Lars, Vinod
Indeed it's a DMA handling issue, and I'm preparing to implement a proper handling in DMA driver. thanks a lot for these suggestions.