summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/input/uhid.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/input/uhid.c')
-rw-r--r--sys/dev/usb/input/uhid.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c
index a7fd899..1b810e3 100644
--- a/sys/dev/usb/input/uhid.c
+++ b/sys/dev/usb/input/uhid.c
@@ -607,29 +607,45 @@ uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
return (error);
}
+static const STRUCT_USB_HOST_ID uhid_devs[] = {
+ /* generic HID class */
+ {USB_IFACE_CLASS(UICLASS_HID),},
+ /* the Xbox 360 gamepad doesn't use the HID class */
+ {USB_IFACE_CLASS(UICLASS_VENDOR),
+ USB_IFACE_SUBCLASS(UISUBCLASS_XBOX360_CONTROLLER),
+ USB_IFACE_PROTOCOL(UIPROTO_XBOX360_GAMEPAD),},
+};
+
static int
uhid_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
+ int error;
DPRINTFN(11, "\n");
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
- if (uaa->info.bInterfaceClass != UICLASS_HID) {
- /* the Xbox 360 gamepad doesn't use the HID class */
+ error = usbd_lookup_id_by_uaa(uhid_devs, sizeof(uhid_devs), uaa);
+ if (error)
+ return (error);
- if ((uaa->info.bInterfaceClass != UICLASS_VENDOR) ||
- (uaa->info.bInterfaceSubClass != UISUBCLASS_XBOX360_CONTROLLER) ||
- (uaa->info.bInterfaceProtocol != UIPROTO_XBOX360_GAMEPAD)) {
- return (ENXIO);
- }
- }
- if (usb_test_quirk(uaa, UQ_HID_IGNORE)) {
+ if (usb_test_quirk(uaa, UQ_HID_IGNORE))
+ return (ENXIO);
+
+ /*
+ * Don't attach to mouse and keyboard devices, hence then no
+ * "nomatch" event is generated and then ums and ukbd won't
+ * attach properly when loaded.
+ */
+ if ((uaa->info.bInterfaceClass == UICLASS_HID) &&
+ (uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
+ ((uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD) ||
+ (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE))) {
return (ENXIO);
}
+
return (BUS_PROBE_GENERIC);
}
OpenPOWER on IntegriCloud