>Number:         172458
>Category:       usb
>Synopsis:       Make uhid(4) attach to mice and keyboards with 
>UQ_{UMS,KBD}_IGNORE quirks
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-usb
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Oct 07 18:10:15 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Vitaly Magerya
>Release:        FreeBSD 9.1-RC1 amd64
>Organization:
>Environment:
>Description:
The uhid(4) driver that can attach to the same devices that
ums(4) and ukbd(4) can. Since uhid should generally be used as
a fallback, it performs this check:

        /*
         * 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);
        }

The problem here is that we have UQ_KBD_IGNORE and UQ_UMS_IGNORE
quirks that prevent ukbd and ums from attaching -- if such a
quirk is set, it may be the case that because of this check no
driver will attach to the device, while uhid should take over
in such a case.
>How-To-Repeat:

>Fix:
The proper fix would be to remove the above check altogether and
somehow ensure that uhid is given lower priority than ukbd and
ums. Since I don't really know how to do that, I propose just
testing for UQ_KBD_IGNORE and UQ_UMS_IGNORE quirks in uhid too.

Patch attached with submission follows:

Index: sys/dev/usb/input/uhid.c
===================================================================
--- sys/dev/usb/input/uhid.c    (revision 241311)
+++ sys/dev/usb/input/uhid.c    (working copy)
@@ -691,8 +691,10 @@
         */
        if ((uaa->info.bInterfaceClass == UICLASS_HID) &&
            (uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
-           ((uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD) ||
-            (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE))) {
+           (((uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD) &&
+             !usb_test_quirk(uaa, UQ_KBD_IGNORE)) ||
+            ((uaa->info.bInterfaceProtocol == UIPROTO_MOUSE) &&
+             !usb_test_quirk(uaa, UQ_UMS_IGNORE)))) {
                return (ENXIO);
        }
 


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "[email protected]"

Reply via email to