aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2009-03-22 13:01:49 -0400
committerJiri Kosina <jkosina@suse.cz>2009-03-25 12:57:58 -0400
commit6d77976800c3f29a0337fadcc9ddd79050fa5620 (patch)
tree3618f5fef912ba9568e24d7df1d562e1ec7fd862 /drivers
parentae2f007468223e9efd6973be0364b9307a050a0c (diff)
HID: autosuspend -- fix lockup of hid on reset
This fixes a use of flush_scheduled_work() in USB HID's reset logic that can deadlock. Tested-by: Valdis Kletniks <Valdis.Kletnieks@vt.edu> Signed-off-by: Oliver Neukum <oliver@neukum.name> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hid/usbhid/hid-core.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 054f0c521e6f..a1ef41f067ce 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1207,7 +1207,6 @@ static void hid_cease_io(struct usbhid_device *usbhid)
1207 usb_kill_urb(usbhid->urbin); 1207 usb_kill_urb(usbhid->urbin);
1208 usb_kill_urb(usbhid->urbctrl); 1208 usb_kill_urb(usbhid->urbctrl);
1209 usb_kill_urb(usbhid->urbout); 1209 usb_kill_urb(usbhid->urbout);
1210 flush_scheduled_work();
1211} 1210}
1212 1211
1213/* Treat USB reset pretty much the same as suspend/resume */ 1212/* Treat USB reset pretty much the same as suspend/resume */
@@ -1219,6 +1218,7 @@ static int hid_pre_reset(struct usb_interface *intf)
1219 spin_lock_irq(&usbhid->lock); 1218 spin_lock_irq(&usbhid->lock);
1220 set_bit(HID_RESET_PENDING, &usbhid->iofl); 1219 set_bit(HID_RESET_PENDING, &usbhid->iofl);
1221 spin_unlock_irq(&usbhid->lock); 1220 spin_unlock_irq(&usbhid->lock);
1221 cancel_work_sync(&usbhid->restart_work);
1222 hid_cease_io(usbhid); 1222 hid_cease_io(usbhid);
1223 1223
1224 return 0; 1224 return 0;