Skip to content

Commit c284979

Browse files
bentissJiri Kosina
authored andcommitted
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: Andrew Duggan <aduggan@synaptics.com> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
1 parent 320cde1 commit c284979

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

drivers/hid/i2c-hid/i2c-hid.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,13 +540,24 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
540540
{
541541
struct i2c_client *client = hid->driver_data;
542542
int report_id = buf[0];
543+
int ret;
543544

544545
if (report_type == HID_INPUT_REPORT)
545546
return -EINVAL;
546547

547-
return i2c_hid_set_report(client,
548+
if (report_id) {
549+
buf++;
550+
count--;
551+
}
552+
553+
ret = i2c_hid_set_report(client,
548554
report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
549555
report_id, buf, count);
556+
557+
if (report_id && ret >= 0)
558+
ret++; /* add report_id to the number of transfered bytes */
559+
560+
return ret;
550561
}
551562

552563
static int i2c_hid_parse(struct hid_device *hid)

0 commit comments

Comments
 (0)