ums(4): Disable vendor usage page button support

for all devices except Kensington Slimblade Trackball as it brokes
some other devices like Contour Rollermouse Red

Add a quirk for it as well.

Reported by:	Atte Peltomäki <koston_AT_iki_DOT_fi>
PR:		267922
MFC after:	2 weeks
This commit is contained in:
Vladimir Kondratyev 2022-12-24 12:01:20 +03:00
parent 860399eb86
commit ab4f740bc5
5 changed files with 19 additions and 6 deletions

View file

@ -78,6 +78,8 @@ does not identify properly
mouse sends an unknown leading byte
.It UQ_MS_REVZ
mouse has Z-axis reversed
.It UQ_MS_VENDOR_BTN
mouse has buttons in vendor usage page
.It UQ_NO_STRINGS
string descriptors are broken
.It UQ_POWER_CLAIM

View file

@ -122,6 +122,7 @@ struct ums_info {
#define UMS_FLAG_SBU 0x0010 /* spurious button up events */
#define UMS_FLAG_REVZ 0x0020 /* Z-axis is reversed */
#define UMS_FLAG_W_AXIS 0x0040
#define UMS_FLAG_VBTN 0x0080 /* Buttons in vendor usage page */
uint8_t sc_iid_w;
uint8_t sc_iid_x;
@ -538,12 +539,13 @@ ums_hid_parse(struct ums_softc *sc, device_t dev, const uint8_t *buf,
}
/* detect other buttons */
for (j = 0; (i < UMS_BUTTON_MAX) && (j < 2); i++, j++) {
if (!hid_locate(buf, len, HID_USAGE2(HUP_MICROSOFT, (j + 1)),
hid_input, index, &info->sc_loc_btn[i], NULL,
&info->sc_iid_btn[i])) {
break;
if (info->sc_flags & UMS_FLAG_VBTN) {
for (j = 0; (i < UMS_BUTTON_MAX) && (j < 2); i++, j++) {
if (!hid_locate(buf, len, HID_USAGE2(HUP_MICROSOFT,
(j + 1)), hid_input, index, &info->sc_loc_btn[i],
NULL, &info->sc_iid_btn[i])) {
break;
}
}
}
@ -618,6 +620,10 @@ ums_attach(device_t dev)
isize = hid_report_size_max(d_ptr, d_len, hid_input, &sc->sc_iid);
if (usb_test_quirk(uaa, UQ_MS_VENDOR_BTN))
for (i = 0; i < UMS_INFO_MAX; i++)
sc->sc_info[i].sc_flags |= UMS_FLAG_VBTN;
/*
* The Microsoft Wireless Notebook Optical Mouse seems to be in worse
* shape than the Wireless Intellimouse 2.0, as its X, Y, wheel, and

View file

@ -175,6 +175,8 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
/* Quirk for Corsair STRAFE Gaming keyboard */
USB_QUIRK(CORSAIR, STRAFE, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
USB_QUIRK(CORSAIR, STRAFE2, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
/* Quirk for Kensington Slimblade Trackball */
USB_QUIRK(KENSINGTON, SLIMBLADE, 0x0000, 0xffff, UQ_MS_VENDOR_BTN),
/* umodem(4) device quirks */
USB_QUIRK(METRICOM, RICOCHET_GS, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA),
USB_QUIRK(SANYO, SCP4900, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA),
@ -649,6 +651,7 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = {
[UQ_MS_BAD_CLASS] = "UQ_MS_BAD_CLASS",
[UQ_MS_LEADING_BYTE] = "UQ_MS_LEADING_BYTE",
[UQ_MS_REVZ] = "UQ_MS_REVZ",
[UQ_MS_VENDOR_BTN] = "UQ_MS_VENDOR_BTN",
[UQ_NO_STRINGS] = "UQ_NO_STRINGS",
[UQ_POWER_CLAIM] = "UQ_POWER_CLAIM",
[UQ_SPUR_BUT_UP] = "UQ_SPUR_BUT_UP",

View file

@ -55,6 +55,7 @@ enum {
UQ_MS_BAD_CLASS, /* doesn't identify properly */
UQ_MS_LEADING_BYTE, /* mouse sends an unknown leading byte */
UQ_MS_REVZ, /* mouse has Z-axis reversed */
UQ_MS_VENDOR_BTN, /* mouse has buttons in vendor usage page */
UQ_NO_STRINGS, /* string descriptors are broken */
UQ_POWER_CLAIM, /* hub lies about power status */
UQ_SPUR_BUT_UP, /* spurious mouse button up events */

View file

@ -2710,6 +2710,7 @@ product KEISOKUGIKEN USBDAQ 0x0068 HKS-0200 USBDAQ
/* Kensington products */
product KENSINGTON ORBIT 0x1003 Orbit USB/PS2 trackball
product KENSINGTON TURBOBALL 0x1005 TurboBall
product KENSINGTON SLIMBLADE 0x2041 Slimblade Trackball
/* Synaptics products */
product SYNAPTICS FPR9A 0x009a Fingerprint Reader