Move pci id matching to a helper and reuse it in probe and detach functions.
Signed-off-by: David Marchand <david.marchand at 6wind.com> --- lib/librte_eal/common/eal_common_pci.c | 67 ++++++++++++---------------------- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index 2528775..44549f7 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -174,14 +174,10 @@ pci_add_device(struct rte_pci_device *dev) return 0; } -/* - * If vendor/device ID match, call the devinit() function of the - * driver. - */ static int -rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev) +pci_driver_supports_device(const struct rte_pci_driver *dr, + const struct rte_pci_device *dev) { - int ret; const struct rte_pci_id *id_table; for (id_table = dr->id_table; id_table->vendor_id != 0; id_table++) { @@ -200,6 +196,20 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d id_table->subsystem_device_id != PCI_ANY_ID) continue; + return 1; + } + return 0; +} + +/* + * If vendor/device ID match, call the devinit() function of the + * driver. + */ +static int +rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, + struct rte_pci_device *dev) +{ + int ret; struct rte_pci_addr *loc = &dev->addr; RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", @@ -240,9 +250,6 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d /* call the driver devinit() function */ return dr->devinit(dr, dev); - } - /* return positive value if driver is not found */ - return 1; } /* @@ -253,27 +260,6 @@ static int rte_eal_pci_detach_dev(struct rte_pci_driver *dr, struct rte_pci_device *dev) { - const struct rte_pci_id *id_table; - - if ((dr == NULL) || (dev == NULL)) - return -EINVAL; - - for (id_table = dr->id_table; id_table->vendor_id != 0; id_table++) { - - /* check if device's identifiers match the driver's ones */ - if (id_table->vendor_id != dev->id.vendor_id && - id_table->vendor_id != PCI_ANY_ID) - continue; - if (id_table->device_id != dev->id.device_id && - id_table->device_id != PCI_ANY_ID) - continue; - if (id_table->subsystem_vendor_id != dev->id.subsystem_vendor_id && - id_table->subsystem_vendor_id != PCI_ANY_ID) - continue; - if (id_table->subsystem_device_id != dev->id.subsystem_device_id && - id_table->subsystem_device_id != PCI_ANY_ID) - continue; - struct rte_pci_addr *loc = &dev->addr; RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", @@ -294,10 +280,6 @@ rte_eal_pci_detach_dev(struct rte_pci_driver *dr, pci_unmap_device(dev); return 0; - } - - /* return positive value if driver is not found */ - return 1; } /* @@ -311,16 +293,16 @@ pci_probe_all_drivers(struct rte_pci_device *dev) struct rte_pci_driver *dr = NULL; int rc = 0; - if (dev == NULL) - return -1; - TAILQ_FOREACH(dr, &pci_driver_list, next) { + if (!pci_driver_supports_device(dr, dev)) + continue; + rc = rte_eal_pci_probe_one_driver(dr, dev); if (rc < 0) /* negative value is an error */ return -1; if (rc > 0) - /* positive value means driver not found */ + /* positive value means device is blacklisted */ continue; return 0; } @@ -338,17 +320,14 @@ pci_detach_all_drivers(struct rte_pci_device *dev) struct rte_pci_driver *dr = NULL; int rc = 0; - if (dev == NULL) - return -1; - TAILQ_FOREACH(dr, &pci_driver_list, next) { + if (!pci_driver_supports_device(dr, dev)) + continue; + rc = rte_eal_pci_detach_dev(dr, dev); if (rc < 0) /* negative value is an error */ return -1; - if (rc > 0) - /* positive value means driver not found */ - continue; return 0; } return 1; -- 1.9.1