projects/linux·commit 29129a98

HID: Send Report ID when numbered reports are sent over the control endpoint.

29129a98 · Alan Ott <[email protected]> · 2010-06-30 09:50:36 -04:00

The Report ID wasn't sent as part of the payload for reports which were sent
over the control endpoint. This is required by section 8.1 of the HID spec.

Signed-off-by: Alan Ott <[email protected]>
Signed-off-by: Jiri Kosina <[email protected]>
Commit
29129a98e6fc892d63bf7b8efcb458a258fe1683
Parents
1f45e324

Changes

1 files changed · +10 −3

FileStatusAddDelContent
drivers/hid/usbhid/hid-core.cmodified+10−3View file

drivers/hid/usbhid/hid-core.c

View file
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 1ebd324..b729c02 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -827,14 +827,21 @@ static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t co
ret++;
}
} else {
+ int skipped_report_id = 0;
+ if (buf[0] == 0x0) {
+ /* Don't send the Report ID */
+ buf++;
+ count--;
+ skipped_report_id = 1;
+ }
ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
HID_REQ_SET_REPORT,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
((report_type + 1) << 8) | *buf,
- interface->desc.bInterfaceNumber, buf + 1, count - 1,
+ interface->desc.bInterfaceNumber, buf, count,
USB_CTRL_SET_TIMEOUT);
- /* count also the report id */
- if (ret > 0)
+ /* count also the report id, if this was a numbered report. */
+ if (ret > 0 && skipped_report_id)
ret++;
}