bnxt: implement ethtool standard stats
authorJakub Kicinski <kuba@kernel.org>
Fri, 16 Apr 2021 19:27:44 +0000 (12:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Apr 2021 23:59:20 +0000 (16:59 -0700)
Most of the names seem to strongly correlate with names from
the standard and RFC. Whether ..+good_frames are indeed Frames..OK
I'm the least sure of.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 7b90357..8322523 100644 (file)
@@ -3990,6 +3990,127 @@ ethtool_init_exit:
        mutex_unlock(&bp->hwrm_cmd_lock);
 }
 
+static void bnxt_get_eth_phy_stats(struct net_device *dev,
+                                  struct ethtool_eth_phy_stats *phy_stats)
+{
+       struct bnxt *bp = netdev_priv(dev);
+       u64 *rx;
+
+       if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS_EXT))
+               return;
+
+       rx = bp->rx_port_stats_ext.sw_stats;
+       phy_stats->SymbolErrorDuringCarrier =
+               *(rx + BNXT_RX_STATS_EXT_OFFSET(rx_pcs_symbol_err));
+}
+
+static void bnxt_get_eth_mac_stats(struct net_device *dev,
+                                  struct ethtool_eth_mac_stats *mac_stats)
+{
+       struct bnxt *bp = netdev_priv(dev);
+       u64 *rx, *tx;
+
+       if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS))
+               return;
+
+       rx = bp->port_stats.sw_stats;
+       tx = bp->port_stats.sw_stats + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
+
+       mac_stats->FramesReceivedOK =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_good_frames);
+       mac_stats->FramesTransmittedOK =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_good_frames);
+}
+
+static void bnxt_get_eth_ctrl_stats(struct net_device *dev,
+                                   struct ethtool_eth_ctrl_stats *ctrl_stats)
+{
+       struct bnxt *bp = netdev_priv(dev);
+       u64 *rx;
+
+       if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS))
+               return;
+
+       rx = bp->port_stats.sw_stats;
+       ctrl_stats->MACControlFramesReceived =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_ctrl_frames);
+}
+
+static const struct ethtool_rmon_hist_range bnxt_rmon_ranges[] = {
+       {    0,    64 },
+       {   65,   127 },
+       {  128,   255 },
+       {  256,   511 },
+       {  512,  1023 },
+       { 1024,  1518 },
+       { 1519,  2047 },
+       { 2048,  4095 },
+       { 4096,  9216 },
+       { 9217, 16383 },
+       {}
+};
+
+static void bnxt_get_rmon_stats(struct net_device *dev,
+                               struct ethtool_rmon_stats *rmon_stats,
+                               const struct ethtool_rmon_hist_range **ranges)
+{
+       struct bnxt *bp = netdev_priv(dev);
+       u64 *rx, *tx;
+
+       if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS))
+               return;
+
+       rx = bp->port_stats.sw_stats;
+       tx = bp->port_stats.sw_stats + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
+
+       rmon_stats->jabbers =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_jbr_frames);
+       rmon_stats->oversize_pkts =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_ovrsz_frames);
+       rmon_stats->undersize_pkts =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_undrsz_frames);
+
+       rmon_stats->hist[0] = BNXT_GET_RX_PORT_STATS64(rx, rx_64b_frames);
+       rmon_stats->hist[1] = BNXT_GET_RX_PORT_STATS64(rx, rx_65b_127b_frames);
+       rmon_stats->hist[2] = BNXT_GET_RX_PORT_STATS64(rx, rx_128b_255b_frames);
+       rmon_stats->hist[3] = BNXT_GET_RX_PORT_STATS64(rx, rx_256b_511b_frames);
+       rmon_stats->hist[4] =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_512b_1023b_frames);
+       rmon_stats->hist[5] =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_1024b_1518b_frames);
+       rmon_stats->hist[6] =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_1519b_2047b_frames);
+       rmon_stats->hist[7] =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_2048b_4095b_frames);
+       rmon_stats->hist[8] =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_4096b_9216b_frames);
+       rmon_stats->hist[9] =
+               BNXT_GET_RX_PORT_STATS64(rx, rx_9217b_16383b_frames);
+
+       rmon_stats->hist_tx[0] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_64b_frames);
+       rmon_stats->hist_tx[1] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_65b_127b_frames);
+       rmon_stats->hist_tx[2] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_128b_255b_frames);
+       rmon_stats->hist_tx[3] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_256b_511b_frames);
+       rmon_stats->hist_tx[4] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_512b_1023b_frames);
+       rmon_stats->hist_tx[5] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_1024b_1518b_frames);
+       rmon_stats->hist_tx[6] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_1519b_2047b_frames);
+       rmon_stats->hist_tx[7] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_2048b_4095b_frames);
+       rmon_stats->hist_tx[8] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_4096b_9216b_frames);
+       rmon_stats->hist_tx[9] =
+               BNXT_GET_TX_PORT_STATS64(tx, tx_9217b_16383b_frames);
+
+       *ranges = bnxt_rmon_ranges;
+}
+
 void bnxt_ethtool_free(struct bnxt *bp)
 {
        kfree(bp->test_info);
@@ -4049,4 +4170,8 @@ const struct ethtool_ops bnxt_ethtool_ops = {
        .set_dump               = bnxt_set_dump,
        .get_dump_flag          = bnxt_get_dump_flag,
        .get_dump_data          = bnxt_get_dump_data,
+       .get_eth_phy_stats      = bnxt_get_eth_phy_stats,
+       .get_eth_mac_stats      = bnxt_get_eth_mac_stats,
+       .get_eth_ctrl_stats     = bnxt_get_eth_ctrl_stats,
+       .get_rmon_stats         = bnxt_get_rmon_stats,
 };