lkml.org 
[lkml]   [2019]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 13/41] dmaengine: sh: rcar-dmac: With cyclic DMA residue 0 is valid
    Date
    From: Dirk Behme <dirk.behme@de.bosch.com>

    commit 907bd68a2edc491849e2fdcfe52c4596627bca94 upstream.

    Having a cyclic DMA, a residue 0 is not an indication of a completed
    DMA. In case of cyclic DMA make sure that dma_set_residue() is called
    and with this a residue of 0 is forwarded correctly to the caller.

    Fixes: 3544d2878817 ("dmaengine: rcar-dmac: use result of updated get_residue in tx_status")
    Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
    Signed-off-by: Achim Dahlhoff <Achim.Dahlhoff@de.bosch.com>
    Signed-off-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
    Signed-off-by: Yao Lihua <ylhuajnu@outlook.com>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Cc: <stable@vger.kernel.org> # v4.8+
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/dma/sh/rcar-dmac.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    --- a/drivers/dma/sh/rcar-dmac.c
    +++ b/drivers/dma/sh/rcar-dmac.c
    @@ -1311,6 +1311,7 @@ static enum dma_status rcar_dmac_tx_stat
    enum dma_status status;
    unsigned long flags;
    unsigned int residue;
    + bool cyclic;

    status = dma_cookie_status(chan, cookie, txstate);
    if (status == DMA_COMPLETE || !txstate)
    @@ -1318,10 +1319,11 @@ static enum dma_status rcar_dmac_tx_stat

    spin_lock_irqsave(&rchan->lock, flags);
    residue = rcar_dmac_chan_get_residue(rchan, cookie);
    + cyclic = rchan->desc.running ? rchan->desc.running->cyclic : false;
    spin_unlock_irqrestore(&rchan->lock, flags);

    /* if there's no residue, the cookie is complete */
    - if (!residue)
    + if (!residue && !cyclic)
    return DMA_COMPLETE;

    dma_set_residue(txstate, residue);

    \
     
     \ /
      Last update: 2019-04-30 14:09    [W:4.097 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site