2014-05-18 93 views
4

我正在开始使用通过笔记本电脑的PCIe扩展插槽连接的PCI设备的Linux设备驱动程序开发。pci_Driver.probe未被调用

开机时,一切都很好。但是,我试图在线获得基本的Hotplug支持。当我弹出卡片时,我可以看到(在dmesg)正确的删除东西被调用。但是,当卡被重新插入时,没有任何反应。如果我手动卸下模块,然后插入卡(或在引导后插入卡),则可以看到模块的init被调用,但不是probe。此外,该设备不会出现在lspci输出中。

但是,如果我echo 1 > /sys/bus/pci/rescan那么它出现在lspci输出,但模块无法加载错误(pci_enable_device failed with code -22)。

任何想法甚至可以开始诊断吗?没有执行.probe是令我困惑的事情。

我应该提到这是连接在这里的FPGA电路板,因此设备本身可能存在问题,但我仍然期望探针运行,然后在出现奇怪错误后失败。

+0

您需要仔细检查退出和删除代码,以确保在init&probe期间执行的每个资源和初始化操作都已撤销(以相反顺序)。您可能需要使用printk()来分配代码以查找-22错误代码(EINVAL)的来源。 *“执行失败.probe是令我困惑的事情。”* - 这可能意味着模块的init例程返回错误。 – sawdust

+0

初始化运行成功,我测试了它..但.probe永远不会被调用。 – Yeraze

+0

我四处寻找,只是偶然发现[pcihp_skeleton](https://svn.dd-wrt.com/browser/src/linux/universal/linux-3.4/drivers/pci/hotplug/pcihp_skeleton.c?rev= 19285)。 hotplug接口是否与常规PCI接口完全不同?我认为新的内核合并了两者。 – Yeraze

回答

3

如果设备没有在lspci中显示,那么驱动程序的.probe函数将不会被调用,因为它会在内核设备树中列出。

当你做pci总线重新扫描,它被lspci看到,这并不意味着该设备是可访问的。事实上,尝试做一个lspci -vv -s BB:DD(其中BB:DD是由lspci报告的设备总线ID和设备ID。我预计你会得到0xFF许多寄存器(特别是BAR)。我想这将是原因pci_enable_device失败。

我有一个FPGA器件类似的问题,当我重新加载位文件运行时。 一个可能的原因,您的问题是,配置空间寄存器被复位。 你可以尝试保存配置空间之前,您删除板(根):

cp /sys/bus/pci/devices/0000\:BB\:DD.0/config ~/config.save 

然后将其还原:

cp ~/config.save /sys/bus/pci/devices/0000\:BB\:DD.0/config 

我已经有这种方法在一些硬件上工作,但不在其他(较新的硬件)上。