From 519d68956b6ba2d8ebddcb3046454e9c7957f93b Mon Sep 17 00:00:00 2001 From: joe Date: Tue, 14 Jan 2003 23:07:43 +0000 Subject: [PATCH] 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 --- sys/dev/usb/usb_subr.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c index ee5b8757036b..08ebe65c5550 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)); }