projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
fead2ab
)
USB: fsl_udc_core: Fix kernel oops on module removal
author
Anton Vorontsov
<
[email protected]
>
Thu, 29 Oct 2009 16:50:43 +0000
(19:50 +0300)
committer
Greg Kroah-Hartman
<
[email protected]
>
Fri, 30 Oct 2009 21:57:33 +0000
(14:57 -0700)
fsl_udc_release() calls dma_free_coherent() with an inappropriate
device passed to it, and since the device has no dma_ops, the following
oops pops up:
Kernel BUG at
d103ce9c
[verbose debug info unavailable]
Oops: Exception in kernel mode, sig: 5 [#1]
...
NIP [
d103ce9c
] fsl_udc_release+0x50/0x80 [fsl_usb2_udc]
LR [
d103ce74
] fsl_udc_release+0x28/0x80 [fsl_usb2_udc]
Call Trace:
[
cfbc7dc0
] [
d103ce74
] fsl_udc_release+0x28/0x80 [fsl_usb2_udc]
[
cfbc7dd0
] [
c01a35c4
] device_release+0x2c/0x90
[
cfbc7de0
] [
c016b480
] kobject_cleanup+0x58/0x98
[
cfbc7e00
] [
c016c52c
] kref_put+0x54/0x6c
[
cfbc7e10
] [
c016b360
] kobject_put+0x34/0x64
[
cfbc7e20
] [
c01a1d0c
] put_device+0x1c/0x2c
[
cfbc7e30
] [
d103dbfc
] fsl_udc_remove+0xc0/0x1e4 [fsl_usb2_udc]
...
This patch fixes the issue by passing dev->parent, which points to
a correct device.
Signed-off-by: Anton Vorontsov <
[email protected]
>
Cc: Li Yang <
[email protected]
>
Cc: David Brownell <
[email protected]
>
Cc: Guennadi Liakhovetski <
[email protected]
>
Signed-off-by: Greg Kroah-Hartman <
[email protected]
>
drivers/usb/gadget/fsl_udc_core.c
patch
|
blob
|
history
diff --git
a/drivers/usb/gadget/fsl_udc_core.c
b/drivers/usb/gadget/fsl_udc_core.c
index 42a74b8a0bb82e3dcc0ab0becf156e44db9c32a1..fa3d142ba64d966aa4bf454a4f2a55480970bc4f 100644
(file)
--- a/
drivers/usb/gadget/fsl_udc_core.c
+++ b/
drivers/usb/gadget/fsl_udc_core.c
@@
-2139,7
+2139,7
@@
static int fsl_proc_read(char *page, char **start, off_t off, int count,
static void fsl_udc_release(struct device *dev)
{
complete(udc_controller->done);
- dma_free_coherent(dev, udc_controller->ep_qh_size,
+ dma_free_coherent(dev
->parent
, udc_controller->ep_qh_size,
udc_controller->ep_qh, udc_controller->ep_qh_dma);
kfree(udc_controller);
}