From a8d5021410094d76f4b6003b67ec5ab1d33a6ec6 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 24 Feb 2010 10:20:59 -0500 Subject: [PATCH] USB: gadget: android: Disable UMS when RNDIS ethernet is active. Signed-off-by: Mike Lockwood --- drivers/usb/gadget/android.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index e1ea22fe0e61..70e48ac3e2a9 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -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) { -- 2.34.1