i40e_init_module()
__pci_register_driver()
driver_register()
driver_find()//判断是否是已经注册过的driver
bus_add_driver()//将驱动添加到对应类型的总线上
driver_attach()//通过bus_for_each_dev,bus上每个device都会调用一次__driver_attach()
__driver_attach()
driver_match_device()
drv->bus->match(dev, drv)//pci_bus_match()
pci_match_device()
pci_match_id()
device_driver_attach()
driver_probe_device()
really_probe()
driver_sysfs_add(dev)//关联driver与device
i40e_probe()//初始化
driver_bound()//将dev挂接到该driver->klist_devices上
driver_add_groups()//将驱动添加到对应组中
kobject_uevent()//注册uevent事件
每个网卡驱动都有一个描述驱动的结构体变量,id_table中描述了driver所支持的device id。
在pci_match_device()函数中会通过调用pci_match_id()函数在id_table中匹配device的device id。
Code Flow:
i40e_probe()
pci_enable_device_mem()
pci_request_mem_regions()
pci_enable_pcie_error_reporting()
pci_set_master() //Now that we have a PCI connection
i40e_set_mac_type()
i40e_init_shared_code()
i40e_init_adminq()
i40e_verify_eeprom()
i40e_get_capabilities()
i40e_sw_init()//初始化pf
i40e_configure_lan_hmc()
i40e_get_platform_mac_addr()//获取mac地址
i40e_init_interrupt_scheme()
i40e_setup_pf_switch()//alloc ring
i40e_lan_add_device()
pcie_capability_read_word()
i40e_set_pci_config_data()//将配置空间的Cap信息写入HW结构体中 主要是link width and speed
当设备加载完驱动后,会进入probe函数进行alloc ring、设置mac地址、获取设备Capability、注册中断等初始化工作,
在i40e_init_shared_code()函数中会调用i40e_set_mac_type()函数根据设备的device id设置网卡的mac_type,由于无法找到网卡的device id,导致返回error。