[PATCH 4/6] net: ldpaa_eth: extend debug capabilities with DPMAC statistics

Ramon Fried rfried.dev at gmail.com
Sat Jun 10 12:47:41 CEST 2023


On Tue, May 23, 2023 at 4:48 PM Ioana Ciornei <ioana.ciornei at nxp.com> wrote:
>
> The ldpaa_eth driver already had a DPMAC statistics dump, this patch
> extends the list of stats and adds a bit more structure to the code.
>
> For a bit more context, the DPAA2 u-boot software architecture uses a
> default network interface object - a DPNI - which, at runtime, will get
> connected to the currently used DPMAC object.
> Each time the .stop() eth callback is called, the DPMAC is destroyed
> thus any previous counters will get lost.
>
> As a preparation for the next patches, we add a software kept set of
> DPMAC counters which will get updated before each destroy operation
> takes place.
>
> Signed-off-by: Ioana Ciornei <ioana.ciornei at nxp.com>
> ---
>  drivers/net/ldpaa_eth/ldpaa_eth.c | 114 ++++++++++--------------------
>  drivers/net/ldpaa_eth/ldpaa_eth.h |  34 +++++++++
>  include/fsl-mc/fsl_dpmac.h        |   5 +-
>  3 files changed, 76 insertions(+), 77 deletions(-)
>
> diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c
> index 907e51da6e1e..53c5b8ba2b1d 100644
> --- a/drivers/net/ldpaa_eth/ldpaa_eth.c
> +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c
> @@ -79,8 +79,33 @@ static void ldpaa_eth_add_dpni_stats(struct udevice *dev, u64 *data)
>                 priv->dpni_stats[i] += data[i];
>  }
>
> -#ifdef DEBUG
> +static void ldpaa_eth_collect_dpmac_stats(struct udevice *dev, u64 *data)
> +{
> +       struct ldpaa_eth_priv *priv = dev_get_priv(dev);
> +       int err, i;
> +       u64 value;
>
> +       for (i = 0; i < LDPAA_ETH_DPMAC_NUM_STATS; i++) {
> +               err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> +                                       priv->dpmac_handle, i,
> +                                       &value);
> +               if (err)
> +                       printf("dpmac_get_counter(%d) failed\n", i);
> +
> +               *(data + i) = value;
> +       }
> +}
> +
> +static void ldpaa_eth_add_dpmac_stats(struct udevice *dev, u64 *data)
> +{
> +       struct ldpaa_eth_priv *priv = dev_get_priv(dev);
> +       int i;
> +
> +       for (i = 0; i < LDPAA_ETH_DPMAC_NUM_STATS; i++)
> +               priv->dpmac_stats[i] += data[i];
> +}
> +
> +#ifdef DEBUG
>  static void ldpaa_eth_dump_dpni_stats(struct udevice *dev, u64 *data)
>  {
>         int i;
> @@ -90,82 +115,13 @@ static void ldpaa_eth_dump_dpni_stats(struct udevice *dev, u64 *data)
>                 printf("  %s: %llu\n", ldpaa_eth_dpni_stat_strings[i], data[i]);
>  }
>
> -static void ldpaa_eth_get_dpmac_counter(struct udevice *dev)
> +static void ldpaa_eth_dump_dpmac_stats(struct udevice *dev, u64 *data)
>  {
> -       struct ldpaa_eth_priv *priv = dev_get_priv(dev);
> -       int err = 0;
> -       u64 value;
> -
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_ING_BYTE,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_ING_BYTE failed\n");
> -               return;
> -       }
> -       printf("\nDPMAC counters ..\n");
> -       printf("DPMAC_CNT_ING_BYTE=%lld\n", value);
> -
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_ING_FRAME_DISCARD,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_ING_FRAME_DISCARD failed\n");
> -               return;
> -       }
> -       printf("DPMAC_CNT_ING_FRAME_DISCARD=%lld\n", value);
> -
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_ING_ALIGN_ERR,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_ING_ALIGN_ERR failed\n");
> -               return;
> -       }
> -       printf("DPMAC_CNT_ING_ALIGN_ERR =%lld\n", value);
> -
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_ING_BYTE,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_ING_BYTE failed\n");
> -               return;
> -       }
> -       printf("DPMAC_CNT_ING_BYTE=%lld\n", value);
> -
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_ING_ERR_FRAME,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_ING_ERR_FRAME failed\n");
> -               return;
> -       }
> -       printf("DPMAC_CNT_ING_ERR_FRAME=%lld\n", value);
> -
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_EGR_BYTE ,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_EGR_BYTE failed\n");
> -               return;
> -       }
> -       printf("DPMAC_CNT_EGR_BYTE =%lld\n", value);
> +       int i;
>
> -       err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
> -                    priv->dpmac_handle,
> -                    DPMAC_CNT_EGR_ERR_FRAME ,
> -                    &value);
> -       if (err < 0) {
> -               printf("dpmac_get_counter: DPMAC_CNT_EGR_ERR_FRAME failed\n");
> -               return;
> -       }
> -       printf("DPMAC_CNT_EGR_ERR_FRAME =%lld\n", value);
> +       printf("DPMAC counters:\n");
> +       for (i = 0; i < LDPAA_ETH_DPMAC_NUM_STATS; i++)
> +               printf("  %s: %llu\n", ldpaa_eth_dpmac_stat_strings[i], data[i]);
>  }
>  #endif
>
> @@ -559,9 +515,15 @@ static void ldpaa_eth_stop(struct udevice *dev)
>         }
>         kfree(data);
>
> +       data = kzalloc(sizeof(u64) * LDPAA_ETH_DPMAC_NUM_STATS, GFP_KERNEL);
> +       if (data) {
> +               ldpaa_eth_collect_dpmac_stats(dev, data);
> +               ldpaa_eth_add_dpmac_stats(dev, data);
>  #ifdef DEBUG
> -       ldpaa_eth_get_dpmac_counter(dev);
> +               ldpaa_eth_dump_dpmac_stats(dev, data);
>  #endif
> +       }
> +       kfree(data);
>
>         err = dprc_disconnect(dflt_mc_io, MC_CMD_NO_FLAGS,
>                               dflt_dprc_handle, &dpmac_endpoint);
> diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.h b/drivers/net/ldpaa_eth/ldpaa_eth.h
> index 62dc9dd31029..af082e34caea 100644
> --- a/drivers/net/ldpaa_eth/ldpaa_eth.h
> +++ b/drivers/net/ldpaa_eth/ldpaa_eth.h
> @@ -142,6 +142,39 @@ static const char ldpaa_eth_dpni_stat_strings[][ETH_GSTRING_LEN] = {
>
>  #define LDPAA_ETH_DPNI_NUM_STATS       ARRAY_SIZE(ldpaa_eth_dpni_stat_strings)
>
> +static const char ldpaa_eth_dpmac_stat_strings[][ETH_GSTRING_LEN] = {
> +       [DPMAC_CNT_ING_ALL_FRAME]               = "[mac] rx all frames",
> +       [DPMAC_CNT_ING_GOOD_FRAME]              = "[mac] rx frames ok",
> +       [DPMAC_CNT_ING_ERR_FRAME]               = "[mac] rx frame errors",
> +       [DPMAC_CNT_ING_FRAME_DISCARD]           = "[mac] rx frame discards",
> +       [DPMAC_CNT_ING_UCAST_FRAME]             = "[mac] rx u-cast",
> +       [DPMAC_CNT_ING_BCAST_FRAME]             = "[mac] rx b-cast",
> +       [DPMAC_CNT_ING_MCAST_FRAME]             = "[mac] rx m-cast",
> +       [DPMAC_CNT_ING_FRAME_64]                = "[mac] rx 64 bytes",
> +       [DPMAC_CNT_ING_FRAME_127]               = "[mac] rx 65-127 bytes",
> +       [DPMAC_CNT_ING_FRAME_255]               = "[mac] rx 128-255 bytes",
> +       [DPMAC_CNT_ING_FRAME_511]               = "[mac] rx 256-511 bytes",
> +       [DPMAC_CNT_ING_FRAME_1023]              = "[mac] rx 512-1023 bytes",
> +       [DPMAC_CNT_ING_FRAME_1518]              = "[mac] rx 1024-1518 bytes",
> +       [DPMAC_CNT_ING_FRAME_1519_MAX]          = "[mac] rx 1519-max bytes",
> +       [DPMAC_CNT_ING_FRAG]                    = "[mac] rx frags",
> +       [DPMAC_CNT_ING_JABBER]                  = "[mac] rx jabber",
> +       [DPMAC_CNT_ING_ALIGN_ERR]               = "[mac] rx align errors",
> +       [DPMAC_CNT_ING_OVERSIZED]               = "[mac] rx oversized",
> +       [DPMAC_CNT_ING_VALID_PAUSE_FRAME]       = "[mac] rx pause",
> +       [DPMAC_CNT_ING_BYTE]                    = "[mac] rx bytes",
> +       [DPMAC_CNT_EGR_GOOD_FRAME]              = "[mac] tx frames ok",
> +       [DPMAC_CNT_EGR_UCAST_FRAME]             = "[mac] tx u-cast",
> +       [DPMAC_CNT_EGR_MCAST_FRAME]             = "[mac] tx m-cast",
> +       [DPMAC_CNT_EGR_BCAST_FRAME]             = "[mac] tx b-cast",
> +       [DPMAC_CNT_EGR_ERR_FRAME]               = "[mac] tx frame errors",
> +       [DPMAC_CNT_EGR_UNDERSIZED]              = "[mac] tx undersized",
> +       [DPMAC_CNT_EGR_VALID_PAUSE_FRAME]       = "[mac] tx b-pause",
> +       [DPMAC_CNT_EGR_BYTE]                    = "[mac] tx bytes",
> +};
> +
> +#define LDPAA_ETH_DPMAC_NUM_STATS      ARRAY_SIZE(ldpaa_eth_dpmac_stat_strings)
> +
>  struct ldpaa_eth_priv {
>         struct phy_device *phy;
>         int phy_mode;
> @@ -159,6 +192,7 @@ struct ldpaa_eth_priv {
>
>         /* SW kept statistics */
>         u64 dpni_stats[LDPAA_ETH_DPNI_NUM_STATS];
> +       u64 dpmac_stats[LDPAA_ETH_DPMAC_NUM_STATS];
>  };
>
>  struct dprc_endpoint dpmac_endpoint;
> diff --git a/include/fsl-mc/fsl_dpmac.h b/include/fsl-mc/fsl_dpmac.h
> index 8f5e17fe222a..1fa26ef3805a 100644
> --- a/include/fsl-mc/fsl_dpmac.h
> +++ b/include/fsl-mc/fsl_dpmac.h
> @@ -412,6 +412,8 @@ int dpmac_set_link_state(struct fsl_mc_io           *mc_io,
>   * @DPMAC_CNT_EGR_ERR_FRAME: counts frame transmitted with an error
>   * @DPMAC_CNT_ING_GOOD_FRAME: counts frame received without error, including
>   *                           pause frames.
> + * @DPMAC_CNT_EGR_GOOD_FRAME: counts frames transmitted without error, including
> + *                           pause frames.
>   */
>  enum dpmac_counter {
>         DPMAC_CNT_ING_FRAME_64,
> @@ -440,7 +442,8 @@ enum dpmac_counter {
>         DPMAC_CNT_EGR_BCAST_FRAME,
>         DPMAC_CNT_EGR_UCAST_FRAME,
>         DPMAC_CNT_EGR_ERR_FRAME,
> -       DPMAC_CNT_ING_GOOD_FRAME
> +       DPMAC_CNT_ING_GOOD_FRAME,
> +       DPMAC_CNT_EGR_GOOD_FRAME,
>  };
>
>  /**
> --
> 2.25.1
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list