在 Linux 中重置 PCI 设备

在 Linux 中重置 PCI 设备

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

答案1

根据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.

答案2

上述方案的问题是需要设备的配合;然而,在大多数情况下,重置它的原因正是它的不合作性。

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

步骤:

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

我这里有一个有问题的 pci 设备,有时是 PCI 级重置,有时这个删除读取技巧可以修复它。我即将编写一个脚本来自动执行此操作。 :-)

答案3

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

答案4

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

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

相关内容