4

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

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

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

有什么想法可以从哪里开始诊断?执行失败.probe是真正让我感到困惑的地方。

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

4

1 回答 1

3

如果设备未在 lspci 中显示,则不会调用驱动程序的 .probe 函数,因为它确实在内核设备树中列出。

当您执行 pci bus rescan 并且它被 lspci 看到时,这并不意味着该设备是可访问的。事实上,尝试做一个lspci -vv -s BB:DD(其中 BB:DD 是 lspci 报告的设备总线 ID 和设备 ID。我希望你得到许多寄存器(特别是 BAR)的 0xFF。我想这就是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

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

于 2014-06-04T08:10:57.480 回答