Commit 75f1f19b authored by Daniel M. Lambea's avatar Daniel M. Lambea Committed by Jiri Kosina
Browse files

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: default avatarDaniel M. Lambea <dmlambea@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 6b003a8d
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -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)