* [PATCH net-next] net: phy: smsc: Implement PHY statistics
@ 2017-06-02 21:24 Andrew Lunn
2017-06-02 23:35 ` Woojung.Huh
2017-06-02 23:44 ` Florian Fainelli
0 siblings, 2 replies; 5+ messages in thread
From: Andrew Lunn @ 2017-06-02 21:24 UTC (permalink / raw)
To: David Miller
Cc: Vivien Didelot, Chris Healy, Nikita Yushchenko, netdev,
Andrew Lunn
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
^ permalink raw reply related [flat|nested] 5+ messages in thread
* RE: [PATCH net-next] net: phy: smsc: Implement PHY statistics
2017-06-02 21:24 [PATCH net-next] net: phy: smsc: Implement PHY statistics Andrew Lunn
@ 2017-06-02 23:35 ` Woojung.Huh
2017-06-03 0:52 ` Andrew Lunn
2017-06-02 23:44 ` Florian Fainelli
1 sibling, 1 reply; 5+ messages in thread
From: Woojung.Huh @ 2017-06-02 23:35 UTC (permalink / raw)
To: andrew, davem; +Cc: vivien.didelot, cphealy, nikita.yoush, netdev
Andrew,
> 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,
> +
...
>
> + /* Statistics */
> + .get_sset_count = smsc_get_sset_count,
> + .get_strings = smsc_get_strings,
> + .get_stats = smsc_get_stats,
> +
...
> + /* Statistics */
> + .get_sset_count = smsc_get_sset_count,
> + .get_strings = smsc_get_strings,
> + .get_stats = smsc_get_stats,
> +
...
> + /* 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
> + .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>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next] net: phy: smsc: Implement PHY statistics
2017-06-02 21:24 [PATCH net-next] net: phy: smsc: Implement PHY statistics Andrew Lunn
2017-06-02 23:35 ` Woojung.Huh
@ 2017-06-02 23:44 ` Florian Fainelli
1 sibling, 0 replies; 5+ messages in thread
From: Florian Fainelli @ 2017-06-02 23:44 UTC (permalink / raw)
To: Andrew Lunn, David Miller
Cc: Vivien Didelot, Chris Healy, Nikita Yushchenko, netdev
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next] net: phy: smsc: Implement PHY statistics
2017-06-02 23:35 ` Woojung.Huh
@ 2017-06-03 0:52 ` Andrew Lunn
2017-06-03 2:27 ` Woojung.Huh
0 siblings, 1 reply; 5+ messages in thread
From: Andrew Lunn @ 2017-06-03 0:52 UTC (permalink / raw)
To: Woojung.Huh; +Cc: davem, vivien.didelot, cphealy, nikita.yoush, netdev
Hi Woojung
> Just cosmetic thing.
> How about aligning with other members in structure like
Yes, i can do that. v2 tomorrow sometime.
> > + .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
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [PATCH net-next] net: phy: smsc: Implement PHY statistics
2017-06-03 0:52 ` Andrew Lunn
@ 2017-06-03 2:27 ` Woojung.Huh
0 siblings, 0 replies; 5+ messages in thread
From: Woojung.Huh @ 2017-06-03 2:27 UTC (permalink / raw)
To: andrew; +Cc: davem, vivien.didelot, cphealy, nikita.yoush, netdev
>> 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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-06-03 2:27 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-02 21:24 [PATCH net-next] net: phy: smsc: Implement PHY statistics Andrew Lunn
2017-06-02 23:35 ` Woojung.Huh
2017-06-03 0:52 ` Andrew Lunn
2017-06-03 2:27 ` Woojung.Huh
2017-06-02 23:44 ` Florian Fainelli
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox