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 <kevin@koconnor.net>
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 @@
     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);