[dpdk-dev,5/9] pci: factorize probe/detach code
Commit Message
Move pci id matching to a helper and reuse it in probe and detach
functions.
Signed-off-by: David Marchand <david.marchand@6wind.com>
---
lib/librte_eal/common/eal_common_pci.c | 67 ++++++++++++----------------------
1 file changed, 23 insertions(+), 44 deletions(-)
@@ -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;