projects
/
kernel
/
kernel-generic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
a7f3872
)
USB: fsl_usb2_udc: fix recursive lock
author
Li Yang
<leoli@freescale.com>
Thu, 29 May 2008 13:04:45 +0000
(21:04 +0800)
committer
Greg Kroah-Hartman
<gregkh@suse.de>
Thu, 29 May 2008 20:59:06 +0000
(13:59 -0700)
UDC needs to release lock before calling out to gadget driver, since
it may need to reenter. The change fixes kernel BUG observed on rt
kernel.
> kernel BUG at kernel/rtmutex.c:683!
> stopped custom tracer.
> Oops: Exception in kernel mode, sig: 5 [#1]
> PREEMPT MPC834x ITX
> NIP:
c021629c
LR:
c0216270
CTR:
00000000
> REGS:
df761d70
TRAP: 0700 Not tainted (2.6.23.9-rt13)
> MSR:
00021032
<ME,IR,DR> CR:
28000022
XER:
00000000
> TASK =
df632080
[241] 'IRQ-38' THREAD:
df760000
> GPR00:
00000001
df761e20
df632080
00000000
11111111
00000000
df761e6c
>
00000000
> GPR08:
df761e48
00000000
df761e50
00000000
80000000
ede5cdde
1fffd000
>
00800000
> GPR16:
ffffffff
00000000
007fff00
00000040
00000000
007ffeb0
00000000
>
1fff8b08
> GPR24:
00000000
00000026
00000000
df79a320
c026b2e8
c02240bc
00009032
>
df79a320
> NIP [
c021629c
] rt_spin_lock_slowlock+0x9c/0x200
> LR [
c0216270
] rt_spin_lock_slowlock+0x70/0x200
> Call Trace:
> [
df761e20
] [
c0216270
] rt_spin_lock_slowlock+0x70/0x200 (unreliable)
> [
df761e90
] [
c0182828
] fsl_ep_disable+0xcc/0x154
> [
df761eb0
] [
c0184d30
] eth_reset_config+0x88/0x1d0
> [
df761ed0
] [
c0184ec0
] eth_disconnect+0x48/0x64
> [
df761ef0
] [
c01831a4
] reset_queues+0x60/0x78
> [
df761f00
] [
c0183b74
] fsl_udc_irq+0x9b8/0xa58
> [
df761f50
] [
c003ef30
] handle_IRQ_event+0x64/0x100
> [
df761f80
] [
c003f758
] thread_simple_irq+0x6c/0xc8
> [
df761fa0
] [
c003f888
] do_irqd+0xd4/0x2e4
> [
df761fd0
] [
c0032284
] kthread+0x50/0x8c
> [
df761ff0
] [
c000f9b4
] kernel_thread+0x44/0x60
Signed-off-by: Li Yang <leoli@freescale.com>
Cc: Eugene T. Bordenkircher <Eugene_Bordenkircher@selinc.com>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/fsl_usb2_udc.c
patch
|
blob
|
history
diff --git
a/drivers/usb/gadget/fsl_usb2_udc.c
b/drivers/usb/gadget/fsl_usb2_udc.c
index
651b827
..
1868754
100644
(file)
--- a/
drivers/usb/gadget/fsl_usb2_udc.c
+++ b/
drivers/usb/gadget/fsl_usb2_udc.c
@@
-1627,7
+1627,9
@@
static int reset_queues(struct fsl_udc *udc)
udc_reset_ep_queue(udc, pipe);
/* report disconnect; the driver is already quiesced */
+ spin_unlock(&udc->lock);
udc->driver->disconnect(&udc->gadget);
+ spin_lock(&udc->lock);
return 0;
}