lkml.org 
[lkml]   [2010]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] dma : EG20T PCH: Fix miss-setting DMA descriptor
    From: Tomoya MORINAGA <tomoya-linux@dsn.okisemi.com>



    Currently, in case of using scatter/gather mode, head of data is not sent to

    destination. The cause is second descriptor address is set to NEXT.

    The NEXT must have head of descriptor address.

    This patch sets head of descriptor address to the NEXT.



    Signed-off-by: Tomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
    ---
    drivers/dma/pch_dma.c | 15 ++++++++-------
    1 files changed, 8 insertions(+), 7 deletions(-)

    diff --git a/drivers/dma/pch_dma.c b/drivers/dma/pch_dma.c
    index 92b6790..a3d54c0 100644
    --- a/drivers/dma/pch_dma.c
    +++ b/drivers/dma/pch_dma.c
    @@ -259,11 +259,6 @@ static void pdc_dostart(struct pch_dma_chan *pd_chan, struct pch_dma_desc* desc)
    return;
    }

    - channel_writel(pd_chan, DEV_ADDR, desc->regs.dev_addr);
    - channel_writel(pd_chan, MEM_ADDR, desc->regs.mem_addr);
    - channel_writel(pd_chan, SIZE, desc->regs.size);
    - channel_writel(pd_chan, NEXT, desc->regs.next);
    -
    dev_dbg(chan2dev(&pd_chan->chan), "chan %d -> dev_addr: %x\n",
    pd_chan->chan.chan_id, desc->regs.dev_addr);
    dev_dbg(chan2dev(&pd_chan->chan), "chan %d -> mem_addr: %x\n",
    @@ -273,10 +268,16 @@ static void pdc_dostart(struct pch_dma_chan *pd_chan, struct pch_dma_desc* desc)
    dev_dbg(chan2dev(&pd_chan->chan), "chan %d -> next: %x\n",
    pd_chan->chan.chan_id, desc->regs.next);

    - if (list_empty(&desc->tx_list))
    + if (list_empty(&desc->tx_list)) {
    + channel_writel(pd_chan, DEV_ADDR, desc->regs.dev_addr);
    + channel_writel(pd_chan, MEM_ADDR, desc->regs.mem_addr);
    + channel_writel(pd_chan, SIZE, desc->regs.size);
    + channel_writel(pd_chan, NEXT, desc->regs.next);
    pdc_set_mode(&pd_chan->chan, DMA_CTL0_ONESHOT);
    - else
    + } else {
    + channel_writel(pd_chan, NEXT, virt_to_phys(&desc->regs));
    pdc_set_mode(&pd_chan->chan, DMA_CTL0_SG);
    + }

    val = dma_readl(pd, CTL2);
    val |= 1 << (DMA_CTL2_START_SHIFT_BITS + pd_chan->chan.chan_id);
    --
    1.6.0.6


    \
     
     \ /
      Last update: 2010-12-01 11:53    [W:0.021 / U:2.456 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site