diff options
author | Alan Stern | 2014-09-02 11:39:15 -0400 |
---|---|---|
committer | Jiri Kosina | 2014-09-03 23:37:38 +0200 |
commit | 8f507ef522d55a6e2f9e11a1c1163a92756da044 (patch) | |
tree | 7f053757c34528cbf56aac2ffc49fe7eb48623eb /sound/i2c | |
parent | 79346d620e9de87912de73337f6df8b7f9a46888 (diff) |
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 <stern@rowland.harvard.edu>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'sound/i2c')
0 files changed, 0 insertions, 0 deletions