Replace usb_gadget_driver's disconnect with udc-core's reset notifier at
bus reset handler.

Signed-off-by: Peter Chen <[email protected]>
---
 drivers/usb/gadget/udc/mv_udc_core.c |   19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/udc/mv_udc_core.c 
b/drivers/usb/gadget/udc/mv_udc_core.c
index 040fb16..406d213 100644
--- a/drivers/usb/gadget/udc/mv_udc_core.c
+++ b/drivers/usb/gadget/udc/mv_udc_core.c
@@ -1311,6 +1311,23 @@ static void nuke(struct mv_ep *ep, int status)
        }
 }
 
+static void gadget_reset(struct mv_udc *udc, struct usb_gadget_driver *driver)
+{
+       struct mv_ep    *ep;
+
+       nuke(&udc->eps[0], -ESHUTDOWN);
+
+       list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
+               nuke(ep, -ESHUTDOWN);
+       }
+
+       /* report disconnect; the driver is already quiesced */
+       if (driver) {
+               spin_unlock(&udc->lock);
+               usb_gadget_udc_reset(&udc->gadget, driver);
+               spin_lock(&udc->lock);
+       }
+}
 /* stop all USB activities */
 static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver)
 {
@@ -1886,7 +1903,7 @@ static void irq_process_reset(struct mv_udc *udc)
                dev_info(&udc->dev->dev, "usb bus reset\n");
                udc->usb_state = USB_STATE_DEFAULT;
                /* reset all the queues, stop all USB activities */
-               stop_activity(udc, udc->driver);
+               gadget_reset(udc, udc->driver);
        } else {
                dev_info(&udc->dev->dev, "USB reset portsc 0x%x\n",
                        readl(&udc->op_regs->portsc));
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to