Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Benjamin Tissoires and committed by
Jiri Kosina
c284979a 320cde19

+12 -1
+12 -1
drivers/hid/i2c-hid/i2c-hid.c
··· 540 540 { 541 541 struct i2c_client *client = hid->driver_data; 542 542 int report_id = buf[0]; 543 + int ret; 543 544 544 545 if (report_type == HID_INPUT_REPORT) 545 546 return -EINVAL; 546 547 547 - return i2c_hid_set_report(client, 548 + if (report_id) { 549 + buf++; 550 + count--; 551 + } 552 + 553 + ret = i2c_hid_set_report(client, 548 554 report_type == HID_FEATURE_REPORT ? 0x03 : 0x02, 549 555 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; 550 561 } 551 562 552 563 static int i2c_hid_parse(struct hid_device *hid)