Odpowiedzi:
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.
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ć setpci
zapisu do rejestrów kontrolnych, aby zmienić stan zasilania, ale wierzę, że dzieje się to automatycznie po zwolnieniu sterownika.
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.
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:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Możemy znaleźć jego identyfikator PCI za pomocą lspci
polecenia.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. :-)
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ę.