不少網絡接口卡都是PCI設備,必須與Linux PCI子系統協同工做。新的PCI設備是PCI Express設備.PCI設備都有隻讀的配置空間,能夠經過lspci命令來讀取。node
#lspci -xxx能夠查看PCI配置空間內容的十六進制表示linux
#lspci -xxxx能夠查看擴展PCI配置空間內容的十六進制表示網絡
固然linux PCI API提供了3個讀取配置空間的方法,位於文件對象
drivers/pci/access.c中:接口
pci_read_config_byte, pci_read_config_word, pci_read_config_dwordip
還有寫配置的方法ci
pci_write_config_byte, pci_write _config_word, pci_write _config_dwordrem
在Linux PCI子系統中,PCI設備用pci_device_id對象表示,位於文件it
include/linux/mod_devicetable.h:io
struct pci_device_id {
__u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/
__u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */
__u32 class, class_mask; /* (class,subclass,prog-if) triplet */
kernel_ulong_t driver_data; /* Data private to the driver */
};
每一個pci設備驅動程序都聲明瞭一個pci_drier對象,位於文件include/linux/pci.h
struct pci_driver {
struct list_head node;
const 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);
int (*sriov_configure) (struct pci_dev *dev, int num_vfs); /* PF pdev */
const struct pci_error_handlers *err_handler;
const struct attribute_group **groups;
struct device_driver driver;
struct pci_dynids dynids;
};