Gibt es eine allgemeine Möglichkeit, ein PCI-Gerät in Linux über die Befehlszeile zurückzusetzen? Das heißt, der PCI-Bus gibt einen Rücksetzbefehl aus.
Laut http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci können Sie einzelne Funktionen des Geräts zurücksetzen, wenn dies unterstützt wird:
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.
Das, was der PCI-Bus einem Zurücksetzen auf Geräteebene am nächsten kommt, ist, den Energiezustand auf D3 und zurück auf D0 zu ändern. Nach dem Entladen des Treibers (es wäre schlecht, die Hardware unter dem Treiber zurückzusetzen) können Sie setpci
in die Steuerregister schreiben, um den Energiezustand zu ändern, aber ich glaube, dies geschieht automatisch, wenn Sie den Treiber entladen.
Da ein generisches PCI-Gerät nicht Hot-Plug-fähig ist, kann es nicht zurückgesetzt und vom Kernel erneut aufgelistet werden.
Welche Art von Problemen Sie auch lösen möchten, es gibt sicherlich einen besseren Weg, als sie einfach zurückzusetzen.
Das Problem bei den obigen Lösungen besteht darin, dass sie die Zusammenarbeit des Geräts erfordern; In den meisten Szenarien liegt der Grund für das Zurücksetzen jedoch genau in der mangelnden Kooperativität.
Wie hier beschrieben , gibt es jedoch eine andere, "schwierigere" Möglichkeit, es auf der PCI-Ebene zurückzusetzen: Wir entfernen es aus dem PCI-Bus und fügen es dann durch einen erneuten Scan wieder ein.
Die Schritte:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Wir können seine PCI-ID mit einemlspci
Befehl finden.echo 1 >/sys/bus/pci/rescan
Ich habe hier ein fehlerhaftes PCI-Gerät, manchmal einen PCI-Level-Reset, manchmal behebt dieser Trick das Problem. Ich bin dabei, ein Skript zu schreiben, um es automatisch zu machen. :-)
quelle