OSDN Git Service

dpaa2-eth: Add QBMAN related stats
authorIoana Radulescu <ruxandra.radulescu@nxp.com>
Tue, 18 Dec 2018 15:23:01 +0000 (15:23 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Dec 2018 18:37:22 +0000 (10:37 -0800)
Add statistics for pending frames in Rx/Tx conf FQs and
number of buffers in pool. Available through ethtool -S.

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: Ioana ciornei <ioana.ciornei@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c

index 0c831bf..a7389e7 100644 (file)
@@ -48,6 +48,12 @@ static char dpaa2_ethtool_extras[][ETH_GSTRING_LEN] = {
        "[drv] xdp drop",
        "[drv] xdp tx",
        "[drv] xdp tx errors",
+       /* FQ stats */
+       "[qbman] rx pending frames",
+       "[qbman] rx pending bytes",
+       "[qbman] tx conf pending frames",
+       "[qbman] tx conf pending bytes",
+       "[qbman] buffer count",
 };
 
 #define DPAA2_ETH_NUM_EXTRA_STATS      ARRAY_SIZE(dpaa2_ethtool_extras)
@@ -177,6 +183,10 @@ static void dpaa2_eth_get_ethtool_stats(struct net_device *net_dev,
        int j, k, err;
        int num_cnt;
        union dpni_statistics dpni_stats;
+       u32 fcnt, bcnt;
+       u32 fcnt_rx_total = 0, fcnt_tx_total = 0;
+       u32 bcnt_rx_total = 0, bcnt_tx_total = 0;
+       u32 buf_cnt;
        struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
        struct dpaa2_eth_drv_stats *extras;
        struct dpaa2_eth_ch_stats *ch_stats;
@@ -219,6 +229,37 @@ static void dpaa2_eth_get_ethtool_stats(struct net_device *net_dev,
                for (j = 0; j < sizeof(*ch_stats) / sizeof(__u64); j++)
                        *((__u64 *)data + i + j) += *((__u64 *)ch_stats + j);
        }
+       i += j;
+
+       for (j = 0; j < priv->num_fqs; j++) {
+               /* Print FQ instantaneous counts */
+               err = dpaa2_io_query_fq_count(NULL, priv->fq[j].fqid,
+                                             &fcnt, &bcnt);
+               if (err) {
+                       netdev_warn(net_dev, "FQ query error %d", err);
+                       return;
+               }
+
+               if (priv->fq[j].type == DPAA2_TX_CONF_FQ) {
+                       fcnt_tx_total += fcnt;
+                       bcnt_tx_total += bcnt;
+               } else {
+                       fcnt_rx_total += fcnt;
+                       bcnt_rx_total += bcnt;
+               }
+       }
+
+       *(data + i++) = fcnt_rx_total;
+       *(data + i++) = bcnt_rx_total;
+       *(data + i++) = fcnt_tx_total;
+       *(data + i++) = bcnt_tx_total;
+
+       err = dpaa2_io_query_bp_count(NULL, priv->bpid, &buf_cnt);
+       if (err) {
+               netdev_warn(net_dev, "Buffer count query error %d\n", err);
+               return;
+       }
+       *(data + i++) = buf_cnt;
 }
 
 static int prep_eth_rule(struct ethhdr *eth_value, struct ethhdr *eth_mask,