网络设备之pci_device_id

标准PCI设备都有一个配置寄存器,用来存储各种参数;

 1 /* pci设备配置寄存器 */
 2 struct pci_device_id {
 3     /* 厂商id,设备id */
 4     __u32 vendor, device;        /* Vendor and device ID or PCI_ANY_ID*/
 5     /* 子系统厂商id,子系统设备id */
 6     __u32 subvendor, subdevice;    /* Subsystem ID's or PCI_ANY_ID */
 7     /* 类,类掩码,使驱动程序可以指定支持某一种pci设备 */
 8     __u32 class, class_mask;    /* (class,subclass,prog-if) triplet */
 9     /* 保存于设备相关的私有信息 */
10     kernel_ulong_t driver_data;    /* Data private to the driver */
11 };

以e100为例,其支持多种设备,不同设备的pci_device_id初始化后存放在e100_id_table[]数组中;

e100_driver操作中的id_table字段会引用该数组;

 1 /* e100的pci设备信息结构列表 */
 2 #define INTEL_8255X_ETHERNET_DEVICE(device_id, ich) {
 3     PCI_VENDOR_ID_INTEL, device_id, PCI_ANY_ID, PCI_ANY_ID, 
 4     PCI_CLASS_NETWORK_ETHERNET << 8, 0xFFFF00, ich }
 5 static const struct pci_device_id e100_id_table[] = {
 6     INTEL_8255X_ETHERNET_DEVICE(0x1029, 0),
 7     INTEL_8255X_ETHERNET_DEVICE(0x1030, 0),
 8     INTEL_8255X_ETHERNET_DEVICE(0x1031, 3),
 9     INTEL_8255X_ETHERNET_DEVICE(0x1032, 3),
10     INTEL_8255X_ETHERNET_DEVICE(0x1033, 3),
11     INTEL_8255X_ETHERNET_DEVICE(0x1034, 3),
12     INTEL_8255X_ETHERNET_DEVICE(0x1038, 3),
13     INTEL_8255X_ETHERNET_DEVICE(0x1039, 4),
14     INTEL_8255X_ETHERNET_DEVICE(0x103A, 4),
15     INTEL_8255X_ETHERNET_DEVICE(0x103B, 4),
16     INTEL_8255X_ETHERNET_DEVICE(0x103C, 4),
17     INTEL_8255X_ETHERNET_DEVICE(0x103D, 4),
18     INTEL_8255X_ETHERNET_DEVICE(0x103E, 4),
19     INTEL_8255X_ETHERNET_DEVICE(0x1050, 5),
20     INTEL_8255X_ETHERNET_DEVICE(0x1051, 5),
21     INTEL_8255X_ETHERNET_DEVICE(0x1052, 5),
22     INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
23     INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
24     INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
25     INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
26     INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
27     INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
28     INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
29     INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
30     INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
31     INTEL_8255X_ETHERNET_DEVICE(0x1067, 6),
32     INTEL_8255X_ETHERNET_DEVICE(0x1068, 6),
33     INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
34     INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
35     INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
36     INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),
37     INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),
38     INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),
39     INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),
40     INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),
41     INTEL_8255X_ETHERNET_DEVICE(0x10fe, 7),
42     INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
43     INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
44     INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
45     INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
46     INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
47     INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),
48     { 0, }
49 };
50 MODULE_DEVICE_TABLE(pci, e100_id_table);
原文地址:https://www.cnblogs.com/wanpengcoder/p/7526005.html