dmaengine: virt-dma: store result on dma descriptor
authorAlexandru Ardelean <alexandru.ardelean@analog.com>
Thu, 6 Jun 2019 10:45:47 +0000 (13:45 +0300)
committerVinod Koul <vkoul@kernel.org>
Fri, 14 Jun 2019 05:52:43 +0000 (11:22 +0530)
This allows each virtual channel to store information about each transfer
that completed, i.e. which transfer succeeded (or which failed) and if
there was any residue data on each (completed) transfer.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/virt-dma.c
drivers/dma/virt-dma.h

index 88ad8ed2a8d6d32c82193b70580784461e441293..bf560a20c8a8d62e83a5bb17138eb014336378cc 100644 (file)
@@ -101,7 +101,7 @@ static void vchan_complete(unsigned long arg)
        }
        spin_unlock_irq(&vc->lock);
 
-       dmaengine_desc_callback_invoke(&cb, NULL);
+       dmaengine_desc_callback_invoke(&cb, &vd->tx_result);
 
        list_for_each_entry_safe(vd, _vd, &head, node) {
                dmaengine_desc_get_callback(&vd->tx, &cb);
@@ -109,7 +109,7 @@ static void vchan_complete(unsigned long arg)
                list_del(&vd->node);
                vchan_vdesc_fini(vd);
 
-               dmaengine_desc_callback_invoke(&cb, NULL);
+               dmaengine_desc_callback_invoke(&cb, &vd->tx_result);
        }
 }
 
index b09b75ab07518ebda2791c787e002a6f3f3bd311..eb767c583b7e4ec0d7e69158f6eee4656e0a46c2 100644 (file)
@@ -17,6 +17,7 @@
 
 struct virt_dma_desc {
        struct dma_async_tx_descriptor tx;
+       struct dmaengine_result tx_result;
        /* protected by vc.lock */
        struct list_head node;
 };
@@ -65,6 +66,9 @@ static inline struct dma_async_tx_descriptor *vchan_tx_prep(struct virt_dma_chan
        vd->tx.tx_submit = vchan_tx_submit;
        vd->tx.desc_free = vchan_tx_desc_free;
 
+       vd->tx_result.result = DMA_TRANS_NOERROR;
+       vd->tx_result.residue = 0;
+
        spin_lock_irqsave(&vc->lock, flags);
        list_add_tail(&vd->node, &vc->desc_allocated);
        spin_unlock_irqrestore(&vc->lock, flags);