Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Jun 2009 20:04:38 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 164141 for review
Message-ID:  <200906112004.n5BK4c0I023361@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=164141

Change 164141 by hselasky@hselasky_laptop001 on 2009/06/11 20:03:57

	
	USB input:
	- add support for Yubikey
	- reported by Jeremy Faulkner
	- improve mouse probe routine

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/input/ukbd.c#18 edit
.. //depot/projects/usb/src/sys/dev/usb/input/ums.c#16 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/input/ukbd.c#18 (text+ko) ====

@@ -659,6 +659,9 @@
 {
 	keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
+	void *d_ptr;
+	int error;
+	uint16_t d_len;
 
 	DPRINTFN(11, "\n");
 
@@ -668,16 +671,35 @@
 	if (uaa->usb_mode != USB_MODE_HOST) {
 		return (ENXIO);
 	}
-	/* check that the keyboard speaks the boot protocol: */
-	if ((uaa->info.bInterfaceClass == UICLASS_HID)
-	    && (uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT)
-	    && (uaa->info.bInterfaceProtocol == UPROTO_BOOT_KEYBOARD)) {
+
+	if (uaa->info.bInterfaceClass != UICLASS_HID)
+		return (ENXIO);
+
+	if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
+	    (uaa->info.bInterfaceProtocol == UPROTO_BOOT_KEYBOARD)) {
 		if (usb2_test_quirk(uaa, UQ_KBD_IGNORE))
 			return (ENXIO);
 		else
 			return (0);
 	}
-	return (ENXIO);
+
+	error = usb2_req_get_hid_desc(uaa->device, NULL,
+	    &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
+
+	if (error)
+		return (ENXIO);
+
+	if (hid_is_collection(d_ptr, d_len,
+	    HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_KEYBOARD))) {
+		if (usb2_test_quirk(uaa, UQ_KBD_IGNORE))
+			error = ENXIO;
+		else
+			error = 0;
+	} else
+		error = ENXIO;
+
+	free(d_ptr, M_TEMP);
+	return (error);
 }
 
 static int

==== //depot/projects/usb/src/sys/dev/usb/input/ums.c#16 (text+ko) ====

@@ -332,7 +332,6 @@
 ums_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
-	struct usb_interface_descriptor *id;
 	void *d_ptr;
 	int error;
 	uint16_t d_len;
@@ -342,11 +341,12 @@
 	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
 
-	id = usb2_get_interface_descriptor(uaa->iface);
+	if (uaa->info.bInterfaceClass != UICLASS_HID)
+		return (ENXIO);
 
-	if ((id == NULL) ||
-	    (id->bInterfaceClass != UICLASS_HID))
-		return (ENXIO);
+	if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
+	    (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE))
+		return (0);
 
 	error = usb2_req_get_hid_desc(uaa->device, NULL,
 	    &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
@@ -357,9 +357,6 @@
 	if (hid_is_collection(d_ptr, d_len,
 	    HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE)))
 		error = 0;
-	else if ((id->bInterfaceSubClass == UISUBCLASS_BOOT) &&
-	    (id->bInterfaceProtocol == UIPROTO_MOUSE))
-		error = 0;
 	else
 		error = ENXIO;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906112004.n5BK4c0I023361>