spin_lock(&mchan->lock);
 
+               out_8(&mdma->regs->dmacint, ch + off);
+               out_8(&mdma->regs->dmacerr, ch + off);
+
                /* Check error status */
                if (es & (1 << ch))
                        list_for_each_entry(mdesc, &mchan->active, node)
        mpc_dma_irq_process(mdma, in_be32(&mdma->regs->dmaintl),
                                        in_be32(&mdma->regs->dmaerrl), 0);
 
-       /* Ack interrupt on all channels */
-       out_be32(&mdma->regs->dmainth, 0xFFFFFFFF);
-       out_be32(&mdma->regs->dmaintl, 0xFFFFFFFF);
-       out_be32(&mdma->regs->dmaerrh, 0xFFFFFFFF);
-       out_be32(&mdma->regs->dmaerrl, 0xFFFFFFFF);
-
        /* Schedule tasklet */
        tasklet_schedule(&mdma->tasklet);