dmaengine: ptdma: handle the cases based on DMA is complete
authorSanjay R Mehta <sanju.mehta@amd.com>
Wed, 2 Feb 2022 15:14:40 +0000 (09:14 -0600)
committerVinod Koul <vkoul@kernel.org>
Tue, 15 Feb 2022 05:24:54 +0000 (10:54 +0530)
There is a need to segregate the cases when DMA is complete or not.
In case if DMA is already complete there is no need to handle it
again and gracefully exit from the function.

Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
Link: https://lore.kernel.org/r/1643814880-3882-3-git-send-email-Sanju.Mehta@amd.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ptdma/ptdma-dmaengine.c

index e38dca42239121b30f7f9f2dc7d57ea91f4720d5..91b93e8d97799c93eaa2b5bd22c9a737d2e59f42 100644 (file)
@@ -100,12 +100,17 @@ static struct pt_dma_desc *pt_handle_active_desc(struct pt_dma_chan *chan,
                spin_lock_irqsave(&chan->vc.lock, flags);
 
                if (desc) {
-                       if (desc->status != DMA_ERROR)
-                               desc->status = DMA_COMPLETE;
-
-                       dma_cookie_complete(tx_desc);
-                       dma_descriptor_unmap(tx_desc);
-                       list_del(&desc->vd.node);
+                       if (desc->status != DMA_COMPLETE) {
+                               if (desc->status != DMA_ERROR)
+                                       desc->status = DMA_COMPLETE;
+
+                               dma_cookie_complete(tx_desc);
+                               dma_descriptor_unmap(tx_desc);
+                               list_del(&desc->vd.node);
+                       } else {
+                               /* Don't handle it twice */
+                               tx_desc = NULL;
+                       }
                }
 
                desc = pt_next_dma_desc(chan);