diff options
author | Alexey Khoroshilov <khoroshilov@ispras.ru> | 2013-05-29 16:51:37 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2013-06-10 10:08:48 -0400 |
commit | f37d49ad6e3d351fcf3cd042953ff273b6cd47e0 (patch) | |
tree | 54db39fe36fc29ea34c0ba6d2ab72c75ed88798b /drivers/usb | |
parent | a2cc81d315c45cce35c0e50716fbee5dc00e28aa (diff) |
usb: gadget: r8a66597-udc: do not unlock unheld spinlock in r8a66597_sudmac_irq()
r8a66597_irq() processes sudmac part (r8a66597_sudmac_irq()) before locking r8a66597->lock.
But transfer_complete(), that is called inside (r8a66597_sudmac_irq()->sudmac_finish()->transfer_complete()),
expects r8a66597->lock is locked. As a result unheld spinlock can be unlocked.
The patch just moves locking before calling r8a66597_sudmac_irq().
Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/gadget/r8a66597-udc.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/usb/gadget/r8a66597-udc.c b/drivers/usb/gadget/r8a66597-udc.c index 51ea1690ca5d..c6af649f3240 100644 --- a/drivers/usb/gadget/r8a66597-udc.c +++ b/drivers/usb/gadget/r8a66597-udc.c | |||
@@ -1469,11 +1469,11 @@ static irqreturn_t r8a66597_irq(int irq, void *_r8a66597) | |||
1469 | u16 savepipe; | 1469 | u16 savepipe; |
1470 | u16 mask0; | 1470 | u16 mask0; |
1471 | 1471 | ||
1472 | spin_lock(&r8a66597->lock); | ||
1473 | |||
1472 | if (r8a66597_is_sudmac(r8a66597)) | 1474 | if (r8a66597_is_sudmac(r8a66597)) |
1473 | r8a66597_sudmac_irq(r8a66597); | 1475 | r8a66597_sudmac_irq(r8a66597); |
1474 | 1476 | ||
1475 | spin_lock(&r8a66597->lock); | ||
1476 | |||
1477 | intsts0 = r8a66597_read(r8a66597, INTSTS0); | 1477 | intsts0 = r8a66597_read(r8a66597, INTSTS0); |
1478 | intenb0 = r8a66597_read(r8a66597, INTENB0); | 1478 | intenb0 = r8a66597_read(r8a66597, INTENB0); |
1479 | 1479 | ||