Thread (24 messages) 24 messages, 4 authors, 2023-02-28
STALE1199d

[PATCH v2 net-next 4/5] net: dsa: microchip: add eth phy grouping for ethtool statistics

From: Rakesh Sankaranarayanan <hidden>
Date: 2023-02-17 11:02:58
Also in: lkml
Subsystem: microchip ksz series ethernet switch driver, networking drivers, networking [dsa], the rest · Maintainers: Woojung Huh, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Vladimir Oltean, Linus Torvalds

    Add support for ethtool standard device statistics grouping. Support
    ethernet phy statistics grouping using eth-phy groups parameter in
    ethtool command.

Signed-off-by: Rakesh Sankaranarayanan <redacted>
---
 drivers/net/dsa/microchip/ksz_common.c  | 13 +++++++++
 drivers/net/dsa/microchip/ksz_common.h  |  2 ++
 drivers/net/dsa/microchip/ksz_ethtool.c | 36 +++++++++++++++++++++++++
 drivers/net/dsa/microchip/ksz_ethtool.h |  5 ++++
 4 files changed, 56 insertions(+)
diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c
index e4a51f13afa4..01adcbeffaaa 100644
--- a/drivers/net/dsa/microchip/ksz_common.c
+++ b/drivers/net/dsa/microchip/ksz_common.c
@@ -208,6 +208,7 @@ static const struct ksz_dev_ops ksz8_dev_ops = {
 	.get_rmon_stats = ksz8_get_rmon_stats,
 	.get_eth_ctrl_stats = ksz8_get_eth_ctrl_stats,
 	.get_eth_mac_stats = ksz8_get_eth_mac_stats,
+	.get_eth_phy_stats = ksz8_get_eth_phy_stats,
 	.mdb_add = ksz8_mdb_add,
 	.mdb_del = ksz8_mdb_del,
 	.vlan_filtering = ksz8_port_vlan_filtering,
@@ -248,6 +249,7 @@ static const struct ksz_dev_ops ksz9477_dev_ops = {
 	.get_rmon_stats = ksz9477_get_rmon_stats,
 	.get_eth_ctrl_stats = ksz9477_get_eth_ctrl_stats,
 	.get_eth_mac_stats = ksz9477_get_eth_mac_stats,
+	.get_eth_phy_stats = ksz9477_get_eth_phy_stats,
 	.vlan_filtering = ksz9477_port_vlan_filtering,
 	.vlan_add = ksz9477_port_vlan_add,
 	.vlan_del = ksz9477_port_vlan_del,
@@ -287,6 +289,7 @@ static const struct ksz_dev_ops lan937x_dev_ops = {
 	.get_rmon_stats = ksz9477_get_rmon_stats,
 	.get_eth_ctrl_stats = ksz9477_get_eth_ctrl_stats,
 	.get_eth_mac_stats = ksz9477_get_eth_mac_stats,
+	.get_eth_phy_stats = ksz9477_get_eth_phy_stats,
 	.vlan_filtering = ksz9477_port_vlan_filtering,
 	.vlan_add = ksz9477_port_vlan_add,
 	.vlan_del = ksz9477_port_vlan_del,
@@ -1768,6 +1771,15 @@ static void ksz_get_eth_mac_stats(struct dsa_switch *ds, int port,
 		dev->dev_ops->get_eth_mac_stats(dev, port, mac_stats);
 }
 
+static void ksz_get_eth_phy_stats(struct dsa_switch *ds, int port,
+				  struct ethtool_eth_phy_stats *phy_stats)
+{
+	struct ksz_device *dev = ds->priv;
+
+	if (dev->dev_ops->get_eth_phy_stats)
+		dev->dev_ops->get_eth_phy_stats(dev, port, phy_stats);
+}
+
 static void ksz_get_strings(struct dsa_switch *ds, int port,
 			    u32 stringset, uint8_t *buf)
 {
@@ -3227,6 +3239,7 @@ static const struct dsa_switch_ops ksz_switch_ops = {
 	.get_rmon_stats		= ksz_get_rmon_stats,
 	.get_eth_ctrl_stats	= ksz_get_eth_ctrl_stats,
 	.get_eth_mac_stats	= ksz_get_eth_mac_stats,
+	.get_eth_phy_stats	= ksz_get_eth_phy_stats,
 	.port_change_mtu	= ksz_change_mtu,
 	.port_max_mtu		= ksz_max_mtu,
 	.get_ts_info		= ksz_get_ts_info,
diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h
index 738e81923c31..8a71e035b699 100644
--- a/drivers/net/dsa/microchip/ksz_common.h
+++ b/drivers/net/dsa/microchip/ksz_common.h
@@ -368,6 +368,8 @@ struct ksz_dev_ops {
 				   struct ethtool_eth_ctrl_stats *ctrl_stats);
 	void (*get_eth_mac_stats)(struct ksz_device *dev, int port,
 				  struct ethtool_eth_mac_stats *mac_stats);
+	void (*get_eth_phy_stats)(struct ksz_device *dev, int port,
+				  struct ethtool_eth_phy_stats *phy_stats);
 };
 
 struct ksz_device *ksz_switch_alloc(struct device *base, void *priv);
diff --git a/drivers/net/dsa/microchip/ksz_ethtool.c b/drivers/net/dsa/microchip/ksz_ethtool.c
index 42954bbfb9b4..c0b95d78e41e 100644
--- a/drivers/net/dsa/microchip/ksz_ethtool.c
+++ b/drivers/net/dsa/microchip/ksz_ethtool.c
@@ -204,6 +204,24 @@ void ksz8_get_eth_mac_stats(struct ksz_device *dev, int port,
 	mutex_unlock(&mib->cnt_mutex);
 }
 
+void ksz8_get_eth_phy_stats(struct ksz_device *dev, int port,
+			    struct ethtool_eth_phy_stats *phy_stats)
+{
+	struct ksz_port_mib *mib;
+	u64 *cnt;
+
+	mib = &dev->ports[port].mib;
+
+	mutex_lock(&mib->cnt_mutex);
+
+	cnt = &mib->counters[KSZ8_RX_SYMBOL_ERR];
+	dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_SYMBOL_ERR, NULL, cnt);
+
+	phy_stats->SymbolErrorDuringCarrier = *cnt;
+
+	mutex_unlock(&mib->cnt_mutex);
+}
+
 void ksz9477_get_rmon_stats(struct ksz_device *dev, int port,
 			    struct ethtool_rmon_stats *rmon_stats,
 			    const struct ethtool_rmon_hist_range **ranges)
@@ -310,3 +328,21 @@ void ksz9477_get_eth_mac_stats(struct ksz_device *dev, int port,
 
 	mutex_unlock(&mib->cnt_mutex);
 }
+
+void ksz9477_get_eth_phy_stats(struct ksz_device *dev, int port,
+			       struct ethtool_eth_phy_stats *phy_stats)
+{
+	struct ksz_port_mib *mib;
+	u64 *cnt;
+
+	mib = &dev->ports[port].mib;
+
+	mutex_lock(&mib->cnt_mutex);
+
+	cnt = &mib->counters[KSZ9477_RX_SYMBOL_ERR];
+	dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_SYMBOL_ERR, NULL, cnt);
+
+	phy_stats->SymbolErrorDuringCarrier = *cnt;
+
+	mutex_unlock(&mib->cnt_mutex);
+}
diff --git a/drivers/net/dsa/microchip/ksz_ethtool.h b/drivers/net/dsa/microchip/ksz_ethtool.h
index 2dcfe8922b4e..042a0b38a899 100644
--- a/drivers/net/dsa/microchip/ksz_ethtool.h
+++ b/drivers/net/dsa/microchip/ksz_ethtool.h
@@ -15,6 +15,8 @@ void ksz8_get_eth_ctrl_stats(struct ksz_device *dev, int port,
 			     struct ethtool_eth_ctrl_stats *ctrl_stats);
 void ksz8_get_eth_mac_stats(struct ksz_device *dev, int port,
 			    struct ethtool_eth_mac_stats *mac_stats);
+void ksz8_get_eth_phy_stats(struct ksz_device *dev, int port,
+			    struct ethtool_eth_phy_stats *phy_stats);
 
 void ksz9477_get_rmon_stats(struct ksz_device *dev, int port,
 			    struct ethtool_rmon_stats *rmon_stats,
@@ -23,4 +25,7 @@ void ksz9477_get_eth_ctrl_stats(struct ksz_device *dev, int port,
 				struct ethtool_eth_ctrl_stats *ctrl_stats);
 void ksz9477_get_eth_mac_stats(struct ksz_device *dev, int port,
 			       struct ethtool_eth_mac_stats *mac_stats);
+void ksz9477_get_eth_phy_stats(struct ksz_device *dev, int port,
+			       struct ethtool_eth_phy_stats *phy_stats);
+
 #endif
-- 
2.34.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help