Subject: "usbd_get_string: getting lang failed, using 0"
To: None <tech-kern@netbsd.org>
From: Cliff Neighbors <cliff@netbsd.org>
List: tech-kern
Date: 11/14/2007 01:25:07
so there I was... trying to bring up the ohci driver on XYZ chip:
...
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
usbd_get_string: getting lang failed, using 0
...
it seems in usbd_get_string_desc()\usb_subr.c the minimum value for
`actlen' as returned from the first call to usbd_do_request_flags()
(to get /* only size byte first */) is 2:
if (actlen < 2)
return (USBD_SHORT_XFER);
but the case when `sindex' value is 0, (Language table) `actlen; will
come back with value 1, thanks to ohci_root_ctrl_start()\ohci.c
who does
totlen = 1;
which ultimately gets returned via xfer->actlen through
usbd_do_request_flags() as 'actlen'.
So we have ohci_root_ctrl_start() setting xfer->actlen to 1,
and usbd_get_string_desc() insisting `actlen' should be
minimum of 2.
I'm not sure which is right; it seems that when asking for
only the size byte, the minimum can be 1.
here is my diff showing a proposed fix:
diff -u -r1.148.8.1 usb_subr.c
--- usb_subr.c 6 Nov 2007 23:30:42 -0000 1.148.8.1
+++ usb_subr.c 14 Nov 2007 08:58:19 -0000
@@ -180,7 +180,7 @@
if (err)
return (err);
- if (actlen < 2)
+ if (actlen < 1)
return (USBD_SHORT_XFER);
USETW(req.wLength, sdesc->bLength); /* the whole string */
this solves my immediate problem, but I'm not sure it is correct.
can someone who has spent more time in ohci.c review this?
regards,
-cliff-