From 52a6b7ce30ec585392dda7f2e15e64087a4335aa Mon Sep 17 00:00:00 2001 From: hselasky Date: Thu, 27 Sep 2012 15:45:24 +0000 Subject: [PATCH] Make sure the "wMaxPacketSize" limitations are respected. --- sys/dev/usb/controller/dwc_otg.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/sys/dev/usb/controller/dwc_otg.c b/sys/dev/usb/controller/dwc_otg.c index d46d613ee892..3086ae2ae273 100644 --- a/sys/dev/usb/controller/dwc_otg.c +++ b/sys/dev/usb/controller/dwc_otg.c @@ -3974,9 +3974,34 @@ dwc_otg_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc, return; } } else { - if (udev->speed != USB_SPEED_LOW && - udev->speed != USB_SPEED_FULL && - udev->speed != USB_SPEED_HIGH) { + uint16_t mps; + + mps = UGETW(edesc->wMaxPacketSize); + + /* Apply limitations of our USB host driver */ + + switch (udev->speed) { + case USB_SPEED_HIGH: + if (mps > 512) { + DPRINTF("wMaxPacketSize=0x%04x" + "is not supported\n", (int)mps); + /* not supported */ + return; + } + break; + + case USB_SPEED_FULL: + case USB_SPEED_LOW: + if (mps > 188) { + DPRINTF("wMaxPacketSize=0x%04x" + "is not supported\n", (int)mps); + /* not supported */ + return; + } + break; + + default: + DPRINTF("Invalid device speed\n"); /* not supported */ return; }