Message ID | 20240201044055.23367-1-tatsunosuke.wacom@gmail.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | ab41a31dd5e2681803642b6d08590b61867840ec |
Delegated to: | Jiri Kosina |
Headers | show |
Series | [1/2] HID: wacom: generic: Avoid reporting a serial of '0' to userspace | expand |
On Thu, 1 Feb 2024, Tobita, Tatsunosuke wrote: > From: Tatsunosuke Tobita <tatsunosuke.tobita@wacom.com> > > The xf86-input-wacom driver does not treat '0' as a valid serial > number and will drop any input report which contains an > MSC_SERIAL = 0 event. The kernel driver already takes care to > avoid sending any MSC_SERIAL event if the value of serial[0] == 0 > (which is the case for devices that don't actually report a > serial number), but this is not quite sufficient. > Only the lower 32 bits of the serial get reported to userspace, > so if this portion of the serial is zero then there can still > be problems. > > This commit allows the driver to report either the lower 32 bits > if they are non-zero or the upper 32 bits otherwise. > > Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> > Signed-off-by: Tatsunosuke Tobita <tatsunosuke.tobita@wacom.com> > Fixes: f85c9dc678a5 ("HID: wacom: generic: Support tool ID and additional tool types") > CC: stable@vger.kernel.org # v4.10 Applied to hid.git#for-6.8/upstream-fixes.
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index da8a01fedd39..fbe10fbc5769 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -2575,7 +2575,14 @@ static void wacom_wac_pen_report(struct hid_device *hdev, wacom_wac->hid_data.tipswitch); input_report_key(input, wacom_wac->tool[0], sense); if (wacom_wac->serial[0]) { - input_event(input, EV_MSC, MSC_SERIAL, wacom_wac->serial[0]); + /* + * xf86-input-wacom does not accept a serial number + * of '0'. Report the low 32 bits if possible, but + * if they are zero, report the upper ones instead. + */ + __u32 serial_lo = wacom_wac->serial[0] & 0xFFFFFFFFu; + __u32 serial_hi = wacom_wac->serial[0] >> 32; + input_event(input, EV_MSC, MSC_SERIAL, (int)(serial_lo ? serial_lo : serial_hi)); input_report_abs(input, ABS_MISC, sense ? id : 0); }