All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Andrew Lunn <andrew@lunn.ch>, Heiner Kallweit <hkallweit1@gmail.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>,
	Bryan Whitehead <bryan.whitehead@microchip.com>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Florian Fainelli <florian.fainelli@broadcom.com>,
	Jakub Kicinski <kuba@kernel.org>,
	Jose Abreu <joabreu@synopsys.com>,
	linux-arm-kernel@lists.infradead.org,
	linux-stm32@st-md-mailman.stormreply.com,
	Marcin Wojtas <marcin.s.wojtas@gmail.com>,
	Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	netdev@vger.kernel.org, Oleksij Rempel <o.rempel@pengutronix.de>,
	Paolo Abeni <pabeni@redhat.com>,
	UNGLinuxDriver@microchip.com
Subject: Re: [PATCH RFC net-next 00/23] net: phylink managed EEE support
Date: Tue, 26 Nov 2024 16:55:41 +0000	[thread overview]
Message-ID: <Z0X9jVhpLvBGkRXD@shell.armlinux.org.uk> (raw)
In-Reply-To: <Z0XEWGqLJ8okNSIr@shell.armlinux.org.uk>

On Tue, Nov 26, 2024 at 12:51:36PM +0000, Russell King (Oracle) wrote:
> In doing this, I came across the fact that the addition of phylib
> managed EEE support has actually broken a huge number of drivers -
> phylib will now overwrite all members of struct ethtool_keee whether
> the netdev driver wants it or not. This leads to weird scenarios where
> doing a get_eee() op followed by a set_eee() op results in e.g.
> tx_lpi_timer being zeroed, because the MAC driver doesn't know it needs
> to initialise phylib's phydev->eee_cfg.tx_lpi_timer member. This mess
> really needs urgently addressing, and I believe it came about because
> Andrew's patches were only partly merged via another party - I guess
> highlighting the inherent danger of "thou shalt limit your patch series
> to no more than 15 patches" when one has a subsystem who's in-kernel
> API is changing.

Note that, I think, fec_main.c isn't broken, although a quick review
only looking at fec_enet_get_eee() may suggest otherwise:

static int
fec_enet_get_eee(struct net_device *ndev, struct ethtool_keee *edata)
{
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct ethtool_keee *p = &fep->eee;

        if (!(fep->quirks & FEC_QUIRK_HAS_EEE))
                return -EOPNOTSUPP;

        if (!netif_running(ndev))
                return -ENETDOWN;

        edata->tx_lpi_timer = p->tx_lpi_timer; // <===========================

        return phy_ethtool_get_eee(ndev->phydev, edata);
}

static int
fec_enet_set_eee(struct net_device *ndev, struct ethtool_keee *edata)
{
...
        p->tx_lpi_timer = edata->tx_lpi_timer;

Since the driver does not touch phydev->eee_cfg.tx_lpi_timer,
phy_ethtool_get_eee() above will overwrite edata->tx_lpi_timer with
zero. If ethtool does a read-modify-write on the EEE settings, then
fec_enet_set_eee() will be passed a value of zero for
edata->tx_lpi_timer.

This will result in FEC_LPI_SLEEP and FEC_LPI_WAKE being written with
zero, and from what I can see in fec_enet_eee_mode_set(), that disables
EEE.

The saving grace for this driver is that p->tx_lpi_timer also starts
off as zero.

A better implementation would be to get rid of p->tx_lpi_timer
entirely, and instead rely on phydev->eee_cfg.tx_lpi_timer to be
managed by phylib, obtaining its value from there in
fec_enet_eee_mode_set(). At least the driver doesn't attempt to
maintain any other EEE state!

So something like this:


diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 1cca0425d493..c81f2ea588f2 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -671,8 +671,6 @@ struct fec_enet_private {
 	unsigned int tx_time_itr;
 	unsigned int itr_clk_rate;
 
-	/* tx lpi eee mode */
-	struct ethtool_keee eee;
 	unsigned int clk_ref_rate;
 
 	/* ptp clock period in ns*/
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 1b55047c0237..25c842835d52 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2045,14 +2045,14 @@ static int fec_enet_us_to_tx_cycle(struct net_device *ndev, int us)
 	return us * (fep->clk_ref_rate / 1000) / 1000;
 }
 
-static int fec_enet_eee_mode_set(struct net_device *ndev, bool enable)
+static int fec_enet_eee_mode_set(struct net_device *ndev, u32 lpi_timer,
+				 bool enable)
 {
 	struct fec_enet_private *fep = netdev_priv(ndev);
-	struct ethtool_keee *p = &fep->eee;
 	unsigned int sleep_cycle, wake_cycle;
 
 	if (enable) {
-		sleep_cycle = fec_enet_us_to_tx_cycle(ndev, p->tx_lpi_timer);
+		sleep_cycle = fec_enet_us_to_tx_cycle(lpi_timer);
 		wake_cycle = sleep_cycle;
 	} else {
 		sleep_cycle = 0;
@@ -2105,7 +2105,9 @@ static void fec_enet_adjust_link(struct net_device *ndev)
 			napi_enable(&fep->napi);
 		}
 		if (fep->quirks & FEC_QUIRK_HAS_EEE)
-			fec_enet_eee_mode_set(ndev, phy_dev->enable_tx_lpi);
+			fec_enet_eee_mode_set(ndev,
+					      phy_dev->eee_cfg.tx_lpi_timer,
+					      phy_dev->enable_tx_lpi);
 	} else {
 		if (fep->link) {
 			netif_stop_queue(ndev);
@@ -3181,7 +3183,6 @@ static int
 fec_enet_get_eee(struct net_device *ndev, struct ethtool_keee *edata)
 {
 	struct fec_enet_private *fep = netdev_priv(ndev);
-	struct ethtool_keee *p = &fep->eee;
 
 	if (!(fep->quirks & FEC_QUIRK_HAS_EEE))
 		return -EOPNOTSUPP;
@@ -3189,8 +3190,6 @@ fec_enet_get_eee(struct net_device *ndev, struct ethtool_keee *edata)
 	if (!netif_running(ndev))
 		return -ENETDOWN;
 
-	edata->tx_lpi_timer = p->tx_lpi_timer;
-
 	return phy_ethtool_get_eee(ndev->phydev, edata);
 }
 
@@ -3198,7 +3197,6 @@ static int
 fec_enet_set_eee(struct net_device *ndev, struct ethtool_keee *edata)
 {
 	struct fec_enet_private *fep = netdev_priv(ndev);
-	struct ethtool_keee *p = &fep->eee;
 
 	if (!(fep->quirks & FEC_QUIRK_HAS_EEE))
 		return -EOPNOTSUPP;
@@ -3206,8 +3204,6 @@ fec_enet_set_eee(struct net_device *ndev, struct ethtool_keee *edata)
 	if (!netif_running(ndev))
 		return -ENETDOWN;
 
-	p->tx_lpi_timer = edata->tx_lpi_timer;
-
 	return phy_ethtool_set_eee(ndev->phydev, edata);
 }
 
Another patch to be added to my stack...

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!


  parent reply	other threads:[~2024-11-26 16:57 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-26 12:51 [PATCH RFC net-next 00/23] net: phylink managed EEE support Russell King (Oracle)
2024-11-26 12:52 ` [PATCH RFC net-next 01/23] net: phy: ensure that genphy_c45_an_config_eee_aneg() sees new value of phydev->eee_cfg.eee_enabled Russell King
2024-11-26 12:52 ` [PATCH RFC net-next 02/23] net: phy: fix phy_ethtool_set_eee() incorrectly enabling LPI Russell King (Oracle)
2024-11-27 11:12   ` Russell King (Oracle)
2024-11-27 12:20     ` Oleksij Rempel
2024-11-28 14:11     ` Andrew Lunn
2024-11-26 12:52 ` [PATCH RFC net-next 03/23] net: phy: marvell: use phydev->eee_cfg.eee_enabled Russell King (Oracle)
2024-11-26 20:19   ` Heiner Kallweit
2024-11-26 12:52 ` [PATCH RFC net-next 04/23] net: phy: avoid genphy_c45_ethtool_get_eee() setting eee_enabled Russell King (Oracle)
2024-11-26 20:20   ` Heiner Kallweit
2024-11-26 12:52 ` [PATCH RFC net-next 05/23] net: phy: remove genphy_c45_eee_is_active()'s is_enabled arg Russell King (Oracle)
2024-11-26 20:24   ` Heiner Kallweit
2024-11-28 11:28   ` kernel test robot
2024-11-26 12:52 ` [PATCH RFC net-next 06/23] net: phy: update phy_ethtool_get_eee() documentation Russell King (Oracle)
2024-11-26 12:52 ` [PATCH RFC net-next 07/23] net: mdio: add definition for clock stop capable bit Russell King (Oracle)
2024-11-26 12:52 ` [PATCH RFC net-next 08/23] net: phy: add support for querying PHY clock stop capability Russell King (Oracle)
2024-11-26 12:52 ` [PATCH RFC net-next 09/23] net: phy: add configuration of rx clock stop mode Russell King (Oracle)
2024-11-28 12:29   ` kernel test robot
2024-11-26 12:53 ` [PATCH RFC net-next 10/23] net: phylink: add phylink_link_is_up() helper Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 11/23] net: phylink: add EEE management Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 12/23] net: mvneta: convert to phylink EEE implementation Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 13/23] net: mvneta: only allow EEE to be used in "SGMII" modes Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 14/23] net: mvpp2: add EEE implementation Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 15/23] net: lan743x: use netdev in lan743x_phylink_mac_link_down() Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 16/23] net: lan743x: convert to phylink managed EEE Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 17/23] net: stmmac: move tx_lpi_timer tracking to phylib Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 18/23] net: stmmac: make EEE depend on phy->enable_tx_lpi Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 19/23] net: stmmac: remove redundant code from ethtool EEE ops Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 20/23] net: stmmac: remove priv->tx_lpi_enabled Russell King (Oracle)
2024-11-26 12:53 ` [PATCH RFC net-next 21/23] net: stmmac: report EEE errors if EEE is supported Russell King (Oracle)
2024-11-26 12:54 ` [PATCH RFC net-next 22/23] net: stmmac: convert to use phy_eee_rx_clock_stop() Russell King (Oracle)
2024-11-26 12:54 ` [PATCH RFC net-next 23/23] net: stmmac: convert to phylink managed EEE support Russell King (Oracle)
2024-11-28 13:10   ` kernel test robot
2024-11-26 13:01 ` [PATCH RFC net-next 00/23] net: " Russell King (Oracle)
2024-11-26 14:21   ` Oleksij Rempel
2024-11-26 16:14     ` Russell King (Oracle)
2024-11-26 16:55 ` Russell King (Oracle) [this message]
2024-11-27 10:49 ` net: rtl8169: EEE seems to be ok (was: Re: [PATCH RFC net-next 00/23] net: phylink managed EEE support) Russell King (Oracle)
2024-11-27 22:15   ` net: rtl8169: EEE seems to be ok Heiner Kallweit
2024-11-27 11:20 ` net: ti: weirdness (was Re: [PATCH RFC net-next 00/23] net: phylink managed EEE support) Russell King (Oracle)
2024-11-28 14:21   ` Andrew Lunn
2024-11-27 12:15 ` net: sxgbe: using lpi_timer for Twake timer Oleksij Rempel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z0X9jVhpLvBGkRXD@shell.armlinux.org.uk \
    --to=linux@armlinux.org.uk \
    --cc=UNGLinuxDriver@microchip.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=andrew@lunn.ch \
    --cc=bryan.whitehead@microchip.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=florian.fainelli@broadcom.com \
    --cc=hkallweit1@gmail.com \
    --cc=joabreu@synopsys.com \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=marcin.s.wojtas@gmail.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=o.rempel@pengutronix.de \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.