Commit c3b999ca authored by Yael Chemla's avatar Yael Chemla Committed by Paolo Abeni
Browse files

net/mlx5e: Expose port reset cycle recovery counter via ethtool



Display recovery event of PPCNT recovery counters group. Counts (per
link) the number of total successful recovery events of any recovery
types during port reset cycle.

Signed-off-by: default avatarYael Chemla <ychemla@nvidia.com>
Reviewed-by: default avatarCosmin Ratiu <cratiu@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/1742112876-2890-5-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 4c737ceb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1082,6 +1082,11 @@ like flow control, FEC and more.
       need to replace the cable/transceiver.
     - Error

   * - `total_success_recovery_phy`
     - The number of total successful recovery events of any type during
       ports reset cycle.
     - Error

   * - `rx_out_of_buffer`
     - Number of times receive queue had no software buffers allocated for the
       adapter's incoming traffic.
+39 −5
Original line number Diff line number Diff line
@@ -1250,12 +1250,22 @@ pport_phy_statistical_err_lanes_stats_desc[] = {
	{ "rx_err_lane_3_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane3) },
};

#define PPORT_PHY_RECOVERY_OFF(c) \
	MLX5_BYTE_OFF(ppcnt_reg, counter_set.phys_layer_recovery_cntrs.c)
static const struct counter_desc
pport_phy_recovery_cntrs_stats_desc[] = {
	{ "total_success_recovery_phy",
	  PPORT_PHY_RECOVERY_OFF(total_successful_recovery_events) }
};

#define NUM_PPORT_PHY_LAYER_COUNTERS \
	ARRAY_SIZE(pport_phy_layer_cntrs_stats_desc)
#define NUM_PPORT_PHY_STATISTICAL_COUNTERS \
	ARRAY_SIZE(pport_phy_statistical_stats_desc)
#define NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS \
	ARRAY_SIZE(pport_phy_statistical_err_lanes_stats_desc)
#define NUM_PPORT_PHY_RECOVERY_COUNTERS \
	ARRAY_SIZE(pport_phy_recovery_cntrs_stats_desc)

#define NUM_PPORT_PHY_STATISTICAL_LOOPBACK_COUNTERS(dev) \
	(MLX5_CAP_PCAM_FEATURE(dev, ppcnt_statistical_group) ? \
@@ -1263,6 +1273,9 @@ pport_phy_statistical_err_lanes_stats_desc[] = {
#define NUM_PPORT_PHY_STATISTICAL_PER_LANE_LOOPBACK_COUNTERS(dev) \
	(MLX5_CAP_PCAM_FEATURE(dev, per_lane_error_counters) ? \
	NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS : 0)
#define NUM_PPORT_PHY_RECOVERY_LOOPBACK_COUNTERS(dev) \
	(MLX5_CAP_PCAM_FEATURE(dev, ppcnt_recovery_counters) ? \
	NUM_PPORT_PHY_RECOVERY_COUNTERS : 0)

static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)
{
@@ -1275,6 +1288,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)

	num_stats += NUM_PPORT_PHY_STATISTICAL_PER_LANE_LOOPBACK_COUNTERS(mdev);

	num_stats += NUM_PPORT_PHY_RECOVERY_LOOPBACK_COUNTERS(mdev);
	return num_stats;
}

@@ -1295,6 +1309,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)
		ethtool_puts(data,
			     pport_phy_statistical_err_lanes_stats_desc[i]
			     .format);

	for (i = 0; i < NUM_PPORT_PHY_RECOVERY_LOOPBACK_COUNTERS(mdev); i++)
		ethtool_puts(data,
			     pport_phy_recovery_cntrs_stats_desc[i].format);
}

static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
@@ -1324,6 +1342,13 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
			MLX5E_READ_CTR64_BE(
				&priv->stats.pport.phy_statistical_counters,
				pport_phy_statistical_err_lanes_stats_desc, i));

	for (i = 0; i < NUM_PPORT_PHY_RECOVERY_LOOPBACK_COUNTERS(mdev); i++)
		mlx5e_ethtool_put_stat(
			data,
			MLX5E_READ_CTR32_BE(
				&priv->stats.pport.phy_recovery_counters,
				pport_phy_recovery_cntrs_stats_desc, i));
}

static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
@@ -1339,12 +1364,21 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);

	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
		return;

	if (MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group)) {
		out = pstats->phy_statistical_counters;
	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
		MLX5_SET(ppcnt_reg, in, grp,
			 MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0,
				     0);
	}

	if (MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_recovery_counters)) {
		out = pstats->phy_recovery_counters;
		MLX5_SET(ppcnt_reg, in, grp,
			 MLX5_PHYSICAL_LAYER_RECOVERY_GROUP);
		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0,
				     0);
	}
}

void mlx5e_get_link_ext_stats(struct net_device *dev,
+4 −0
Original line number Diff line number Diff line
@@ -309,6 +309,9 @@ struct mlx5e_vport_stats {
#define PPORT_PHY_STATISTICAL_GET(pstats, c) \
	MLX5_GET64(ppcnt_reg, (pstats)->phy_statistical_counters, \
		   counter_set.phys_layer_statistical_cntrs.c##_high)
#define PPORT_PHY_RECOVERY_GET(pstats, c) \
	MLX5_GET64(ppcnt_reg, (pstats)->phy_recovery_counters, \
		   counter_set.phys_layer_recovery_cntrs.c)
#define PPORT_PER_PRIO_GET(pstats, prio, c) \
	MLX5_GET64(ppcnt_reg, pstats->per_prio_counters[prio], \
		   counter_set.eth_per_prio_grp_data_layout.c##_high)
@@ -324,6 +327,7 @@ struct mlx5e_pport_stats {
	__be64 per_prio_counters[NUM_PPORT_PRIO][MLX5_ST_SZ_QW(ppcnt_reg)];
	__be64 phy_counters[MLX5_ST_SZ_QW(ppcnt_reg)];
	__be64 phy_statistical_counters[MLX5_ST_SZ_QW(ppcnt_reg)];
	__be64 phy_recovery_counters[MLX5_ST_SZ_QW(ppcnt_reg)];
	__be64 eth_ext_counters[MLX5_ST_SZ_QW(ppcnt_reg)];
	__be64 per_tc_prio_counters[NUM_PPORT_PRIO][MLX5_ST_SZ_QW(ppcnt_reg)];
	__be64 per_tc_congest_prio_counters[NUM_PPORT_PRIO][MLX5_ST_SZ_QW(ppcnt_reg)];