Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c284979a authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Jiri Kosina
Browse files

HID: i2c-hid: fix i2c_hid_output_raw_report



i2c_hid_output_raw_report is used by hidraw to forward set_report requests.
The current implementation of i2c_hid_set_report needs to take the
report_id as an argument. The report_id is stored in the first byte
of the buffer in argument of i2c_hid_output_raw_report.

Not removing the report_id from the given buffer adds this byte 2 times
in the command, leading to a non working command.

Reported-by: default avatarAndrew Duggan <aduggan@synaptics.com>
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 320cde19
Loading
Loading
Loading
Loading
+12 −1
Original line number Original line Diff line number Diff line
@@ -540,13 +540,24 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
{
{
	struct i2c_client *client = hid->driver_data;
	struct i2c_client *client = hid->driver_data;
	int report_id = buf[0];
	int report_id = buf[0];
	int ret;


	if (report_type == HID_INPUT_REPORT)
	if (report_type == HID_INPUT_REPORT)
		return -EINVAL;
		return -EINVAL;


	return i2c_hid_set_report(client,
	if (report_id) {
		buf++;
		count--;
	}

	ret = i2c_hid_set_report(client,
				report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
				report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
				report_id, buf, count);
				report_id, buf, count);

	if (report_id && ret >= 0)
		ret++; /* add report_id to the number of transfered bytes */

	return ret;
}
}


static int i2c_hid_parse(struct hid_device *hid)
static int i2c_hid_parse(struct hid_device *hid)