summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usbdi_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/usbdi_util.c')
-rw-r--r--sys/dev/usb/usbdi_util.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/dev/usb/usbdi_util.c b/sys/dev/usb/usbdi_util.c
index a439655..f7b64ba 100644
--- a/sys/dev/usb/usbdi_util.c
+++ b/sys/dev/usb/usbdi_util.c
@@ -336,9 +336,10 @@ usbd_set_idle(iface, duration, id)
}
usbd_status
-usbd_get_report_descriptor(dev, i, size, d)
+usbd_get_report_descriptor(dev, ifcno, repid, size, d)
usbd_device_handle dev;
- int i;
+ int ifcno;
+ int repid;
int size;
void *d;
{
@@ -346,8 +347,8 @@ usbd_get_report_descriptor(dev, i, size, d)
req.bmRequestType = UT_READ_INTERFACE;
req.bRequest = UR_GET_DESCRIPTOR;
- USETW2(req.wValue, UDESC_REPORT, 0);
- USETW(req.wIndex, i);
+ USETW2(req.wValue, UDESC_REPORT, repid);
+ USETW(req.wIndex, ifcno);
USETW(req.wLength, size);
return (usbd_do_request(dev, &req, d));
}
@@ -393,6 +394,7 @@ usbd_alloc_report_desc(ifc, descp, sizep, mem)
#endif
{
+ usb_interface_descriptor_t *id;
usb_hid_descriptor_t *hid;
usbd_device_handle dev;
usbd_status r;
@@ -400,6 +402,9 @@ usbd_alloc_report_desc(ifc, descp, sizep, mem)
r = usbd_interface2device_handle(ifc, &dev);
if (r != USBD_NORMAL_COMPLETION)
return (r);
+ id = usbd_get_interface_descriptor(ifc);
+ if (!id)
+ return (USBD_INVAL);
hid = usbd_get_hid_descriptor(ifc);
if (!hid)
return (USBD_IOERROR);
@@ -407,7 +412,9 @@ usbd_alloc_report_desc(ifc, descp, sizep, mem)
*descp = malloc(*sizep, mem, M_NOWAIT);
if (!*descp)
return (USBD_NOMEM);
- r = usbd_get_report_descriptor(dev, 0, *sizep, *descp);
+ /* XXX should not use 0 Report ID */
+ r = usbd_get_report_descriptor(dev, id->bInterfaceNumber, 0,
+ *sizep, *descp);
if (r != USBD_NORMAL_COMPLETION) {
free(*descp, mem);
return (r);
OpenPOWER on IntegriCloud