pci设备的初始化

我们先来看下pci_driver结构,它的id_table是一个指向当前驱动所能处理的pci设备的id列表,由于每个pci设备都有一个唯一的标记,因此我们通过pci_device_id结构就可以标记不同的pci设备。

driver则指向下一个pci驱动。

struct pci_driver {
	struct list_head node;
	char *name;
	const struct pci_device_id *id_table;	/* must be non-NULL for probe to be called */
	int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);	/* New device inserted */
	void (*remove) (struct pci_dev *dev);	/* Device removed (NULL if not a hot-plug capable driver) */
	int  (*suspend) (struct pci_dev *dev, pm_message_t state);	/* Device suspended */
	int  (*suspend_late) (struct pci_dev *dev, pm_message_t state);
	int  (*resume_early) (struct pci_dev *dev);
	int  (*resume) (struct pci_dev *dev);	                /* Device woken up */
	void (*shutdown) (struct pci_dev *dev);
	struct pm_ext_ops *pm;
	struct pci_error_handlers *err_handler;
	struct device_driver	driver;
	struct pci_dynids dynids;
};


当系统boot时,它会为每一个总线创建一个检测到的设备的链表。我们这里只看pci总线,当boot后,有一个包含所有检测到的pci设备的链表,然后他会load所有的通过pci_register_driver注册的pci驱动(也就是一个驱动链表).此后系统会通过pci_device_id来发现每个pci设备所对应的驱动,当匹配好之后,系统会调用相应的probe函数创建和注册相应的网络设备。

可以看下下面的图:



a图 系统拥有一个设备的列表和一个驱动的列表。




b图 系统通过id_table查找到驱动A所对应的设备dev 1和dev 2




c图 系统查找到驱动B对应的设备dev 3



你可能感兴趣的:(ext,UP)