Commit 59d2f5b7 authored by Luke D. Jones's avatar Luke D. Jones Committed by Jiri Kosina
Browse files

HID: asus: fix more n-key report descriptors if n-key quirked



Adjusts the report descriptor for N-Key devices to
make the output count 0x01 which completely avoids
the need for a block of filtering.

Signed-off-by: default avatarLuke D. Jones <luke@ljones.dev>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.com>
parent 3e78a6c0
Loading
Loading
Loading
Loading
+24 −27
Original line number Diff line number Diff line
@@ -335,26 +335,12 @@ static int asus_raw_event(struct hid_device *hdev,
	if (drvdata->quirks & QUIRK_MEDION_E1239T)
		return asus_e1239t_event(drvdata, data, size);

	if (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) {
	/*
	 * Skip these report ID, the device emits a continuous stream associated
	 * with the AURA mode it is in which looks like an 'echo'.
	 */
		if (report->id == FEATURE_KBD_LED_REPORT_ID1 ||
				report->id == FEATURE_KBD_LED_REPORT_ID2) {
	if (report->id == FEATURE_KBD_LED_REPORT_ID1 || report->id == FEATURE_KBD_LED_REPORT_ID2)
		return -1;
		/* Additional report filtering */
		} else if (report->id == FEATURE_KBD_REPORT_ID) {
			/*
			 * G14 and G15 send these codes on some keypresses with no
			 * discernable reason for doing so. We'll filter them out to avoid
			 * unmapped warning messages later.
			*/
			if (data[1] == 0xea || data[1] == 0xec || data[1] == 0x02 ||
					data[1] == 0x8a || data[1] == 0x9e) {
				return -1;
			}
		}
	if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) {
		/*
		 * G713 and G733 send these codes on some keypresses, depending on
@@ -365,8 +351,6 @@ static int asus_raw_event(struct hid_device *hdev,
		}
	}

	}

	if (drvdata->quirks & QUIRK_ROG_CLAYMORE_II_KEYBOARD) {
		/*
		 * CLAYMORE II keyboard sends this packet when it goes to sleep
@@ -1250,6 +1234,19 @@ static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc,
		rdesc[205] = 0x01;
	}

	/* match many more n-key devices */
	if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) {
		for (int i = 0; i < *rsize + 1; i++) {
			/* offset to the count from 0x5a report part always 14 */
			if (rdesc[i] == 0x85 && rdesc[i + 1] == 0x5a &&
			    rdesc[i + 14] == 0x95 && rdesc[i + 15] == 0x05) {
				hid_info(hdev, "Fixing up Asus N-Key report descriptor\n");
				rdesc[i + 15] = 0x01;
				break;
			}
		}
	}

	return rdesc;
}