From patchwork Thu Apr 5 12:27:41 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Using GPMI-NAND driver on iMX28 using 3.4-rc1? Date: Thu, 05 Apr 2012 02:27:41 -0000 From: Vinod Koul X-Patchwork-Id: 150945 Message-Id: <1333628861.31825.22.camel@vkoul-udesk3> To: Sam Gandhi Cc: Russell King - ARM Linux , Wolfram Sang , Huang Shijie , linux-mtd@lists.infradead.org, "linux-arm-kernel@lists.infradead.org" , Fabio Estevam , Shawn Guo On Thu, 2012-04-05 at 05:03 -0700, Sam Gandhi wrote: > 2012/4/4 Huang Shijie : > > Hi All: > >> On Wed, Apr 4, 2012 at 7:07 PM, Sam Gandhi wrote: > >> > >>> I reverted that commit and I still see following error! > >> Huang, > >> > >> Are you able to use gpmi on mx28 running 3.4-rc1? > >> > > I also meet the same problem today. > > > > > >>> flash_erase /dev/mtd1 0 0 > >>> Erasing 1------------[ cut here ]------------ > >>> kernel BUG at /home/sam/linux/drivers/dma/dmaengine.h:53! > > the mxs-dma has added some patches about the cookie. > > The bug is in the dmaengine.h. > > > > So let more people know this bug. > > > > BR > > Huang Shijie > > > > > FWIW, Just a data point. > > I coverted BUG_ON in dmaengine.h to printk as shown below. With this > change I was able to format nand, create UBI partition. I have been > running UBI torture test called integck on my board that does lot of > I/O, mounting/unmounting of filesystem for close to 8 hour now without > crash. But I do see those printks. I haven't followed logic of > tx->cookie well enough to figure out what the appropriate change > should be. Note this is with commit > 00292bbf769620dea923dbd906afd88955f7ea19 reverted in my tree. > > Cookie 0 completed 102118268 DMA_MIN 1 > Cookie 0 completed 102120401 DMA_MIN 1 > Cookie 0 completed 102237726 DMA_MIN 1 > > git diff drivers/dma/dmaengine.h > diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h > index 17f983a..3d10a70 100644 > --- a/drivers/dma/dmaengine.h > +++ b/drivers/dma/dmaengine.h > @@ -50,7 +50,11 @@ static inline dma_cookie_t dma_cookie_assign(struct > dma_async_tx_descriptor *tx) > */ > static inline void dma_cookie_complete(struct dma_async_tx_descriptor *tx) > { > - BUG_ON(tx->cookie < DMA_MIN_COOKIE); > + if ( tx->cookie < DMA_MIN_COOKIE) > + printk(KERN_ERR "Cookie %d, completed %d DMA_MIN %d > ",tx->cookie, > + tx->chan->completed_cookie, > + DMA_MIN_COOKIE); > + /* BUG_ON(tx->cookie < DMA_MIN_COOKIE); */ > tx->chan->completed_cookie = tx->cookie; > tx->cookie = 0; > } This means you are trying to mark a cookie complete when it is already marked so!, hence dmaengine screams. The bug is is mxs-dma. Let me know if below fixes it (assuming you are not using cyclic API, that would need fixup as well) if (direction == DMA_TRANS_NONE) { diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c index c81ef7e..5ddd84e 100644 --- a/drivers/dma/mxs-dma.c +++ b/drivers/dma/mxs-dma.c @@ -399,6 +399,10 @@ static struct dma_async_tx_descriptor *mxs_dma_prep_slave_sg( ccw->bits &= ~CCW_DEC_SEM; } else { idx = 0; + /* assign cookie here, + * hopefully for above case we dont need it + */ + dma_cookie_assign(&mxs_chan->desc); }