On Wed, 23 Mar 2016, Alan Stern wrote: > The usbhid driver has inconsistently duplicated code in its post-reset, > resume, and reset-resume pathways. > > reset-resume doesn't check HID_STARTED before trying to > restart the I/O queues. > > resume fails to clear the HID_SUSPENDED flag if HID_STARTED > isn't set. > > resume calls usbhid_restart_queues() with usbhid->lock held > and the others call it without holding the lock. > > The first item in particular causes a problem following a reset-resume > if the driver hasn't started up its I/O. URB submission fails because > usbhid->urbin is NULL, and this triggers an unending reset-retry loop. > > This patch fixes the problem by creating a new subroutine, > hid_restart_io(), to carry out all the common activities. It also > adds some checks that were missing in the original code: > > After a reset, there's no need to clear any halted endpoints. > > After a resume, if a reset is pending there's no need to > restart any I/O until the reset is finished. > > After a resume, if the interrupt-IN endpoint is halted there's > no need to submit the input URB until the halt has been > cleared.
In addition to this being an actual fix, it's a nice cleanup as well. Thanks a lot; queuing for 4.6. -- Jiri Kosina SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html