lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Sat, 19 Feb 2022 11:01:51 +0100
From:   José Expósito <jose.exposito89@...il.com>
To:     jikos@...nel.org
Cc:     benjamin.tissoires@...hat.com, spbnick@...il.com,
        linux-input@...r.kernel.org, linux-kernel@...r.kernel.org,
        José Expósito <jose.exposito89@...il.com>
Subject: [PATCH for-5.18/uclogic 3/9] HID: uclogic: Switch to matching subreport bytes

From: Nikolai Kondrashov <spbnick@...il.com>

Switch from matching UC-Logic subreport with a mask to a full value to
support detecting Huion HS610 touch dial reports. Those would match the
button mask otherwise.

Signed-off-by: Nikolai Kondrashov <spbnick@...il.com>
Signed-off-by: José Expósito <jose.exposito89@...il.com>
---
 drivers/hid/hid-uclogic-core.c   |  9 ++++++---
 drivers/hid/hid-uclogic-params.c |  4 ++--
 drivers/hid/hid-uclogic-params.h | 13 +++++++------
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/hid/hid-uclogic-core.c b/drivers/hid/hid-uclogic-core.c
index 7092f86517a5..a02edeb30a35 100644
--- a/drivers/hid/hid-uclogic-core.c
+++ b/drivers/hid/hid-uclogic-core.c
@@ -365,9 +365,12 @@ static int uclogic_raw_event(struct hid_device *hdev,
 				ARRAY_SIZE(params->pen.subreport_list);
 			/* Try to match a subreport */
 			for (subreport = params->pen.subreport_list;
-			     subreport < subreport_list_end &&
-				(data[1] & subreport->mask) != subreport->mask;
-			     subreport++);
+			     subreport < subreport_list_end; subreport++) {
+				if (subreport->value != 0 &&
+				    subreport->value == data[1]) {
+					break;
+				}
+			}
 			/* If a subreport matched */
 			if (subreport < subreport_list_end) {
 				/* Change to subreport ID, and restart */
diff --git a/drivers/hid/hid-uclogic-params.c b/drivers/hid/hid-uclogic-params.c
index 138dd8b0a360..a4a53ab1e72c 100644
--- a/drivers/hid/hid-uclogic-params.c
+++ b/drivers/hid/hid-uclogic-params.c
@@ -763,7 +763,7 @@ static int uclogic_params_huion_init(struct uclogic_params *params,
 				goto cleanup;
 			}
 			/* Link frame button subreports from pen reports */
-			p.pen.subreport_list[0].mask = 0x20;
+			p.pen.subreport_list[0].value = 0xe0;
 			p.pen.subreport_list[0].id =
 				UCLOGIC_RDESC_BUTTONPAD_V2_ID;
 			goto output;
@@ -791,7 +791,7 @@ static int uclogic_params_huion_init(struct uclogic_params *params,
 			(found ? "" : " not"));
 		if (found) {
 			/* Link frame button subreports from pen reports */
-			p.pen.subreport_list[0].mask = 0x20;
+			p.pen.subreport_list[0].value = 0xe0;
 			p.pen.subreport_list[0].id =
 				UCLOGIC_RDESC_BUTTONPAD_V1_ID;
 		}
diff --git a/drivers/hid/hid-uclogic-params.h b/drivers/hid/hid-uclogic-params.h
index 82db8ab36fec..c18569591b75 100644
--- a/drivers/hid/hid-uclogic-params.h
+++ b/drivers/hid/hid-uclogic-params.h
@@ -39,14 +39,15 @@ extern const char *uclogic_params_pen_inrange_to_str(
  */
 struct uclogic_params_pen_subreport {
 	/*
-	 * The subreport's bitmask matching the second byte of the pen report.
-	 * If zero, the subreport is considered invalid, and won't match.
+	 * The value of the second byte of the pen report indicating this
+	 * subreport. If zero, the subreport should be considered invalid and
+	 * not matched.
 	 */
-	__u8 mask;
+	__u8 value;
 
 	/*
-	 * The ID to be assigned to the report, if the "mask" matches.
-	 * Only valid if "mask" is not zero.
+	 * The ID to be assigned to the report, if the second byte of the pen
+	 * report is equal to "value". Only valid if "value" is not zero.
 	 */
 	__u8 id;
 };
@@ -200,7 +201,7 @@ extern int uclogic_params_init(struct uclogic_params *params,
 		(_params)->pen.desc_ptr,                                    \
 		(_params)->pen.desc_size,                                   \
 		(_params)->pen.id,                                          \
-		(_params)->pen.subreport_list[0].mask,                      \
+		(_params)->pen.subreport_list[0].value,                     \
 		(_params)->pen.subreport_list[0].id,                        \
 		uclogic_params_pen_inrange_to_str((_params)->pen.inrange),  \
 		((_params)->pen.fragmented_hires ? "true" : "false"),       \
-- 
2.25.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ