AFU device may be already unplugged in IFPGA bus cleanup process,
unplug AFU device only when it exists.

Signed-off-by: Wei Huang <wei.hu...@intel.com>
---
 drivers/raw/ifpga/ifpga_rawdev.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c
index 1020adc..0d43c87 100644
--- a/drivers/raw/ifpga/ifpga_rawdev.c
+++ b/drivers/raw/ifpga/ifpga_rawdev.c
@@ -29,6 +29,7 @@
 #include <bus_vdev_driver.h>
 #include <rte_string_fns.h>
 #include <rte_pmd_i40e.h>
+#include <bus_driver.h>
 
 #include "base/opae_hw_api.h"
 #include "base/opae_ifpga_hw_api.h"
@@ -1832,12 +1833,19 @@ static int ifpga_rawdev_get_string_arg(const char *key 
__rte_unused,
        return ret;
 }
 
+static int cmp_dev_name(const struct rte_device *dev, const void *_name)
+{
+       const char *name = _name;
+       return strcmp(dev->name, name);
+}
+
 static int
 ifpga_cfg_remove(struct rte_vdev_device *vdev)
 {
        struct rte_rawdev *rawdev = NULL;
        struct ifpga_rawdev *ifpga_dev;
        struct ifpga_vdev_args args;
+       struct rte_bus *bus;
        char dev_name[RTE_RAWDEV_NAME_MAX_LEN];
        const char *vdev_name = NULL;
        char *tmp_vdev = NULL;
@@ -1864,7 +1872,13 @@ static int ifpga_rawdev_get_string_arg(const char *key 
__rte_unused,
 
        snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
                args.port, args.bdf);
-       ret = rte_eal_hotplug_remove(RTE_STR(IFPGA_BUS_NAME), dev_name);
+       bus = rte_bus_find_by_name(RTE_STR(IFPGA_BUS_NAME));
+       if (bus) {
+               if (bus->find_device(NULL, cmp_dev_name, dev_name)) {
+                       ret = rte_eal_hotplug_remove(RTE_STR(IFPGA_BUS_NAME),
+                               dev_name);
+               }
+       }
 
        for (i = 0; i < IFPGA_MAX_VDEV; i++) {
                tmp_vdev = ifpga_dev->vdev_name[i];
-- 
1.8.3.1

Reply via email to