dmaengine: fix cookie handling in iop-adma.c and ppc4xx/adma.c
authorRussell King - ARM Linux <linux@arm.linux.org.uk>
Tue, 6 Mar 2012 22:36:07 +0000 (22:36 +0000)
committerVinod Koul <vinod.koul@linux.intel.com>
Tue, 13 Mar 2012 06:07:33 +0000 (11:37 +0530)
Dan Williams said:
> > Russell King wrote:
> > Firstly, we have DMA_MIN_COOKIE which has value 1 - so any cookies below
> > that aren't valid.  That seems sane.
> >
> > We seem to have different behaviours:
> >
> > -       cookie = c->cookie;
> > -       cookie++;
> > -       if (cookie < 0)
> > -               cookie = 1;
> > -       c->cookie = cookie;
> > -       tx->cookie = cookie;
> >
> > c->cookie here is initialized to zero, so the first cookie given out will
> > be 1.  This is how most DMA engine drivers implement this.
> >
> > Then we have this:
> >
> >                cookie = chan->common.cookie;
> >                cookie++;
> >                if (cookie <= 1)
> >                        cookie = 2;
> >
> >                /* initialize the completed cookie to be less than
> >                 * the most recently used cookie
> >                 */
> >                chan->common.completed_cookie = cookie - 1;
> >                chan->common.cookie = sw_desc->async_tx.cookie = cookie;
> >
> > Again, chan->common.cookie starts off at 0.  The first cookie given out
> > will be 2, and 1 will never be used.  There are three drivers which
> > implement it this way.
> >
> > Why is there this difference, and can these three be corrected to behave
> > the same way as the first (and therefore the assignment of cookies
> > consolidated?)
>
> Yes, they should be consolidated, and I believe they have drifted only
> because there were no good common helpers and murphy's law took over.

So lets fix this up to use the common dma_cookie_assign() helper.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Jassi Brar <jassisinghbrar@gmail.com>
[imx-sdma.c & mxs-dma.c]
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
drivers/dma/iop-adma.c
drivers/dma/ppc4xx/adma.c

index b1e3be089c5223ef19896fd7323da029674d5690..4370b1015f73e3b312377689e9510a45dac3118d 100644 (file)
@@ -1622,16 +1622,12 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan)
                iop_desc_set_dest_addr(grp_start, iop_chan, 0);
                iop_desc_set_memcpy_src_addr(grp_start, 0);
 
-               cookie = iop_chan->common.cookie;
-               cookie++;
-               if (cookie <= 1)
-                       cookie = 2;
+               cookie = dma_cookie_assign(&sw_desc->async_tx);
 
                /* initialize the completed cookie to be less than
                 * the most recently used cookie
                 */
                iop_chan->common.completed_cookie = cookie - 1;
-               iop_chan->common.cookie = sw_desc->async_tx.cookie = cookie;
 
                /* channel should not be busy */
                BUG_ON(iop_chan_is_busy(iop_chan));
@@ -1679,16 +1675,12 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
                iop_desc_set_xor_src_addr(grp_start, 0, 0);
                iop_desc_set_xor_src_addr(grp_start, 1, 0);
 
-               cookie = iop_chan->common.cookie;
-               cookie++;
-               if (cookie <= 1)
-                       cookie = 2;
+               cookie = dma_cookie_assign(&sw_desc->async_tx);
 
                /* initialize the completed cookie to be less than
                 * the most recently used cookie
                 */
                iop_chan->common.completed_cookie = cookie - 1;
-               iop_chan->common.cookie = sw_desc->async_tx.cookie = cookie;
 
                /* channel should not be busy */
                BUG_ON(iop_chan_is_busy(iop_chan));
index 86239ea01898b840661ea968e8885592ea00b8c8..975206257f6e5ab1e88ea5eca84e2d2687ad3814 100644 (file)
@@ -4022,16 +4022,12 @@ static void ppc440spe_chan_start_null_xor(struct ppc440spe_adma_chan *chan)
                async_tx_ack(&sw_desc->async_tx);
                ppc440spe_desc_init_null_xor(group_start);
 
-               cookie = chan->common.cookie;
-               cookie++;
-               if (cookie <= 1)
-                       cookie = 2;
+               cookie = dma_cookie_assign(&sw_desc->async_tx);
 
                /* initialize the completed cookie to be less than
                 * the most recently used cookie
                 */
                chan->common.completed_cookie = cookie - 1;
-               chan->common.cookie = sw_desc->async_tx.cookie = cookie;
 
                /* channel should not be busy */
                BUG_ON(ppc440spe_chan_is_busy(chan));