我开始为通过笔记本电脑的 PCIe 扩展槽连接的 PCI 设备进行 Linux 设备驱动程序开发。

在启动时,一切正常。但是,我正在尝试在线获得基本的热插拔支持。当我弹出卡时,我可以看到(在 dmesg 中)调用了正确的删除内容。但是,当重新插入卡时,没有任何 react 。如果我手动移除模块,然后插入卡(或在启动后插入卡),那么我可以看到模块的 init 被调用,但不是 probe 。此外,该设备不会出现在 lspci 输出中。

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

有什么想法可以从哪里开始诊断吗?执行 .probe 失败让我很困惑。

我应该提到这是一个连接到这里的 FPGA 板,所以设备本身可能有问题,但我仍然希望探针运行然后失败,然后出现奇怪的错误。

最佳答案

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

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

当我在运行时重新加载位文件时,我在 FPGA 设备上遇到了类似的问题。
问题的一个可能原因是配置空间寄存器被重置。
您可以在移除板之前尝试保存配置空间(以 root 用户身份):

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

然后恢复它:
cp ~/config.save /sys/bus/pci/devices/0000\:BB\:DD.0/config

我已经在某些硬件上使用了这种方法,但在其他(较新的硬件)上却没有。

关于linux - pci_Driver.probe 未被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23725484/

10-11 17:10