CentOS 7中无法找到pci find device函数的解决方法
文章介绍了CentOS7中无法找到pci_find_device函数的解决方法,希望对大家会有帮助,下面就随小编一起去看看具体的操作吧。
Linux学习笔记(二百八十五)一pci_find_device和 pci_get_device Pasted on 2010年04月26日
在我的2.6.31内核上编译VME_Univerae驱动的时候,遇到了一个以前没有见过的错误,说 pci_find_device函数役有声明。找了一下,是在linux/pcih头文件中,4ifdef CONFIG_PCILEGACY
struct pei_dev ___deprecated *pei_find_device(unsigned int vendor,
unsigned int device, struct pei_dev *from);
#endif/* CONFIG_PCI_LEGACY */
也就是说只有在定义了CONFIG_PCI_LEGACY的情况下才会存在。所以最简单的方式就是在驱动里用到这个的文件前面写上#ifndef CONFIG_PCI_LEGACY#define CONFIG_PCI_LEGACY#endif
就可以通过编译。可是对于连接来说还是不行的,因为在内核源文件drivers/pci/search.c里面对这个函数的实现是。
#ifdef CONFIG_PCI_LEGACY
struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device,
struct pci_dev *from)
struct pci_dev *pdev;
pci_dev_get(from);
pdev=pci_get_subeys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from); pci_dev_put(pdev); return pdev;
EXPORT_SYMBOL(pci_find_device);#endif/*CONFIG_PCI_LEGACY*
也就是说除非编译内核的时候选上了这一项,否则在连接的时候是找不着想要的
SYMBOL,更产重的问题是,在更新的比如2.6.34内核里这个API好像已经完全消失了.....所以最好的方法还是改用新的pei_get_device函数,在同一个源文件里面,
strut pci__dev *pci_get_sqbsys(umsigned intvendor, unsigned int device,
unsigned int s8_vendor, unsigned int 88_device, struct pci_dev *from)
struct pci_dev *pdev; struct pei_device_id *id;
if (unlikely(no_pei_devices())
return NULL;
id - kzalloc(sizeof(*id), GFP_KERNEL); if (!id)
return NULL; id->vendor - vendor; id->device - device;
id->subvendor-s_vendor; id->subdevice = ss_device;
pdev - pei_get_dev_by_id(id, from); kfree(id);
return pdev;
struct pci_dev *
pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)
return pci_get_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID,from);
也就是说比pci_find_devioe少了pci_dev_get和pci_dev_put这两步。其实真正让人奇怪的是为什么pci_find_device里面为什么要有这两步,两者一个是增加设备的引用数,一个是减少,效果完全抵消啊?可能就是为了模拟过去的pci_find_device的实现吧,故意把操作弄得不是atomic的吧。反正不用是对的。
您可能感兴趣的文章
声明:本文来自互联网或用户投稿,该文观点仅代表作者本人,不代表本站立场。文章及其配图仅供学习和交流之用,版权归原作者所有,如有内容侵权或者其他违规问题,请联系本站处理。






