Linux 上的 USB 端口不断重置

Linux 上的 USB 端口不断重置

问题
USB 端口(2.0)不断重置导致连接的外围设备在一段时间后停止工作。

硬件
主板:ASUS J1800I-C
CPU:Intel(R) Celeron(R) CPU J1800 @ 2.41GHz
RAM:4GB

设备数量:> 100 台作为支付亭运行的设备,均显示相同问题。

连接的 USB 设备(lsusb)

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 013: ID 0dd4:015d Custom Engineering SPA
Bus 001 Device 012: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
Bus 001 Device 011: ID 23d8:0285 
Bus 001 Device 010: ID 1ff7:0013 CVT Electronics.Co.,Ltd CVTouch Screen (HID)
Bus 001 Device 009: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 002: ID 0e8f:0022 GreenAsia Inc. multimedia keyboard controller
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


重现该问题的操作系统:
Ubuntu 14.04-服务器(64 位)
Ubuntu 16.04-服务器(64 位)
Ubuntu 18.04-服务器(64 位)
Ubuntu 14.04(服务器和桌面)(32 位)
Ubuntu 16.04-服务器(32 位)
尝试使用 UEFI 和 BIOS 启动运行上述操作系统。

使用相同硬件不会产生任何问题的操作系统:
Windows 7的

症状:
启动时,一切正常,USB 设备可工作 15 至 60 分钟。在此时间之后,一个或多个端口将开始重置,dmesg 中会出现错误:

    [ 1484.129248] perf 中断耗时过长 (2520 > 2500),将 kernel.perf_event_max_sample_rate 降低至 50000
    [2645.972003] usb 1-4-port1:无法重置(错误= -71)
    [ 2646.236044] usb 1-4.1: 使用 xhci_hcd 重置全速 USB 设备编号 4
    [ 2646.324439] usb 1-4.1:ep 0x1 - 将间隔舍入为 64 微帧,ep desc 表示为 80 微帧
    [ 2647.558156] usb 1-4.1: 使用 xhci_hcd 重置全速 USB 设备编号 4
    [ 2647.646546] usb 1-4.1:ep 0x1 - 将间隔舍入为 64 微帧,ep desc 表示为 80 微帧
    [3942.619669]usb 1-4-port1:无法重置(错误=-71)
    [3942.619742] usb 1-4-port1:无法重置(错误= -71)
    [3942.619821]USB 1-4-端口1:无法重置(错误=-71)
    [3942.619861]USB 1-4-端口1:无法重置(错误=-71)
    [3942.619901] usb 1-4-port1:无法重置(错误= -71)
    [ 3942.619905] usb 1-4-port1:无法启用。可能是 USB 电缆坏了?
    [3942.690031] usb 1-4.1: 使用 xhci_hcd 重置全速 USB 设备编号 4
    [3942.690038] usb 1-4.1:集线器无法启用设备,错误 -22
    [3942.762176] usb 1-4.1:使用 xhci_hcd 重置全速 USB 设备编号 4
    [3943.170800] usb 1-4.1:设备不接受地址 4,错误 -22
    [3943.242967] usb 1-4.1:使用 xhci_hcd 重置全速 USB 设备编号 4
    [3943.651734] usb 1-4.1:设备不接受地址 4,错误 -22
    [3943.653063] usb 1-4.1: USB 断开连接,设备编号 4
    [3943.751603] usb 1-4.1: 使用 xhci_hcd 的新全速 USB 设备编号 8
    [3943.840892] usb 1-4.1:发现新的 USB 设备,idVendor=1ff7,idProduct=0013
    [3943.840899] usb 1-4.1:新的 USB 设备字符串:Mfr=0、Product=0、SerialNumber=0
    [3943.841068] usb 1-4.1:ep 0x1 - 将间隔舍入为 64 微帧,ep desc 表示为 80 微帧
    [3943.850194] 输入:HID 1ff7:0013 作为 /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4.1/1-4.1:1.0/0003:1FF7:0013.0005/input/input11
    [ 3943.850467] hid-multitouch 0003:1FF7:0013.0005:输入,hiddev0,hidraw3:USB HID v1.11 鼠标 [HID 1ff7:0013] 位于 usb-0000:00:14.0-4.1/input0 上
    [ 4215.269989] usb 1-4-port1:无法重置(错误 = -71)
    [ 4215.270192] usb 1-4-port1:无法重置(错误 = -71)
    [ 4215.270264] usb 1-4-port1:无法重置(错误 = -71)
    [ 4215.270343] usb 1-4-port1:无法重置(错误 = -71)
    [ 4215.270383] usb 1-4-port1:无法重置(错误 = -71)
    [ 4215.270386] usb 1-4-port1:无法启用。可能是 USB 电缆坏了?
    [ 4215.342214] usb 1-4.1: 使用 xhci_hcd 重置全速 USB 设备编号 8
    [ 4215.342221] usb 1-4.1:集线器无法启用设备,错误 -22
    [4215.358192]集线器 1-4:1.0:hub_ext_port_status 失败(错误 = -71)
    [4215.358263]USB 1-4-端口1:无法重置(错误=-71)
    [ 4215.622566] usb 1-4.1: 使用 xhci_hcd 重置全速 USB 设备编号 8
    [ 4215.755250] usb usb1-port4: 由集线器禁用(EMI?),重新启用...
    [ 4215.755273] usb 1-4: USB 断开连接,设备编号 3
    [ 4215.755277] usb 1-4.1: USB 断开连接,设备编号 0
    [ 4216.031181] usb 1-4.1:设备不接受地址 8,错误 -22
    [ 4216.064588] usb 1-4.2: USB 断开连接,设备编号 5
    [ 4216.065324] usb 1-4.3: USB 断开连接,设备编号 6
    [ 4216.065632] option1 ttyUSB0: GSM 调制解调器(1 端口)转换器现已与 ttyUSB0 断开连接
    [ 4216.065647] 选项 1-4.3:1.0: 设备已断开连接
    [4216.065760] huawei_cdc_ncm 1-4.3:1.1 wwx001e101f0000:取消注册‘huawei_cdc_ncm’usb-0000:00:14.0-4.3,华为 CDC NCM 设备
    [ 4216.079590] option1 ttyUSB1: GSM 调制解调器(1 端口)转换器现已与 ttyUSB1 断开连接
    [ 4216.079611] 选项 1-4.3:1.2: 设备已断开连接
    [ 4216.079752] option1 ttyUSB2: GSM 调制解调器(1 端口)转换器现已与 ttyUSB2 断开连接
    [ 4216.079768] 选项 1-4.3:1.3: 设备已断开连接
    [4216.148026]USB 1-4.4:USB断开连接,设备编号7
    [4216.148183]usblp2:已删除
    [4216.387741] usb 1-4: 使用 xhci_hcd 的新高速 USB 设备编号 9
    [4216.517658] usb 1-4:发现新的 USB 设备,idVendor=05e3,idProduct=0610
    [ 4216.517666] usb 1-4:新的 USB 设备字符串:Mfr=0、Product=1、SerialNumber=0
    [ 4216.517670] usb 1-4: 产品: USB2.0 集线器
    [4216.518341]集线器 1-4:1.0:找到 USB 集线器
    [4216.518643]集线器 1-4:1.0: 检测到 4 个端口
    [ 4216.792385] usb 1-4.1: 使用 xhci_hcd 的新全速 USB 设备编号 10
    [4216.885849] usb 1-4.1:发现新的 USB 设备,idVendor=1ff7,idProduct=0013
    [ 4216.885855] usb 1-4.1:新的 USB 设备字符串:Mfr=0、Product=0、SerialNumber=0
    [ 4216.886042] usb 1-4.1:ep 0x1 - 将间隔舍入为 64 微帧,ep desc 表示为 80 微帧
    [4216.895096] 输入:HID 1ff7:0013 作为 /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4.1/1-4.1:1.0/0003:1FF7:0013.0006/input/input13
    [ 4216.951230] hid-multitouch 0003:1FF7:0013.0006:输入,hiddev0,hidraw2:USB HID v1.11 鼠标 [HID 1ff7:0013] 位于 usb-0000:00:14.0-4.1/input0 上

我尝试过但未能解决问题的方法:
我尝试通过添加 linux kernel cmdline: usbcore.autosuspend=-1 等多种选项来禁用 USB 端口的自动挂起,但都失败了。
我还尝试更改与 USB 相关的多个 BIOS 选项,但没有任何帮助。


实用信息:
- 所有 USB 2.0 4 端口都会导致问题。
- 主板只有一个 USB 3.0 端口,似乎不受此问题影响。
- 使用连接到 USB3 端口的有源 USB 集线器,然后将所有 USB 设备连接到它似乎可以解决问题。
- 使用相同操作系统的 32 位版本似乎可以解决 USB 问题。测试了一些安装了 32 位的自助服务终端,正常运行时间为 3 天,没有任何 dmesg 警告或错误。

问题:
我该如何在 64 位 Ubuntu 16.04 上解决这个问题?

转换为 32 位对我来说是一个不切实际的解决方案,因为它需要重新安装 100 多个设备。此外,我的一些设备附带 64 位专有 SDK。


更新 1:
该问题似乎与 CPU 架构无关,一段时间后在 Ubuntu 14.04-32bit 和 16.04-32bit 上也出现了该问题

答案1

一个可能的解决方案 - 在反复试验的过程中将 USB 相关内核模块列入黑名单,结果发现ehci-pci内核模块是导致问题的原因。

对于临时解决方案,只需删除内核模块:

sudo rmmod ehci_pci

对于永久的解决方案,可以通过内核启动参数将模块列入黑名单,例如

modprobe.blacklist=ehci_pci

注意。将 ehci_pci 列入黑名单也将阻止内核模块的ehci-hcd加载。

ehci* 内核模块是内核的 USB 2 驱动程序。

幸运的是,USB 3 内核模块 xhci* 也支持 USB 2 设备,使用这些设备不会造成性能损失

答案2

我使用 BlackWidow 终极键盘和鼠标。当我将鼠标插入键盘侧面的 USB 端口时,USB 端口发生了数千次重置。

但是当我将鼠标直接插入主板上的 USB 1.x 或 2.x 端口(避免使用 3.x 端口)时,端口重置就会消失

相关内容