Skip to content

Commit

Permalink
HID: cougar: Stop processing vendor events on hid-core
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel M. Lambea authored and Jiri Kosina committed Sep 5, 2018
1 parent 6b003a8 commit 75f1f19
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions drivers/hid/hid-cougar.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 75f1f19

Please sign in to comment.