我这里有 Linux 4.4(我曾经在一个旧的内核上工作,它以同样的方式失败),带有一个 PCIe 连接的 FPGA 设备和一个驱动程序,它们都是我自己设计的。这些在正常条件下工作得很好,但现在我尝试让它们在热插拔条件下工作。这不是真正的硬件热插拔,我一直在尝试的是echo 1 >remove设备的 sysfs 目录及echo 1 >/sys/bus/pci/rescan之后的常规操作。
设备重新出现后,我的驱动程序的初始化调用pci_enable_device()在记录时失败:
otscan 0000:02:00.0: can't enable device: BAR 0 [mem 0xf7e01000-0xf7e013ff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 1 [mem 0xf7e00000-0xf7e00fff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 2 [mem 0xf0200000-0xf020ffff 64bit pref] not claimed
Run Code Online (Sandbox Code Playgroud)
(通常它会在第一个无人认领的资源之后停止,但我已将其修改为继续并确认实际上所有 BAR 均无人认领。)
这里的“未声明”意味着该对象struct resource存在但没有父对象,据我所知,这是由于request_resource()从未被调用而造成的。我不认为这是一个驱动程序问题,因为初始化例程在由于无法启用设备而中止之前没有做很多事情。
这留下了 FPGA(具有硬 IP PCIe 内核的 Altera Cyclone V)以及我可能在那里做错的事情,例如以某种方式错误处理总线重置。通过 sysfs 重新插入该计算机中的其他 PCIe 设备即可工作。
我已经研究了一段时间,但仍然没有弄清楚为什么我的设备被 Linux 区别对待。我的设备的哪些可能属性可能会让 Linux …