This patch (as1601) adds support for the new "reset" gadget callback
to the net2280 driver.

Signed-off-by: Alan Stern <st...@rowland.harvard.edu>

---

 drivers/usb/gadget/net2280.c |   42 ++++++++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 10 deletions(-)

Index: usb-3.5/drivers/usb/gadget/net2280.c
===================================================================
--- usb-3.5.orig/drivers/usb/gadget/net2280.c
+++ usb-3.5/drivers/usb/gadget/net2280.c
@@ -2449,18 +2449,40 @@ static void handle_stat1_irqs (struct ne
         * only indicates a change in the reset state).
         */
        if (stat & tmp) {
+               bool    reset = false;
+               bool    disconnect = false;
+
+               /*
+                * Ignore disconnects and resets if the speed hasn't been set.
+                * VBUS can bounce and there's always an initial reset.
+                */
                writel (tmp, &dev->regs->irqstat1);
-               if ((((stat & (1 << ROOT_PORT_RESET_INTERRUPT))
-                                       && ((readl (&dev->usb->usbstat) & mask)
-                                                       == 0))
-                               || ((readl (&dev->usb->usbctl)
-                                       & (1 << VBUS_PIN)) == 0)
-                           ) && ( dev->gadget.speed != USB_SPEED_UNKNOWN)) {
-                       DEBUG (dev, "disconnect %s\n",
+               if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
+                       if ((stat & (1 << VBUS_INTERRUPT)) &&
+                                       (readl(&dev->usb->usbctl) &
+                                               (1 << VBUS_PIN)) == 0) {
+                               disconnect = true;
+                               DEBUG(dev, "disconnect %s\n",
+                                       dev->driver->driver.name);
+                       } else if ((stat & (1 << ROOT_PORT_RESET_INTERRUPT)) &&
+                                       (readl(&dev->usb->usbstat) & mask)
+                                               == 0) {
+                               reset = true;
+                               DEBUG(dev, "reset %s\n",
                                        dev->driver->driver.name);
-                       stop_activity (dev, dev->driver);
-                       ep0_start (dev);
-                       return;
+                       }
+
+                       if (disconnect || reset) {
+                               stop_activity(dev, dev->driver);
+                               ep0_start(dev);
+                               spin_unlock(&dev->lock);
+                               if (reset && dev->driver->reset)
+                                       (dev->driver->reset)(&dev->gadget);
+                               else
+                                       (dev->driver->disconnect)(&dev->gadget);
+                               spin_lock(&dev->lock);
+                               return;
+                       }
                }
                stat &= ~tmp;
 

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

Reply via email to