diff options
author | Oliver Neukum <oliver@neukum.org> | 2009-03-22 13:01:49 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2009-03-25 12:57:58 -0400 |
commit | 6d77976800c3f29a0337fadcc9ddd79050fa5620 (patch) | |
tree | 3618f5fef912ba9568e24d7df1d562e1ec7fd862 /drivers/hid | |
parent | ae2f007468223e9efd6973be0364b9307a050a0c (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/hid')
-rw-r--r-- | drivers/hid/usbhid/hid-core.c | 2 |
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; |