在这里查看内核文档后:https://www.kernel.org/doc/Documentation/PCI/pci.txt我对于设置和拆卸PCI驱动程序的函数调用的顺序一无所知。
我有两个问题:
对于设置,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()
总是来
第一。这些呼叫中的哪一个应该首先发生,为什么?
对于拆除驱动程序,我感到更加困惑。假设首先出现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);
}
拆卸驱动程序时应该首先使用哪个功能?内核中的驱动程序似乎无法达成共识。
答案 0 :(得分:2)
最终发言权如下:
如果设备处于挂起状态,请唤醒它
o 分配设备的I / O和内存区域(如果没有BIOS)
o分配一个IRQ(如果BIOS没有)。
因此,没有必要让内核保留资源是没有意义的。在大多数情况下,由于Bios已经完成了我们不需要分配资源的情况,在这些情况下,我们可以先保留其中任一功能,但只有在绝对确定的情况下才可以这样做。