HID: usbhid: improve handling of Clear-Halt and reset
authorAlan Stern <stern@rowland.harvard.edu>
Tue, 2 Sep 2014 15:39:15 +0000 (11:39 -0400)
committermobile promotions <svcmobile_promotions@nvidia.com>
Sat, 26 Nov 2016 00:19:19 +0000 (16:19 -0800)
commit064d1094f2a67b71ec55a8b8938e52da2634fde7
tree07941303c996bc17bcc06ce85f6fdc76eeddb2b9
parent4c1235923bf1c01966eb815b07a48d01369b65f4
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.

Bug 1838664

Change-Id: Ifb3fb19787b87ce72c8010f3d15d8b8392413162
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Reviewed-on: http://git-master/r/1257991
Reviewed-by: ChihMin Cheng <ccheng@nvidia.com>
Reviewed-by: Hans Yang <hansy@nvidia.com>
Tested-by: Hans Yang <hansy@nvidia.com>
Reviewed-by: WK Tsai <wtsai@nvidia.com>
Reviewed-by: Henry Lin <henryl@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Vinayak Pane <vpane@nvidia.com>
drivers/hid/usbhid/hid-core.c