自定义PCI驱动程序无法探测设备

时间:2016-08-06 01:53:53

标签: c linux-kernel linux-device-driver kernel-module pci

通过调用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

1 个答案:

答案 0 :(得分:0)

您还需要添加subvendorsubdevice字段(也将其设置为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),
};