The DMA cleanup function was holding the spinlock across a busy loop where it waits for HW to indicate teardown is complete. This generates a backtrace, when DEBUG_SPINLOCK is enabled. Make the locking more granular.
Signed-off-by: Sriramakrishnan A G <[email protected]> --- drivers/net/davinci_cpdma.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/drivers/net/davinci_cpdma.c b/drivers/net/davinci_cpdma.c index ae47f23..57fd0fc 100644 --- a/drivers/net/davinci_cpdma.c +++ b/drivers/net/davinci_cpdma.c @@ -824,6 +824,8 @@ int cpdma_chan_stop(struct cpdma_chan *chan) /* trigger teardown */ dma_reg_write(ctlr, chan->td, chan->chan_num); + spin_unlock_irqrestore(&chan->lock, flags); + /* wait for teardown complete */ timeout = jiffies + HZ/10; /* 100 msec */ while (time_before(jiffies, timeout)) { @@ -843,6 +845,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan) } while ((ret & CPDMA_DESC_TD_COMPLETE) == 0); /* remaining packets haven't been tx/rx'ed, clean them up */ + spin_lock_irqsave(&chan->lock, flags); while (chan->head) { struct cpdma_desc __iomem *desc = chan->head; dma_addr_t next_dma; -- 1.6.2.4 _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
