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 меня действительно озадачивает.

Я должен упомянуть, что здесь подключена плата FPGA, поэтому, возможно, что-то не так в самом устройстве, но я все равно ожидаю, что зонд запустится, а затем выйдет из строя со странной ошибкой позже.


person Yeraze    schedule 18.05.2014    source источник
comment
Вам необходимо тщательно изучить код выхода и удаления, чтобы убедиться, что каждый ресурс и инициализация, выполненные во время инициализации и проверки, отменены (в обратном порядке). Возможно, вам придется добавить в код функцию printk(), чтобы найти источник кода ошибки -22 (EINVAL). Сбой при выполнении exec .probe меня действительно озадачил. -- Вероятно, это означает, что процедура инициализации модуля вернула ошибку.   -  person sawdust    schedule 19.05.2014
comment
Init работает успешно, я проверил его. Но .probe никогда не вызывается.   -  person Yeraze    schedule 19.05.2014
comment
Я осматриваюсь и просто наткнулся на pcihp_skeleton. Интерфейс горячего подключения полностью отличается от обычного интерфейса PCI? Я думал, что новые ядра объединили их.   -  person Yeraze    schedule 19.05.2014
comment
Если enable_device не работает, зонд не будет запущен. Устройства включаются шинным интерфейсом до активации драйвера.   -  person oakad    schedule 30.05.2014
comment
Опять же, не вопрос... Я даже не могу дойти до вызова enable_device, так как Probe не запущен (а enable_device находится в функции Probe)   -  person Yeraze    schedule 30.05.2014


Ответы (1)


Если устройство не отображается в lspci, нет никаких шансов, что будет вызвана функция .probe вашего драйвера, потому что она указана в дереве устройств ядра.

Когда вы выполняете повторное сканирование шины pci и ее видит 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

У меня этот метод работал на одном оборудовании, но не на другом (более новом оборудовании).

person Claudio    schedule 04.06.2014