diff options
Diffstat (limited to 'drivers/hid/usbhid/hid-core.c')
-rw-r--r-- | drivers/hid/usbhid/hid-core.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 1ebd3244eb85..b729c0286679 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 | |||
827 | ret++; | 827 | ret++; |
828 | } | 828 | } |
829 | } else { | 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 | } | ||
830 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | 837 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
831 | HID_REQ_SET_REPORT, | 838 | HID_REQ_SET_REPORT, |
832 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | 839 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, |
833 | ((report_type + 1) << 8) | *buf, | 840 | ((report_type + 1) << 8) | *buf, |
834 | interface->desc.bInterfaceNumber, buf + 1, count - 1, | 841 | interface->desc.bInterfaceNumber, buf, count, |
835 | USB_CTRL_SET_TIMEOUT); | 842 | USB_CTRL_SET_TIMEOUT); |
836 | /* count also the report id */ | 843 | /* count also the report id, if this was a numbered report. */ |
837 | if (ret > 0) | 844 | if (ret > 0 && skipped_report_id) |
838 | ret++; | 845 | ret++; |
839 | } | 846 | } |
840 | 847 | ||