网卡生命周期
计算机启动时,初始化网卡驱动的流程
初始化程序入口,主要是调用了iwl_pci_register_driver()来注册驱动
位于iwl-drv.c
static int __init iwl_drv_init(void) {
int i, err;
// ... ...
err = iwl_pci_register_driver();
// ... ...
return 0;
}
module_init(iwl_drv_init);
(1)这里描述了一个PCI驱动的格式iwl_pci_driver
位于drv.c
static struct pci_driver iwl_pci_driver = {
.name = DRV_NAME,
.id_table = iwl_hw_card_ids,
.probe = iwl_pci_probe,
.remove = iwl_pci_remove,
.driver.pm = IWL_PM_OPS,
};
(2)注册一个 PCI 驱动到 Linux 内核的 PCI 子系统中
位于drv.c
int __must_check iwl_pci_register_driver(void)
{
int ret;
ret = pci_register_driver(&iwl_pci_driver);
// ... ...
return ret;
}
(3)具体的注册驱动
位于pci-driver.c
int __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name) {
/* initialize common driver fields */
drv->driver.name = drv->name;
drv->driver.bus = &pci_bus_type;
drv->driver.owner = owner;
drv->driver.mod_name = mod_name;
drv->driver.groups = drv->groups;
drv->driver.dev_groups = drv->dev_groups;
spin_lock_init(&drv->dynids.lock);
INIT_LIST_HEAD(&drv->dynids.list);
/* register with core */
return driver_register(&drv->driver);
}
EXPORT_SYMBOL(__pci_register_driver);