summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorVijayavardhan Vennapusa <vvreddy@codeaurora.org>2017-10-30 14:33:51 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2017-11-01 22:13:23 -0700
commit43c0d001bcc1e4282cc43c93ffccf42916911fca (patch)
treeabff8f5e3ff0ba9e02c9578155d9260d1f8852cb /drivers/usb
parentaedf62a2ba4143939439ecacee412358ccd6fea2 (diff)
USB: configfs: Don't send DISCONNECT uevent during unbind
Windows XP host takes upto 6 seconds to enumerate RNDIS composition when RNDIS (tethering) is enabled while in MTP/PTP composition. This results in Userpsace Tethering enable timeout (1 second) causing RNDIS enumeration failure and falls back to default composition. Workaround the issue by not sending disconnect event to userspace on composition switch (MTP/PTP to RNDIS). Send the disconnect event from USB bus reset so that userspace enable timer starts from bus reset. Change-Id: I2d1fcaa0704e369204fbba4eceb8ba9b1c525b41 Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/configfs.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 255a11f595c4..d9fb5d411d1d 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -87,6 +87,7 @@ struct gadget_info {
struct usb_composite_driver composite;
struct usb_composite_dev cdev;
bool use_os_desc;
+ bool unbinding;
char b_vendor_code;
char qw_sign[OS_STRING_QW_SIGN_LEN];
#ifdef CONFIG_USB_CONFIGFS_UEVENT
@@ -283,9 +284,11 @@ static int unregister_gadget(struct gadget_info *gi)
if (!gi->udc_name)
return -ENODEV;
+ gi->unbinding = true;
ret = usb_gadget_unregister_driver(&gi->composite.gadget_driver);
if (ret)
return ret;
+ gi->unbinding = false;
kfree(gi->udc_name);
gi->udc_name = NULL;
return 0;
@@ -1561,7 +1564,8 @@ static void android_disconnect(struct usb_gadget *gadget)
acc_disconnect();
#endif
gi->connected = 0;
- schedule_work(&gi->work);
+ if (!gi->unbinding)
+ schedule_work(&gi->work);
composite_disconnect(gadget);
}
#endif