]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: ldpaa_eth: extend debug capabilities with DPMAC statistics
authorIoana Ciornei <ioana.ciornei@nxp.com>
Tue, 23 May 2023 13:47:46 +0000 (16:47 +0300)
committerPeng Fan <peng.fan@nxp.com>
Wed, 14 Jun 2023 10:40:16 +0000 (18:40 +0800)
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@nxp.com>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/net/ldpaa_eth/ldpaa_eth.c
drivers/net/ldpaa_eth/ldpaa_eth.h
include/fsl-mc/fsl_dpmac.h

index 907e51da6e1ea7bd41e9d046a27e63c2d9f33f5b..53c5b8ba2b1d1c1d3c3fd61aaad11d0d9fbf8658 100644 (file)
@@ -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);
index 62dc9dd3102966a74eaa5439cbfb9e018d186b24..af082e34caea96f03f7ad4309c7b33d55d8b05bb 100644 (file)
@@ -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;
index 8f5e17fe222a82d1e4948b5624b5ee2614a7cb53..1fa26ef3805ad54892916d693572990cbefa476b 100644 (file)
@@ -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,
 };
 
 /**