Patch "dmaengine: hisilicon: Fix CQ head update" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    dmaengine: hisilicon: Fix CQ head update

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     dmaengine-hisilicon-fix-cq-head-update.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b7a102b549ee34aff14a404f8ab1b7dbd3216954
Author: Jie Hai <haijie1@xxxxxxxxxx>
Date:   Tue Aug 30 14:22:46 2022 +0800

    dmaengine: hisilicon: Fix CQ head update
    
    [ Upstream commit 94477a79cf80e8ab55b68f14bc579a12ddea1e0b ]
    
    After completion of data transfer of one or multiple descriptors,
    the completion status and the current head pointer to submission
    queue are written into the CQ and interrupt can be generated to
    inform the software. In interrupt process CQ is read and cq_head
    is updated.
    
    hisi_dma_irq updates cq_head only when the completion status is
    success. When an abnormal interrupt reports, cq_head will not update
    which will cause subsequent interrupt processes read the error CQ
    and never report the correct status.
    
    This patch updates cq_head whenever CQ is accessed.
    
    Fixes: e9f08b65250d ("dmaengine: hisilicon: Add Kunpeng DMA engine support")
    Signed-off-by: Jie Hai <haijie1@xxxxxxxxxx>
    Acked-by: Zhou Wang <wangzhou1@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20220830062251.52993-3-haijie1@xxxxxxxxxx
    Signed-off-by: Vinod Koul <vkoul@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/dma/hisi_dma.c b/drivers/dma/hisi_dma.c
index 70a0d784a6a3..9e6ce3731ca5 100644
--- a/drivers/dma/hisi_dma.c
+++ b/drivers/dma/hisi_dma.c
@@ -436,12 +436,10 @@ static irqreturn_t hisi_dma_irq(int irq, void *data)
 	desc = chan->desc;
 	cqe = chan->cq + chan->cq_head;
 	if (desc) {
+		chan->cq_head = (chan->cq_head + 1) % hdma_dev->chan_depth;
+		hisi_dma_chan_write(hdma_dev->base, HISI_DMA_CQ_HEAD_PTR,
+				    chan->qp_num, chan->cq_head);
 		if (FIELD_GET(STATUS_MASK, cqe->w0) == STATUS_SUCC) {
-			chan->cq_head = (chan->cq_head + 1) %
-					hdma_dev->chan_depth;
-			hisi_dma_chan_write(hdma_dev->base,
-					    HISI_DMA_CQ_HEAD_PTR, chan->qp_num,
-					    chan->cq_head);
 			vchan_cookie_complete(&desc->vd);
 		} else {
 			dev_err(&hdma_dev->pdev->dev, "task error!\n");



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux