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 c3a33c6..a6791c1 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

Reply via email to