Index: sys/dev/usb/usb_subr.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/usb_subr.c,v retrieving revision 1.190 diff -u -p -u -r1.190 usb_subr.c --- sys/dev/usb/usb_subr.c 20 Mar 2013 11:14:51 -0000 1.190 +++ sys/dev/usb/usb_subr.c 20 Mar 2013 12:47:58 -0000 @@ -1063,6 +1063,9 @@ usbd_reattach_device(device_t parent, us * Do as Windows does: try to read 64 bytes -- there are devices which * recognize the initial descriptor fetch (before the control endpoint's * MaxPacketSize is known by the host) by exactly this length. + * + * If the 64 bytes request fails try for just the 8 that the USB 2.0 + * specification says should be requested. */ static usbd_status usbd_get_initial_ddesc(usbd_device_handle dev, usb_device_descriptor_t *desc) @@ -1076,10 +1079,18 @@ usbd_get_initial_ddesc(usbd_device_handl USETW2(req.wValue, UDESC_DEVICE, 0); USETW(req.wIndex, 0); USETW(req.wLength, 64); + DPRINTF(("%s asking for 64 bytes\n", __func__)); + res = usbd_do_request_flags(dev, &req, buf, USBD_SHORT_XFER_OK, &actlen, USBD_DEFAULT_TIMEOUT); - if (res) - return res; + if (res) { + DPRINTF(("%s asking for 8 bytes\n", __func__)); + USETW(req.wLength, 8); + res = usbd_do_request_flags(dev, &req, buf, USBD_SHORT_XFER_OK, + &actlen, USBD_DEFAULT_TIMEOUT); + if (res) + return res; + } if (actlen < 8) return USBD_SHORT_XFER; memcpy(desc, buf, 8);