net/mlx5e: Expose flow control counters to ethtool
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 <galp@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fe6b9bd9eb
commit
e989d5a532
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue