pci: separate detaching ethernet ports from PCI devices
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index 80b661d..d1747f6 100644 (file)
@@ -483,11 +483,11 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
                hw->cvq = cvq;
        }
 
-       /* For virtio_user case (that is when dev->pci_dev is NULL), we use
+       /* For virtio_user case (that is when hw->dev is NULL), we use
         * virtual address. And we need properly set _offset_, please see
         * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information.
         */
-       if (dev->pci_dev)
+       if (hw->dev)
                vq->offset = offsetof(struct rte_mbuf, buf_physaddr);
        else {
                vq->vq_ring_mem = (uintptr_t)mz->addr;
@@ -893,6 +893,7 @@ virtio_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
                for (t = 0; t < VIRTIO_NB_RXQ_XSTATS; t++) {
                        xstats[count].value = *(uint64_t *)(((char *)rxvq) +
                                rte_virtio_rxq_stat_strings[t].offset);
+                       xstats[count].id = count;
                        count++;
                }
        }
@@ -908,6 +909,7 @@ virtio_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
                for (t = 0; t < VIRTIO_NB_TXQ_XSTATS; t++) {
                        xstats[count].value = *(uint64_t *)(((char *)txvq) +
                                rte_virtio_txq_stat_strings[t].offset);
+                       xstats[count].id = count;
                        count++;
                }
        }
@@ -1190,7 +1192,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
        struct virtio_hw *hw = eth_dev->data->dev_private;
        struct virtio_net_config *config;
        struct virtio_net_config local_config;
-       struct rte_pci_device *pci_dev = eth_dev->pci_dev;
+       struct rte_pci_device *pci_dev = hw->dev;
        int ret;
 
        /* Reset the device although not necessary at startup */
@@ -1210,7 +1212,10 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
        else
                eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
 
-       rte_eth_copy_pci_info(eth_dev, pci_dev);
+       if (pci_dev) {
+               rte_eth_copy_pci_info(eth_dev, pci_dev);
+               eth_dev->data->dev_flags = RTE_ETH_DEV_DETACHABLE;
+       }
 
        rx_func_get(eth_dev);
 
@@ -1294,7 +1299,6 @@ int
 eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 {
        struct virtio_hw *hw = eth_dev->data->dev_private;
-       struct rte_pci_device *pci_dev;
        uint32_t dev_flags = RTE_ETH_DEV_DETACHABLE;
        int ret;
 
@@ -1317,10 +1321,12 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
                return -ENOMEM;
        }
 
-       pci_dev = eth_dev->pci_dev;
-
-       if (pci_dev) {
-               ret = vtpci_init(pci_dev, hw, &dev_flags);
+       /* For virtio_user case the hw->virtio_user_dev is populated by
+        * virtio_user_eth_dev_alloc() before eth_virtio_dev_init() is called.
+        */
+       if (!hw->virtio_user_dev) {
+               ret = vtpci_init(RTE_DEV_TO_PCI(eth_dev->device), hw,
+                                &dev_flags);
                if (ret)
                        return ret;
        }
@@ -1343,7 +1349,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 static int
 eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 {
-       struct rte_pci_device *pci_dev;
        struct virtio_hw *hw = eth_dev->data->dev_private;
 
        PMD_INIT_FUNC_TRACE();
@@ -1353,7 +1358,6 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 
        virtio_dev_stop(eth_dev);
        virtio_dev_close(eth_dev);
-       pci_dev = eth_dev->pci_dev;
 
        eth_dev->dev_ops = NULL;
        eth_dev->tx_pkt_burst = NULL;
@@ -1367,7 +1371,8 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
                rte_intr_callback_unregister(vtpci_intr_handle(hw),
                                                virtio_interrupt_handler,
                                                eth_dev);
-       rte_eal_pci_unmap_device(pci_dev);
+       if (hw->dev)
+               rte_eal_pci_unmap_device(hw->dev);
 
        PMD_INIT_LOG(DEBUG, "dev_uninit completed");
 
@@ -1380,7 +1385,7 @@ static struct eth_driver rte_virtio_pmd = {
                        .name = "net_virtio",
                },
                .id_table = pci_id_virtio_map,
-               .drv_flags = RTE_PCI_DRV_DETACHABLE,
+               .drv_flags = 0,
                .probe = rte_eth_dev_pci_probe,
                .remove = rte_eth_dev_pci_remove,
        },
@@ -1626,6 +1631,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        uint64_t tso_mask;
        struct virtio_hw *hw = dev->data->dev_private;
 
+       dev_info->pci_dev = hw->dev;
        dev_info->max_rx_queues =
                RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
        dev_info->max_tx_queues =