USB: gadget: android: Disable UMS when RNDIS ethernet is active.
authorMike Lockwood <lockwood@android.com>
Wed, 24 Feb 2010 15:20:59 +0000 (10:20 -0500)
committerColin Cross <ccross@android.com>
Tue, 14 Jun 2011 16:09:05 +0000 (09:09 -0700)
Signed-off-by: Mike Lockwood <lockwood@android.com>
drivers/usb/gadget/android.c

index e1ea22fe0e612c42d9b835aa220f27e3e39c0e34..70e48ac3e2a9d666fcc0ae16d1058996277ce241 100644 (file)
@@ -325,16 +325,14 @@ void android_enable_function(struct usb_function *f, int enable)
 
        if (!!f->hidden != disable) {
                f->hidden = disable;
-               product_id = get_product_id(dev);
-               device_desc.idProduct = __constant_cpu_to_le16(product_id);
-               if (dev->cdev)
-                       dev->cdev->desc.idProduct = device_desc.idProduct;
 
 #ifdef CONFIG_USB_ANDROID_RNDIS
-               /* We need to specify the COMM class in the device descriptor
-               * if we are using RNDIS.
-               */
                if (!strcmp(f->name, "rndis")) {
+                       struct usb_function             *func;
+
+                       /* We need to specify the COMM class in the device descriptor
+                        * if we are using RNDIS.
+                        */
                        if (enable)
 #ifdef CONFIG_USB_ANDROID_RNDIS_WCEIS
                                dev->cdev->desc.bDeviceClass = USB_CLASS_WIRELESS_CONTROLLER;
@@ -343,9 +341,24 @@ void android_enable_function(struct usb_function *f, int enable)
 #endif
                        else
                                dev->cdev->desc.bDeviceClass = USB_CLASS_PER_INTERFACE;
+
+                       /* Windows does not support other interfaces when RNDIS is enabled,
+                        * so we disable UMS when RNDIS is on.
+                        */
+                       list_for_each_entry(func, &android_config_driver.functions, list) {
+                               if (!strcmp(func->name, "usb_mass_storage")) {
+                                       func->hidden = enable;
+                                       break;
+                               }
+                       }
                }
 #endif
 
+               product_id = get_product_id(dev);
+               device_desc.idProduct = __constant_cpu_to_le16(product_id);
+               if (dev->cdev)
+                       dev->cdev->desc.idProduct = device_desc.idProduct;
+
                /* force reenumeration */
                if (dev->cdev && dev->cdev->gadget &&
                                dev->cdev->gadget->speed != USB_SPEED_UNKNOWN) {