代码之家  ›  专栏  ›  技术社区  ›  Andreas Bombe

pci\u enable\u device()在删除/重新扫描后失败

  •  5
  • Andreas Bombe  · 技术社区  · 7 年前

    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
    

    (通常它会在第一个无人认领的资源之后停止,但我已经修改了它,以继续并确认实际上所有的条都是无人认领的。)

    struct resource 存在但没有父项,据我收集,这是由 request_resource() 从来没有被召唤过。我不认为这是一个驱动程序问题,因为由于无法启用设备,初始化例程在中止之前没有做很多工作。

    这留下了FPGA(带硬IP PCIe核心的Altera Cyclone V)和一些我可能做错的事情,例如以某种方式错误处理总线重置。当通过sysfs重新填充时,该计算机中的其他PCIe设备工作。

    我已经研究了一段时间,仍然没有弄清楚为什么我的设备被Linux区别对待。我的设备有什么可能的属性可以让Linux决定不调用 在我的设备栏上?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Andreas Bombe    7 年前

    看起来我找到了原因。我把班级代码保留为 0 (无效)在PCIe核心配置中,当设备处于引导状态时,该配置工作正常。提出合理的价值( 0x40000 0xff0000 对于“未注册设备”也有效)也使其在热插拔上有效。

    0

        2
  •  2
  •   Ariel_HIAI Anthony O.    5 年前

    问题似乎是在FPGA的PCIe核心的PCIe配置空间中错误地定义了类。确保类寄存器的高位字节是st,与0不同

    在查看dmesg时,我们遇到了类似的问题: “无法启用设备:条0……未声明” 然后 “pci\u enable\u设备失败”

        3
  •  0
  •   faku    3 年前

    确实是类代码设置不正确。我建议设置 0x058000