pci_Driver.probe не вызывается
Я начинаю разработку драйвера устройства Linux для устройства PCI, подключенного через слот расширения PCIe ноутбука.
При загрузке все работает красиво. Тем не менее, я пытаюсь получить базовую поддержку Hotplug онлайн. Когда я извлекаю карту, я вижу (в dmesg
) что правильное удаление материала называется. Однако при повторной установке карты ничего не происходит. Если я удаляю модуль вручную, а затем вставляю карту (или вставляю карту после загрузки), то я вижу init
называется, но не probe
, Кроме того, устройство не отображается в lspci
выход.
Однако если я echo 1 > /sys/bus/pci/rescan
затем он появляется в lspci
вывод, но модуль не загружается с ошибками (pci_enable_device failed with code -22
).
Есть идеи, где вообще начать диагностировать это? Неспособность выполнить .probe
это то, что действительно озадачивает меня
Я должен отметить, что это подключенная плата ПЛИС, поэтому возможно, что в самом устройстве что-то не так, но я все же ожидал, что пробник запустится, а потом выйдет из строя со странной ошибкой.
1 ответ
Если устройство не отображается в lspci, нет никаких шансов, что будет вызвана функция.probe вашего драйвера, потому что она будет указана в дереве устройств ядра.
Когда вы делаете повторное сканирование pci bus и это видит lspci, это не означает, что устройство доступно. На самом деле, попробуйте сделать lspci -vv -s BB:DD
(где BB:DD - это идентификатор шины устройства и идентификатор устройства, как сообщает lspci. Я ожидаю, что вы получите 0xFF для многих регистров (в частности, для BAR). Я думаю, что это было бы причиной того, что pci_enable_device
выходит из строя.
У меня похожая проблема с устройством FPGA, когда я перезагружаю битовый файл во время работы. Одной из возможных причин вашей проблемы является то, что регистры пространства конфигурации сбрасываются. Вы можете попытаться сохранить конфигурационное пространство перед удалением платы (с правами root):
cp /sys/bus/pci/devices/0000\:BB\:DD.0/config ~/config.save
затем восстановить его:
cp ~/config.save /sys/bus/pci/devices/0000\:BB\:DD.0/config
У меня был этот метод работы на одном оборудовании, но не на другом (более новое оборудование).