Zresetuj urządzenie PCI w systemie Linux

12

Czy istnieje ogólny sposób resetowania urządzenia PCI w systemie Linux z wiersza polecenia? Oznacza to, że magistrala PCI wydaje polecenie resetowania.

Jonathan
źródło

Odpowiedzi:

6

zgodnie z http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci możesz zresetować poszczególne funkcje urządzenia, jeśli jest to obsługiwane:

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
źródło
5

Najbliższą rzeczą, jaką magistrala PCI ma do resetowania poziomu urządzenia, jest zmiana stanu zasilania na D3 i powrót do D0. Po rozładowaniu sterownika (źle byłoby zresetować sprzęt spod sterownika), możesz użyć setpcizapisu do rejestrów kontrolnych, aby zmienić stan zasilania, ale wierzę, że dzieje się to automatycznie po zwolnieniu sterownika.

psusi
źródło
1

Ponieważ ogólnego urządzenia PCI nie można podłączyć w trybie hot-plug, nie będzie sposobu na jego zresetowanie i ponowne przeliczenie przez jądro.

Niezależnie od rodzaju problemów, które próbujesz rozwiązać, z pewnością istnieje lepszy sposób niż zresetowanie go.


źródło
4
Symuluję urządzenie PCI w QEMU i muszę się resetować w miarę rozwoju. Chciałem to zrobić z wnętrza gościa.
Jonathan
1
Mam wadliwą kartę pci cctv, działa, ale czasami umiera z powodu usterki. Następnie należy zrestartować cały system, zresetować PCI, czego można uniknąć ... System jest stabilny, nie szkodzi, tylko wejście wideo staje się puste, więc czasami lepszym rozwiązaniem jest zresetowanie PCI niż ponowne uruchomienie cała maszyna każdego dnia. (zwłaszcza jeśli jesteś 6000 km od tej maszyny przez 6 miesięcy)
Gipsz Jakab
1

Problem z powyższymi rozwiązaniami polega na tym, że wymagają one współpracy urządzenia; jednak w większości scenariuszy powodem zresetowania jest właśnie brak współpracy.

Jednak, jak tu opisano , istnieje inny „trudniejszy” sposób zresetowania go na poziomie PCI: usuwamy go z magistrali PCI, a następnie ponownie wkładamy za pomocą ponownego skanowania.

Kroki:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Możemy znaleźć jego identyfikator PCI za pomocą lspcipolecenia.
  2. echo 1 >/sys/bus/pci/rescan

Mam tutaj wadliwe urządzenie PCI, czasem resetowanie na poziomie PCI, czasem ta sztuczka z odczytem usuwa to. Mam zamiar napisać skrypt, aby zrobić to automatycznie. :-)

peterh - Przywróć Monikę
źródło
Ugh. Mój kontroler USB nadal jest wadliwy, nawet po tym resecie.
Chris
@Chris Czy jesteś pewien, że jest to kontroler, a nie urządzenie?
peterh - Przywróć Monikę
Tak, jestem pewien, że to kontroler 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Przekazuję go do VM przez VFIO i po ponownym uruchomieniu VM muszę również ponownie uruchomić host, aby znów działał, w przeciwnym razie wykryte zostanie każde podłączone USB, ale komunikacja nie powiedzie się.
Chris