diff options
author | Daniel M. Lambea <dmlambea@gmail.com> | 2018-07-27 23:19:12 +0300 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2018-09-05 11:25:37 +0300 |
commit | 75f1f19bdd60575164b5d1fb04602bf4450e2b62 (patch) | |
tree | 80edae4da0970021eec2473f92ce188c563e74c8 /drivers/hid | |
parent | 6b003a8ddd6f413a7e17470515accdd4cd80e871 (diff) | |
download | linux-75f1f19bdd60575164b5d1fb04602bf4450e2b62.tar.xz |
HID: cougar: Stop processing vendor events on hid-core
Special key events received by the custom vendor's hdev are
translated to key events on the kbd iface's input device, so
their processing must not continue. Return -EPERM from
raw_event handler to effectively stop source events from
being processed in hid-core.
Signed-off-by: Daniel M. Lambea <dmlambea@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/hid-cougar.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/hid/hid-cougar.c b/drivers/hid/hid-cougar.c index 910ef4312157..3f0916b64c60 100644 --- a/drivers/hid/hid-cougar.c +++ b/drivers/hid/hid-cougar.c @@ -261,26 +261,32 @@ static int cougar_raw_event(struct hid_device *hdev, struct hid_report *report, u8 *data, int size) { struct cougar *cougar; + struct cougar_shared *shared; unsigned char code, action; int i; cougar = hid_get_drvdata(hdev); - if (!cougar->special_intf || !cougar->shared || - !cougar->shared->input || !cougar->shared->enabled) + shared = cougar->shared; + if (!cougar->special_intf || !shared) return 0; + if (!shared->enabled || !shared->input) + return -EPERM; + code = data[COUGAR_FIELD_CODE]; action = data[COUGAR_FIELD_ACTION]; for (i = 0; cougar_mapping[i][0]; i++) { if (code == cougar_mapping[i][0]) { - input_event(cougar->shared->input, EV_KEY, + input_event(shared->input, EV_KEY, cougar_mapping[i][1], action); - input_sync(cougar->shared->input); - return 0; + input_sync(shared->input); + return -EPERM; } } - hid_warn(hdev, "unmapped special key code %x: ignoring\n", code); - return 0; + /* Avoid warnings on the same unmapped key twice */ + if (action != 0) + hid_warn(hdev, "unmapped special key code %0x: ignoring\n", code); + return -EPERM; } static void cougar_remove(struct hid_device *hdev) |