aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2022-12-24 09:01:20 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2022-12-24 09:01:20 +0000
commitab4f740bc59e3ba2948bcc4e03bd6125b1dae36f (patch)
treeab8aecf0135cad2b633ee7061b900f147ce38130
parent860399eb86cc431412bfbce0ab76c6652e5b6c07 (diff)
downloadsrc-ab4f740bc59e3ba2948bcc4e03bd6125b1dae36f.tar.gz
src-ab4f740bc59e3ba2948bcc4e03bd6125b1dae36f.zip
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
-rw-r--r--share/man/man4/usb_quirk.42
-rw-r--r--sys/dev/usb/input/ums.c18
-rw-r--r--sys/dev/usb/quirk/usb_quirk.c3
-rw-r--r--sys/dev/usb/quirk/usb_quirk.h1
-rw-r--r--sys/dev/usb/usbdevs1
5 files changed, 19 insertions, 6 deletions
diff --git a/share/man/man4/usb_quirk.4 b/share/man/man4/usb_quirk.4
index 8751807f9dec..c176993bdbc3 100644
--- a/share/man/man4/usb_quirk.4
+++ b/share/man/man4/usb_quirk.4
@@ -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
diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c
index 987c4b9d1309..2280cdc29e8d 100644
--- a/sys/dev/usb/input/ums.c
+++ b/sys/dev/usb/input/ums.c
@@ -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
diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c
index 856cd3c006f9..68e4910202b0 100644
--- a/sys/dev/usb/quirk/usb_quirk.c
+++ b/sys/dev/usb/quirk/usb_quirk.c
@@ -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",
diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h
index 9b3d0c81ce03..85bec036f84d 100644
--- a/sys/dev/usb/quirk/usb_quirk.h
+++ b/sys/dev/usb/quirk/usb_quirk.h
@@ -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 */
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index 70540fe6540b..4e2f46e5d77b 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -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