[patch 2.6.24-rc3] usb peripheral controller driver oops avoidance

David Brownell <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
From: Patrik Sevallius <[email protected]>

I'm having problem with oopses when rebooting, if I modprobe g_serial
and rmmod g_serial and do a reboot I get an oops in device_shutdown().
The reason seems to be that usb_gadget_unregister_driver() doesn't do
enough cleanup.  With this at91_udc patch I don't get the oops.

Signed-off-by: Patrik Sevallius <[email protected]>
[ Same bug was in some other peripheral controller drivers; fixed. ]
Signed-off-by: David Brownell <[email protected]>
---
 drivers/usb/gadget/amd5536udc.c  |    1 +
 drivers/usb/gadget/at91_udc.c    |    2 ++
 drivers/usb/gadget/dummy_hcd.c   |    1 +
 drivers/usb/gadget/goku_udc.c    |    1 +
 drivers/usb/gadget/lh7a40x_udc.c |    1 +
 drivers/usb/gadget/m66592-udc.c  |    1 +
 drivers/usb/gadget/pxa2xx_udc.c  |    1 +
 7 files changed, 8 insertions(+)

--- at91.orig/drivers/usb/gadget/amd5536udc.c	2007-11-19 12:33:33.000000000 -0800
+++ at91/drivers/usb/gadget/amd5536udc.c	2007-11-19 12:38:31.000000000 -0800
@@ -2038,6 +2038,7 @@ int usb_gadget_unregister_driver(struct 
 	spin_unlock_irqrestore(&dev->lock, flags);
 
 	driver->unbind(&dev->gadget);
+	dev->gadget.dev.driver = NULL;
 	dev->driver = NULL;
 
 	/* set SD */
--- at91.orig/drivers/usb/gadget/at91_udc.c	2007-11-19 12:20:20.000000000 -0800
+++ at91/drivers/usb/gadget/at91_udc.c	2007-11-19 12:20:21.000000000 -0800
@@ -1614,6 +1614,8 @@ int usb_gadget_unregister_driver (struct
 	local_irq_enable();
 
 	driver->unbind(&udc->gadget);
+	udc->gadget.dev.driver = NULL;
+	udc->gadget.dev.driver_data = NULL;
 	udc->driver = NULL;
 
 	DBG("unbound from %s\n", driver->driver.name);
--- at91.orig/drivers/usb/gadget/dummy_hcd.c	2007-11-19 12:33:33.000000000 -0800
+++ at91/drivers/usb/gadget/dummy_hcd.c	2007-11-19 12:36:05.000000000 -0800
@@ -830,6 +830,7 @@ usb_gadget_unregister_driver (struct usb
 	spin_unlock_irqrestore (&dum->lock, flags);
 
 	driver->unbind (&dum->gadget);
+	dum->gadget.dev.driver = NULL;
 	dum->driver = NULL;
 
 	device_release_driver (&dum->gadget.dev);
--- at91.orig/drivers/usb/gadget/goku_udc.c	2007-11-19 12:33:34.000000000 -0800
+++ at91/drivers/usb/gadget/goku_udc.c	2007-11-19 12:36:29.000000000 -0800
@@ -1422,6 +1422,7 @@ int usb_gadget_unregister_driver(struct 
 	spin_unlock_irqrestore(&dev->lock, flags);
 
 	driver->unbind(&dev->gadget);
+	dev->gadget.dev.driver = NULL;
 
 	DBG(dev, "unregistered driver '%s'\n", driver->driver.name);
 	return 0;
--- at91.orig/drivers/usb/gadget/lh7a40x_udc.c	2007-11-19 12:33:34.000000000 -0800
+++ at91/drivers/usb/gadget/lh7a40x_udc.c	2007-11-19 12:36:56.000000000 -0800
@@ -474,6 +474,7 @@ int usb_gadget_unregister_driver(struct 
 	spin_unlock_irqrestore(&dev->lock, flags);
 
 	driver->unbind(&dev->gadget);
+	dev->gadget.dev.driver = NULL;
 	device_del(&dev->gadget.dev);
 
 	udc_disable(dev);
--- at91.orig/drivers/usb/gadget/m66592-udc.c	2007-11-19 12:33:34.000000000 -0800
+++ at91/drivers/usb/gadget/m66592-udc.c	2007-11-19 12:42:47.000000000 -0800
@@ -1456,6 +1456,7 @@ int usb_gadget_unregister_driver(struct 
 	m66592_bclr(m66592, M66592_VBSE | M66592_URST, M66592_INTENB0);
 
 	driver->unbind(&m66592->gadget);
+	m66592->gadget.dev.driver = NULL;
 
 	init_controller(m66592);
 	disable_controller(m66592);
--- at91.orig/drivers/usb/gadget/pxa2xx_udc.c	2007-11-19 12:33:34.000000000 -0800
+++ at91/drivers/usb/gadget/pxa2xx_udc.c	2007-11-19 12:37:46.000000000 -0800
@@ -1345,6 +1345,7 @@ int usb_gadget_unregister_driver(struct 
 	local_irq_enable();
 
 	driver->unbind(&dev->gadget);
+	dev->gadget.dev.driver = NULL;
 	dev->driver = NULL;
 
 	device_del (&dev->gadget.dev);

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.