Відповіді:
відповідно до 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.
Найближче, що шина PCI має відновити рівень пристрою, - це зміна стану живлення на D3 і повернення до D0. Після вивантаження драйвера (було б погано скинути обладнання з-під драйвера), ви можете використовувати setpci
для запису в регістри управління, щоб змінити стан живлення, але я вважаю, що це відбувається автоматично, коли ви вивантажуєте драйвер.
Оскільки загальний пристрій PCI не є гарячим підключенням, не буде способу його скинути і змусити ядро його перерахувати.
Які б проблеми ви не намагалися вирішити, безумовно, є кращий спосіб, ніж просто скинути її.
Проблема з вищезазначеними рішеннями полягає в тому, що вони вимагають кооперативності пристрою; однак у більшості сценаріїв причиною її скидання є саме його некооперативність.
Однак, як це описано тут , є ще один, "складніший" спосіб його скидання на рівні PCI: ми видаляємо його з шини PCI, а потім знову вставляємо його за допомогою сканування.
Етапи:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Ми можемо знайти його ідентифікатор PCI за допомогою lspci
команди.echo 1 >/sys/bus/pci/rescan
У мене тут пристрій з помилковою системою PCI, іноді скидання рівня PCI, іноді цей фокус, прочитаний на видалення, виправляє це. Я збираюся написати сценарій, щоб це зробити автоматично. :-)
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
. Я передаю його в VM через VFIO, і після перезавантаження VM мені також доведеться перезавантажити хост, щоб він знову працював, інакше будь-який USB-підключений виявлений, але зв’язок не вдається.