Imported Upstream version 16.07-rc1
[deb_dpdk.git] / drivers / net / fm10k / fm10k_ethdev.c
index c2d377f..eb77705 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2013-2016 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -947,7 +947,7 @@ fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        fm10k_mbx_lock(hw);
@@ -969,7 +969,7 @@ fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        if (dev->data->all_multicast == 1)
@@ -995,7 +995,7 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        /* If promiscuous mode is enabled, it doesn't make sense to enable
@@ -1026,7 +1026,7 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        if (dev->data->promiscuous) {
@@ -1256,8 +1256,46 @@ fm10k_link_update(struct rte_eth_dev *dev,
        return 0;
 }
 
+static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
+       struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit)
+{
+       unsigned i, q;
+       unsigned count = 0;
+
+       if (xstats_names != NULL) {
+               /* Note: limit checked in rte_eth_xstats_names() */
+
+               /* Global stats */
+               for (i = 0; i < FM10K_NB_HW_XSTATS; i++) {
+                       snprintf(xstats_names[count].name,
+                               sizeof(xstats_names[count].name),
+                               "%s", fm10k_hw_stats_strings[count].name);
+                       count++;
+               }
+
+               /* PF queue stats */
+               for (q = 0; q < FM10K_MAX_QUEUES_PF; q++) {
+                       for (i = 0; i < FM10K_NB_RX_Q_XSTATS; i++) {
+                               snprintf(xstats_names[count].name,
+                                       sizeof(xstats_names[count].name),
+                                       "rx_q%u_%s", q,
+                                       fm10k_hw_stats_rx_q_strings[i].name);
+                               count++;
+                       }
+                       for (i = 0; i < FM10K_NB_TX_Q_XSTATS; i++) {
+                               snprintf(xstats_names[count].name,
+                                       sizeof(xstats_names[count].name),
+                                       "tx_q%u_%s", q,
+                                       fm10k_hw_stats_tx_q_strings[i].name);
+                               count++;
+                       }
+               }
+       }
+       return FM10K_NB_XSTATS;
+}
+
 static int
-fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
+fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
                 unsigned n)
 {
        struct fm10k_hw_stats *hw_stats =
@@ -1269,8 +1307,6 @@ fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
 
        /* Global stats */
        for (i = 0; i < FM10K_NB_HW_XSTATS; i++) {
-               snprintf(xstats[count].name, sizeof(xstats[count].name),
-                        "%s", fm10k_hw_stats_strings[count].name);
                xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
                        fm10k_hw_stats_strings[count].offset);
                count++;
@@ -1279,18 +1315,12 @@ fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
        /* PF queue stats */
        for (q = 0; q < FM10K_MAX_QUEUES_PF; q++) {
                for (i = 0; i < FM10K_NB_RX_Q_XSTATS; i++) {
-                       snprintf(xstats[count].name, sizeof(xstats[count].name),
-                                "rx_q%u_%s", q,
-                                fm10k_hw_stats_rx_q_strings[i].name);
                        xstats[count].value =
                                *(uint64_t *)(((char *)&hw_stats->q[q]) +
                                fm10k_hw_stats_rx_q_strings[i].offset);
                        count++;
                }
                for (i = 0; i < FM10K_NB_TX_Q_XSTATS; i++) {
-                       snprintf(xstats[count].name, sizeof(xstats[count].name),
-                                "tx_q%u_%s", q,
-                                fm10k_hw_stats_tx_q_strings[i].name);
                        xstats[count].value =
                                *(uint64_t *)(((char *)&hw_stats->q[q]) +
                                fm10k_hw_stats_tx_q_strings[i].offset);
@@ -2629,6 +2659,7 @@ static const struct eth_dev_ops fm10k_eth_dev_ops = {
        .allmulticast_disable   = fm10k_dev_allmulticast_disable,
        .stats_get              = fm10k_stats_get,
        .xstats_get             = fm10k_xstats_get,
+       .xstats_get_names       = fm10k_xstats_get_names,
        .stats_reset            = fm10k_stats_reset,
        .xstats_reset           = fm10k_stats_reset,
        .link_update            = fm10k_link_update,