Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: accept 1-byte Device Status replies, fixing some b0rken devices

Some devices have a bug which causes them to send a 1-byte reply to
Get-Device-Status requests instead of 2 bytes as required by the
spec. This doesn't play well with autosuspend, since we look for a
valid status reply to make sure the device is still present when it
resumes. Without both bytes, we assume the device has been
disconnected.

Lack of the second byte shouldn't matter much, since the spec requires
it always to be equal to 0. Hence this patch (as959) causes
finish_port_resume() to accept a 1-byte reply as valid.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: David Brownell <david-b@pacbell.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Alan Stern and committed by
Greg Kroah-Hartman
46dede46 f095137e

+2 -1
+2 -1
drivers/usb/core/hub.c
··· 1644 1644 * and device drivers will know about any resume quirks. 1645 1645 */ 1646 1646 if (status == 0) { 1647 + devstatus = 0; 1647 1648 status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); 1648 1649 if (status >= 0) 1649 - status = (status == 2 ? 0 : -ENODEV); 1650 + status = (status > 0 ? 0 : -ENODEV); 1650 1651 } 1651 1652 1652 1653 if (status) {