@@ -42,6 +42,7 @@
#include <rte_devargs.h>
#include <rte_debug.h>
#include <rte_devargs.h>
+#include <rte_errno.h>
#include <rte_log.h>
#include "eal_private.h"
@@ -67,6 +68,7 @@ static int cmp_dev_name(const struct rte_device *dev, const void *_name)
int rte_eal_dev_attach(const char *name, const char *devargs)
{
+ struct rte_device *dev;
int ret;
if (name == NULL || devargs == NULL) {
@@ -74,9 +76,9 @@ int rte_eal_dev_attach(const char *name, const char *devargs)
return -EINVAL;
}
- ret = rte_eal_hotplug_add("pci", name, devargs);
- if (ret && ret != -EINVAL)
- return ret;
+ dev = rte_eal_hotplug_add("pci", name, devargs);
+ if (dev == NULL && rte_errno != EINVAL)
+ return -rte_errno;
/*
* If we haven't found a bus device the user meant to "hotplug" a
@@ -118,7 +120,8 @@ int rte_eal_dev_detach(struct rte_device *dev)
return ret;
}
-int rte_eal_hotplug_add(const char *busname, const char *devname,
+struct rte_device *
+rte_eal_hotplug_add(const char *busname, const char *devname,
const char *devargs)
{
struct rte_bus *bus;
@@ -128,31 +131,39 @@ int rte_eal_hotplug_add(const char *busname, const char *devname,
bus = rte_bus_find_by_name(busname);
if (bus == NULL) {
RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", busname);
- return -ENOENT;
+ rte_errno = ENOENT;
+ return NULL;
}
if (bus->plug == NULL) {
RTE_LOG(ERR, EAL, "Function plug not supported by bus (%s)\n",
bus->name);
- return -ENOTSUP;
+ rte_errno = ENOTSUP;
+ return NULL;
}
ret = bus->scan();
- if (ret)
- return ret;
+ if (ret) {
+ rte_errno = -ret;
+ return NULL;
+ }
dev = bus->find_device(NULL, cmp_detached_dev_name, devname);
if (dev == NULL) {
RTE_LOG(ERR, EAL, "Cannot find unplugged device (%s)\n",
devname);
- return -EINVAL;
+ rte_errno = EINVAL;
+ return NULL;
}
ret = bus->plug(dev, devargs);
- if (ret)
+ if (ret) {
RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n",
dev->name);
- return ret;
+ rte_errno = -ret;
+ return NULL;
+ }
+ return dev;
}
int rte_eal_hotplug_remove(const char *busname, const char *devname)
@@ -164,24 +175,29 @@ int rte_eal_hotplug_remove(const char *busname, const char *devname)
bus = rte_bus_find_by_name(busname);
if (bus == NULL) {
RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", busname);
+ rte_errno = ENOENT;
return -ENOENT;
}
if (bus->unplug == NULL) {
RTE_LOG(ERR, EAL, "Function unplug not supported by bus (%s)\n",
bus->name);
+ rte_errno = ENOTSUP;
return -ENOTSUP;
}
dev = bus->find_device(NULL, cmp_dev_name, devname);
if (dev == NULL) {
RTE_LOG(ERR, EAL, "Cannot find plugged device (%s)\n", devname);
+ rte_errno = EINVAL;
return -EINVAL;
}
ret = bus->unplug(dev);
- if (ret)
+ if (ret) {
RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n",
dev->name);
+ rte_errno = -ret;
+ }
return ret;
}
@@ -218,10 +218,12 @@ int rte_eal_dev_detach(struct rte_device *dev);
* @param devargs
* Device arguments to be passed to the driver.
* @return
- * 0 on success, negative on error.
+ * The pointer to the plugged rte_device on success.
+ * NULL on error. rte_errno is then set.
*/
-int rte_eal_hotplug_add(const char *busname, const char *devname,
- const char *devargs);
+struct rte_device *rte_eal_hotplug_add(const char *busname,
+ const char *devname,
+ const char *devargs);
/**
* @warning
@@ -234,7 +236,7 @@ int rte_eal_hotplug_add(const char *busname, const char *devname,
* @param devname
* The device name being removed.
* @return
- * 0 on success, negative on error.
+ * 0 on success, negative on error. rte_errno is then set.
*/
int rte_eal_hotplug_remove(const char *busname, const char *devname);