summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorjoe <joe@FreeBSD.org>2003-01-14 23:07:43 +0000
committerjoe <joe@FreeBSD.org>2003-01-14 23:07:43 +0000
commit519d68956b6ba2d8ebddcb3046454e9c7957f93b (patch)
tree8243a2ff179ca87bd1be888e54d2df601c922bc2 /sys/dev/usb
parente9184d11f9970e9cd10311e9bfd685db20115fec (diff)
downloadFreeBSD-src-519d68956b6ba2d8ebddcb3046454e9c7957f93b.zip
FreeBSD-src-519d68956b6ba2d8ebddcb3046454e9c7957f93b.tar.gz
Some USB devices are not prepared to deal with a single byte string
descriptor request, which usbd_get_string_desc() uses to get the length of a descriptor. One device for instance returns a full 8 byte long packet instead which confuses the rest of the stack and leads to the USB port being reset. The fix is to instead request two bytes, but not to complain if we only get one. Submitted by: kan MFC after: 3 days
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/usb_subr.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c
index ee5b875..08ebe65 100644
--- a/sys/dev/usb/usb_subr.c
+++ b/sys/dev/usb/usb_subr.c
@@ -153,15 +153,21 @@ usbd_get_string_desc(usbd_device_handle dev, int sindex, int langid,
{
usb_device_request_t req;
usbd_status err;
+ int actlen;
req.bmRequestType = UT_READ_DEVICE;
req.bRequest = UR_GET_DESCRIPTOR;
USETW2(req.wValue, UDESC_STRING, sindex);
USETW(req.wIndex, langid);
- USETW(req.wLength, 1); /* only size byte first */
- err = usbd_do_request(dev, &req, sdesc);
+ USETW(req.wLength, 2); /* only size byte first */
+ err = usbd_do_request_flags(dev, &req, sdesc, USBD_SHORT_XFER_OK,
+ &actlen, USBD_DEFAULT_TIMEOUT);
if (err)
return (err);
+
+ if (actlen < 1)
+ return (USBD_SHORT_XFER);
+
USETW(req.wLength, sdesc->bLength); /* the whole string */
return (usbd_do_request(dev, &req, sdesc));
}
OpenPOWER on IntegriCloud