Using just the device name to attach a device on the EAL level is not enough
for a unique identification of the bus it should get attached to. Therefore
lets change rte_eal_dev_attach() introduced in 16.11 to take the busname and
the raw devargs string.

Signed-off-by: Jan Blunck <jblu...@infradead.org>
---
 lib/librte_eal/common/eal_common_dev.c | 61 ++++++++++++++++++++++++++--------
 lib/librte_ether/rte_ethdev.c          | 17 +---------
 2 files changed, 49 insertions(+), 29 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_dev.c 
b/lib/librte_eal/common/eal_common_dev.c
index 4bde430..bf41a94 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -37,6 +37,7 @@
 #include <inttypes.h>
 #include <sys/queue.h>
 
+#include <rte_bus.h>
 #include <rte_dev.h>
 #include <rte_devargs.h>
 #include <rte_debug.h>
@@ -76,29 +77,63 @@ void rte_eal_device_remove(struct rte_device *dev)
        TAILQ_REMOVE(&dev_device_list, dev, next);
 }
 
-int rte_eal_dev_attach(const char *name, const char *devargs)
+int rte_eal_dev_attach(const char *busname, const char *devargs)
 {
-       struct rte_pci_addr addr;
+       struct rte_bus *bus;
+       rte_bus_attach_t attach;
+       int ret;
 
-       if (name == NULL || devargs == NULL) {
+       if (busname == NULL || devargs == NULL) {
                RTE_LOG(ERR, EAL, "Invalid device or arguments provided\n");
                return -EINVAL;
        }
 
-       if (eal_parse_pci_DomBDF(name, &addr) == 0) {
-               if (rte_eal_pci_probe_one(&addr) < 0)
-                       goto err;
+       if (!busname) {
+               char *name, *args;
+               struct rte_pci_addr addr;
 
-       } else {
-               if (rte_eal_vdev_init(name, devargs))
-                       goto err;
+               /*
+                * We default to virtual device but lets check for PCI device 
format for
+                * backwards compatibility reasons.
+                */
+               busname = "virtual";
+
+               if (rte_eal_parse_devargs_str(devargs, &name, &args))
+                       return -EINVAL;
+
+               if (eal_parse_pci_DomBDF(name, &addr) == 0) {
+                       RTE_LOG(ERR, EAL, "Deprectated\n");
+                       busname = "pci";
+               }
+
+               free(name);
+               free(args);
        }
 
-       return 0;
+       bus = rte_bus_find_by_name(busname);
+       if (!bus) {
+               RTE_LOG(ERR, EAL, "Can't find bus (%s)\n", busname);
+               return -EINVAL;
+       }
 
-err:
-       RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", name);
-       return -EINVAL;
+       attach = bus->attach;
+       if (!attach) {
+               RTE_LOG(ERR, EAL, "Function not supported\n");
+               return -ENOTSUP;
+       }
+
+       ret = attach(devargs);
+       if (ret) {
+               RTE_LOG(ERR, EAL, "Attaching device to bus failed \n");
+               return ret;
+       }
+
+       /*
+        * Probing might fail because some devices are not claimed by any driver
+        * but we don't care: the device is properly attached at this point.
+        */
+       (void)bus->probe();
+       return 0;
 }
 
 int rte_eal_dev_detach(const char *name)
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index eb0a94a..bbebc8f 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -474,29 +474,16 @@ rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
 {
        int ret = -1;
        int current = rte_eth_dev_count();
-       char *name = NULL;
-       char *args = NULL;
 
        if ((devargs == NULL) || (port_id == NULL)) {
                ret = -EINVAL;
                goto err;
        }
 
-       /* parse devargs, then retrieve device name and args */
-       if (rte_eal_parse_devargs_str(devargs, &name, &args))
-               goto err;
-
-       ret = rte_eal_dev_attach(name, args);
+       ret = rte_eal_dev_attach(NULL, devargs);
        if (ret < 0)
                goto err;
 
-       /* no point looking at the port count if no port exists */
-       if (!rte_eth_dev_count()) {
-               RTE_LOG(ERR, EAL, "No port found for device (%s)\n", name);
-               ret = -1;
-               goto err;
-       }
-
        /* if nothing happened, there is a bug here, since some driver told us
         * it did attach a device, but did not create a port.
         */
@@ -509,8 +496,6 @@ rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
        ret = 0;
 
 err:
-       free(name);
-       free(args);
        return ret;
 }
 
-- 
2.7.4

Reply via email to