Commit 46386b58 authored by Simon Budig's avatar Simon Budig Committed by Jiri Kosina

HID: introduce proper zeroing of unused bits in output reports

Some HID devices are looking on the unused bits in the HID reports they
receive. This is violating the specification, but we want to make those
devices work. Well-behaving devices are unaffected, as they don't care
about the unused bits.

If bitsused % 8 is 0 all bits in data[] get used and we don't need to
clear anything. Otherwise (bitsused % 8) bits of the last byte get used.
By shifting 1 for (bitsused % 8) bits and subtracting 1 we create a mask
consisting of (bitsused % 8) ones and remaining zeroes. By ANDing we
clear the upper unused bits.
Signed-off-by: default avatarSimon Budig <simon@budig.de>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent a21bd69e
...@@ -872,8 +872,13 @@ static void hid_output_field(struct hid_field *field, __u8 *data) ...@@ -872,8 +872,13 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
unsigned count = field->report_count; unsigned count = field->report_count;
unsigned offset = field->report_offset; unsigned offset = field->report_offset;
unsigned size = field->report_size; unsigned size = field->report_size;
unsigned bitsused = offset + count * size;
unsigned n; unsigned n;
/* make sure the unused bits in the last byte are zeros */
if (count > 0 && size > 0 && (bitsused % 8) != 0)
data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1;
for (n = 0; n < count; n++) { for (n = 0; n < count; n++) {
if (field->logical_minimum < 0) /* signed values */ if (field->logical_minimum < 0) /* signed values */
implement(data, offset + n * size, size, s32ton(field->value[n], size)); implement(data, offset + n * size, size, s32ton(field->value[n], size));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment