| From 56626a72a47bf3e50875d960d6b5f17b9bee0ab2 Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Thu, 14 Oct 2010 15:25:21 -0400 |
| Subject: USB: accept some invalid ep0-maxpacket values |
| |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| commit 56626a72a47bf3e50875d960d6b5f17b9bee0ab2 upstream. |
| |
| A few devices (such as the RCA VR5220 voice recorder) are so |
| non-compliant with the USB spec that they have invalid maxpacket sizes |
| for endpoint 0. Nevertheless, as long as we can safely use them, we |
| may as well do so. |
| |
| This patch (as1432) softens our acceptance criterion by allowing |
| high-speed devices to have ep0-maxpacket sizes other than 64. A |
| warning is printed in the system log when this happens, and the |
| existing error message is clarified. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Reported-by: James <bjlockie@lockie.ca> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/core/hub.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/usb/core/hub.c |
| +++ b/drivers/usb/core/hub.c |
| @@ -2821,13 +2821,16 @@ hub_port_init (struct usb_hub *hub, stru |
| else |
| i = udev->descriptor.bMaxPacketSize0; |
| if (le16_to_cpu(udev->ep0.desc.wMaxPacketSize) != i) { |
| - if (udev->speed != USB_SPEED_FULL || |
| + if (udev->speed == USB_SPEED_LOW || |
| !(i == 8 || i == 16 || i == 32 || i == 64)) { |
| - dev_err(&udev->dev, "ep0 maxpacket = %d\n", i); |
| + dev_err(&udev->dev, "Invalid ep0 maxpacket: %d\n", i); |
| retval = -EMSGSIZE; |
| goto fail; |
| } |
| - dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i); |
| + if (udev->speed == USB_SPEED_FULL) |
| + dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i); |
| + else |
| + dev_warn(&udev->dev, "Using ep0 maxpacket: %d\n", i); |
| udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i); |
| usb_ep0_reinit(udev); |
| } |