diff options
author | joe <joe@FreeBSD.org> | 2003-01-14 23:07:43 +0000 |
---|---|---|
committer | joe <joe@FreeBSD.org> | 2003-01-14 23:07:43 +0000 |
commit | 519d68956b6ba2d8ebddcb3046454e9c7957f93b (patch) | |
tree | 8243a2ff179ca87bd1be888e54d2df601c922bc2 /sys/dev/usb | |
parent | e9184d11f9970e9cd10311e9bfd685db20115fec (diff) | |
download | FreeBSD-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.c | 10 |
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)); } |