From: Adrien Mazarguil <adrien.mazarg...@6wind.com> Add a driver reference (if available) to every PCI devices, even when blacklisted. This information is made available in the global device_list variable so users know which network devices are managed or ignored.
Acked-by: Ivan Boule <ivan.boule at 6wind.com> Acked-by: Damien Millescamps <damien.millescamps at 6wind.com> Signed-off-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com> --- lib/librte_eal/common/eal_common_pci.c | 3 +-- lib/librte_eal/common/include/rte_pci.h | 2 ++ lib/librte_eal/linuxapp/eal/eal_pci.c | 11 ++++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index fe24265..73d8fb3 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -81,9 +81,8 @@ pci_probe_all_drivers(struct rte_pci_device *dev) { struct rte_pci_driver *dr = NULL; + dev->blacklisted = !!is_blacklisted(dev); TAILQ_FOREACH(dr, &driver_list, next) { - if (is_blacklisted(dev)) - return -1; if (rte_eal_pci_probe_one_driver(dr, dev) == 0) return 0; } diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h index f2128b5..b465995 100644 --- a/lib/librte_eal/common/include/rte_pci.h +++ b/lib/librte_eal/common/include/rte_pci.h @@ -111,6 +111,8 @@ struct rte_pci_device { struct rte_pci_id id; /**< PCI ID. */ struct rte_pci_resource mem_resource; /**< PCI Memory Resource */ struct rte_intr_handle intr_handle; /**< Interrupt handle */ + const struct rte_pci_driver *driver; /**< Associated driver */ + unsigned int blacklisted:1; /**< Device is blacklisted */ }; /** Any PCI device identifier (vendor, device, ...) */ diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c index 78687d6..86002bd 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c @@ -731,7 +731,8 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d dev->id.vendor_id, dev->id.device_id, dr->name); /* Unbind PCI devices if needed */ - if (module_name != NULL) { + if ((!dev->blacklisted) && + (module_name != NULL)) { if (rte_eal_process_type() == RTE_PROC_PRIMARY) { /* unbind current driver, bind ours */ if (pci_unbind_kernel_driver(dev) < 0) @@ -743,6 +744,14 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d if (pci_uio_map_resource(dev) < 0) return -1; } + + /* reference driver structure */ + dev->driver = dr; + + /* no initialization when blacklisted */ + if (dev->blacklisted) + return -1; + /* call the driver devinit() function */ return dr->devinit(dr, dev); -- 1.7.2.5