It'*_*ete 9 c linux-device-driver linux-kernel pci pci-e
看完这里的内核文档后:https://www.kernel.org/doc/Documentation/PCI/pci.txt关于设置和拆除PCI驱动程序的函数调用的顺序,我很遗憾.
我有两个问题:
对于设置,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()
始终是第一位的.这些电话中的哪一个应该首先出现,为什么?
为了拆掉司机,我更加困惑.假设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)
在拆除驱动程序时应该首先使用哪种功能?看来内核中的驱动程序本身无法达成一致.
最终决定声明如下:
o 如果设备处于挂起状态,则唤醒设备,
o分配设备的 I/O 和内存区域(如果 BIOS 没有),
o 分配 IRQ(如果 BIOS 没有)。
因此,如果没有资源,要求内核保留资源是没有意义的。在大多数情况下,当我们不需要分配资源,因为它已经由 BIOS 完成时,在这些情况下,我们可以先保留其中一个函数,但只有在您完全确定的情况下才这样做。