PCI 总线与设备级重置最接近的事情是将电源状态更改为 D3,然后再更改回 D0。卸载驱动程序后(从驱动程序下重置硬件会很糟糕),您可以使用setpci写入控制寄存器来更改电源状态,但我相信卸载驱动程序时会自动发生这种情况。
根据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)
上述解决方案的问题在于它们需要设备的协同性;然而,在大多数情况下,重置它的原因正是它的非合作性。
但是,正如此处所述,还有另一种“更难”的方法可以在 PCI 级别重置它:我们将其从 PCI 总线中移除,然后通过重新扫描将其重新插入。
步骤:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. 我们可以通过lspci命令找到它的 PCI ID 。echo 1 >/sys/bus/pci/rescan我这里有一个有问题的 pci 设备,有时是 PCI 级别的重置,有时是这个移除阅读技巧可以修复它。我即将编写一个脚本来自动完成它。:-)
小智 1
由于通用 PCI 设备不可热插拔,因此无法重置它并让内核重新枚举它。
无论您要解决什么类型的问题,肯定有比重置更好的方法。