linux - pci_Driver.probe 未被调用

标签 linux kernel linux-device-driver pci-e hotplugging

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

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

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

有什么想法可以从哪里开始诊断吗? exec .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/

相关文章:

ruby - 在 Chef 配方中,您如何为 Ruby 指定特定的补丁级别?

linux - fedpkg 本地错误 : conflict

tcp - (FreeBSD) 当 3000 或 4000 人突然同时开始登录时,同一秒内的端口没有响应。

linux - 内核模块 : Netfilter hook not providing correct data via sk_buff

linux - 检索 tasklet 的 pid

c - Linux 上的 <conio.h> 头文件在哪里?为什么我找不到 <conio.h>?

c - 在 C 中实现异步函数

assembly - 引导加载程序和内核错误

c - 如何从用户程序中调用用内核模块编写的函数?

c - 使用 pci_alloc_consistent 分配内存的限制是多少?