HBA(pm8001)的probe过程 之内核路径

来源:互联网 发布:java 启动openssl 编辑:程序博客网 时间:2024/06/05 04:17

参考:struct device_driver的probe的调用http://bbs.chinaunix.net/thread-2120664-1-1.html

弄了HBA驱动几个月了,现在把学习到的东西总结一下。

首先是关于HBA的probe过程。在kernel里面是怎么调用的,看下面:

module_init(pm8001_init)----->pm8001_init(void)----->pci_register_driver(&pm8001_pci_driver)-----> __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name)----->driver_register(&drv->driver)----->

bus_add_driver(drv)----->driver_attach(drv)-----> __driver_attach(struct device *dev, void *data)----->driver_probe_device(drv, dev)----->

really_probe(dev, drv)----->dev->bus->probe(dev)(或者drv->probe(dev))。根据条件:if(dev->bus->probe),执行dev->bus->probe(dev),

由:

struct bus_type pci_bus_type = {
    .name        = "pci",
    .match        = pci_bus_match,
    .uevent        = pci_uevent,
    .probe        = pci_device_probe,
    .remove        = pci_device_remove,
    .shutdown    = pci_device_shutdown,
    .dev_attrs    = pci_dev_attrs,
    .bus_attrs    = pci_bus_attrs,
    .drv_attrs    = pci_drv_attrs,
    .pm        = PCI_PM_OPS_PTR,
};

dev->bus->probe(struct device *dev)----->pci_device_probe(struct device *dev)----->__pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)----->pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, const struct pci_device_id *id)----->local_pci_probe(void *_ddi)----->ddi->drv->probe(ddi->dev, ddi->id)

由:

static struct pci_driver pm8001_pci_driver = {
    .name        = DRV_NAME,
    .id_table    = pm8001_pci_table,
    .probe        = pm8001_pci_probe,
    .remove        = pm8001_pci_remove,
    .suspend    = pm8001_pci_suspend,
    .resume        = pm8001_pci_resume,
    .err_handler     = &pm8001_err_handler,
};

ddi->drv->probe(ddi->dev, ddi->id)----->pm8001_pci_probe

以后的文章中会详细的分析pm8001_pci_probe的执行过程。