mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
mlx5: add pause frame stats
Plumb through all the indirection and copy some code from ethtool -S. The names of the group indicate that these are the stats we are after (and Saeed confirms it). v3: - fix build in mlx5_rep v2: - drop the ethool helper and call stats directly - don't pass 0 as initialized to in buffer - use local buffer Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
eabbe2bb68
commit
098d9ed9ef
4 changed files with 50 additions and 0 deletions
|
@ -1341,6 +1341,14 @@ static int mlx5e_set_tunable(struct net_device *dev,
|
|||
return err;
|
||||
}
|
||||
|
||||
static void mlx5e_get_pause_stats(struct net_device *netdev,
|
||||
struct ethtool_pause_stats *pause_stats)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
|
||||
mlx5e_stats_pause_get(priv, pause_stats);
|
||||
}
|
||||
|
||||
void mlx5e_ethtool_get_pauseparam(struct mlx5e_priv *priv,
|
||||
struct ethtool_pauseparam *pauseparam)
|
||||
{
|
||||
|
@ -2033,6 +2041,7 @@ const struct ethtool_ops mlx5e_ethtool_ops = {
|
|||
.set_rxnfc = mlx5e_set_rxnfc,
|
||||
.get_tunable = mlx5e_get_tunable,
|
||||
.set_tunable = mlx5e_set_tunable,
|
||||
.get_pause_stats = mlx5e_get_pause_stats,
|
||||
.get_pauseparam = mlx5e_get_pauseparam,
|
||||
.set_pauseparam = mlx5e_set_pauseparam,
|
||||
.get_ts_info = mlx5e_get_ts_info,
|
||||
|
|
|
@ -288,6 +288,14 @@ static u32 mlx5e_rep_get_rxfh_indir_size(struct net_device *netdev)
|
|||
return mlx5e_ethtool_get_rxfh_indir_size(priv);
|
||||
}
|
||||
|
||||
static void mlx5e_uplink_rep_get_pause_stats(struct net_device *netdev,
|
||||
struct ethtool_pause_stats *stats)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
|
||||
mlx5e_stats_pause_get(priv, stats);
|
||||
}
|
||||
|
||||
static void mlx5e_uplink_rep_get_pauseparam(struct net_device *netdev,
|
||||
struct ethtool_pauseparam *pauseparam)
|
||||
{
|
||||
|
@ -362,6 +370,7 @@ static const struct ethtool_ops mlx5e_uplink_rep_ethtool_ops = {
|
|||
.set_rxfh = mlx5e_set_rxfh,
|
||||
.get_rxnfc = mlx5e_get_rxnfc,
|
||||
.set_rxnfc = mlx5e_set_rxnfc,
|
||||
.get_pause_stats = mlx5e_uplink_rep_get_pause_stats,
|
||||
.get_pauseparam = mlx5e_uplink_rep_get_pauseparam,
|
||||
.set_pauseparam = mlx5e_uplink_rep_set_pauseparam,
|
||||
};
|
||||
|
|
|
@ -677,6 +677,35 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(802_3)
|
|||
mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
|
||||
}
|
||||
|
||||
#define MLX5E_READ_CTR64_BE_F(ptr, c) \
|
||||
be64_to_cpu(*(__be64 *)((char *)ptr + \
|
||||
MLX5_BYTE_OFF(ppcnt_reg, \
|
||||
counter_set.eth_802_3_cntrs_grp_data_layout.c##_high)))
|
||||
|
||||
void mlx5e_stats_pause_get(struct mlx5e_priv *priv,
|
||||
struct ethtool_pause_stats *pause_stats)
|
||||
{
|
||||
u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
|
||||
int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
|
||||
|
||||
if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
|
||||
return;
|
||||
|
||||
MLX5_SET(ppcnt_reg, in, local_port, 1);
|
||||
MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
|
||||
mlx5_core_access_reg(mdev, in, sz, ppcnt_ieee_802_3,
|
||||
sz, MLX5_REG_PPCNT, 0, 0);
|
||||
|
||||
pause_stats->tx_pause_frames =
|
||||
MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
|
||||
a_pause_mac_ctrl_frames_transmitted);
|
||||
pause_stats->rx_pause_frames =
|
||||
MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
|
||||
a_pause_mac_ctrl_frames_received);
|
||||
}
|
||||
|
||||
#define PPORT_2863_OFF(c) \
|
||||
MLX5_BYTE_OFF(ppcnt_reg, \
|
||||
counter_set.eth_2863_cntrs_grp_data_layout.c##_high)
|
||||
|
|
|
@ -104,6 +104,9 @@ void mlx5e_stats_update(struct mlx5e_priv *priv);
|
|||
void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx);
|
||||
void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data);
|
||||
|
||||
void mlx5e_stats_pause_get(struct mlx5e_priv *priv,
|
||||
struct ethtool_pause_stats *pause_stats);
|
||||
|
||||
/* Concrete NIC Stats */
|
||||
|
||||
struct mlx5e_sw_stats {
|
||||
|
|
Loading…
Reference in a new issue