Hi Thomas,
On Wed, Oct 22, 2008 at 4:03 PM, Thomas Petazzoni
<[EMAIL PROTECTED]> wrote:
> Le Sat, 18 Oct 2008 19:32:16 +0900,
> J.H.Kim <[EMAIL PROTECTED]> a écrit :
>
>> I'm reading kernel source code for the first time. First, I'd
>> like to know how the PCI driver works.
>> I found the routines which scans PCI bus and and add data structure
>> of the found devices into bus data structure as linked list.
>> But I got lost there. Each device probe routine seems to be called
>> after the related module is loaded.
>> I cannot find the routines which call modprobe or insmod for desired
>> modules related to found devices and I wonder how the module for each
>> device is selected.
>> So, I'm finding where the PCI network driver module is loaded, for
>> example. Any advice would be greatly appreciated.
>
> In /lib/modules/<kernelversion>/modules.alias, there is a list of
> associations between PCI IDs and modules names, like:
>
> alias pci:v0000106Bd00001645sv*sd*bc*sc*i* tg3
>
> When a PCI device is detected on the PCI bus, the kernel sends an
> uevent to the user-space daemon udev, with a MODALIAS variable,
> containing a string like pci:v0000106Bd00001645sv*sd*bc*sc*i*. Then
> udev runs the modprobe command with the module alias in argument.
> modprobe travels through the modules.alias file and loads the
> corresponding module. Once loaded the module tells the kernel that it
> handles PCI devices identified by some IDs, and its ->probe() method
> gets called.
>
I noticed that PCI_DEVICE_TABLE is defined here:
./drivers/net/sky2.c:
static DEFINE_PCI_DEVICE_TABLE(sky2_id_table) = {
./drivers/net/bnx2.c:
static DEFINE_PCI_DEVICE_TABLE(bnx2_pci_tbl) = {
and within this table are a list of all the vendor IDs:
static DEFINE_PCI_DEVICE_TABLE(sky2_id_table) = {
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, /* SK-9Sxx */
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, /* SK-9Exx */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) }, /* DGE-560T */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4001) }, /* DGE-550SX */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B02) }, /* DGE-560SX */
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B03) }, /* DGE-550T */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) }, /* 88E8021 */
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) }, /* 88E8022 */
So are all these vendor ID - which are statically defined inside the
sky2.ko module, somehow made to go into modules.alias as well? (at
compilation time, i supposed)
Appreciate very much your explanation :-).
--
Regards,
Peter Teoh
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [EMAIL PROTECTED]
Please read the FAQ at http://kernelnewbies.org/FAQ