Registering a PCI NIC Device Driver
PCI devices are uniquely identified by a combination of
parameters, including vendor, model, etc. These parameters are stored by the kernel in a
data structure of type pci_device_id, defined as
follows:
struct pci_device_id {
unsigned int vendor, device;
unsigned int subvendor, subdevice;
unsigned int class, class_mask;
unsigned long driver_data;
};Most of the fields are self-explanatory. vendor and
device are usually sufficient to identify the device.
subvendor and subdevice are rarely needed and are usually set to a wildcard value (PCI_ANY_ID). class and
class_mask represent the class the device belongs to;
NETWORK is the class that covers the devices we discuss in this chapter. driver_data is not part of the PCI ID; it is a private
parameter used by the driver.
Each device driver registers with the kernel a vector of pci_device_id instances that lists the IDs of the devices it can handle.
PCI device drivers register and unregister with the kernel with pci_register_driver and pci_unregister_driver, respectively. These functions are defined in drivers/pci/pci.c. There is also pci_module_init, an alias for pci_register_driver. A few drivers still use pci_module_init, which is the name of the routine the kernel provided in
older kernel versions before the introduction of pci_register_driver.
pci_register_driver requires a pci_driver data structure as an argument. Thanks to the
pci_driver's id_table vector, the kernel knows what devices the driver can ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access