4.0 及更高版本的 Linux 内核中的 USB 驱动程序发生了哪些变化?

4.0 及更高版本的 Linux 内核中的 USB 驱动程序发生了哪些变化?

使用高达 3.19 的内核,我的所有 USB 设备都可以完美运行。

升级到 4.0 或更高版本后,我的一些 USB 设备停止工作,并且内核会产生如下错误:

[    3.369436] usb 9-1: device descriptor read/64, error -62
[    3.593543] usb 9-1: new full-speed USB device number 4 using ohci-pci
[    3.997572] usb 9-1: device not accepting address 4, error -62
[    4.120602] usb 9-1: new full-speed USB device number 5 using ohci-pci
[    4.524792] usb 9-1: device not accepting address 5, error -62
[    4.524911] usb usb9-port1: unable to enumerate USB device
[   15.402105] usb 9-1: new full-speed USB device number 6 using ohci-pci
[   15.530135] usb 9-1: device descriptor read/64, error -62
[   15.759224] usb 9-1: device descriptor read/64, error -62
[   15.983312] usb 9-1: new full-speed USB device number 7 using ohci-pci
[   16.111309] usb 9-1: device descriptor read/64, error -62
[   16.340398] usb 9-1: device descriptor read/64, error -62
[   16.564378] usb 9-1: new full-speed USB device number 8 using ohci-pci
[   16.968454] usb 9-1: device not accepting address 8, error -62
[   17.091555] usb 9-1: new full-speed USB device number 9 using ohci-pci
[   17.495570] usb 9-1: device not accepting address 9, error -62
[   17.495603] usb usb9-port1: unable to enumerate USB device
[   17.673702] usb 9-1: new full-speed USB device number 10 using ohci-pci
[   17.801758] usb 9-1: device descriptor read/64, error -62
[   18.030814] usb 9-1: device descriptor read/64, error -62
[   18.254834] usb 9-1: new full-speed USB device number 11 using ohci-pci
[   18.382858] usb 9-1: device descriptor read/64, error -62
[   18.611902] usb 9-1: device descriptor read/64, error -62
[   18.835977] usb 9-1: new full-speed USB device number 12 using ohci-pci
[   19.240034] usb 9-1: device not accepting address 12, error -62
[   19.363101] usb 9-1: new full-speed USB device number 13 using ohci-pci
[   19.767182] usb 9-1: device not accepting address 13, error -62
[   19.767226] usb usb9-port1: unable to enumerate USB device

那个特定的例子只是一个廉价的 USB 存储卡读卡器......我并不真正关心它。

对我来说更重要的问题是我的 mythtv 后端盒子上的 Quad DVB-T 接收器也遇到同样的问题,所以我目前无法将该机器升级到 3.19 以上。这是一张 PCI-e 卡,看起来像是某种 PCI-E 转 USB 桥接器,并且 DVB 调谐器通过 USB 连接。我不完全确定,但我认为它实际上可能是 PCIe -> PCI -> USB 卡。

以下是该卡在工作 3.19 内核上的详细信息:

# lsusb | grep Leadtek
Bus 010 Device 005: ID 0413:6680 Leadtek Research, Inc. 
Bus 010 Device 004: ID 0413:6680 Leadtek Research, Inc. 
Bus 010 Device 003: ID 0413:6680 Leadtek Research, Inc. 
Bus 010 Device 002: ID 0413:6680 Leadtek Research, Inc. 

# dmesg | grep -i DigitalNow| grep pci
[    9.405568] input: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-1/rc/rc1/input17
[    9.405687] rc1: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-1/rc/rc1
[    9.475939] input: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-2/rc/rc2/input22
[    9.476049] rc2: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-2/rc/rc2
[    9.542441] input: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-3/rc/rc3/input24
[    9.542617] rc3: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-3/rc/rc3
[    9.609134] input: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-4/rc/rc4/input26
[    9.609289] rc4: DigitalNow Quad DVB-T Receiver as /devices/pci0000:00/0000:00:0a.0/0000:04:00.0/0000:05:00.2/usb10/10-4/rc/rc4

# lspci | grep '^0[45]:'
04:00.0 PCI bridge: PLX Technology, Inc. PEX8112 x1 Lane PCI Express-to-PCI Bridge (rev aa)
05:00.0 USB controller: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller (rev 62)
05:00.1 USB controller: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller (rev 62)
05:00.2 USB controller: VIA Technologies, Inc. USB 2.0 (rev 65)

# lspci -vv -s 05:00
05:00.0 USB controller: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller (rev 62) (prog-if 00 [UHCI])
    Subsystem: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 32, Cache Line Size: 64 bytes
    Interrupt: pin A routed to IRQ 26
    Region 4: I/O ports at d020 [size=32]
    Capabilities: [80] Power Management version 2
        Flags: PMEClk+ DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold-)
        Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
    Kernel driver in use: uhci_hcd

    05:00.1 USB controller: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller (rev 62) (prog-if 00 [UHCI])
        Subsystem: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32, Cache Line Size: 64 bytes
        Interrupt: pin B routed to IRQ 41
        Region 4: I/O ports at d000 [size=32]
        Capabilities: [80] Power Management version 2
            Flags: PMEClk+ DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold-)
            Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: uhci_hcd

    05:00.2 USB controller: VIA Technologies, Inc. USB 2.0 (rev 65) (prog-if 20 [EHCI])
        Subsystem: VIA Technologies, Inc. USB 2.0 Controller
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32, Cache Line Size: 64 bytes
        Interrupt: pin C routed to IRQ 50
        Region 0: Memory at fe500000 (32-bit, non-prefetchable) [size=256]
        Capabilities: [80] Power Management version 2
            Flags: PMEClk+ DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold-)
            Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: ehci-pci

那么,最近内核 USB 驱动程序发生了哪些变化? 这是一个错误,还是一个配置问题?

几个内核版本 (3.8) 之前,USB 内容发生了变化,因此ehci-hcd必须在ehci-pci. initramfs-tools此后已升级为自动处理该问题,但我的/etc/modules文件中仍然有注释掉的解决方法的残余部分:

# make sure ehci-pci loads immediately after ehci-hcd for kernel 3.8
# (should be handled automagically by initramfs-tools 0.110 now)
#ehci-hcd
#ehci-pci

这是否是类似的情况,可以通过按特定顺序加载驱动程序或将某些过时的驱动程序列入黑名单来处理?


更多硬件和软件详细信息:

多台机器上都发生过这种情况,包括:

  • 华硕 M4A89TD PRO USB3 主板,配备 AMD Phenom II X6 1090T 处理器(工作站)
  • 华硕 M5A97 搭载 AMD Phenom II X6 1090T 处理器(神话前端)
  • 采用 AMD Phenom II X6 1090T 处理器的 Asus Sabertooth 990FX(工作站和服务器)
  • 华硕 Sabertooth 990FX 配备 AMD FX(tm)-8150 八核处理器(神话后端)

最后一个是 FX-8150(前一块主板坏掉后我不得不重建它),是带有 DigitalNow 四路 DVB-T 接收器的神话盒子。第一个是 M4A89TD Pro,是带有廉价 USB 存储卡读卡器的机器。

它们都至少有 8GB RAM,并且都具有 nvidia GTX-750(神话盒子)或 GTX-560 或 GTX-560Ti GPU,使用专有的 nvidia 驱动程序。所有系统都运行 Debian sid,带有最新的内核(4.2.x 除了神话后端之外的所有内核,因为这是唯一一个 USB 对除 HID 之外的任何东西都很重要的内核 - USB kbd 和鼠标,甚至 wacom 平板电脑都可以在 4.0+ 上正常工作内核)。

所有机器都使用 RAID-1 中的 128-256GB SSD 启动,/使用 XFS,/boot 使用 ext4。 mythtv 后端也运行 zfsonlinux 以进行大容量存储。工作站/服务器的组合也是如此。

我尝试过 debian stock 内核、liquiix 内核和定制编译的内核。所有结果都相同:最高 3.19 就可以了。 4.0 及更高版本损坏了我的 DVB-T 接收器和存储卡读卡器。


请注意:我并不追求一般知识,或者通过谷歌五分钟就能找到的信息。我正在寻找有关 4.0+ 内核中任何已知 USB(或其他可能相关)回归的具体信息,幸运的是,还有补丁或解决方法。

答案1

这听起来像是 4.x Linux 中的内核回归,至少对于您的特定硬件而言是这样。

http://archlinuxarm.org/forum/viewtopic.php?f=53&t=8798

它可能在此提交中,但很难说,因为您没有提供有关系统的任何进一步信息。

https://github.com/torvalds/linux/commit/a0b5cd4ac2d6542d524d8063961bf914b5df1efa

某些系统显然至少在 USB 3 方面遇到问题: https://lists.debian.org/debian-kernel/2015/08/msg00066.html

所以真正的问题是,您的硬件是什么,以及您尝试过的最新 4.x 内核是什么。这可能已在最近的 4.x 版本中得到解决。问题是与 USB 2 和 3 相关,还是与 USB 3 相关,或者与 USB 版本无关?这将有助于缩小范围。您的数据看起来只是系统上的 usb2 max。

内核回归正常。

当人们问此类问题时,我告诉他们,新的 Linux 内核有几种可能的结果:

  1. 以前不起作用的东西现在起作用了
  2. 系统上的一切都保持不变
  3. 以前有用的东西现在不再工作了
  4. 有些事情变得更好,有些事情停止了

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1455376 这是 Ubuntu 的 USB 处理错误。

通常影响很多人使用的错误会相对较快地得到修复,因此值得检查最新稳定内核的最新版本,我认为目前是 4.3。

如果您使用 ubuntu,则可以运行 Liquix 内核,至少如果它是当前的 ubuntu,而不是 LTS,对于 debian、非稳定版本也是如此。

查看:inxi -bxxx 将有助于展示系统的基础知识。 inxi 可以从大多数发行版存储库安装。

以下是 Greg KH 的 4.0 / 3.20 USB 更改列表

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e29876723f7cb7728f0d6a674d23f92673e9f112

  usb: musb: fix device hotplug behind hub
  usb: dwc2: Fix a bug in reading the endpoint directions from reg.
  staging: emxx_udc: fix the build error
  usb: Retry port status check on resume to work around RH bugs
  Revert "usb: Reset USB-3 devices on USB-3 link bounce"
  uhci-hub: use HUB_CHAR_*
  usb: kconfig: replace PPC_OF with PPC
  ehci-pci: disable for Intel MID platforms (update)
  usb: gadget: Kconfig: use bool instead of boolean
  usb: musb: blackfin: remove incorrect __exit_p()
  USB: fix use-after-free bug in usb_hcd_unlink_urb()
  ehci-pci: disable for Intel MID platforms
  usb: host: pci_quirks: joing string literals
  USB: add flag for HCDs that can't receive wakeup requests (isp1760-hcd)
  USB: usbfs: allow URBs to be reaped after disconnection
  cdc-acm: kill unnecessary messages
  cdc-acm: add sanity checks
  usb: phy: phy-generic: Fix USB PHY gpio reset
  usb: dwc2: fix USB core dependencies
  usb: renesas_usbhs: fix NULL pointer dereference in dma_release_channel()

http://kernelnewbies.org/Linux_4.0显示完整的变更集。

https://lkml.org/lkml/2015/6/26/511这就是 4.2-rc1 中 USB 的变化。正如您所看到的,询问“发生了什么变化”可能不是正确的问题,更有用的是确定您的硬件的问题是否已在最新版本中得到解决。

相关内容