drivers/net/phy/microchip_t1.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
Currently, for a LAN8870 phy, before link up, a call to ethtool to set
master-slave fails with 'operation not supported'. Reason: speed, duplex
and master/slave are not properly initialized.
This change sets proper initial states for speed and duplex and publishes
master-slave states. A default link up for speed 1000, full duplex and
slave mode then works without having to call ethtool.
Signed-off-by: Josef Raschen <josef@raschen.org>
---
drivers/net/phy/microchip_t1.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/net/phy/microchip_t1.c b/drivers/net/phy/microchip_t1.c
index 62b36a318100..5fcbfa730910 100644
--- a/drivers/net/phy/microchip_t1.c
+++ b/drivers/net/phy/microchip_t1.c
@@ -1319,7 +1319,12 @@ static int lan887x_phy_init(struct phy_device *phydev)
return ret;
/* PHY interface setup */
- return lan887x_config_phy_interface(phydev);
+ ret = lan887x_config_phy_interface(phydev);
+ if (ret < 0)
+ return ret;
+
+ /* Make configuration visible for ethtool. */
+ return genphy_c45_pma_baset1_read_master_slave(phydev);
}
static int lan887x_phy_config(struct phy_device *phydev,
@@ -1489,7 +1494,12 @@ static int lan887x_config_aneg(struct phy_device *phydev)
if (ret < 0)
return ret;
- return lan887x_phy_reconfig(phydev);
+ ret = lan887x_phy_reconfig(phydev);
+ if (ret < 0)
+ return ret;
+
+ /* Make configuration changes visible for ethtool. */
+ return genphy_c45_pma_baset1_read_master_slave(phydev);
}
static int lan887x_probe(struct phy_device *phydev)
@@ -1503,6 +1513,10 @@ static int lan887x_probe(struct phy_device *phydev)
priv->init_done = false;
phydev->priv = priv;
+ /* Set default link parameters. */
+ phydev->duplex = DUPLEX_FULL;
+ phydev->speed = SPEED_1000;
+
return lan887x_phy_setup(phydev);
}
--
2.43.0
On Thu, Sep 25, 2025 at 10:52:22PM +0200, Josef Raschen wrote: > Currently, for a LAN8870 phy, before link up, a call to ethtool to set > master-slave fails with 'operation not supported'. Reason: speed, duplex > and master/slave are not properly initialized. > > This change sets proper initial states for speed and duplex and publishes > master-slave states. A default link up for speed 1000, full duplex and > slave mode then works without having to call ethtool. Hi Josef What you are missing from the commit message is an explanation why the LAN8870 is special, it needs to do something no other PHY does. Is there something broken with this PHY? Some register not following 802.3? Andrew --- pw-bot: cr
Hello Andrew, Thanks for your feedback. On 9/26/25 00:00, Andrew Lunn wrote: > On Thu, Sep 25, 2025 at 10:52:22PM +0200, Josef Raschen wrote: >> Currently, for a LAN8870 phy, before link up, a call to ethtool to set >> master-slave fails with 'operation not supported'. Reason: speed, duplex >> and master/slave are not properly initialized. >> >> This change sets proper initial states for speed and duplex and publishes >> master-slave states. A default link up for speed 1000, full duplex and >> slave mode then works without having to call ethtool. > > Hi Josef > > What you are missing from the commit message is an explanation why the > LAN8870 is special, it needs to do something no other PHY does. Is > there something broken with this PHY? Some register not following > 802.3? > > Andrew > > --- > pw-bot: cr > Special about the LAN8870 might be that it is a dual speed T1 phy. As most other T1 pyhs have only one possible configuration the unknown speed configuration was not a problem so far. But here, when calling link up without manually setting the speed before, it seems to pick speed 100 in phy_sanitize_settings(). I assume that this is not the desired behavior? The second problem is that ethtool initially does not allow to set master-slave at all. You first have to call ethtool without the master-slave argument, then again with it. This is fixed by reading the master slave configuration from the device which seems to be missing in the .config_init and .config_aneg functions. I took this solution from net/phy/dp83tg720.c. Regards, Josef
On Fri, Sep 26, 2025 at 11:24:56PM +0200, Josef Raschen wrote: > Hello Andrew, > > Thanks for your feedback. > > On 9/26/25 00:00, Andrew Lunn wrote: > > On Thu, Sep 25, 2025 at 10:52:22PM +0200, Josef Raschen wrote: > > > Currently, for a LAN8870 phy, before link up, a call to ethtool to set > > > master-slave fails with 'operation not supported'. Reason: speed, duplex > > > and master/slave are not properly initialized. > > > > > > This change sets proper initial states for speed and duplex and publishes > > > master-slave states. A default link up for speed 1000, full duplex and > > > slave mode then works without having to call ethtool. > > > > Hi Josef > > > > What you are missing from the commit message is an explanation why the > > LAN8870 is special, it needs to do something no other PHY does. Is > > there something broken with this PHY? Some register not following > > 802.3? > > > > Andrew > > > > --- > > pw-bot: cr > > > > Special about the LAN8870 might be that it is a dual speed T1 phy. > As most other T1 pyhs have only one possible configuration the unknown > speed configuration was not a problem so far. But here, when > calling link up without manually setting the speed before, it seems to > pick speed 100 in phy_sanitize_settings(). I assume that this is not the > desired behavior? What speeds does the PHY say it supports? phy_sanitize_settings() should pick the highest speed the PHY supports as the default. So if it is picking 100, it suggests the PHY is not reporting it supports 1000? Or phy_sanitize_settings() is broken for 1000Base-T1? Please try understand why it is picking 100. > The second problem is that ethtool initially does not allow to set > master-slave at all. You first have to call ethtool without the > master-slave argument, then again with it. This is fixed by reading > the master slave configuration from the device which seems to be missing > in the .config_init and .config_aneg functions. I took this solution from > net/phy/dp83tg720.c. How does this work with a regular T4 or T2 PHY? Ideally, A T1 should be no different. And ideally, we want a solution for all T1 PHYs, assuming it is not something which is special for this PHY. Andrew
On 9/26/25 23:46, Andrew Lunn wrote: > On Fri, Sep 26, 2025 at 11:24:56PM +0200, Josef Raschen wrote: >> Hello Andrew, >> >> Thanks for your feedback. >> >> On 9/26/25 00:00, Andrew Lunn wrote: >>> On Thu, Sep 25, 2025 at 10:52:22PM +0200, Josef Raschen wrote: >>>> Currently, for a LAN8870 phy, before link up, a call to ethtool to set >>>> master-slave fails with 'operation not supported'. Reason: speed, duplex >>>> and master/slave are not properly initialized. >>>> >>>> This change sets proper initial states for speed and duplex and publishes >>>> master-slave states. A default link up for speed 1000, full duplex and >>>> slave mode then works without having to call ethtool. >>> >>> Hi Josef >>> >>> What you are missing from the commit message is an explanation why the >>> LAN8870 is special, it needs to do something no other PHY does. Is >>> there something broken with this PHY? Some register not following >>> 802.3? >>> >>> Andrew >>> >>> --- >>> pw-bot: cr >>> >> >> Special about the LAN8870 might be that it is a dual speed T1 phy. >> As most other T1 pyhs have only one possible configuration the unknown >> speed configuration was not a problem so far. But here, when >> calling link up without manually setting the speed before, it seems to >> pick speed 100 in phy_sanitize_settings(). I assume that this is not the >> desired behavior? > > What speeds does the PHY say it supports? > > phy_sanitize_settings() should pick the highest speed the PHY supports > as the default. So if it is picking 100, it suggests the PHY is not > reporting it supports 1000? Or phy_sanitize_settings() is broken for > 1000Base-T1? Please try understand why it is picking 100. It should pick 1000 then for this phy. I checked already that the device is actually reporting being 100Base-T1 and 1000Base-T1 capable. I will have a look, why it doesn't pick SPEED_1000 then. I did not know that phy_sanitize_settings() is supposed to pick the highest speed already. >> The second problem is that ethtool initially does not allow to set >> master-slave at all. You first have to call ethtool without the >> master-slave argument, then again with it. This is fixed by reading >> the master slave configuration from the device which seems to be missing >> in the .config_init and .config_aneg functions. I took this solution from >> net/phy/dp83tg720.c. > > How does this work with a regular T4 or T2 PHY? Ideally, A T1 should > be no different. And ideally, we want a solution for all T1 PHYs, > assuming it is not something which is special for this PHY. I agree, a generic solution would be best. I will read a bit into the code to see if there is a better solution. Thanks, Josef
© 2016 - 2025 Red Hat, Inc.