net/txgbe: add queue stats mapping
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index 1eb3240..6c233b7 100644 (file)
@@ -23,6 +23,7 @@
 #include <rte_common.h>
 #include <rte_errno.h>
 #include <rte_cpuflags.h>
+#include <rte_vect.h>
 
 #include <rte_memory.h>
 #include <rte_eal.h>
@@ -40,7 +41,7 @@
 static int eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev);
 static int  virtio_dev_configure(struct rte_eth_dev *dev);
 static int  virtio_dev_start(struct rte_eth_dev *dev);
-static void virtio_dev_stop(struct rte_eth_dev *dev);
+static int  virtio_dev_stop(struct rte_eth_dev *dev);
 static int virtio_dev_promiscuous_enable(struct rte_eth_dev *dev);
 static int virtio_dev_promiscuous_disable(struct rte_eth_dev *dev);
 static int virtio_dev_allmulticast_enable(struct rte_eth_dev *dev);
@@ -609,10 +610,9 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
                txr = hdr_mz->addr;
                memset(txr, 0, vq_size * sizeof(*txr));
                for (i = 0; i < vq_size; i++) {
-                       struct vring_desc *start_dp = txr[i].tx_indir;
-
                        /* first indirect descriptor is always the tx header */
                        if (!vtpci_packed_queue(hw)) {
+                               struct vring_desc *start_dp = txr[i].tx_indir;
                                vring_desc_init_split(start_dp,
                                                      RTE_DIM(txr[i].tx_indir));
                                start_dp->addr = txvq->virtio_net_hdr_mem
@@ -621,6 +621,16 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
                                                   tx_hdr);
                                start_dp->len = hw->vtnet_hdr_size;
                                start_dp->flags = VRING_DESC_F_NEXT;
+                       } else {
+                               struct vring_packed_desc *start_dp =
+                                       txr[i].tx_packed_indir;
+                               vring_desc_init_indirect_packed(start_dp,
+                                     RTE_DIM(txr[i].tx_packed_indir));
+                               start_dp->addr = txvq->virtio_net_hdr_mem
+                                       + i * sizeof(*txr)
+                                       + offsetof(struct virtio_tx_region,
+                                                  tx_hdr);
+                               start_dp->len = hw->vtnet_hdr_size;
                        }
                }
        }
@@ -1709,6 +1719,8 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
        else
                eth_dev->data->dev_flags &= ~RTE_ETH_DEV_INTR_LSC;
 
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
+
        /* Setting up rx_header size for the device */
        if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF) ||
            vtpci_with_feature(hw, VIRTIO_F_VERSION_1) ||
@@ -1984,21 +1996,18 @@ err_vtpci_init:
 static int
 eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 {
+       int ret;
        PMD_INIT_FUNC_TRACE();
 
        if (rte_eal_process_type() == RTE_PROC_SECONDARY)
                return 0;
 
-       virtio_dev_stop(eth_dev);
+       ret = virtio_dev_stop(eth_dev);
        virtio_dev_close(eth_dev);
 
-       eth_dev->dev_ops = NULL;
-       eth_dev->tx_pkt_burst = NULL;
-       eth_dev->rx_pkt_burst = NULL;
-
        PMD_INIT_LOG(DEBUG, "dev_uninit completed");
 
-       return 0;
+       return ret;
 }
 
 
@@ -2304,7 +2313,8 @@ virtio_dev_configure(struct rte_eth_dev *dev)
                if ((hw->use_vec_rx || hw->use_vec_tx) &&
                    (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) ||
                     !vtpci_with_feature(hw, VIRTIO_F_IN_ORDER) ||
-                    !vtpci_with_feature(hw, VIRTIO_F_VERSION_1))) {
+                    !vtpci_with_feature(hw, VIRTIO_F_VERSION_1) ||
+                    rte_vect_get_max_simd_bitwidth() < RTE_VECT_SIMD_512)) {
                        PMD_DRV_LOG(INFO,
                                "disabled packed ring vectorized path for requirements not met");
                        hw->use_vec_rx = 0;
@@ -2336,7 +2346,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
                }
 
                if (hw->use_vec_rx) {
-#if defined RTE_ARCH_ARM64 || defined RTE_ARCH_ARM
+#if defined RTE_ARCH_ARM
                        if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON)) {
                                PMD_DRV_LOG(INFO,
                                        "disabled split ring vectorized path for requirement not met");
@@ -2357,6 +2367,12 @@ virtio_dev_configure(struct rte_eth_dev *dev)
                                        "disabled split ring vectorized rx for offloading enabled");
                                hw->use_vec_rx = 0;
                        }
+
+                       if (rte_vect_get_max_simd_bitwidth() < RTE_VECT_SIMD_128) {
+                               PMD_DRV_LOG(INFO,
+                                       "disabled split ring vectorized rx, max SIMD bitwidth too low");
+                               hw->use_vec_rx = 0;
+                       }
                }
        }
 
@@ -2506,7 +2522,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
 /*
  * Stop device: disable interrupt and mark link down
  */
-static void
+static int
 virtio_dev_stop(struct rte_eth_dev *dev)
 {
        struct virtio_hw *hw = dev->data->dev_private;
@@ -2514,6 +2530,7 @@ virtio_dev_stop(struct rte_eth_dev *dev)
        struct rte_intr_conf *intr_conf = &dev->data->dev_conf.intr_conf;
 
        PMD_INIT_LOG(DEBUG, "stop");
+       dev->data->dev_started = 0;
 
        rte_spinlock_lock(&hw->state_lock);
        if (!hw->started)
@@ -2535,6 +2552,8 @@ virtio_dev_stop(struct rte_eth_dev *dev)
        rte_eth_linkstatus_set(dev, &link);
 out_unlock:
        rte_spinlock_unlock(&hw->state_lock);
+
+       return 0;
 }
 
 static int