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

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 <alan@signal11.us>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

authored by Alan Ott and committed by Jiri Kosina 29129a98 1f45e324

+10 -3
+10 -3
drivers/hid/usbhid/hid-core.c
··· 827 ret++; 828 } 829 } else { 830 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 831 HID_REQ_SET_REPORT, 832 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 833 ((report_type + 1) << 8) | *buf, 834 - interface->desc.bInterfaceNumber, buf + 1, count - 1, 835 USB_CTRL_SET_TIMEOUT); 836 - /* count also the report id */ 837 - if (ret > 0) 838 ret++; 839 } 840
··· 827 ret++; 828 } 829 } else { 830 + int skipped_report_id = 0; 831 + if (buf[0] == 0x0) { 832 + /* Don't send the Report ID */ 833 + buf++; 834 + count--; 835 + skipped_report_id = 1; 836 + } 837 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 838 HID_REQ_SET_REPORT, 839 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 840 ((report_type + 1) << 8) | *buf, 841 + interface->desc.bInterfaceNumber, buf, count, 842 USB_CTRL_SET_TIMEOUT); 843 + /* count also the report id, if this was a numbered report. */ 844 + if (ret > 0 && skipped_report_id) 845 ret++; 846 } 847