drivers/net: fix vfio kmod dependency
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index cd87c0e..45f9bca 100644 (file)
@@ -87,7 +87,7 @@ static void virtio_dev_stats_reset(struct rte_eth_dev *dev);
 static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);
 static int virtio_vlan_filter_set(struct rte_eth_dev *dev,
                                uint16_t vlan_id, int on);
-static void virtio_mac_addr_add(struct rte_eth_dev *dev,
+static int virtio_mac_addr_add(struct rte_eth_dev *dev,
                                struct ether_addr *mac_addr,
                                uint32_t index, uint32_t vmdq __rte_unused);
 static void virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);
@@ -546,6 +546,9 @@ virtio_free_queues(struct virtio_hw *hw)
        int queue_type;
        uint16_t i;
 
+       if (hw->vqs == NULL)
+               return;
+
        for (i = 0; i < nr_vq; i++) {
                vq = hw->vqs[i];
                if (!vq)
@@ -564,9 +567,11 @@ virtio_free_queues(struct virtio_hw *hw)
                }
 
                rte_free(vq);
+               hw->vqs[i] = NULL;
        }
 
        rte_free(hw->vqs);
+       hw->vqs = NULL;
 }
 
 static int
@@ -1020,7 +1025,7 @@ virtio_get_hwaddr(struct virtio_hw *hw)
        }
 }
 
-static void
+static int
 virtio_mac_table_set(struct virtio_hw *hw,
                     const struct virtio_net_ctrl_mac *uc,
                     const struct virtio_net_ctrl_mac *mc)
@@ -1030,7 +1035,7 @@ virtio_mac_table_set(struct virtio_hw *hw,
 
        if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
                PMD_DRV_LOG(INFO, "host does not support mac table");
-               return;
+               return -1;
        }
 
        ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
@@ -1045,9 +1050,10 @@ virtio_mac_table_set(struct virtio_hw *hw,
        err = virtio_send_command(hw->cvq, &ctrl, len, 2);
        if (err != 0)
                PMD_DRV_LOG(NOTICE, "mac table set failed: %d", err);
+       return err;
 }
 
-static void
+static int
 virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
                    uint32_t index, uint32_t vmdq __rte_unused)
 {
@@ -1058,7 +1064,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
 
        if (index >= VIRTIO_MAX_MAC_ADDRS) {
                PMD_DRV_LOG(ERR, "mac address index %u out of range", index);
-               return;
+               return -EINVAL;
        }
 
        uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
@@ -1075,7 +1081,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
                memcpy(&tbl->macs[tbl->entries++], addr, ETHER_ADDR_LEN);
        }
 
-       virtio_mac_table_set(hw, uc, mc);
+       return virtio_mac_table_set(hw, uc, mc);
 }
 
 static void
@@ -1348,7 +1354,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
        if (virtio_negotiate_features(hw, req_features) < 0)
                return -1;
 
-       if (eth_dev->device) {
+       if (!hw->virtio_user_dev) {
                pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
                rte_eth_copy_pci_info(eth_dev, pci_dev);
        }
@@ -1479,7 +1485,7 @@ virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw)
        if (hw->modern) {
                /*
                 * We don't have to re-parse the PCI config space, since
-                * rte_eal_pci_map_device() makes sure the mapped address
+                * rte_pci_map_device() makes sure the mapped address
                 * in secondary process would equal to the one mapped in
                 * the primary process: error will be returned if that
                 * requirement is not met.
@@ -1488,12 +1494,12 @@ virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw)
                 * (such as dev_cfg, common_cfg, etc.) parsed from the
                 * primary process, which is stored in shared memory.
                 */
-               if (rte_eal_pci_map_device(pci_dev)) {
+               if (rte_pci_map_device(pci_dev)) {
                        PMD_INIT_LOG(DEBUG, "failed to map pci device!");
                        return -1;
                }
        } else {
-               if (rte_eal_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0)
+               if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0)
                        return -1;
        }
 
@@ -1603,7 +1609,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
                                                virtio_interrupt_handler,
                                                eth_dev);
        if (eth_dev->device)
-               rte_eal_pci_unmap_device(RTE_DEV_TO_PCI(eth_dev->device));
+               rte_pci_unmap_device(RTE_DEV_TO_PCI(eth_dev->device));
 
        PMD_INIT_LOG(DEBUG, "dev_uninit completed");
 
@@ -1641,7 +1647,7 @@ rte_virtio_pmd_init(void)
                return;
        }
 
-       rte_eal_pci_register(&rte_virtio_pmd);
+       rte_pci_register(&rte_virtio_pmd);
 }
 
 /*
@@ -1937,4 +1943,4 @@ __rte_unused uint8_t is_rx)
 
 RTE_PMD_EXPORT_NAME(net_virtio, __COUNTER__);
 RTE_PMD_REGISTER_PCI_TABLE(net_virtio, pci_id_virtio_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_virtio, "* igb_uio | uio_pci_generic | vfio");
+RTE_PMD_REGISTER_KMOD_DEP(net_virtio, "* igb_uio | uio_pci_generic | vfio-pci");