ethdev: add device flag to bypass auto-filled queue xstats
[dpdk.git] / drivers / net / thunderx / nicvf_ethdev.c
index edc956b..f0bd20a 100644 (file)
 #include "nicvf_svf.h"
 #include "nicvf_logs.h"
 
-int nicvf_logtype_mbox;
-int nicvf_logtype_init;
-int nicvf_logtype_driver;
-
-static void nicvf_dev_stop(struct rte_eth_dev *dev);
+static int nicvf_dev_stop(struct rte_eth_dev *dev);
 static void nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup);
 static void nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic,
                          bool cleanup);
 static int nicvf_vlan_offload_config(struct rte_eth_dev *dev, int mask);
 static int nicvf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 
-RTE_INIT(nicvf_init_log)
-{
-       nicvf_logtype_mbox = rte_log_register("pmd.net.thunderx.mbox");
-       if (nicvf_logtype_mbox >= 0)
-               rte_log_set_level(nicvf_logtype_mbox, RTE_LOG_NOTICE);
-
-       nicvf_logtype_init = rte_log_register("pmd.net.thunderx.init");
-       if (nicvf_logtype_init >= 0)
-               rte_log_set_level(nicvf_logtype_init, RTE_LOG_NOTICE);
-
-       nicvf_logtype_driver = rte_log_register("pmd.net.thunderx.driver");
-       if (nicvf_logtype_driver >= 0)
-               rte_log_set_level(nicvf_logtype_driver, RTE_LOG_NOTICE);
-}
+RTE_LOG_REGISTER(nicvf_logtype_mbox, pmd.net.thunderx.mbox, NOTICE);
+RTE_LOG_REGISTER(nicvf_logtype_init, pmd.net.thunderx.init, NOTICE);
+RTE_LOG_REGISTER(nicvf_logtype_driver, pmd.net.thunderx.driver, NOTICE);
 
 static void
 nicvf_link_status_update(struct nicvf *nic,
@@ -98,9 +83,9 @@ nicvf_interrupt(void *arg)
                        nicvf_link_status_update(nic, &link);
                        rte_eth_linkstatus_set(dev, &link);
 
-                       _rte_eth_dev_callback_process(dev,
-                                                     RTE_ETH_EVENT_INTR_LSC,
-                                                     NULL);
+                       rte_eth_dev_callback_process(dev,
+                                                    RTE_ETH_EVENT_INTR_LSC,
+                                                    NULL);
                }
        }
 
@@ -362,7 +347,7 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)
        return ptypes;
 }
 
-static void
+static int
 nicvf_dev_stats_reset(struct rte_eth_dev *dev)
 {
        int i;
@@ -370,6 +355,7 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev)
        struct nicvf *nic = nicvf_pmd_priv(dev);
        uint16_t rx_start, rx_end;
        uint16_t tx_start, tx_end;
+       int ret;
 
        /* Reset all primary nic counters */
        nicvf_rx_range(dev, nic, &rx_start, &rx_end);
@@ -380,7 +366,9 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev)
        for (i = tx_start; i <= tx_end; i++)
                txqs |= (0x3 << (i * 2));
 
-       nicvf_mbox_reset_stat_counters(nic, 0x3FFF, 0x1F, rxqs, txqs);
+       ret = nicvf_mbox_reset_stat_counters(nic, 0x3FFF, 0x1F, rxqs, txqs);
+       if (ret != 0)
+               return ret;
 
        /* Reset secondary nic queue counters */
        for (i = 0; i < nic->sqs_count; i++) {
@@ -396,8 +384,12 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev)
                for (i = tx_start; i <= tx_end; i++)
                        txqs |= (0x3 << ((i % MAX_SND_QUEUES_PER_QS) * 2));
 
-               nicvf_mbox_reset_stat_counters(snic, 0, 0, rxqs, txqs);
+               ret = nicvf_mbox_reset_stat_counters(snic, 0, 0, rxqs, txqs);
+               if (ret != 0)
+                       return ret;
        }
+
+       return 0;
 }
 
 /* Promiscuous mode enabled by default in LMAC to VF 1:1 map configuration */
@@ -489,9 +481,10 @@ nicvf_dev_reta_query(struct rte_eth_dev *dev,
        int ret, i, j;
 
        if (reta_size != NIC_MAX_RSS_IDR_TBL_SIZE) {
-               RTE_LOG(ERR, PMD, "The size of hash lookup table configured "
-                       "(%d) doesn't match the number hardware can supported "
-                       "(%d)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE);
+               PMD_DRV_LOG(ERR,
+                           "The size of hash lookup table configured "
+                           "(%u) doesn't match the number hardware can supported "
+                           "(%u)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE);
                return -EINVAL;
        }
 
@@ -519,9 +512,9 @@ nicvf_dev_reta_update(struct rte_eth_dev *dev,
        int ret, i, j;
 
        if (reta_size != NIC_MAX_RSS_IDR_TBL_SIZE) {
-               RTE_LOG(ERR, PMD, "The size of hash lookup table configured "
-                       "(%d) doesn't match the number hardware can supported "
-                       "(%d)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE);
+               PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
+                       "(%u) doesn't match the number hardware can supported "
+                       "(%u)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE);
                return -EINVAL;
        }
 
@@ -562,8 +555,8 @@ nicvf_dev_rss_hash_update(struct rte_eth_dev *dev,
 
        if (rss_conf->rss_key &&
                rss_conf->rss_key_len != RSS_HASH_KEY_BYTE_SIZE) {
-               RTE_LOG(ERR, PMD, "Hash key size mismatch %d",
-                               rss_conf->rss_key_len);
+               PMD_DRV_LOG(ERR, "Hash key size mismatch %u",
+                           rss_conf->rss_key_len);
                return -EINVAL;
        }
 
@@ -1773,6 +1766,7 @@ nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup)
        struct nicvf *nic = nicvf_pmd_priv(dev);
 
        PMD_INIT_FUNC_TRACE();
+       dev->data->dev_started = 0;
 
        /* Teardown secondary vf first */
        for (i = 0; i < nic->sqs_count; i++) {
@@ -1796,12 +1790,14 @@ nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup)
                PMD_INIT_LOG(ERR, "Failed to reclaim CPI config %d", ret);
 }
 
-static void
+static int
 nicvf_dev_stop(struct rte_eth_dev *dev)
 {
        PMD_INIT_FUNC_TRACE();
 
        nicvf_dev_stop_cleanup(dev, false);
+
+       return 0;
 }
 
 static void
@@ -1859,13 +1855,15 @@ nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic, bool cleanup)
        }
 }
 
-static void
+static int
 nicvf_dev_close(struct rte_eth_dev *dev)
 {
        size_t i;
        struct nicvf *nic = nicvf_pmd_priv(dev);
 
        PMD_INIT_FUNC_TRACE();
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
 
        nicvf_dev_stop_cleanup(dev, true);
        nicvf_periodic_alarm_stop(nicvf_interrupt, dev);
@@ -1876,6 +1874,8 @@ nicvf_dev_close(struct rte_eth_dev *dev)
 
                nicvf_periodic_alarm_stop(nicvf_vf_interrupt, nic->snicvf[i]);
        }
+
+       return 0;
 }
 
 static int
@@ -1913,6 +1913,9 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
 
+       if (rxmode->mq_mode & ETH_MQ_RX_RSS_FLAG)
+               rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
        if (!rte_eal_has_hugepages()) {
                PMD_INIT_LOG(INFO, "Huge page is not configured");
                return -EINVAL;
@@ -1978,6 +1981,37 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
        return 0;
 }
 
+static int
+nicvf_dev_set_link_up(struct rte_eth_dev *dev)
+{
+       struct nicvf *nic = nicvf_pmd_priv(dev);
+       int rc, i;
+
+       rc = nicvf_mbox_set_link_up_down(nic, true);
+       if (rc)
+               goto done;
+
+       /* Start tx queues  */
+       for (i = 0; i < dev->data->nb_tx_queues; i++)
+               nicvf_dev_tx_queue_start(dev, i);
+
+done:
+       return rc;
+}
+
+static int
+nicvf_dev_set_link_down(struct rte_eth_dev *dev)
+{
+       struct nicvf *nic = nicvf_pmd_priv(dev);
+       int i;
+
+       /* Stop tx queues  */
+       for (i = 0; i < dev->data->nb_tx_queues; i++)
+               nicvf_dev_tx_queue_stop(dev, i);
+
+       return nicvf_mbox_set_link_up_down(nic, false);
+}
+
 /* Initialize and register driver with DPDK Application */
 static const struct eth_dev_ops nicvf_eth_dev_ops = {
        .dev_configure            = nicvf_dev_configure,
@@ -2002,9 +2036,10 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = {
        .tx_queue_stop            = nicvf_dev_tx_queue_stop,
        .rx_queue_setup           = nicvf_dev_rx_queue_setup,
        .rx_queue_release         = nicvf_dev_rx_queue_release,
-       .rx_queue_count           = nicvf_dev_rx_queue_count,
        .tx_queue_setup           = nicvf_dev_tx_queue_setup,
        .tx_queue_release         = nicvf_dev_tx_queue_release,
+       .dev_set_link_up          = nicvf_dev_set_link_up,
+       .dev_set_link_down        = nicvf_dev_set_link_down,
        .get_reg                  = nicvf_dev_get_regs,
 };
 
@@ -2089,10 +2124,7 @@ static int
 nicvf_eth_dev_uninit(struct rte_eth_dev *dev)
 {
        PMD_INIT_FUNC_TRACE();
-
-       if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-               nicvf_dev_close(dev);
-
+       nicvf_dev_close(dev);
        return 0;
 }
 static int
@@ -2105,6 +2137,7 @@ nicvf_eth_dev_init(struct rte_eth_dev *eth_dev)
        PMD_INIT_FUNC_TRACE();
 
        eth_dev->dev_ops = &nicvf_eth_dev_ops;
+       eth_dev->rx_queue_count = nicvf_dev_rx_queue_count;
 
        /* For secondary processes, the primary has done all the work */
        if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
@@ -2122,6 +2155,7 @@ nicvf_eth_dev_init(struct rte_eth_dev *eth_dev)
 
        pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        rte_eth_copy_pci_info(eth_dev, pci_dev);
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        nic->device_id = pci_dev->id.device_id;
        nic->vendor_id = pci_dev->id.vendor_id;