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 1ebd3244eb8..b729c028667 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++;  	}  |