summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/android.c
diff options
context:
space:
mode:
authorDima Zavin <dima@android.com>2011-09-14 11:53:11 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:39:05 -0800
commit1fdcc7a46a0306d61de07ef861cfc0166f9603c0 (patch)
tree3ee529c285735af3a8adad21f88d48388b88586c /drivers/usb/gadget/android.c
parent672c2230765dbe06918ee9ac8495a6337df81a0c (diff)
usb: gadget: android: follow proper order on disconnect
We should composite_disconnect *before* updating our internal state and sending uevent to userspace. Also, hold cdev->lock while updating internal state. Change-Id: If66a5a4f7d4a102a44aefc3ce4a154a5a1517dcf Signed-off-by: Dima Zavin <dima@android.com>
Diffstat (limited to 'drivers/usb/gadget/android.c')
-rw-r--r--drivers/usb/gadget/android.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c
index b7e402921c65..a7d5b19dc161 100644
--- a/drivers/usb/gadget/android.c
+++ b/drivers/usb/gadget/android.c
@@ -1081,9 +1081,15 @@ android_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *c)
static void android_disconnect(struct usb_gadget *gadget)
{
struct android_dev *dev = _android_dev;
+ struct usb_composite_dev *cdev = get_gadget_data(gadget);
+ unsigned long flags;
+
+ composite_disconnect(gadget);
+
+ spin_lock_irqsave(&cdev->lock, flags);
dev->connected = 0;
schedule_work(&dev->work);
- composite_disconnect(gadget);
+ spin_unlock_irqrestore(&cdev->lock, flags);
}
static int android_create_device(struct android_dev *dev)