On 13-08-20, 16:14, Gustavo Pimentel wrote: > Fix the source and destination physical address calculation of a > peripheral device on scatter-gather implementation. > > This issue manifested during tests using a 64 bits architecture system. > The abnormal behavior wasn't visible before due to all previous tests > were done using 32 bits architecture system, that masked his effect. Applied, thanks > > Fixes: e63d79d1ffcd ("dmaengine: Add Synopsys eDMA IP core driver") > Dont leave empty line here > Cc: Joao Pinto <jpinto@xxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Gustavo Pimentel <gustavo.pimentel@xxxxxxxxxxxx> > --- > drivers/dma/dw-edma/dw-edma-core.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c > index ed430ad..b971505 100644 > --- a/drivers/dma/dw-edma/dw-edma-core.c > +++ b/drivers/dma/dw-edma/dw-edma-core.c > @@ -405,7 +405,7 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) > if (xfer->cyclic) { > burst->dar = xfer->xfer.cyclic.paddr; > } else { > - burst->dar = sg_dma_address(sg); > + burst->dar = dst_addr; > /* Unlike the typical assumption by other > * drivers/IPs the peripheral memory isn't > * a FIFO memory, in this case, it's a > @@ -413,14 +413,13 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) > * and destination addresses are increased > * by the same portion (data length) > */ > - src_addr += sg_dma_len(sg); > } > } else { > burst->dar = dst_addr; > if (xfer->cyclic) { > burst->sar = xfer->xfer.cyclic.paddr; > } else { > - burst->sar = sg_dma_address(sg); > + burst->sar = src_addr; > /* Unlike the typical assumption by other > * drivers/IPs the peripheral memory isn't > * a FIFO memory, in this case, it's a > @@ -428,12 +427,14 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) > * and destination addresses are increased > * by the same portion (data length) > */ > - dst_addr += sg_dma_len(sg); > } > } > > - if (!xfer->cyclic) > + if (!xfer->cyclic) { > + src_addr += sg_dma_len(sg); > + dst_addr += sg_dma_len(sg); > sg = sg_next(sg); > + } > } > > return vchan_tx_prep(&chan->vc, &desc->vd, xfer->flags); > -- > 2.7.4 -- ~Vinod