我有一个基于 debian mint 的系统,我在其中插入了 16 个 USB 设备。内核是:3.11.0-12-generic 大约 10 个设备之后,我开始遇到连接新设备的问题。可以在 dmesgs 中找到此类设备的错误,如下所示(最后两行不同)
[新更新:解决方法] 我发现这个问题是 xhci 特有的。在我的 bios 中,我实际上能够禁用 xhci 并强制 linux 回退到 ehci(大概)。现在我的所有设备都运行正常!当然,这意味着我没有 USB3 设备。幸运的是,我的直接应用程序不需要它们。我不知道这是英特尔问题还是 Linux 问题。最好保留此页面,因为其他人很可能会找到它。
dmesg | grep -i 3-5.1
工作装置:
[ 1.883505] hub 3-5:1.0: USB hub found
[ 1.883733] hub 3-5:1.0: 4 ports detected
[ 3.370272] usb 3-5.1: new full-speed USB device number 17 using xhci_hcd
[ 3.387126] usb 3-5.1: New USB device found, idVendor=03eb, idProduct=2045
[ 3.387129] usb 3-5.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 3.387908] usb-storage 3-5.1:1.0: USB Mass Storage device detected
[ 3.388006] scsi14 : usb-storage 3-5.1:1.0
[ 121.738568] usb 3-5.1: USB disconnect, device number 17
[ 121.942662] usb 3-5.1: new full-speed USB device number 28 using xhci_hcd
[ 121.961332] usb 3-5.1: New USB device found, idVendor=03eb, idProduct=204b
[ 121.961334] usb 3-5.1: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[ 121.961336] usb 3-5.1: Product: LUFA USB-RS232 Adapter
[ 121.961337] usb 3-5.1: Manufacturer: Dean Camera
[ 121.961338] usb 3-5.1: SerialNumber: 741333532373518080C1
[ 121.961408] usb 3-5.1: ep 0x82 - rounding interval to 1024 microframes, ep desc says 2040 microframes
[ 121.962080] cdc_acm 3-5.1:1.0: ttyACM3: USB ACM device
[ 1281.513105] usb 3-5.1: USB disconnect, device number 28
dmesg | grep -i 3-5.1
故障设备:
[ 3.638401] usb 3-5.4: new full-speed USB device number 20 using xhci_hcd
[ 3.655067] usb 3-5.4: New USB device found, idVendor=03eb, idProduct=2045
[ 3.655070] usb 3-5.4: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 3.655868] usb-storage 3-5.4:1.0: USB Mass Storage device detected
[ 3.655977] scsi17 : usb-storage 3-5.4:1.0
[ 118.793161] usb 3-5.4: USB disconnect, device number 20
[ 122.603119] usb 3-5.4: new full-speed USB device number 31 using xhci_hcd
[ 122.621653] usb 3-5.4: New USB device found, idVendor=03eb, idProduct=204b
[ 122.621655] usb 3-5.4: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[ 122.621656] usb 3-5.4: Product: LUFA USB-RS232 Adapter
[ 122.621657] usb 3-5.4: Manufacturer: Dean Camera
[ 122.621658] usb 3-5.4: SerialNumber: 74133353237351808021
[ 122.621795] usb 3-5.4: ep 0x82 - rounding interval to 1024 microframes, ep desc says 2040 microframes
[ 122.622419] usb 3-5.4: Not enough host controller resources for new device state.
[ 122.622424] usb 3-5.4: can't set config #1, error -12
我的硬件拓扑如下:PC -> 4 个带电的 usb2 集线器 -> 每个集线器有 4 个 usb(1) 设备。这些设备是“双启动”的,您可以在上方看到它们被弹出为大容量存储设备,并在同一端口上作为串行设备重新启动。
我直接从电源为 USB 集线器供电,每个设备大约消耗 700mA 电流,而电源的 5V 线电压降至 4.69V。
我的机器上有许多 USB 区域,据我所知,这些区域连接到底层集线器或根集线器。移动外部集线器对结果没有影响。实验:我以为将集线器放在集线器上会导致更大的问题,但结果是一样的。
当我将所有设备插入电源(并获取电流),但只有 3 个集线器插入 PC 时,一切正常。当我插入第 4 个集线器时,我可以在 LSUSB 中看到所有设备都在那里,但是,最后一个集线器上的 4 个设备中只有 1 个出现。在这种情况下。3-5.1 没问题,但 3-5.2 3-5.3 和 3-5.4 似乎没有加载驱动程序。
所有设备都是相同的,我已经测试过诸如交换设备、交换集线器等操作。它总是最后插入的设备。即使最后一个设备是完全不同的东西,如鼠标或 wifi 适配器,也会发生这种情况。该设备将在 lsusb 中可见,但它无法工作。我认为这表明操作系统存在 USB 限制,而不是特定于驱动程序的问题。
重启时,电流仍在流过时,它仍然是最后 3 个设备。但是。我也能将这些设备置于无电流流过时的状态,并且可以启动它们。
我的结论是,操作系统正在读取电流消耗并对电源资源进行一些评估。他们可能从集线器获取这些信息,甚至可能将这些值加在一起。如果我能简单地拥有“更多主机控制器资源”,那就太好了
[更新] 我找到这里错误消息的源代码看起来像什么:我不喜欢“/* FIXME:我们可以为 HC 分配更多资源吗?*/”的外观也许这也意味着有一种方法可以从一开始就分配更多的资源。
任何线索都很好,David
答案1
我也遇到了这个错误(在尝试连接十几个 USB 网络接口设备后)。我很确定这不是设备的电流问题:它们都在有源集线器上,并且完全在电流限制之内。我认为这是分配中断或其他资源的问题。
我尝试了在 BIOS 中禁用 USB 3.0 的解决方法,但我怀疑主板内部使用了 USB 3.0(用于蓝牙和其他一些东西),但它不起作用(lsusb -t 显示正在使用 xhci_hcd)。我不得不重建内核(我使用的是 Ubuntu 14.04)以删除 xhci 支持,然后它才起作用。
注意:Ubuntu 默认将 ehci 和 xhci 编译到内核中 - 它不会将它们作为模块加载。我尝试将它们重建为模块,以便我可以使用 modprobe 来操作它们,但失败了,因为:
如果 ehci 是一个模块,它必须在 ohci 和 ahci 模块之前加载(参见 dmesg 中的警告),并且我尝试执行此操作的每种方法都失败了(无论如何,我认为内核模块需要与加载顺序无关?)。
xchi 模块最终总会被加载,即使被列入黑名单,大概是为了处理内部硬件。不过,我并没有对此进行深入调查。
只有通过设置一个编译了 ehci 并编译出 xhci 的内核配置才能正常工作。我还没有测试过在新的无 xhci 内核中在 BIOS 中重新启用 USB 3.0。
答案2
Not enough host controller resources for new device state.
can't set config #1, error -12
遇到同样的错误。Linux 内核中的 XHCI(USB 3.0)限制为 32 个设备。这看起来像是一个错误。但也许这是比尔盖茨的方式“640 千字节对每个人来说都足够了”。无论如何,这很痛苦。
1)最简单的修复方法:如果可能的话,在主板 BIOS 中禁用 XHCI(usb 3.0)支持。2)最难的修复方法:禁用 XHCI linux 模块。 modprobe -r xhci-hcd
但在大多数情况下,它不起作用。您必须重新编译内核以禁用 XHCI 并启用 OHCI(usb 1.1)和 EHXI(usb 2.0)。
答案3
此问题来自底层 USB 硬件控制器,它无法处理那么多设备。Linux 源代码显示,在尝试配置接口时,xHC 返回了“资源错误”代码。xHCI 标准第 4.4.6 章解释了这种情况:
将所需资源变量与可用资源变量进行比较,如果结果表明命令的资源超额订阅(即可用资源 - 所需资源小于 0),则命令将失败,并在命令完成事件中返回资源错误完成代码。有关 xHC 资源的更多信息,请参阅第 4.14.1.1 节。
我的解决方法是通过移除每个不需要的 USB 设备来释放 xHCI 资源,例如内部 USB 设备(例如蓝牙、wifi 等)和仅连接了 USB 2.0 设备的 USB 3.0 集线器。
步骤如下:
- 运行
lsusb
看看是否有什么未使用的东西。 - 使用 sysfs 删除未使用的设备
echo 1 > /sys/<path to device>/remove
。查看dmesg
并了解它如何删除设备和每个子设备。这意味着您可以在根设备上使用此命令删除整个 USB 树。 - 您现在应该能够正确插入更多设备(参见
dmesg
日志)。
为了使此设置重启后仍然有效,请添加 udev 规则以删除设备:
SUBSYSTEM=="usb" <your conditions to match unused devices> RUN="sh -c 'echo 1 > /sys$DEVPATH/remove'"