diff --git a/share/man/man4/usb_quirk.4 b/share/man/man4/usb_quirk.4 index 892c85aa6fba..9f21b6563a0c 100644 --- a/share/man/man4/usb_quirk.4 +++ b/share/man/man4/usb_quirk.4 @@ -76,6 +76,8 @@ device should be ignored by ums class does not identify properly .It UQ_MS_LEADING_BYTE mouse sends an unknown leading byte +.It UQ_MS_NO_SETPROTO +device should not receive "SetProtocol" requests .It UQ_MS_REVZ mouse has Z-axis reversed .It UQ_MS_VENDOR_BTN diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c index ab42f0ea1283..f2e7e0a126a8 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -964,7 +964,8 @@ ukbd_probe(device_t dev) return (ENXIO); if (hid_is_keyboard(d_ptr, d_len)) { - if (hid_is_mouse(d_ptr, d_len)) { + if (hid_is_mouse(d_ptr, d_len) && + !usb_test_quirk(uaa, UQ_UMS_IGNORE)) { /* * NOTE: We currently don't support USB mouse * and USB keyboard on the same USB endpoint. diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c index 5ddba1311762..220d4e6884f1 100644 --- a/sys/dev/usb/input/ums.c +++ b/sys/dev/usb/input/ums.c @@ -592,13 +592,15 @@ ums_attach(device_t dev) usb_callout_init_mtx(&sc->sc_callout, &sc->sc_mtx, 0); /* - * Force the report (non-boot) protocol. + * Force the report (non-boot) protocol unless + * UQ_MS_NO_SETPROTO is set. * * Mice without boot protocol support may choose not to implement * Set_Protocol at all; Ignore any error. */ - err = usbd_req_set_protocol(uaa->device, NULL, - uaa->info.bIfaceIndex, 1); + if (!usb_test_quirk(uaa, UQ_MS_NO_SETPROTO)) + err = usbd_req_set_protocol(uaa->device, NULL, + uaa->info.bIfaceIndex, 1); err = usbd_transfer_setup(uaa->device, &uaa->info.bIfaceIndex, sc->sc_xfer, ums_config, diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index bb02b90ba4bd..973ec549607e 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -649,6 +649,7 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = { [UQ_UMS_IGNORE] = "UQ_UMS_IGNORE", [UQ_MS_BAD_CLASS] = "UQ_MS_BAD_CLASS", [UQ_MS_LEADING_BYTE] = "UQ_MS_LEADING_BYTE", + [UQ_MS_NO_SETPROTO] = "UQ_MS_NO_SETPROTO", [UQ_MS_REVZ] = "UQ_MS_REVZ", [UQ_MS_VENDOR_BTN] = "UQ_MS_VENDOR_BTN", [UQ_NO_STRINGS] = "UQ_NO_STRINGS", diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h index 399c8d3f65b4..62c96bd147a7 100644 --- a/sys/dev/usb/quirk/usb_quirk.h +++ b/sys/dev/usb/quirk/usb_quirk.h @@ -54,6 +54,7 @@ enum { UQ_UMS_IGNORE, /* device should be ignored by ums class */ UQ_MS_BAD_CLASS, /* doesn't identify properly */ UQ_MS_LEADING_BYTE, /* mouse sends an unknown leading byte */ + UQ_MS_NO_SETPROTO, /* device should not receive SetProtocol requests */ 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 */