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 bitfreak.org
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
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu May 26 21:10:01 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Darren Pilgrim
>Release: 6.0-CURRENT
>Organization:
n/a
>Environment:
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
>Description:
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.
>How-To-Repeat:
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!
>Fix:
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
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list