<div dir="ltr"><span style="font-size:12.8px">Hello list,</span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I am reading through the e1000 driver and trying to figure out how the probe function on it gets called.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>The driver initialization function calls pci_register_driver:<br></div><div><br></div><div>-----------------------------------------------------------------------------&gt;8</div><div>static struct pci_driver e1000_driver = {<br></div><div><span style="white-space:pre-wrap">        </span>.name     = e1000_driver_name,</div><div><span style="white-space:pre-wrap">        </span>.id_table = e1000_pci_tbl,</div><div><span style="white-space:pre-wrap">        </span>.probe    = e1000_probe,</div><div><span style="white-space:pre-wrap">        </span>.remove   = e1000_remove,</div><div>    // ...</div><div>};</div><div><br></div><div>static int __init e1000_init_module(void)</div><div>{</div><div>    // ...</div><div><span style="white-space:pre-wrap">        </span>ret = pci_register_driver(&amp;e1000_driver);</div><div>    // ...</div><div>}</div><div>-----------------------------------------------------------------------------&gt;8</div><div><br></div><div>And pci_register_driver is defined as (on linux/pci.h):</div><div><br></div><div>-----------------------------------------------------------------------------&gt;8</div><div>#define pci_register_driver(driver)             \</div><div>         __pci_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)</div><div>-----------------------------------------------------------------------------&gt;8</div><div><br></div><div>Function __pci_register_driver is defined as (drivers/pci/pci-driver.c):</div><div><br></div><div>-----------------------------------------------------------------------------&gt;8</div><div>int __pci_register_driver(struct pci_driver *drv, struct module *owner,</div><div>                          const char *mod_name)</div><div>{</div><div>        /* initialize common driver fields */</div><div>        drv-&gt;<a href="http://driver.name/" target="_blank">driver.name</a> = drv-&gt;name;</div><div>        drv-&gt;driver.bus = &amp;pci_bus_type;</div><div>        drv-&gt;driver.owner = owner;</div><div>        drv-&gt;driver.mod_name = mod_name;</div><div><br></div><div>        spin_lock_init(&amp;drv-&gt;dynids.lock);</div><div>        INIT_LIST_HEAD(&amp;drv-&gt;dynids.list);</div><div><br></div><div>        /* register with core */</div><div>        return driver_register(&amp;drv-&gt;driver);</div><div>}</div><div>EXPORT_SYMBOL(__pci_register_driver);</div><div>-----------------------------------------------------------------------------&gt;8</div><div><br></div><div>This is the point where I am getting lost. I can&#39;t figure out how the Kernel</div><div>will know about the functions defined in the e1000_driver struct mentioned</div><div>before, since it does not seem to pass a reference to it anywhere.</div><div><br></div><div>How does the kernel know where the probe function for this module is in this</div><div>case? To be honest, for any driver that calls pci_register_driver, how will the</div><div>kernel know where the probe function is since it does not seem like it is</div><div>being passed to driver_register?</div><div><br></div><div>Thanks for the help!</div><div><br></div><div>Henrique</div></div></div>