コマンドラインからLinuxでPCIデバイスをリセットする一般的な方法はありますか?つまり、PCIバスにリセットコマンドを発行させます。
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.
PCIバスがデバイスレベルのリセットに最も近いのは、電源状態をD3に変更し、D0に戻すことです。ドライバーをアンロードした後(ドライバーの下からハードウェアをリセットするのは悪いことです)、setpci
を使用して制御レジスタに書き込み、電源状態を変更できますが、これはアンロード時に自動的に行われると思いますドライバ。
一般的なPCIデバイスはホットプラグ対応ではないため、リセットしてカーネルに再列挙させる方法はありません。
あなたが解決しようとしているどんな種類の問題でも、それを単にリセットするよりも確かに良い方法があります。
上記のソリューションの問題は、デバイスの協調性を必要とすることです。ただし、ほとんどのシナリオでリセットする理由は、その非協調性にあります。
ただし、 here で説明されているように、PCIレベルでリセットする別の「より難しい」方法があります。PCIバスから削除してから、再スキャンして再挿入します。
手順:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
。 lspci
コマンドでPCI IDを見つけることができます。echo 1 >/sys/bus/pci/rescan
私はここでバグのあるPCIデバイスを使用しています。PCIレベルのリセットが行われることもあり、この削除によって読み取られたトリックによって修正されることもあります。私はそれを自動的に行うスクリプトを書こうとしています。 :-)