[PATCH net-next] net: phy: smsc: Implement PHY statistics

Subsystems: ethernet phy library, networking drivers, the rest

STALE3427d

5 messages, 3 authors, 2017-06-03 · open the first message on its own page

[PATCH net-next] net: phy: smsc: Implement PHY statistics

From: Andrew Lunn <andrew@lunn.ch>
Date: 2017-06-02 21:24:51

Most of the PHYs supported by the SMSC driver have a counter of symbol
errors. This is 16 bit wide and wraps around when it reaches its
maximum value.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 drivers/net/phy/smsc.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)
diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
index 67c9f2b26c8e..d78b0cd3a435 100644
--- a/drivers/net/phy/smsc.c
+++ b/drivers/net/phy/smsc.c
@@ -25,6 +25,16 @@
 #include <linux/netdevice.h>
 #include <linux/smscphy.h>
 
+struct smsc_hw_stat {
+	const char *string;
+	u8 reg;
+	u8 bits;
+};
+
+static struct smsc_hw_stat smsc_hw_stats[] = {
+	{ "phy_symbol_errors", 26, 16},
+};
+
 struct smsc_phy_priv {
 	bool energy_enable;
 };
@@ -143,6 +153,48 @@ static int lan87xx_read_status(struct phy_device *phydev)
 	return err;
 }
 
+static int smsc_get_sset_count(struct phy_device *phydev)
+{
+	return ARRAY_SIZE(smsc_hw_stats);
+}
+
+static void smsc_get_strings(struct phy_device *phydev, u8 *data)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(smsc_hw_stats); i++) {
+		memcpy(data + i * ETH_GSTRING_LEN,
+		       smsc_hw_stats[i].string, ETH_GSTRING_LEN);
+	}
+}
+
+#ifndef UINT64_MAX
+#define UINT64_MAX              (u64)(~((u64)0))
+#endif
+static u64 smsc_get_stat(struct phy_device *phydev, int i)
+{
+	struct smsc_hw_stat stat = smsc_hw_stats[i];
+	int val;
+	u64 ret;
+
+	val = phy_read(phydev, stat.reg);
+	if (val < 0)
+		ret = UINT64_MAX;
+	else
+		ret = val;
+
+	return ret;
+}
+
+static void smsc_get_stats(struct phy_device *phydev,
+			   struct ethtool_stats *stats, u64 *data)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(smsc_hw_stats); i++)
+		data[i] = smsc_get_stat(phydev, i);
+}
+
 static int smsc_phy_probe(struct phy_device *phydev)
 {
 	struct device *dev = &phydev->mdio.dev;
@@ -206,6 +258,11 @@ static struct phy_driver smsc_phy_driver[] = {
 	.ack_interrupt	= smsc_phy_ack_interrupt,
 	.config_intr	= smsc_phy_config_intr,
 
+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
 	.suspend	= genphy_suspend,
 	.resume		= genphy_resume,
 }, {
@@ -228,6 +285,11 @@ static struct phy_driver smsc_phy_driver[] = {
 	.ack_interrupt	= smsc_phy_ack_interrupt,
 	.config_intr	= smsc_phy_config_intr,
 
+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
 	.suspend	= genphy_suspend,
 	.resume		= genphy_resume,
 }, {
@@ -271,6 +333,11 @@ static struct phy_driver smsc_phy_driver[] = {
 	.ack_interrupt	= smsc_phy_ack_interrupt,
 	.config_intr	= smsc_phy_config_intr,
 
+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
 	.suspend	= genphy_suspend,
 	.resume		= genphy_resume,
 }, {
@@ -293,6 +360,11 @@ static struct phy_driver smsc_phy_driver[] = {
 	.ack_interrupt	= smsc_phy_ack_interrupt,
 	.config_intr	= smsc_phy_config_intr,
 
+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
 	.suspend	= genphy_suspend,
 	.resume		= genphy_resume,
 } };
-- 
2.11.0

RE: [PATCH net-next] net: phy: smsc: Implement PHY statistics

From: <Woojung.Huh@microchip.com>
Date: 2017-06-02 23:35:09

Andrew,
quoted hunk
 static int smsc_phy_probe(struct phy_device *phydev)
 {
 	struct device *dev = &phydev->mdio.dev;
@@ -206,6 +258,11 @@ static struct phy_driver smsc_phy_driver[] = {
 	.ack_interrupt	= smsc_phy_ack_interrupt,
 	.config_intr	= smsc_phy_config_intr,

+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
...
quoted hunk

+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
...
quoted hunk
+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
...
quoted hunk
+	/* Statistics */
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings = smsc_get_strings,
+	.get_stats = smsc_get_stats,
+
Just cosmetic thing.
How about aligning with other members in structure like
quoted hunk
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings     = smsc_get_strings,
+	.get_stats        = smsc_get_stats,
Reviewed-By: Woojung Huh <Woojung.Huh@microchip.com>

Re: [PATCH net-next] net: phy: smsc: Implement PHY statistics

From: Florian Fainelli <f.fainelli@gmail.com>
Date: 2017-06-02 23:44:35

On 06/02/2017 02:24 PM, Andrew Lunn wrote:
Most of the PHYs supported by the SMSC driver have a counter of symbol
errors. This is 16 bit wide and wraps around when it reaches its
maximum value.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

Re: [PATCH net-next] net: phy: smsc: Implement PHY statistics

From: Andrew Lunn <andrew@lunn.ch>
Date: 2017-06-03 00:52:53

Hi Woojung
Just cosmetic thing.
How about aligning with other members in structure like
Yes, i can do that. v2 tomorrow sometime.
quoted
+	.get_sset_count = smsc_get_sset_count,
+	.get_strings     = smsc_get_strings,
+	.get_stats        = smsc_get_stats,
Reviewed-By: Woojung Huh <Woojung.Huh@microchip.com>
Thanks.

Can you confirm the LAN911x Internal PHY don't have this. The register
is not listed in the switch datasheet.

Thanks
	Andrew

RE: [PATCH net-next] net: phy: smsc: Implement PHY statistics

From: <Woojung.Huh@microchip.com>
Date: 2017-06-03 02:27:16

quoted
Just cosmetic thing.
How about aligning with other members in structure like
Yes, i can do that. v2 tomorrow sometime.
Thanks.
Can you confirm the LAN911x Internal PHY don't have this. The register
is not listed in the switch datasheet.
This register is NOT in LAN911x internal phy.
http://ww1.microchip.com/downloads/en/DeviceDoc/00002266A.pdf

- Woojung
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help