[PATCH 7/8] dmaengine/dw_dmac: Unmap all memory buffers after completion of slave transfers
From: Russell King - ARM Linux <hidden>
Date: 2012-01-16 10:55:17
Also in:
lkml
From: Russell King - ARM Linux <hidden>
Date: 2012-01-16 10:55:17
Also in:
lkml
On Mon, Jan 16, 2012 at 03:20:35PM +0530, Viresh Kumar wrote:
Currently, after completion of transfer, source address or destination address of only the first LLI descriptor is unmapped. And length passed for unmap is total length of all descriptors in the list. Which means unmapping code assumed that the memory buffers pointed to by the descriptors will be physically contiguous, which might not be the case. It is possible for other drivers to pass sglist to slave_sg(), in which all buffers are scattered throughout the memory. This patch intends to fix this wrong expectation of dw_dmac. Now, first desc will not contain total length of transfer. But individual descriptors will contain their individual lengths. Finally, we will call unmap for all descriptors.
Note that DMA engine drivers are not responsible for unmapping the buffers when the transfer completes - that is the responsibility of the caller. The automatic buffer unmapping is required for the async_tx APIs and offload APIs.