diff mbox series

[net-next,03/10] net: phy: add configuration of rx clock stop mode

Message ID E1tKefY-006SMd-Af@rmk-PC.armlinux.org.uk (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series net: add phylink managed EEE support | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1 this patch: 1
netdev/build_tools success Errors and warnings before: 0 (+23) this patch: 0 (+23)
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang success Errors and warnings before: 10 this patch: 10
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 367 this patch: 367
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 46 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 66 this patch: 66
netdev/source_inline success Was 0 now: 0

Commit Message

Russell King (Oracle) Dec. 9, 2024, 2:23 p.m. UTC
Add a function to allow configuration of the PCS's clock stop enable
bit, used to configure whether the xMII receive clock can be stopped
during LPI mode.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/phy/phy.c | 27 ++++++++++++++++++++++-----
 include/linux/phy.h   |  1 +
 2 files changed, 23 insertions(+), 5 deletions(-)

Comments

Andrew Lunn Dec. 10, 2024, 3:03 a.m. UTC | #1
On Mon, Dec 09, 2024 at 02:23:28PM +0000, Russell King (Oracle) wrote:
> Add a function to allow configuration of the PCS's clock stop enable
> bit, used to configure whether the xMII receive clock can be stopped
> during LPI mode.
> 
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew
Andrew Lunn Dec. 10, 2024, 3:11 a.m. UTC | #2
> @@ -2073,6 +2073,7 @@ int phy_unregister_fixup_for_id(const char *bus_id);
>  int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
>  
>  int phy_eee_tx_clock_stop_capable(struct phy_device *phydev);
> +int phy_eee_rx_clock_stop(struct phy_device *phydev, bool clk_stop_enable);

Hi Russell

Do you have patches to MAC drivers using phylib, not phylink, using
these two new calls?

We see phylib users get EEE wrong. I'm worried phylib users are going
to try to use these new API methods and make an even bigger mess. If
we think these should only be used by phylink, maybe they should be
put into a header in drivers/net/phy to stop MAC drivers using them?

	Andrew
Russell King (Oracle) Dec. 10, 2024, 9:51 a.m. UTC | #3
On Tue, Dec 10, 2024 at 04:11:09AM +0100, Andrew Lunn wrote:
> > @@ -2073,6 +2073,7 @@ int phy_unregister_fixup_for_id(const char *bus_id);
> >  int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
> >  
> >  int phy_eee_tx_clock_stop_capable(struct phy_device *phydev);
> > +int phy_eee_rx_clock_stop(struct phy_device *phydev, bool clk_stop_enable);
> 
> Hi Russell
> 
> Do you have patches to MAC drivers using phylib, not phylink, using
> these two new calls?
> 
> We see phylib users get EEE wrong. I'm worried phylib users are going
> to try to use these new API methods and make an even bigger mess. If
> we think these should only be used by phylink, maybe they should be
> put into a header in drivers/net/phy to stop MAC drivers using them?

If we want to fix the current phylib-using drivers, then we do need
at minimum phy_eee_rx_clock_stop() to do that - we have drivers that
call phy_init_eee(..., true) which would need to call this.

It's quite rare that drivers allow the PHY to stop the clock. There
may be several reasons for this:

1) the MAC doesn't support EEE on the MII link type(s) that have a
   clock. (e.g. supporting EEE on SGMII but not RGMII.)

2) the documentation for the MAC doesn't comment on this aspect
   (so the safest thing is to always keep the clock running.)

3) the driver developer hasn't understood the feature and the safest
   approach is to pass phy_init_eee() with a value of zero/false
   which leaves the setting unchanged.
Andrew Lunn Dec. 10, 2024, 11:15 p.m. UTC | #4
On Tue, Dec 10, 2024 at 09:51:54AM +0000, Russell King (Oracle) wrote:
> On Tue, Dec 10, 2024 at 04:11:09AM +0100, Andrew Lunn wrote:
> > > @@ -2073,6 +2073,7 @@ int phy_unregister_fixup_for_id(const char *bus_id);
> > >  int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
> > >  
> > >  int phy_eee_tx_clock_stop_capable(struct phy_device *phydev);
> > > +int phy_eee_rx_clock_stop(struct phy_device *phydev, bool clk_stop_enable);
> > 
> > Hi Russell
> > 
> > Do you have patches to MAC drivers using phylib, not phylink, using
> > these two new calls?
> > 
> > We see phylib users get EEE wrong. I'm worried phylib users are going
> > to try to use these new API methods and make an even bigger mess. If
> > we think these should only be used by phylink, maybe they should be
> > put into a header in drivers/net/phy to stop MAC drivers using them?
> 
> If we want to fix the current phylib-using drivers, then we do need
> at minimum phy_eee_rx_clock_stop() to do that - we have drivers that
> call phy_init_eee(..., true) which would need to call this.

phy_init_eee() needs to die, so we need this one. 

But we should consider the other one, do we want to make it private?

	Andrew
diff mbox series

Patch

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 8fb4224c7576..caf472b5d4e5 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1660,6 +1660,27 @@  int phy_eee_tx_clock_stop_capable(struct phy_device *phydev)
 }
 EXPORT_SYMBOL_GPL(phy_eee_tx_clock_stop_capable);
 
+/**
+ * phy_eee_rx_clock_stop() - configure PHY receive clock in LPI
+ * @phydev: target phy_device struct
+ * @clk_stop_enable: flag to indicate whether the clock can be stopped
+ *
+ * Configure whether the PHY can disable its receive clock during LPI mode,
+ * See IEEE 802.3 sections 22.2.2.2, 35.2.2.10, and 45.2.3.1.4.
+ *
+ * Returns: 0 or negative error.
+ */
+int phy_eee_rx_clock_stop(struct phy_device *phydev, bool clk_stop_enable)
+{
+	/* Configure the PHY to stop receiving xMII
+	 * clock while it is signaling LPI.
+	 */
+	return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1,
+			      MDIO_PCS_CTRL1_CLKSTOP_EN,
+			      clk_stop_enable ? MDIO_PCS_CTRL1_CLKSTOP_EN : 0);
+}
+EXPORT_SYMBOL_GPL(phy_eee_rx_clock_stop);
+
 /**
  * phy_init_eee - init and check the EEE feature
  * @phydev: target phy_device struct
@@ -1684,11 +1705,7 @@  int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
 		return -EPROTONOSUPPORT;
 
 	if (clk_stop_enable)
-		/* Configure the PHY to stop receiving xMII
-		 * clock while it is signaling LPI.
-		 */
-		ret = phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1,
-				       MDIO_PCS_CTRL1_CLKSTOP_EN);
+		ret = phy_eee_rx_clock_stop(phydev, true);
 
 	return ret < 0 ? ret : 0;
 }
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 267de08c227c..f865a8fc56c3 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -2073,6 +2073,7 @@  int phy_unregister_fixup_for_id(const char *bus_id);
 int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
 
 int phy_eee_tx_clock_stop_capable(struct phy_device *phydev);
+int phy_eee_rx_clock_stop(struct phy_device *phydev, bool clk_stop_enable);
 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable);
 int phy_get_eee_err(struct phy_device *phydev);
 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_keee *data);