標准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);