• Alan Stern's avatar
    HID: usbhid: improve handling of Clear-Halt and reset · 8f507ef5
    Alan Stern authored
    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: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    8f507ef5
hid-core.c 43.5 KB