| 1839 | } |
| 1840 | |
| 1841 | static int |
| 1842 | ifpga_cfg_remove(struct rte_vdev_device *vdev) |
| 1843 | { |
| 1844 | struct rte_rawdev *rawdev = NULL; |
| 1845 | struct ifpga_rawdev *ifpga_dev; |
| 1846 | struct ifpga_vdev_args args; |
| 1847 | struct rte_bus *bus; |
| 1848 | char dev_name[RTE_RAWDEV_NAME_MAX_LEN]; |
| 1849 | const char *vdev_name = NULL; |
| 1850 | char *tmp_vdev = NULL; |
| 1851 | int i, ret = 0; |
| 1852 | |
| 1853 | vdev_name = rte_vdev_device_name(vdev); |
| 1854 | if (!vdev_name) |
| 1855 | return -EINVAL; |
| 1856 | |
| 1857 | IFPGA_RAWDEV_PMD_INFO("remove ifpga virtual device %s", vdev_name); |
| 1858 | |
| 1859 | ret = ifpga_vdev_parse_devargs(vdev->device.devargs, &args); |
| 1860 | if (ret) |
| 1861 | return ret; |
| 1862 | |
| 1863 | memset(dev_name, 0, sizeof(dev_name)); |
| 1864 | snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", args.bdf); |
| 1865 | rawdev = rte_rawdev_pmd_get_named_dev(dev_name); |
| 1866 | if (!rawdev) |
| 1867 | return -ENODEV; |
| 1868 | ifpga_dev = ifpga_rawdev_get(rawdev); |
| 1869 | if (!ifpga_dev) |
| 1870 | return -ENODEV; |
| 1871 | |
| 1872 | snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s", |
| 1873 | args.port, args.bdf); |
| 1874 | bus = rte_bus_find_by_name(RTE_STR(IFPGA_BUS_NAME)); |
| 1875 | if (bus) { |
| 1876 | if (bus->find_device(NULL, cmp_dev_name, dev_name)) { |
| 1877 | ret = rte_eal_hotplug_remove(RTE_STR(IFPGA_BUS_NAME), |
| 1878 | dev_name); |
| 1879 | } |
| 1880 | } |
| 1881 | |
| 1882 | for (i = 0; i < IFPGA_MAX_VDEV; i++) { |
| 1883 | tmp_vdev = ifpga_dev->vdev_name[i]; |
| 1884 | if (tmp_vdev && !strcmp(tmp_vdev, vdev_name)) { |
| 1885 | free(tmp_vdev); |
| 1886 | ifpga_dev->vdev_name[i] = NULL; |
| 1887 | break; |
| 1888 | } |
| 1889 | } |
| 1890 | |
| 1891 | return ret; |
| 1892 | } |
| 1893 | |
| 1894 | static struct rte_vdev_driver ifpga_cfg_driver = { |
| 1895 | .probe = ifpga_cfg_probe, |
nothing calls this directly
no test coverage detected