spin_lock_irqsave(&dmadata->dma_lock, flags);
        if (dmadata->frag_count >= 0) {
                dmadata->dmacount--;
-               BUG_ON(dmadata->dmacount < 0);
-               tasklet_schedule(&dmadata->tasklet);
+               if (!WARN_ON(dmadata->dmacount < 0))
+                       tasklet_schedule(&dmadata->tasklet);
        }
        spin_unlock_irqrestore(&dmadata->dma_lock, flags);
 }
                spin_unlock_irqrestore(&dmadata->dma_lock, flags);
                return;
        }
-       BUG_ON(dmadata->dmacount >= NR_DMA_CHAIN);
+       if (WARN_ON(dmadata->dmacount >= NR_DMA_CHAIN)) {
+               spin_unlock_irqrestore(&dmadata->dma_lock, flags);
+               return;
+       }
        while (dmadata->dmacount < NR_DMA_CHAIN) {
                dmadata->dmacount++;
                spin_unlock_irqrestore(&dmadata->dma_lock, flags);