OSDN Git Service

mlx5: add pause frame stats
[tomoyo/tomoyo-test1.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_stats.c
index e3b2f59..6d5e54b 100644 (file)
@@ -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)