usb: gadget: dbgp: Fix endpoint config after USB disconnect
authorKyösti Mälkki <kyosti.malkki@gmail.com>
Mon, 3 Nov 2014 15:18:04 +0000 (17:18 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 10 Nov 2014 23:19:34 +0000 (17:19 -0600)
SET_FEATURE request with DEBUG_MODE only worked the first time after module
initialisation. Per the USB 2.0 debug device specification, said request
is to be treated as if it were a SET_CONFIGURATION request, i.e. endpoint
must be re-configured.

As configure_endpoints() may now get called multiple times, move it outside
__init and move serial_alloc_tty() call into __init.

Code has assumption that endpoint mapping remains unchanged with consecutive
calls of configure_endpoints().

Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/legacy/dbgp.c

index 1b075132f8f193f359a97cc66cc795304aa7f819..633683a72a1169d95ee9f553efde929e9bf48808 100644 (file)
@@ -237,7 +237,7 @@ static void dbgp_unbind(struct usb_gadget *gadget)
 static unsigned char tty_line;
 #endif
 
-static int __init dbgp_configure_endpoints(struct usb_gadget *gadget)
+static int dbgp_configure_endpoints(struct usb_gadget *gadget)
 {
        int stp;
 
@@ -273,19 +273,10 @@ static int __init dbgp_configure_endpoints(struct usb_gadget *gadget)
 
        dbgp.serial->in->desc = &i_desc;
        dbgp.serial->out->desc = &o_desc;
-
-       if (gserial_alloc_line(&tty_line)) {
-               stp = 3;
-               goto fail_3;
-       }
+#endif
 
        return 0;
 
-fail_3:
-       dbgp.o_ep->driver_data = NULL;
-#else
-       return 0;
-#endif
 fail_2:
        dbgp.i_ep->driver_data = NULL;
 fail_1:
@@ -324,10 +315,17 @@ static int __init dbgp_bind(struct usb_gadget *gadget,
                err = -ENOMEM;
                goto fail;
        }
+
+       if (gserial_alloc_line(&tty_line)) {
+               stp = 4;
+               err = -ENODEV;
+               goto fail;
+       }
 #endif
+
        err = dbgp_configure_endpoints(gadget);
        if (err < 0) {
-               stp = 4;
+               stp = 5;
                goto fail;
        }
 
@@ -383,6 +381,10 @@ static int dbgp_setup(struct usb_gadget *gadget,
 #ifdef CONFIG_USB_G_DBGP_PRINTK
                err = dbgp_enable_ep();
 #else
+               err = dbgp_configure_endpoints(gadget);
+               if (err < 0) {
+                       goto fail;
+               }
                err = gserial_connect(dbgp.serial, tty_line);
 #endif
                if (err < 0)