lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 509/862] dmaengine: hisilicon: Fix CQ head update
    Date
    From: Jie Hai <haijie1@huawei.com>

    [ 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@huawei.com>
    Acked-by: Zhou Wang <wangzhou1@hisilicon.com>
    Link: https://lore.kernel.org/r/20220830062251.52993-3-haijie1@huawei.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/dma/hisi_dma.c | 8 +++-----
    1 file changed, 3 insertions(+), 5 deletions(-)

    diff --git a/drivers/dma/hisi_dma.c b/drivers/dma/hisi_dma.c
    index 98bc488893cc..837f7e4adfa6 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");
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:14    [W:2.417 / U:0.584 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site