]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
eth: fbnic: Read PHY stats via the ethtool API
authorMohsin Bashir <mohsin.bashr@gmail.com>
Mon, 25 Aug 2025 20:02:05 +0000 (13:02 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 Aug 2025 01:56:19 +0000 (18:56 -0700)
Provide support to read PHY stats (FEC and PCS) via the ethtool API.

]# ethtool -I --show-fec eth0
FEC parameters for eth0:
Supported/Configured FEC encodings: RS
Active FEC encoding: RS
Statistics:
  corrected_blocks: 0
  uncorrectable_blocks: 0

]# ethtool -S eth0 --groups eth-phy
Standard stats for eth0:
eth-phy-SymbolErrorDuringCarrier: 0

Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250825200206.2357713-6-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c

index e6a60d7ea86416480d275c899db9028c78fabc81..4194b30f1074816c6d585381c33bb5b59be755c2 100644 (file)
@@ -1641,6 +1641,46 @@ static void fbnic_set_counter(u64 *stat, struct fbnic_stat_counter *counter)
                *stat = counter->value;
 }
 
+static void
+fbnic_get_fec_stats(struct net_device *netdev,
+                   struct ethtool_fec_stats *fec_stats)
+{
+       struct fbnic_net *fbn = netdev_priv(netdev);
+       struct fbnic_phy_stats *phy_stats;
+       struct fbnic_dev *fbd = fbn->fbd;
+
+       fbnic_get_hw_stats32(fbd);
+       phy_stats = &fbd->hw_stats.phy;
+
+       spin_lock(&fbd->hw_stats.lock);
+       fec_stats->corrected_blocks.total =
+               phy_stats->fec.corrected_blocks.value;
+       fec_stats->uncorrectable_blocks.total =
+               phy_stats->fec.uncorrectable_blocks.value;
+       spin_unlock(&fbd->hw_stats.lock);
+}
+
+static void
+fbnic_get_eth_phy_stats(struct net_device *netdev,
+                       struct ethtool_eth_phy_stats *eth_phy_stats)
+{
+       struct fbnic_net *fbn = netdev_priv(netdev);
+       struct fbnic_phy_stats *phy_stats;
+       struct fbnic_dev *fbd = fbn->fbd;
+       u64 total = 0;
+       int i;
+
+       fbnic_get_hw_stats32(fbd);
+       phy_stats = &fbd->hw_stats.phy;
+
+       spin_lock(&fbd->hw_stats.lock);
+       for (i = 0; i < FBNIC_PCS_MAX_LANES; i++)
+               total += phy_stats->pcs.SymbolErrorDuringCarrier.lanes[i].value;
+
+       eth_phy_stats->SymbolErrorDuringCarrier = total;
+       spin_unlock(&fbd->hw_stats.lock);
+}
+
 static void
 fbnic_get_eth_mac_stats(struct net_device *netdev,
                        struct ethtool_eth_mac_stats *eth_mac_stats)
@@ -1782,7 +1822,9 @@ static const struct ethtool_ops fbnic_ethtool_ops = {
        .get_ts_info                    = fbnic_get_ts_info,
        .get_ts_stats                   = fbnic_get_ts_stats,
        .get_link_ksettings             = fbnic_phylink_ethtool_ksettings_get,
+       .get_fec_stats                  = fbnic_get_fec_stats,
        .get_fecparam                   = fbnic_phylink_get_fecparam,
+       .get_eth_phy_stats              = fbnic_get_eth_phy_stats,
        .get_eth_mac_stats              = fbnic_get_eth_mac_stats,
        .get_eth_ctrl_stats             = fbnic_get_eth_ctrl_stats,
        .get_rmon_stats                 = fbnic_get_rmon_stats,