LINUX.ORG.RU

когда ядро вызывает функцию probe в PCI драйвере

 , , ,


0

2

Перед регистрацией PCI драйвера нужно проинициализировать структуру pci_driver и передать в pci_register_driver(). Одно из полей в структуре это указатель на ф-цию probe.

Собственно вопрос - а когда ядро «позовет» эту функцию. То есть при старте ядра более/менее понятно — PCI core сканирует шину, находит устройства, получает имена из device tree, после этого проходит по списку зарегистрированных драйверов и если к-л драйвер зарегился на данный VENDOR_ID/DEVICE_ID, то запускает его probe(). Как-то так...

А если мы insmod драйвер уже при загруженном ядре, как при таком раскладе ядро решает когда звать probe? Что определяет поведение?

Спасибо.

★★

O — OpenSource

pci_register_driver() это макрос, который раскрывается в вызов функции __pci_register_driver()

__pci_register_driver() вызывает driver_register()

driver_register() вызывает bus_add_driver()

в bus_add_driver() есть код

         if (drv->bus->p->drivers_autoprobe) {
                 error = driver_attach(drv);
                 if (error)
                         goto out_unregister;
         }

driver_attach() вызывает bus_for_each_dev() с аргументом __driver_attach()

__driver_attach() вызывает driver_probe_device()

driver_probe_device() в конечном итоге вызывает really_probe(), где есть такой код:

if (dev->bus->probe) {
    ret = dev->bus->probe(dev);

Кажется, это почти ответ на вопрос. Осталось только узнать, выставляется ли для pci_bus флаг drivers_autoprobe (выставляется, но лучше проверить).

P.S. я не разрабатываю драйверы для linux.

SystemD-hater
()

А если мы insmod драйвер уже при загруженном ядре, как при таком раскладе ядро решает когда звать probe? Что определяет поведение?

По факту probe вызывается сразу по insmod, и пока probe не завершится, не завершается юзерспейсная команда insmod/modprobe. Сам сейчас PCI драйвер один пишу.

Буду рад помочь по прочим вопросам.

Krieger_Od ★★
()
Ответ на: O — OpenSource от SystemD-hater

Я-то думал это нигде не описано и полез в исходники.

Оказывается всё известно:

PCI device drivers call pci_register_driver() during their
initialization with a pointer to a structure describing the driver
(struct pci_driver):

	field name	Description
	----------	------------------------------------------------------
	probe		This probing function gets called (during execution
			of pci_register_driver() for already existing
			devices or later if a new device gets inserted)
https://www.kernel.org/doc/Documentation/PCI/pci.txt

Чому документацию не читаешь?

SystemD-hater
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.