web-dev-qa-db-ja.com

LinuxでPCIデバイスをリセットする

コマンドラインからLinuxでPCIデバイスをリセットする一般的な方法はありますか?つまり、PCIバスにリセットコマンドを発行させます。

12
Jonathan

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.
6
Andre Holzner

PCIバスがデバイスレベルのリセットに最も近いのは、電源状態をD3に変更し、D0に戻すことです。ドライバーをアンロードした後(ドライバーの下からハードウェアをリセットするのは悪いことです)、setpciを使用して制御レジスタに書き込み、電源状態を変更できますが、これはアンロード時に自動的に行われると思いますドライバ。

5
psusi

一般的なPCIデバイスはホットプラグ対応ではないため、リセットしてカーネルに再列挙させる方法はありません。

あなたが解決しようとしているどんな種類の問題でも、それを単にリセットするよりも確かに良い方法があります。

1
Niko S P

上記のソリューションの問題は、デバイスの協調性を必要とすることです。ただし、ほとんどのシナリオでリセットする理由は、その非協調性にあります。

ただし、 here で説明されているように、PCIレベルでリセットする別の「より難しい」方法があります。PCIバスから削除してから、再スキャンして再挿入します。

手順:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/removelspciコマンドでPCI IDを見つけることができます。
  2. echo 1 >/sys/bus/pci/rescan

私はここでバグのあるPCIデバイスを使用しています。PCIレベルのリセットが行われることもあり、この削除によって読み取られたトリックによって修正されることもあります。私はそれを自動的に行うスクリプトを書こうとしています。 :-)