From: Alan Stern Date: Tue, 2 Sep 2014 15:39:15 +0000 (-0400) Subject: HID: usbhid: improve handling of Clear-Halt and reset X-Git-Tag: fixes-for-v3.18-merge-window~27^2^8~4 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f507ef522d55a6e2f9e11a1c1163a92756da044;p=pandora-kernel.git HID: usbhid: improve handling of Clear-Halt and reset This patch changes the way usbhid carries out Clear-Halt and reset. Currently, after a Clear-Halt on the interrupt-IN endpoint, the driver immediately restarts the interrupt URB, even if the Clear-Halt failed. This doesn't work out well when the reason for the failure was that the device was disconnected (when a low- or full-speed device is connected through a hub to an EHCI controller, transfer errors caused by disconnection are reported as stalls by the hub). Instead now the driver will attempt a reset after a failed Clear-Halt. The way resets are carried out is also changed. Now the driver will call usb_queue_reset_device() instead of calling usb_reset_device() directly. This avoids a deadlock that would arise when a device is unplugged: The hid_reset() routine runs as a workqueue item, a reset attempt after the device has been unplugged will fail, failure will cause usbhid to be unbound, and the disconnect routine will try to do cancel_work_sync(). The usb_queue_reset_device() implementation is carefully written to handle scenarios like this one properly. Signed-off-by: Alan Stern Signed-off-by: Jiri Kosina --- Reading git-diff-tree failed