usb: gadget: android: always update the sw_connected state
authorDima Zavin <dima@android.com>
Wed, 14 Sep 2011 22:12:45 +0000 (15:12 -0700)
committermgross <mark.gross@intel.com>
Wed, 9 Nov 2011 20:24:02 +0000 (12:24 -0800)
If we go through connected->configured->disconnected cycle very quickly,
it is possible that we may not generate a disconnect uevent to userspace.
Connected+configured could have happened before the work item got
executed, and thus would not have updated the sw_connected state. On
the disconnect, it would have noticed that a config is no longer there
but since sw_connected was still 0, it would not have sent the
disconnect event.

Change-Id: Id71175f784e3e1cf3f828bd8b24fceea1078a06b
Signed-off-by: Dima Zavin <dima@android.com>
drivers/usb/gadget/android.c

index 8ff9972..d109bfb 100644 (file)
@@ -167,12 +167,11 @@ static void android_work(struct work_struct *data)
        unsigned long flags;
 
        spin_lock_irqsave(&cdev->lock, flags);
-        if (cdev->config) {
+        if (cdev->config)
                uevent_envp = configured;
-       } else if (dev->connected != dev->sw_connected) {
-               dev->sw_connected = dev->connected;
-               uevent_envp = dev->sw_connected ? connected : disconnected;
-       }
+       else if (dev->connected != dev->sw_connected)
+               uevent_envp = dev->connected ? connected : disconnected;
+       dev->sw_connected = dev->connected;
        spin_unlock_irqrestore(&cdev->lock, flags);
 
        if (uevent_envp) {