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

Reply via email to