有没有通用的方法可以从命令行重置 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 总线上移除,然后通过重新扫描将其重新插入。
步骤:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
。我们可以通过命令找到它的PCI IDlspci
。echo 1 >/sys/bus/pci/rescan
我这里有一个有问题的 pci 设备,有时是 PCI 级重置,有时这个删除读取技巧可以修复它。我即将编写一个脚本来自动执行此操作。 :-)
答案3
PCI 总线与设备级重置最接近的事情是将电源状态更改为 D3,然后再更改回 D0。卸载驱动程序后(从驱动程序下重置硬件会很糟糕),您可以使用setpci
写入控制寄存器来更改电源状态,但我相信当您卸载驱动程序时会自动发生这种情况。
答案4
由于通用 PCI 设备不可热插拔,因此无法重置它并让内核重新枚举它。
无论您要解决什么类型的问题,肯定有比重置更好的方法。