Setzen Sie ein PCI-Gerät unter Linux zurück

12

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.

Jonathan
quelle

Antworten:

6

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.
Andre Holzner
quelle
5

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 setpciin die Steuerregister schreiben, um den Energiezustand zu ändern, aber ich glaube, dies geschieht automatisch, wenn Sie den Treiber entladen.

Psusi
quelle
1

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.


quelle
3
Ich simuliere ein PCI-Gerät in QEMU und muss seinen Status während der Entwicklung zurücksetzen. Ich wollte es aus dem Gast heraus tun.
Jonathan
Ich habe eine fehlerhafte PCI-CCTV-Karte, sie funktioniert, stirbt aber manchmal mit einem Segfault. Danach muss das gesamte System neu gestartet werden, was durch einen PCI-Reset vermieden werden kann. Das System ist stabil, kein Schaden, nur der Videoeingang wird leer. Manchmal ist es daher besser, das PCI zurückzusetzen, als einen Neustart durchzuführen die ganze maschine jeden tag. (vor allem, wenn Sie 6 Monate lang
8000
1

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:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Wir können seine PCI-ID mit einem lspciBefehl finden.
  2. 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. :-)

Peterh: Setzen Sie Monica wieder ein
quelle