The branch main has been updated by wulf:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ab4f740bc59e3ba2948bcc4e03bd6125b1dae36f

commit ab4f740bc59e3ba2948bcc4e03bd6125b1dae36f
Author:     Vladimir Kondratyev <w...@freebsd.org>
AuthorDate: 2022-12-24 09:01:20 +0000
Commit:     Vladimir Kondratyev <w...@freebsd.org>
CommitDate: 2022-12-24 09:01:20 +0000

    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
---
 share/man/man4/usb_quirk.4    |  2 ++
 sys/dev/usb/input/ums.c       | 18 ++++++++++++------
 sys/dev/usb/quirk/usb_quirk.c |  3 +++
 sys/dev/usb/quirk/usb_quirk.h |  1 +
 sys/dev/usb/usbdevs           |  1 +
 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

Reply via email to