]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
r8169: implement additional ethtool stats ops
authorHeiner Kallweit <hkallweit1@gmail.com>
Sun, 13 Oct 2024 09:17:39 +0000 (11:17 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 15 Oct 2024 16:52:01 +0000 (09:52 -0700)
This adds support for ethtool standard statistics, and makes use of the
extended hardware statistics being available from RTl8125.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/58e0da73-a7dd-4be3-82ae-d5b3f9069bde@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/realtek/r8169_main.c

index 30de74565228771e33f3c82aab670b1e479c8fc0..c3678c4420225cfc80922a6f31dc23f135143cab 100644 (file)
@@ -2161,6 +2161,19 @@ static void rtl8169_get_ringparam(struct net_device *dev,
        data->tx_pending = NUM_TX_DESC;
 }
 
+static void rtl8169_get_pause_stats(struct net_device *dev,
+                                   struct ethtool_pause_stats *pause_stats)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       if (!rtl_is_8125(tp))
+               return;
+
+       rtl8169_update_counters(tp);
+       pause_stats->tx_pause_frames = le32_to_cpu(tp->counters->tx_pause_on);
+       pause_stats->rx_pause_frames = le32_to_cpu(tp->counters->rx_pause_on);
+}
+
 static void rtl8169_get_pauseparam(struct net_device *dev,
                                   struct ethtool_pauseparam *data)
 {
@@ -2187,6 +2200,69 @@ static int rtl8169_set_pauseparam(struct net_device *dev,
        return 0;
 }
 
+static void rtl8169_get_eth_mac_stats(struct net_device *dev,
+                                     struct ethtool_eth_mac_stats *mac_stats)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       rtl8169_update_counters(tp);
+
+       mac_stats->FramesTransmittedOK =
+               le64_to_cpu(tp->counters->tx_packets);
+       mac_stats->SingleCollisionFrames =
+               le32_to_cpu(tp->counters->tx_one_collision);
+       mac_stats->MultipleCollisionFrames =
+               le32_to_cpu(tp->counters->tx_multi_collision);
+       mac_stats->FramesReceivedOK =
+               le64_to_cpu(tp->counters->rx_packets);
+       mac_stats->AlignmentErrors =
+               le16_to_cpu(tp->counters->align_errors);
+       mac_stats->FramesLostDueToIntMACXmitError =
+               le64_to_cpu(tp->counters->tx_errors);
+       mac_stats->BroadcastFramesReceivedOK =
+               le64_to_cpu(tp->counters->rx_broadcast);
+       mac_stats->MulticastFramesReceivedOK =
+               le32_to_cpu(tp->counters->rx_multicast);
+
+       if (!rtl_is_8125(tp))
+               return;
+
+       mac_stats->AlignmentErrors =
+               le32_to_cpu(tp->counters->align_errors32);
+       mac_stats->OctetsTransmittedOK =
+               le64_to_cpu(tp->counters->tx_octets);
+       mac_stats->LateCollisions =
+               le32_to_cpu(tp->counters->tx_late_collision);
+       mac_stats->FramesAbortedDueToXSColls =
+               le32_to_cpu(tp->counters->tx_aborted32);
+       mac_stats->OctetsReceivedOK =
+               le64_to_cpu(tp->counters->rx_octets);
+       mac_stats->FramesLostDueToIntMACRcvError =
+               le32_to_cpu(tp->counters->rx_mac_error);
+       mac_stats->MulticastFramesXmittedOK =
+               le64_to_cpu(tp->counters->tx_multicast64);
+       mac_stats->BroadcastFramesXmittedOK =
+               le64_to_cpu(tp->counters->tx_broadcast64);
+       mac_stats->MulticastFramesReceivedOK =
+               le64_to_cpu(tp->counters->rx_multicast64);
+        mac_stats->FrameTooLongErrors =
+               le32_to_cpu(tp->counters->rx_frame_too_long);
+}
+
+static void rtl8169_get_eth_ctrl_stats(struct net_device *dev,
+                                      struct ethtool_eth_ctrl_stats *ctrl_stats)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       if (!rtl_is_8125(tp))
+               return;
+
+       rtl8169_update_counters(tp);
+
+       ctrl_stats->UnsupportedOpcodesReceived =
+               le32_to_cpu(tp->counters->rx_unknown_opcode);
+}
+
 static const struct ethtool_ops rtl8169_ethtool_ops = {
        .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
                                     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -2208,8 +2284,11 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
        .get_link_ksettings     = phy_ethtool_get_link_ksettings,
        .set_link_ksettings     = phy_ethtool_set_link_ksettings,
        .get_ringparam          = rtl8169_get_ringparam,
+       .get_pause_stats        = rtl8169_get_pause_stats,
        .get_pauseparam         = rtl8169_get_pauseparam,
        .set_pauseparam         = rtl8169_set_pauseparam,
+       .get_eth_mac_stats      = rtl8169_get_eth_mac_stats,
+       .get_eth_ctrl_stats     = rtl8169_get_eth_ctrl_stats,
 };
 
 static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
@@ -3894,6 +3973,9 @@ static void rtl_hw_start_8125(struct rtl8169_private *tp)
                break;
        }
 
+       /* enable extended tally counter */
+       r8168_mac_ocp_modify(tp, 0xea84, 0, BIT(1) | BIT(0));
+
        rtl_hw_config(tp);
 }