dmaengine: xilinx: Fix race condition in axi dma cyclic dma mode
authorKedareswara rao Appana <appana.durga.rao@xilinx.com>
Sat, 9 Jul 2016 08:39:48 +0000 (14:09 +0530)
committerVinod Koul <vinod.koul@intel.com>
Tue, 12 Jul 2016 04:31:36 +0000 (10:01 +0530)
In cyclic DMA mode need to link the tail bd segment
with the head bd segment to process bd's in cyclic.

Current driver is doing this only for tx channel
needs to update the same for rx channel case also.

This patch fixes the same.

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/xilinx/xilinx_dma.c

index cf47347a1bc6b947b1f3cca2d78fa26ab54835bd..4e223d09443371cfdaccd797725377631f83c333 100644 (file)
@@ -1895,14 +1895,15 @@ static struct dma_async_tx_descriptor *xilinx_dma_prep_dma_cyclic(
        reg |= XILINX_DMA_CR_CYCLIC_BD_EN_MASK;
        dma_ctrl_write(chan, XILINX_DMA_REG_DMACR, reg);
 
+       segment = list_last_entry(&desc->segments,
+                                 struct xilinx_axidma_tx_segment,
+                                 node);
+       segment->hw.next_desc = (u32) head_segment->phys;
+
        /* For the last DMA_MEM_TO_DEV transfer, set EOP */
        if (direction == DMA_MEM_TO_DEV) {
                head_segment->hw.control |= XILINX_DMA_BD_SOP;
-               segment = list_last_entry(&desc->segments,
-                                         struct xilinx_axidma_tx_segment,
-                                         node);
                segment->hw.control |= XILINX_DMA_BD_EOP;
-               segment->hw.next_desc = (u32) head_segment->phys;
        }
 
        return &desc->async_tx;