通过调用140735807202733 140734600362944 140735807202733
函数中的pci_register_driver()
注册PCI驱动程序后,驱动程序应该控制任何没有驱动程序的PCI设备,假设设备与供应商ID匹配,{设备ID等),在init_module
。
我想强制以太网控制器使用我的驱动程序,仅仅是为了实验(例如读取配置字节)。在Virtualbox guest虚拟机(Mint,内核3.13.0)上,我将以太网控制器的驱动程序列入黑名单,运行struct pci_device_id
并重新启动。这成功地取消了Controller的默认驱动程序,因为驱动程序不再出现在update-initramfs -u
的输出中。
然而,当我加载模块时,先前丢失的一些设备出现在lspci -k
的输出中(我的驱动程序正在控制它们),但以太网控制器仍缺少lspci -k
线。如何让我的模块识别并拥有控制器?
请注意,我使用"Kernel driver in use: "
作为供应商和设备字段,并将PCI_ANY_ID
的其他字段保留为未初始化。所以我希望驱动程序能够探测当前缺少驱动程序的任何设备。
struct pci_device_id
答案 0 :(得分:0)
您还需要添加subvendor
和subdevice
字段(也将其设置为PCI_ANY_ID
)。匹配功能如下:
static inline const struct pci_device_id *
pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)
{
if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) &&
(id->device == PCI_ANY_ID || id->device == dev->device) &&
(id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) &&
(id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) &&
!((id->class ^ dev->class) & id->class_mask))
return id;
return NULL;
}
您可以使用PCI_DEVICE
宏来提供相应的sub
成员:
static struct pci_device_id my_pci_id = {
PCI_DEVICE(PCI_ANY_ID, PCI_ANY_ID),
};