Linux PCI驱动程序设置和拆解

It'*_*ete 9 c linux-device-driver linux-kernel pci pci-e

看完这里的内核文档后:https://www.kernel.org/doc/Documentation/PCI/pci.txt关于设置和拆除PCI驱动程序的函数调用的顺序,我很遗憾.

我有两个问题:

  1. 对于设置,pci_enable_device()总是来之前 pci_request_regions()?文档似乎指出了这个事实,但确实说明:

    OS BUG:在启用这些资源之前,我们不会检查资源分配.如果我们pci_request_resources()在打电话之前打电话,序列会更有意义 pci_enable_device().目前,当两个设备分配了相同的范围时,设备驱动程序无法检测到错误.这不是常见问题,不太可能很快修复.这已经在之前讨论过,但在2.6.19之后没有改变:http://lkml.org/lkml/2006/3/2/194

    但是,在快速浏览了几个驱动程序的源代码之后,我们的共识是pci_enable_device()始终是第一位的.这些电话中的哪一个应该首先出现,为什么?

  2. 为了拆掉司机,我更加困惑.假设pci_enable_device()是第一个,我希望你在调用pci_release_regions()之前首先调用pci_disable_device()(即遵循一些对称性).但是,内核文档说这pci_release_regions()应该是最后的.让事情变得更复杂的是,我看了很多司机,而且几乎所有司机都有pci_release_regions()pci_disable_device(),就像我期望的那样.但是,我偶然发现了这个驱动程序:https://elixir.bootlin.com/linux/v4.12/source/drivers/infiniband/hw/hfi1/pcie.c(代码转载如下).

    void hfi1_pcie_cleanup(struct pci_dev *pdev)
    {
        pci_disable_device(pdev);
        /*
         * Release regions should be called after the disable. OK to
         * call if request regions has not been called or failed.
         */
        pci_release_regions(pdev);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在拆除驱动程序时应该首先使用哪种功能?看来内核中的驱动程序本身无法达成一致.

yas*_*shC 2

最终决定声明如下:

o 如果设备处于挂起状态,则唤醒设备,

o分配设备的 I/O 和内存区域(如果 BIOS 没有),

o 分配 IRQ(如果 BIOS 没有)。

因此,如果没有资源,要求内核保留资源是没有意义的。在大多数情况下,当我们不需要分配资源,因为它已经由 BIOS 完成时,在这些情况下,我们可以先保留其中一个函数,但只有在您完全确定的情况下才这样做。