As root: 1. Copy patch-ums-all and patch-ums-mouse to /sys/dev/usb 2. cd /sys/dev/usb 3. patch -l < patch-ums-all 4. patch -p0 -l < patch-ums-mouse # NOTE the "-p0" 5. cp /sys/sys/mouse.h /usr/include/dev/usb 6. cp /sys/sys/mouse.h /usr/include/sys/ config YOURKERNEL make depend && make && make install in ../compile/YOURKERNEL nextboot -k YOURKERNEL or change /boot/loader.conf to include: kernel="YOURKERNEL" Please note that this is the "old way" to compile kernels. It is convenient when testing kernels. It installs kernels under the name "YOURKERNEL" (and therefore doesn't override "kernel") and thus reduces risk if the new kernel is somehow unworkable. After you are confident of the new kernel, you may wish to revert to "make buildkernel installkerenel KERNCONF=YOURKERNEL". -------------------------- If you have trouble with the patches, you can try the files in patched-files/, but you will need to run patch-ums-mouse at least, or cp patched-files/mouse.h.new /sys/sys/mouse.h Then steps 5 and 6 above. ============== DEBUG ALERT! ============== The ums.c file deliberately sets the sysctl hw.usb.ums.debug=1, which causes interesting information about the attach process to be printed to 'dmesg' and the 'kern.crit' syslog facility on bootup. In addition, if you place the line hw.usb.debug="1" in /boot/loader.conf, the boot messages will include a scan of the report descriptor as it computes the size of the input report. The output looks like this (mouse_report does this better). kind=0, want ID=17, h.report_ID=19, pos=0, size=8, count=1 kind=0, want ID=17, h.report_ID=20, pos=8, size=2, count=1 kind=0, want ID=17, h.report_ID=20, pos=10, size=1, count=1 kind=0, want ID=17, h.report_ID=20, pos=11, size=1, count=1 kind=0, want ID=17, h.report_ID=20, pos=12, size=2, count=1 kind=0, want ID=17, h.report_ID=20, pos=14, size=2, count=1 kind=0, want ID=17, h.report_ID=21, pos=16, size=1, count=1 kind=0, want ID=17, h.report_ID=21, pos=17, size=7, count=1 kind=0, want ID=17, h.report_ID=21, pos=24, size=16, count=1 kind=0, want ID=17, h.report_ID=17, pos=40, size=1, count=1 SET lo=40, hi=41 kind=0, want ID=17, h.report_ID=17, pos=41, size=1, count=1 SET hi=42 kind=0, want ID=17, h.report_ID=17, pos=42, size=1, count=1 SET hi=43 kind=0, want ID=17, h.report_ID=17, pos=43, size=1, count=1 SET hi=44 kind=0, want ID=17, h.report_ID=17, pos=44, size=1, count=1 SET hi=45 kind=0, want ID=17, h.report_ID=17, pos=45, size=3, count=1 SET hi=48 kind=0, want ID=17, h.report_ID=17, pos=48, size=8, count=1 SET hi=56 kind=0, want ID=17, h.report_ID=17, pos=56, size=8, count=1 SET hi=64 kind=0, want ID=17, h.report_ID=17, pos=64, size=8, count=1 SET hi=72 kind=0, want ID=17, h.report_ID=17, pos=72, size=8, count=1 SET hi=80 kind=4, want ID=17, h.report_ID=17, pos=80, size=8, count=1, hi=80, lo=40 hid_reportID_size: size=40 bits, report_id=17 hid_reportID_size: size ==> 48 bits hid_reportID_size: 6 bytes ums1: input report ID=17/0x11, report size 6. OR...you can just set hw.usb.debug="1" manually and THEN plug in the mouse, and the above lines will appear wherever your syslog sends it. Finally, usb_subr.c reports about devices and interfaces scanned using DPRINTF (debug) statements which print at debug level 0. You can turn these off by editting the DPRINTF define at the top of the file or setting hw.usb.debug="-1". You probably don't want to shut this off right away, though, be cause it will show you all of the interfaces offered by all of your devices, and you've probably never seen that before if you're not a USB developer.