lkml.org 
[lkml]   [2019]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 01/42] ARM: riscpc: fix DMA
    Date
    [ Upstream commit ffd9a1ba9fdb7f2bd1d1ad9b9243d34e96756ba2 ]

    DMA got broken a while back in two different ways:
    1) a change in the behaviour of disable_irq() to wait for the interrupt
    to finish executing causes us to deadlock at the end of DMA.
    2) a change to avoid modifying the scatterlist left the first transfer
    uninitialised.

    DMA is only used with expansion cards, so has gone unnoticed.

    Fixes: fa4e99899932 ("[ARM] dma: RiscPC: don't modify DMA SG entries")
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/mach-rpc/dma.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c
    index 6d3517dc4772a..82aac38fa2cff 100644
    --- a/arch/arm/mach-rpc/dma.c
    +++ b/arch/arm/mach-rpc/dma.c
    @@ -131,7 +131,7 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
    } while (1);

    idma->state = ~DMA_ST_AB;
    - disable_irq(irq);
    + disable_irq_nosync(irq);

    return IRQ_HANDLED;
    }
    @@ -174,6 +174,9 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma)
    DMA_FROM_DEVICE : DMA_TO_DEVICE);
    }

    + idma->dma_addr = idma->dma.sg->dma_address;
    + idma->dma_len = idma->dma.sg->length;
    +
    iomd_writeb(DMA_CR_C, dma_base + CR);
    idma->state = DMA_ST_AB;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-08-05 15:05    [W:4.086 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site