diff options
author | Benjamin Tissoires <benjamin.tissoires@gmail.com> | 2013-01-31 11:50:02 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-01-31 11:57:53 -0500 |
commit | c284979affcc6870a9a6545fc4b1adb3816dfcbf (patch) | |
tree | 66e97688610f6017627d46694363cb162a8f70ba /drivers | |
parent | 320cde19a4e8f122b19d2df7a5c00636e11ca3fb (diff) |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hid/i2c-hid/i2c-hid.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index 9ef222442ca0..5774ebf4298c 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c | |||
@@ -540,13 +540,24 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf, | |||
540 | { | 540 | { |
541 | struct i2c_client *client = hid->driver_data; | 541 | struct i2c_client *client = hid->driver_data; |
542 | int report_id = buf[0]; | 542 | int report_id = buf[0]; |
543 | int ret; | ||
543 | 544 | ||
544 | if (report_type == HID_INPUT_REPORT) | 545 | if (report_type == HID_INPUT_REPORT) |
545 | return -EINVAL; | 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 | report_type == HID_FEATURE_REPORT ? 0x03 : 0x02, | 554 | report_type == HID_FEATURE_REPORT ? 0x03 : 0x02, |
549 | report_id, buf, count); | 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 | static int i2c_hid_parse(struct hid_device *hid) | 563 | static int i2c_hid_parse(struct hid_device *hid) |