Commit e28d9155 authored by Alexandru Ardelean's avatar Alexandru Ardelean Committed by Vinod Koul

dmaengine: axi-dmac: terminate early DMA transfers after a partial one

When a partial transfer is received, the driver should not submit any more
segments to the hardware, as they will be ignored/unused until a new
transfer start operation is done.

This change implements this by adding a new flag on the AXI DMAC
descriptor. This flags is set to true, if there was a partial transfer in
a previously completed segment. When that flag is true, the TLAST flag is
added to the to the submitted segment, signaling the controller to stop
receiving more segments.
Signed-off-by: default avatarAlexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent e3923592
...@@ -96,6 +96,7 @@ struct axi_dmac_sg { ...@@ -96,6 +96,7 @@ struct axi_dmac_sg {
struct axi_dmac_desc { struct axi_dmac_desc {
struct virt_dma_desc vdesc; struct virt_dma_desc vdesc;
bool cyclic; bool cyclic;
bool have_partial_xfer;
unsigned int num_submitted; unsigned int num_submitted;
unsigned int num_completed; unsigned int num_completed;
...@@ -220,7 +221,8 @@ static void axi_dmac_start_transfer(struct axi_dmac_chan *chan) ...@@ -220,7 +221,8 @@ static void axi_dmac_start_transfer(struct axi_dmac_chan *chan)
} }
desc->num_submitted++; desc->num_submitted++;
if (desc->num_submitted == desc->num_sgs) { if (desc->num_submitted == desc->num_sgs ||
desc->have_partial_xfer) {
if (desc->cyclic) if (desc->cyclic)
desc->num_submitted = 0; /* Start again */ desc->num_submitted = 0; /* Start again */
else else
...@@ -294,6 +296,7 @@ static void axi_dmac_dequeue_partial_xfers(struct axi_dmac_chan *chan) ...@@ -294,6 +296,7 @@ static void axi_dmac_dequeue_partial_xfers(struct axi_dmac_chan *chan)
if (sg->id == AXI_DMAC_SG_UNUSED) if (sg->id == AXI_DMAC_SG_UNUSED)
continue; continue;
if (sg->id == id) { if (sg->id == id) {
desc->have_partial_xfer = true;
sg->partial_len = len; sg->partial_len = len;
found_sg = true; found_sg = true;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment