linux 老式 PCI 探测

在老的内核版本中, 函数 pci_register_driver, 不是一直被 PCI 驱动使用. 相反, 它 们要么手工浏览系统中的 PCI 设备列表, 要么它们将调用一个能够搜索一个特定 PCI 设 备的函数. 驱动的浏览系统中 PCI 设备列表的能力已被从 2.6 内核中去除, 为了阻止驱 动破坏内核, 如果它们偶尔修改 PCI 设备列表当一个设备同时被去除时.

如果发现一个特定 PCI 设备的能力真正被需要, 下列的函数可用:

struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from);

这个函数扫描当前系统中 PCI 设备的列表, 并且如果输入参数匹配指定的供应商 和设备 ID, 它递增在 struct pci_dev 变量 found 中的引用计数, 并且返回它给 调用者. 这阻止了这个结构没有任何通知地消失, 并且确保内核不会 oops. 在驱 动用完由这个函数返回的 struct pci_dev, 它必须调用函数 pci_dev_put 来正确 地递减回使用计数, 以允许内核清理设备如果它被去除.参数 from 用同一个签名 来得到多个设备; 这个参数应答指向已被找到的最后一个设备, 以便搜索能够继续, 而不必从列表头开始. 为找到第一个设备, from 被指定为 NULL. 如果没有找到 (进一步)设备, 返回 NULL.

一个如何正确使用这个函数的例子是:

struct pci_dev *dev;

dev = pci_get_device(PCI_VENDOR_FOO, PCI_DEVICE_FOO, NULL); if (dev)

{

/* Use the PCI device */

...

pci_dev_put(dev);

}

这个函数不能从中断上下文中被调用. 如果这样做了, 一个警告被打印到系统日志.

struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device, unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from);

这个函数就象 pci_get_device 一样, 但是它允许当寻找设备时指定子系统供应商 和子系统设备 ID. 这个函数不能从中断上下文调用. 如果是, 一个警告被打印到 系统日志.

struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);

这个函数查找系统中的 PCI 设备的列表, 在指定的 struct pci_bus 上, 一个指 定的 PCI 设备的设备和功能号. 如果找到一个匹配的设备, 它的引用计数被递增 并且返回指向它的一个指针. 当调用者完成存取 struct pci_dev, 它必须调用 pci_dev_put.

所有指向函数都不能从中断上下文调用. 如果是, 一个警告被打印到系统日志中.

原文地址:https://www.cnblogs.com/fanweisheng/p/11146958.html