Linux PCI驱动程序设置和拆卸

时间:2018-07-03 23:02:05

标签: c linux-kernel linux-device-driver pci pci-e

在这里查看内核文档后:https://www.kernel.org/doc/Documentation/PCI/pci.txt我对于设置和拆卸PCI驱动程序的函数调用的顺序一无所知。

我有两个问题:

  1. 对于设置,pci_enable_device()是否总是在 pci_request_regions()?该文档似乎指出了这一点 事实,但声明:

      

    操作系统错误:在启用资源分配之前,我们不会检查资源分配   资源。如果我们调用该序列将更有意义   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);
    }
    

    拆卸驱动程序时应该首先使用哪个功能?内核中的驱动程序似乎无法达成共识。

1 个答案:

答案 0 :(得分:2)

最终发言权如下:

  

如果设备处于挂起状态,请唤醒它

     

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

     

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

因此,没有必要让内核保留资源是没有意义的。在大多数情况下,由于Bios已经完成了我们不需要分配资源的情况,在这些情况下,我们可以先保留其中任一功能,但只有在绝对确定的情况下才可以这样做。