diff options
author | Nikolai Kondrashov <spbnick@gmail.com> | 2012-03-02 15:13:58 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2012-03-05 04:28:58 -0500 |
commit | 883e0e366209067e690356e58e19bb2e6693b839 (patch) | |
tree | fc146f8908f26f519c4a3d4cf30e812598e10cd4 /drivers/hid/hid-input.c | |
parent | 37891abc8464637964a26ae4b61d307fef831f80 (diff) |
HID: hid-input: allow array fields out of range
Allow array field values out of range as per HID 1.11 specification,
section 6.2.25:
Rather than returning a single bit for each button in the group, an
array returns an index in each field that corresponds to the pressed
button (like keyboard scan codes). An out-of range value in and array
field is considered no controls asserted.
Apparently, "and" above is a typo and should be "an".
This fixes at least Waltop tablet pen clicks - otherwise BTN_TOUCH is never
released.
The relevant part of Waltop tablet report descriptors is this:
0x09, 0x42, /* Usage (Tip Switch), */
0x09, 0x44, /* Usage (Barrel Switch), */
0x09, 0x46, /* Usage (Tablet Pick), */
0x15, 0x01, /* Logical Minimum (1), */
0x25, 0x03, /* Logical Maximum (3), */
0x75, 0x04, /* Report Size (4), */
0x95, 0x01, /* Report Count (1), */
0x80, /* Input, */
This is a regression fix for commit b4b583d ("HID: be more strict when
ignoring out-of-range fields").
Signed-off-by: Nikolai Kondrashov <spbnick@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-input.c')
-rw-r--r-- | drivers/hid/hid-input.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 9333d692a786..627850a54d34 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -986,8 +986,13 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct | |||
986 | return; | 986 | return; |
987 | } | 987 | } |
988 | 988 | ||
989 | /* Ignore out-of-range values as per HID specification, section 5.10 */ | 989 | /* |
990 | if (value < field->logical_minimum || value > field->logical_maximum) { | 990 | * Ignore out-of-range values as per HID specification, |
991 | * section 5.10 and 6.2.25 | ||
992 | */ | ||
993 | if ((field->flags & HID_MAIN_ITEM_VARIABLE) && | ||
994 | (value < field->logical_minimum || | ||
995 | value > field->logical_maximum)) { | ||
991 | dbg_hid("Ignoring out-of-range value %x\n", value); | 996 | dbg_hid("Ignoring out-of-range value %x\n", value); |
992 | return; | 997 | return; |
993 | } | 998 | } |