From: Gal Pressman <g...@mellanox.com>

Just like per prio counters, the global flow counters are queried from
per priority counters register.
Global flow control counters are stored in priority 0 PFC counters.

Signed-off-by: Gal Pressman <g...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 .../net/ethernet/mellanox/mlx5/core/en_ethtool.c   | 35 ++++++++++++++++++++--
 drivers/net/ethernet/mellanox/mlx5/core/en_stats.h | 11 +++----
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index d652aa9..4a3757e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@ -139,6 +139,18 @@ static unsigned long mlx5e_query_pfc_combined(struct 
mlx5e_priv *priv)
        return err ? 0 : pfc_en_tx | pfc_en_rx;
 }
 
+static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
+{
+       struct mlx5_core_dev *mdev = priv->mdev;
+       u32 rx_pause;
+       u32 tx_pause;
+       int err;
+
+       err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
+
+       return err ? false : rx_pause | tx_pause;
+}
+
 #define MLX5E_NUM_Q_CNTRS(priv) (NUM_Q_COUNTERS * (!!priv->q_counter))
 #define MLX5E_NUM_RQ_STATS(priv) \
        (NUM_RQ_STATS * priv->params.num_channels * \
@@ -147,8 +159,8 @@ static unsigned long mlx5e_query_pfc_combined(struct 
mlx5e_priv *priv)
        (NUM_SQ_STATS * priv->params.num_channels * priv->params.num_tc * \
         test_bit(MLX5E_STATE_OPENED, &priv->state))
 #define MLX5E_NUM_PFC_COUNTERS(priv) \
-       (hweight8(mlx5e_query_pfc_combined(priv)) * \
-        NUM_PPORT_PER_PRIO_PFC_COUNTERS)
+       ((mlx5e_query_global_pause_combined(priv) + 
hweight8(mlx5e_query_pfc_combined(priv))) * \
+         NUM_PPORT_PER_PRIO_PFC_COUNTERS)
 
 static int mlx5e_get_sset_count(struct net_device *dev, int sset)
 {
@@ -210,8 +222,18 @@ static void mlx5e_fill_stats_strings(struct mlx5e_priv 
*priv, uint8_t *data)
        pfc_combined = mlx5e_query_pfc_combined(priv);
        for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
                for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
+                       char pfc_string[ETH_GSTRING_LEN];
+
+                       snprintf(pfc_string, sizeof(pfc_string), "prio%d", 
prio);
                        sprintf(data + (idx++) * ETH_GSTRING_LEN,
-                               pport_per_prio_pfc_stats_desc[i].format, prio);
+                               pport_per_prio_pfc_stats_desc[i].format, 
pfc_string);
+               }
+       }
+
+       if (mlx5e_query_global_pause_combined(priv)) {
+               for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
+                       sprintf(data + (idx++) * ETH_GSTRING_LEN,
+                               pport_per_prio_pfc_stats_desc[i].format, 
"global");
                }
        }
 
@@ -306,6 +328,13 @@ static void mlx5e_get_ethtool_stats(struct net_device *dev,
                }
        }
 
+       if (mlx5e_query_global_pause_combined(priv)) {
+               for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
+                       data[idx++] = 
MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
+                                                         
pport_per_prio_pfc_stats_desc, 0);
+               }
+       }
+
        if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
                return;
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
index ae29998..7b9d8a9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
@@ -254,11 +254,12 @@ static const struct counter_desc 
pport_per_prio_traffic_stats_desc[] = {
 };
 
 static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
-       { "rx_prio%d_pause", PPORT_PER_PRIO_OFF(rx_pause) },
-       { "rx_prio%d_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
-       { "tx_prio%d_pause", PPORT_PER_PRIO_OFF(tx_pause) },
-       { "tx_prio%d_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
-       { "rx_prio%d_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) 
},
+       /* %s is "global" or "prio{i}" */
+       { "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) },
+       { "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
+       { "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) },
+       { "tx_%s_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
+       { "rx_%s_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) },
 };
 
 struct mlx5e_rq_stats {
-- 
2.8.0

Reply via email to