usb: gadget: Fix usb string id allocation
authorBenoit Goby <benoit@android.com>
Fri, 20 Jan 2012 22:42:41 +0000 (14:42 -0800)
committerBenoit Goby <benoit@android.com>
Wed, 25 Jan 2012 21:53:58 +0000 (13:53 -0800)
Don't reset next_string_id every time the gadget is enabled, this makes
the next strings allocated overwrite strings allocated at probe time.
Instead, fix rndis not to allocate new string ids on every config bind.

Change-Id: Ied28ee416bb6f00c434c34176fe5b7f0dcb2b2d4
Signed-off-by: Benoit Goby <benoit@android.com>
drivers/usb/gadget/android.c
drivers/usb/gadget/f_rndis.c
drivers/usb/gadget/rndis.c

index 00a446bce3f6cd9aa810282ddd2ba1ae90508159..54f80e79de6f657ab9651712c471b2fe478f0e83 100644 (file)
@@ -840,7 +840,6 @@ static ssize_t enable_store(struct device *pdev, struct device_attribute *attr,
 
        sscanf(buff, "%d", &enabled);
        if (enabled && !dev->enabled) {
-               cdev->next_string_id = 0;
                /* update values in composite driver's copy of device descriptor */
                cdev->desc.idVendor = device_desc.idVendor;
                cdev->desc.idProduct = device_desc.idProduct;
index d03b11b51c8edd1410c67cd521aee53a4a2c95c1..96adf45d44c285e0940cf4566972a4e3ea3780ff 100644 (file)
@@ -755,8 +755,6 @@ rndis_unbind(struct usb_configuration *c, struct usb_function *f)
        rndis_deregister(rndis->config);
        rndis_exit();
 
-       rndis_string_defs[0].id = 0;
-
        if (gadget_is_dualspeed(c->cdev->gadget))
                usb_free_descriptors(f->hs_descriptors);
        usb_free_descriptors(f->descriptors);
@@ -796,14 +794,14 @@ rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
        if (!can_support_rndis(c) || !ethaddr)
                return -EINVAL;
 
+       /* setup RNDIS itself */
+       status = rndis_init();
+       if (status < 0)
+               return status;
+
        /* maybe allocate device-global string IDs */
        if (rndis_string_defs[0].id == 0) {
 
-               /* ... and setup RNDIS itself */
-               status = rndis_init();
-               if (status < 0)
-                       return status;
-
                /* control interface label */
                status = usb_string_id(c->cdev);
                if (status < 0)
index d3cdffea9c8a33e71dd8fb5bacaf41c7aaf240cd..bbfbde7415954148d97cb7921306e993e679bc0d 100644 (file)
@@ -1147,11 +1147,15 @@ static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS];
 
 #endif /* CONFIG_USB_GADGET_DEBUG_FILES */
 
+static bool rndis_initialized;
 
 int rndis_init(void)
 {
        u8 i;
 
+       if (rndis_initialized)
+               return 0;
+
        for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
                char name [20];
@@ -1178,6 +1182,7 @@ int rndis_init(void)
                INIT_LIST_HEAD(&(rndis_per_dev_params[i].resp_queue));
        }
 
+       rndis_initialized = true;
        return 0;
 }
 
@@ -1186,7 +1191,13 @@ void rndis_exit(void)
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
        u8 i;
        char name[20];
+#endif
 
+       if (!rndis_initialized)
+               return;
+       rndis_initialized = false;
+
+#ifdef CONFIG_USB_GADGET_DEBUG_FILES
        for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
                sprintf(name, NAME_TEMPLATE, i);
                remove_proc_entry(name, NULL);