ARM: OMAP: MUSB: DMA interrupt locking fix
Subsystems (2)
PATCH 1/1 ARM: OMAP: MUSB: DMA interrupt locking fix
dma_controller_irq() should take the lock (and disable interrupts) as the main interrupt handler does since the functions it calls assume this to be the case.
drivers/usb/musb/musbhsdma.c +6 -1
@@ -296,6 +296,7 @@ static irqreturn_t dma_controller_irq(instruct musb_dma_controller *controller = (struct musb_dma_controller *)private_data;struct musb_dma_channel *pImplChannel; +struct musb *musb = controller->pDmaPrivate;u8 *mbase = controller->pCoreBase;struct dma_channel *pChannel;u8 bChannel;
@@ -303,6 +304,9 @@ static irqreturn_t dma_controller_irq(inu32 dwAddress;u8 int_hsdma;irqreturn_t retval =IRQ_NONE ; +unsigned long flags; + +spin_lock_irqsave (&musb->lock, flags); int_hsdma =musb_readb (mbase,MUSB_HSDMA_INTR );if (!int_hsdma)
@@ -358,7 +362,7 @@ static irqreturn_t dma_controller_irq(in MUSB_TXCSR_TXPKTRDY); }else musb_dma_completion ( - controller->pDmaPrivate, + musb, pImplChannel->epnum, pImplChannel->transmit); }
@@ -366,6 +370,7 @@ static irqreturn_t dma_controller_irq(in } retval =IRQ_HANDLED ; done: +spin_unlock_irqrestore (&musb->lock, flags);return retval; }
--
Quoted 11 lines
From [email protected] Fri Aug 31 16:33:15 2007
Date: Fri, 31 Aug 2007 16:31:06 -0700
From: Kevin Hilman <[email protected]>
To: [email protected]
Subject: [PATCH] ARM: OMAP: MUSB: DMA interrupt locking fix
dma_controller_irq()should take the lock (and disable interrupts) as the main interrupt handler does since the functions it calls assume this to be the case.Signed-off-by Kevin Hilman <[email protected]>
Ack.
Quoted 45 lines
Index:
dev/drivers/usb/musb/musbhsdma.c
===================================================================drivers/usb/musb/musbhsdma.c +6
-2@@ -296,6 +296,7 @@ static irqreturn_t dma_controller_irq(instruct musb_dma_controller *controller = (struct musb_dma_controller *)private_data;struct musb_dma_channel *pImplChannel; +struct musb *musb = controller->pDmaPrivate;u8 *mbase = controller->pCoreBase;struct dma_channel *pChannel;u8 bChannel;@@ -303,6 +304,9 @@ static irqreturn_t dma_controller_irq(inu32 dwAddress;u8 int_hsdma;irqreturn_t retval =IRQ_NONE ; +unsigned long flags; + +spin_lock_irqsave (&musb->lock, flags); int_hsdma =musb_readb (mbase,MUSB_HSDMA_INTR );if (!int_hsdma)@@ -358,7 +362,7 @@ static irqreturn_t dma_controller_irq(in MUSB_TXCSR_TXPKTRDY); }else musb_dma_completion ( - controller->pDmaPrivate, + musb, pImplChannel->epnum, pImplChannel->transmit); }@@ -366,6 +370,7 @@ static irqreturn_t dma_controller_irq(in } retval =IRQ_HANDLED ; done: +spin_unlock_irqrestore (&musb->lock, flags);return retval; } --_______________________________________________
Linux-omap-open-source mailing list
[email protected]
http://linux.omap.com/mailman/listinfo/linux-omap-open-source
Quoted 44 lines · David Brownell
Quoted 11 lines
From [email protected] Fri Aug 31 16:33:15 2007
Date: Fri, 31 Aug 2007 16:31:06 -0700
From: Kevin Hilman <[email protected]>
To: [email protected]
Subject: [PATCH] ARM: OMAP: MUSB: DMA interrupt locking fix
dma_controller_irq()should take the lock (and disable interrupts) as the main interrupt handler does since the functions it calls assume this to be the case.Signed-off-by Kevin Hilman <[email protected]>Ack.
Quoted 30 lines
Index:
dev/drivers/usb/musb/musbhsdma.c
===================================================================drivers/usb/musb/musbhsdma.c +5
-1@@ -296,6 +296,7 @@ static irqreturn_t dma_controller_irq(instruct musb_dma_controller *controller = (struct musb_dma_controller *)private_data;struct musb_dma_channel *pImplChannel; +struct musb *musb = controller->pDmaPrivate;u8 *mbase = controller->pCoreBase;struct dma_channel *pChannel;u8 bChannel;@@ -303,6 +304,9 @@ static irqreturn_t dma_controller_irq(inu32 dwAddress;u8 int_hsdma;irqreturn_t retval =IRQ_NONE ; +unsigned long flags; + +spin_lock_irqsave (&musb->lock, flags); int_hsdma =musb_readb (mbase,MUSB_HSDMA_INTR );if (!int_hsdma)@@ -358,7 +362,7 @@ static irqreturn_t dma_controller_irq(in MUSB_TXCSR_TXPKTRDY); }else musb_dma_completion ( - controller->pDmaPrivate, + musb, pImplChannel->epnum, pImplChannel->transmit);
Quoted 8 lines
drivers/usb/musb/musbhsdma.c static irqreturn_t dma_controller_irq(in · line 375
Quoted 8 lines
drivers/usb/musb/musbhsdma.c +1
-0}@@ -366,6 +370,7 @@ static irqreturn_t dma_controller_irq(in } retval =IRQ_HANDLED ; done: +spin_unlock_irqrestore (&musb->lock, flags);return retval; }
Pushing this today.
Tony