Same idea as a few commits before, no need to implement the same logic in probe and detach functions. Here, the driver matching is done by a helper, then probe / detach functions are called respectively.
Signed-off-by: David Marchand <david.marchand at 6wind.com> --- lib/librte_eal/common/eal_common_pci.c | 96 ++++++++++++---------------------- 1 file changed, 34 insertions(+), 62 deletions(-) diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index fd88305..768421a 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -280,55 +280,16 @@ pci_detach_device(struct rte_pci_driver *dr, struct rte_pci_device *dev) return 0; } -/* - * If vendor/device ID match, call the devinit() function of all - * registered driver for the given device. Return -1 if initialization - * failed, return 1 if no driver is found for this device. - */ -static int -pci_probe_all_drivers(struct rte_pci_device *dev) -{ - struct rte_pci_driver *dr = NULL; - int rc = 0; - - TAILQ_FOREACH(dr, &pci_driver_list, next) { - if (!pci_driver_supports_device(dr, dev)) - continue; - - rc = pci_probe_device(dr, dev); - if (rc < 0) - /* negative value is an error */ - return -1; - if (rc > 0) - /* positive value means device is blacklisted */ - continue; - return 0; - } - return 1; -} - -/* - * If vendor/device ID match, call the devuninit() function of all - * registered driver for the given device. Return -1 if initialization - * failed, return 1 if no driver is found for this device. - */ -static int -pci_detach_all_drivers(struct rte_pci_device *dev) +static struct rte_pci_driver * +pci_find_driver(struct rte_pci_device *dev) { - struct rte_pci_driver *dr = NULL; - int rc = 0; + struct rte_pci_driver *dr; TAILQ_FOREACH(dr, &pci_driver_list, next) { - if (!pci_driver_supports_device(dr, dev)) - continue; - - rc = pci_detach_device(dr, dev); - if (rc < 0) - /* negative value is an error */ - return -1; - return 0; + if (pci_driver_supports_device(dr, dev)) + break; } - return 1; + return dr; } /* @@ -338,8 +299,8 @@ pci_detach_all_drivers(struct rte_pci_device *dev) int rte_eal_pci_probe_one(const struct rte_pci_addr *addr) { - struct rte_pci_device *dev = NULL; - int ret = 0; + struct rte_pci_device *dev; + struct rte_pci_driver *dr; if (addr == NULL) return -1; @@ -353,8 +314,11 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr) if (!dev) goto err_return; - ret = pci_probe_all_drivers(dev); - if (ret < 0) + dr = pci_find_driver(dev); + if (!dr) + goto err_return; + + if (pci_probe_device(dr, dev) < 0) goto err_return; return 0; @@ -372,8 +336,8 @@ err_return: int rte_eal_pci_detach(const struct rte_pci_addr *addr) { - struct rte_pci_device *dev = NULL; - int ret = 0; + struct rte_pci_device *dev; + struct rte_pci_driver *dr; if (addr == NULL) return -1; @@ -382,8 +346,11 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr) if (!dev) goto err_return; - ret = pci_detach_all_drivers(dev); - if (ret < 0) + dr = pci_find_driver(dev); + if (!dr) + goto err_return; + + if (pci_detach_device(dr, dev) < 0) goto err_return; TAILQ_REMOVE(&pci_device_list, dev, next); @@ -404,28 +371,33 @@ err_return: int rte_eal_pci_probe(void) { - struct rte_pci_device *dev = NULL; + struct rte_pci_device *dev; + struct rte_pci_driver *dr; struct rte_devargs *devargs; int probe_all = 0; - int ret = 0; if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) == 0) probe_all = 1; TAILQ_FOREACH(dev, &pci_device_list, next) { + /* no driver available */ + dr = pci_find_driver(dev); + if (!dr) + continue; + /* set devargs in PCI structure */ devargs = pci_devargs_lookup(dev); if (devargs != NULL) dev->devargs = devargs; - /* probe all or only whitelisted devices */ - if (probe_all) - ret = pci_probe_all_drivers(dev); - else if (devargs != NULL && - devargs->type == RTE_DEVTYPE_WHITELISTED_PCI) - ret = pci_probe_all_drivers(dev); - if (ret < 0) + /* skip if not probing all and device is not whitelisted */ + if (!probe_all && + (devargs == NULL || + devargs->type != RTE_DEVTYPE_WHITELISTED_PCI)) + continue; + + if (pci_probe_device(dr, dev) < 0) rte_exit(EXIT_FAILURE, "Requested device " PCI_PRI_FMT " cannot be used\n", dev->addr.domain, dev->addr.bus, dev->addr.devid, dev->addr.function); -- 1.9.1