From 828ef12437094648db4c3747133d8c255fb50c91 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Fri, 24 Jan 2014 14:34:00 -0500 Subject: [PATCH] usb: USB 3 devices encode bMaxPacketSize0 field. A USB 3 device uses an exponential encoding of the max packet size for the default end point. Signed-off-by: Kevin O'Connor --- src/hw/usb.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/hw/usb.c b/src/hw/usb.c index 8ffddf8..ff20b6c 100644 --- a/src/hw/usb.c +++ b/src/hw/usb.c @@ -319,13 +319,16 @@ configure_usb_device(struct usbdevice_s *usbdev) int ret = get_device_info8(usbdev->defpipe, &dinfo); if (ret) return 0; - dprintf(3, "device rev=%04x cls=%02x sub=%02x proto=%02x size=%02x\n" + u16 maxpacket = dinfo.bMaxPacketSize0; + if (dinfo.bcdUSB >= 0x0300) + maxpacket = 1 << dinfo.bMaxPacketSize0; + dprintf(3, "device rev=%04x cls=%02x sub=%02x proto=%02x size=%d\n" , dinfo.bcdUSB, dinfo.bDeviceClass, dinfo.bDeviceSubClass - , dinfo.bDeviceProtocol, dinfo.bMaxPacketSize0); - if (dinfo.bMaxPacketSize0 < 8 || dinfo.bMaxPacketSize0 > 64) + , dinfo.bDeviceProtocol, maxpacket); + if (maxpacket < 8) return 0; struct usb_endpoint_descriptor epdesc = { - .wMaxPacketSize = dinfo.bMaxPacketSize0, + .wMaxPacketSize = maxpacket, .bmAttributes = USB_ENDPOINT_XFER_CONTROL, }; usbdev->defpipe = usb_update_pipe(usbdev, usbdev->defpipe, &epdesc); -- 2.39.5