Сброс устройства PCI в Linux

12

Существует ли общий способ сброса устройства PCI в Linux из командной строки? То есть заставить шину PCI выдавать команду сброса.

Джонатан
источник

Ответы:

6

в соответствии с 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.
Андре Хольцнер
источник
5

Самое близкое, что имеет шина PCI к сбросу уровня устройства, - это изменение состояния питания на D3 и обратно на D0. После выгрузки драйвера (было бы плохо сбросить аппаратное обеспечение из-под драйвера), вы можете использовать его setpciдля записи в управляющие регистры для изменения состояния питания, но я считаю, что это происходит автоматически при выгрузке драйвера.

psusi
источник
1

Поскольку универсальное устройство PCI не поддерживает горячее подключение, не будет способа сбросить его и заставить ядро ​​пересчитать его.

Какие бы проблемы вы не пытались решить, несомненно, есть лучший способ, чем просто сбросить его.


источник
4
Я моделирую устройство PCI в QEMU и мне нужно сбросить его состояние по мере разработки. Я хотел сделать это изнутри гостя.
Джонатан
1
У меня глючная карта pci cctv, она работает, но иногда умирает с segfault. После этого необходимо перезапустить всю систему, с помощью сброса PCI этого можно избежать ... Система стабильна, без вреда, только видеовход становится пустым, поэтому иногда лучше сбросить PCI, чем перезапуск вся машина каждый день. (особенно если вы на 8000 км от этой машины на 6 месяцев)
Gipsz Jakab
1

Проблема с вышеупомянутыми решениями состоит в том, что они требуют совместимости устройства; однако в большинстве сценариев причиной сброса является именно его неработоспособность.

Однако, как описано здесь , есть еще один, более сложный способ сброса его на уровне PCI: мы удаляем его с шины PCI и затем повторно вставляем его путем повторного сканирования.

Шаги:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove, Мы можем найти его PCI ID с помощью lspciкоманды.
  2. echo 1 >/sys/bus/pci/rescan

У меня здесь глючное устройство pci, иногда сброс на уровне PCI, иногда этот трюк удаления-чтения исправляет это. Я собираюсь написать сценарий, чтобы сделать это автоматически. :-)

Петер - Восстановить Монику
источник
Тьфу. Мой USB-контроллер все еще глючит, даже после этого сброса.
Крис
@Chris Вы уверены, что это контроллер, а не устройство на нем?
Петер - Восстановить Монику
Да, я уверен, что это контроллер 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Я передаю его в виртуальную машину через VFIO, и после перезагрузки виртуальной машины мне также приходится перезагружать хост, чтобы он снова работал, в противном случае обнаруживается любой подключенный USB, но не удается установить связь.
Крис