bin/81533: /usr/sbin/usbd has MAXUSBDEV set too low, resulting not all /dev/usb* being opened and subsequent attach failures.

Darren Pilgrim dmp at
Thu May 26 14:10:02 PDT 2005

>Number:         81533
>Category:       bin
>Synopsis:       /usr/sbin/usbd has MAXUSBDEV set too low, resulting not all /dev/usb* being opened and subsequent attach failures.
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu May 26 21:10:01 GMT 2005
>Originator:     Darren Pilgrim
>Release:        6.0-CURRENT
FreeBSD Smiley.Blackthornes.LAN 6.0-CURRENT FreeBSD 6.0-CURRENT #0: Sun May 22 18:51:16 PDT 2005 root at Sonomago.loki.lan:/usr/obj/usr/src/sys/Sonomago  i386
In order to watch for events, usbd opens the /dev/usb* devices.  usbd uses a #define called MAXUSBDEV to size arrays used in opening the USB bus devices.  As the name of the constant implies, usbd will not open more than MAXUSBDEV /dev/usb* devices.  Presently, MAXUSBDEV is set to 4.  Modern hardware is trending toward four or more USB 2.0 ports using a one-hub-per-port configuration on the motherboard to increase performance.  As such, the current value for MAXUSBDEV is no longer sufficient.

When a device is plugged into a bus not being watched by usbd, the event is not caught and the attach procedure it not performed.  This is further complicated by the dual-hub nature of USB 2.0.  Because of this odd design, it is possible for usbd to be watching the USB 1.1 hub for a port, but not the USB 2.0 hub or vice versa.  When a USB device is connected to such a port, the results are unpredicatable.  The author was able to reliably produce panics in this scenario by plugging and unplugging an external USB 2.0 hub.
The problem can be observed on any machine with at least four USB 2.0 ports or five USB 1.1 ports or any other combination that would produce at least five /dev/usb* devices.  Use fstat to look at the files usbd has open and note that only /dev/usb0, /dev/usb1, /dev/usb2 and /dev/usb3 are open despite the presence of /dev/usb4 and (possibly) higher-numbered devices.  Plugging devices into the unwatched or partially-watched hubs will result in missing or erroneous attach behavior.

WARNING: You may panic your system trying this!

Increasing MAXUSBDEV to at least the number of USB hubs present results in proper operation of usbd for all USB busses.  The following patch to src/usr.sbin/usbd/usbd.c v1.31 increases MAXUSBDEV to 40:

--- usbd.c.orig	Mon Jan  3 22:45:41 2005
+++ usbd.c	Wed May 25 20:52:01 2005
@@ -81,7 +81,7 @@
 /* Maximum number of USB busses expected to be in a system
  * XXX should be replaced by dynamic allocation.
-#define MAXUSBDEV	4
+#define MAXUSBDEV	40
 /* Sometimes a device does not respond in time for interrupt
  * driven explore to find it.  Therefore we run an exploration


More information about the freebsd-bugs mailing list