[PATCH v8 8/8] usb: chipidea: udc: fix the oops when plugs in usb cable after rmmod gadget
From: Felipe Balbi <hidden>
Date: 2013-02-27 08:42:18
On Wed, Feb 27, 2013 at 11:10:03AM +0800, Peter Chen wrote:
On Tue, Feb 26, 2013 at 08:21:41PM +0200, Felipe Balbi wrote:quoted
Hi, On Sun, Feb 17, 2013 at 11:09:53AM +0800, Peter Chen wrote:quoted
@@ -1373,6 +1375,8 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active) hw_device_state(ci, ci->ep0out->qh.dma); dev_dbg(ci->dev, "Connected to host\n"); } else { + if (ci->driver) + ci->driver->disconnect(&ci->gadget);This looks wrong. Why do you need to call ->disconnect() here ?When we disconnect usb cable from the host, we need to notify gadget module disconnection occurs, the gadget module may not be unloaded in future.
ok, I get it now, after reading the code I see that this gets called from your VBUS IRQ handler (actually you queue an unnecessary workqueue for that).
If the disconnection is not notified, the gadget module may still call struct usb_ep_ops's API to visit hardware at its thread but the controller may already enter low power mode. In fact, a common problem is how can we make sure the gadget will not visit register if the controller enters low power mode, currently, there is no prefect solution.
yeah, I have an idea for that, but won't happen for v3.10 I'm afraid... -- balbi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130227/085bf7dd/attachment.sig>