In this patch, cleanup method is implemented for FPGA bus which will be called during eal_bus_cleanup().
Signed-off-by: Wei Huang <wei.hu...@intel.com> --- drivers/bus/ifpga/ifpga_bus.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c index 07e316b..ffb0c61 100644 --- a/drivers/bus/ifpga/ifpga_bus.c +++ b/drivers/bus/ifpga/ifpga_bus.c @@ -360,6 +360,41 @@ struct rte_afu_device * return ret; } +/* + * Cleanup the content of the Intel FPGA bus, and call the remove() function + * for all registered devices. + */ +static int +ifpga_cleanup(void) +{ + struct rte_afu_device *afu_dev, *tmp_dev; + int error = 0; + + RTE_TAILQ_FOREACH_SAFE(afu_dev, &ifpga_afu_dev_list, next, tmp_dev) { + struct rte_afu_driver *drv = afu_dev->driver; + int ret = 0; + + if (drv == NULL || drv->remove == NULL) + goto free; + + ret = drv->remove(afu_dev); + if (ret < 0) { + rte_errno = errno; + error = -1; + } + afu_dev->driver = NULL; + afu_dev->device.driver = NULL; + +free: + TAILQ_REMOVE(&ifpga_afu_dev_list, afu_dev, next); + rte_devargs_remove(afu_dev->device.devargs); + rte_intr_instance_free(afu_dev->intr_handle); + free(afu_dev); + } + + return error; +} + static int ifpga_plug(struct rte_device *dev) { @@ -470,6 +505,7 @@ struct rte_afu_device * static struct rte_bus rte_ifpga_bus = { .scan = ifpga_scan, .probe = ifpga_probe, + .cleanup = ifpga_cleanup, .find_device = ifpga_find_device, .plug = ifpga_plug, .unplug = ifpga_unplug, -- 1.8.3.1