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;
|
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_Q_CNTRS(priv) (NUM_Q_COUNTERS * (!!priv->q_counter))
|
||||||
#define MLX5E_NUM_RQ_STATS(priv) \
|
#define MLX5E_NUM_RQ_STATS(priv) \
|
||||||
(NUM_RQ_STATS * priv->params.num_channels * \
|
(NUM_RQ_STATS * priv->params.num_channels * \
|
||||||
@ -147,7 +159,7 @@ static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv)
|
|||||||
(NUM_SQ_STATS * priv->params.num_channels * priv->params.num_tc * \
|
(NUM_SQ_STATS * priv->params.num_channels * priv->params.num_tc * \
|
||||||
test_bit(MLX5E_STATE_OPENED, &priv->state))
|
test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||||
#define MLX5E_NUM_PFC_COUNTERS(priv) \
|
#define MLX5E_NUM_PFC_COUNTERS(priv) \
|
||||||
(hweight8(mlx5e_query_pfc_combined(priv)) * \
|
((mlx5e_query_global_pause_combined(priv) + hweight8(mlx5e_query_pfc_combined(priv))) * \
|
||||||
NUM_PPORT_PER_PRIO_PFC_COUNTERS)
|
NUM_PPORT_PER_PRIO_PFC_COUNTERS)
|
||||||
|
|
||||||
static int mlx5e_get_sset_count(struct net_device *dev, int sset)
|
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);
|
pfc_combined = mlx5e_query_pfc_combined(priv);
|
||||||
for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
|
for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
|
||||||
for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
|
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,
|
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))
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||||
return;
|
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[] = {
|
static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
|
||||||
{ "rx_prio%d_pause", PPORT_PER_PRIO_OFF(rx_pause) },
|
/* %s is "global" or "prio{i}" */
|
||||||
{ "rx_prio%d_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
|
{ "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) },
|
||||||
{ "tx_prio%d_pause", PPORT_PER_PRIO_OFF(tx_pause) },
|
{ "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
|
||||||
{ "tx_prio%d_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
|
{ "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) },
|
||||||
{ "rx_prio%d_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) },
|
{ "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 {
|
struct mlx5e_rq_stats {
|
||||||
|
Loading…
Reference in New Issue
Block a user