在 Linux 中重置 PCI 设备

Jon*_*han 17 linux pci

有没有一种通用的方法可以从命令行重置 Linux 中的 PCI 设备?即使 PCI 总线发出复位命令。

psu*_*usi 7

PCI 总线与设备级重置最接近的事情是将电源状态更改为 D3,然后再更改回 D0。卸载驱动程序后(从驱动程序下重置硬件会很糟糕),您可以使用setpci写入控制寄存器来更改电源状态,但我相信卸载驱动程序时会自动发生这种情况。


And*_*ner 7

根据http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci,如果支持,您可以重置设备的各个功能:

What:       /sys/bus/pci/devices/.../reset
Description:
            Some devices allow an individual function to be reset
            without affecting other functions in the same device.
            For devices that have this support, a file named reset
            will be present in sysfs.  Writing 1 to this file
            will perform reset.
Run Code Online (Sandbox Code Playgroud)

  • 这会发出功能级重置,该重置不必执行,并且不会重置整个设备,而只会重置相关功能。 (2认同)

pet*_*erh 5

上述解决方案的问题在于它们需要设备的协同性;然而,在大多数情况下,重置它的原因正是它的非合作性。

但是,正如此处所述,还有另一种“更难”的方法可以在 PCI 级别重置它:我们将其从 PCI 总线中移除,然后通过重新扫描将其重新插入。

步骤:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. 我们可以通过lspci命令找到它的 PCI ID 。
  2. echo 1 >/sys/bus/pci/rescan

我这里有一个有问题的 pci 设备,有时是 PCI 级别的重置,有时是这个移除阅读技巧可以修复它。我即将编写一个脚本来自动完成它。:-)


小智 1

由于通用 PCI 设备不可热插拔,因此无法重置它并让内核重新枚举它。

无论您要解决什么类型的问题,肯定有比重置更好的方法。

  • 我正在 QEMU 中模拟 PCI 设备,并且需要在开发时重置它的状态。我想从客人内部做这件事。 (5认同)
  • 我有一个有问题的 pci cctv 卡,它可以工作,但有时会因段错误而死掉。之后,整个系统需要重新启动,通过 PCI 重置,这是可以避免的...系统稳定,无害,只是视频输入变空白,所以有时重置 PCI 是比重新启动更好的解决方案每天整机。(特别是如果您距离该机器 8000 公里 6 个月) (3认同)