From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Florian Fainelli <f.fainelli@gmail.com>
Cc: Youwan Wang <youwan@nfschina.com>,
andrew@lunn.ch, hkallweit1@gmail.com, davem@davemloft.net,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] net: phy: phy_device: fix PHY WOL enabled, PM failed to suspend
Date: Fri, 28 Jun 2024 10:24:55 +0100 [thread overview]
Message-ID: <Zn6BZ4b4h8YJ3Z0u@shell.armlinux.org.uk> (raw)
In-Reply-To: <249879ad-aa97-452c-a173-65255818d2d4@gmail.com>
On Fri, Jun 28, 2024 at 09:25:54AM +0100, Florian Fainelli wrote:
> Would not the situation described here be solved by having the Motorcomm PHY
> driver set PHY_ALWAYS_CALL_SUSPEND since it deals with checking whether WoL
> is enabled or not and will just return then.
Let's also look at PHY_ALWAYS_CALL_SUSPEND. There are currently two
drivers that make use of it - realtek and broadcom.
Looking at realtek, it is used with driver instances that call
rtl821x_suspend
rtl821x_resume
rtl821x_suspend() does nothing if phydev->wol_enabled is true.
rtl821x_resume() only re-enabled the clock if phydev->wol_enabled
was false (in other words, rtl821x has disabled the clock.) However,
it always calls genphy_resume() - presumably this is the reason for
the flag.
The realtek driver instances do not populate .set_wol nor .get_wol,
so the PHY itself does not support WoL configuration. This means
that the phy_ethtool_get_wol() call in phy_suspend() will also fail,
and since wol.wolopts is initialised to zero, phydev->wol_enabled
will only be true if netdev->wol_enabled is true.
Thus, for phydev->wol_enabled to be true, netdev->wol_enabled must
be true, and we won't get here via mdio_bus_phy_suspend() as
mdio_bus_phy_may_suspend() will return false in this case.
Looking at broadcom, it's used with only one driver instance for
BCM54210E which calls:
bcm54xx_suspend
bcm54xx_resume
Other driver instances also call these two functions but do not
set this flag - BCM54612E, BCM54810, BCM54811, BCM50610, and
BCM50610M. Moreover, none of these implement the .get_wol and
.set_wol methods which means the behaviour is as I describe for
Realtek above that also doesn't implement these methods.
The only case where this is different is BCM54210E which does
populate these methods.
bcm54xx_suspend() stops ptp, and if WoL is enabled, configures the
wakeup IRQ. bcm54xx_resume() deconfigures the wakeup IRQ.
This could lead us into a case where the PHY has WoL enabled, the
phy_ethtool_get_wol() call returns that, causing phydev->wol_enabled
to be set, and netdev->wol_enabled is not set.
However, in this case, it would not be a problem because the driver
has set PHY_ALWAYS_CALL_SUSPEND, so we won't return -EBUSY.
Now, looking again at motorcomm, yt8521_resume() disables auto-sleep
before checking whether WoL is enabled. So, the driver is probably
missing PHY_ALWAYS_CALL_SUSPEND if auto-sleep needs to be disabled
each and every resume whether WoL is enabled or not.
However, if we look at yt8521_config_init(), this will also disable
auto sleep. This will be called from phy_init_hw(), and in the
mdio_bus_phy_resume() path, immediately before phy_resume(). Likewise
when we attach the PHY.
Then we have some net drivers that call phy_resume() directly...
drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
(we already have a workaround merged for
PHY-not-providing-clock)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
A suspend/resume cycle of the PHY is done when entering loopback mode.
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
No idea on this one - it resumes the PHY before enabling
loopback mode, and enters suspend when disabling loopback
mode!
drivers/net/ethernet/broadcom/genet/bcmgenet.c
bcmgenet_resume() calls phy_init_hw() before phy_resume().
drivers/net/ethernet/broadcom/bcmsysport.c
bcm_sysport_resume() *doesn't* appear to call phy_init_hw()
before phy_resume(), so I wonder whether the config is
properly restored on resume?
drivers/net/ethernet/realtek/r8169_main.c
rtl8169_up() calls phy_init_hw() before phy_resume().
drivers/net/usb/ax88172a.c
This doesn't actually call phy_resume(), but calls
genphy_resume() directly from ax88172a_reset() immediately
after phy_connect(). However, connecting to a PHY will
call phy_resume()... confused here.
So I'm left wondering whether yt8521_resume() should be fiddling with
this auto-sleep mode, especially as yt8521_config_init() will do that
if the appropriate DT property is set... and whether this should be
done unconditionally.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
next prev parent reply other threads:[~2024-06-28 9:25 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-28 6:03 [PATCH] net: phy: phy_device: fix PHY WOL enabled, PM failed to suspend Youwan Wang
2024-06-28 8:17 ` Russell King (Oracle)
2024-06-28 8:25 ` Florian Fainelli
2024-06-28 8:38 ` Russell King (Oracle)
2024-06-28 8:48 ` Florian Fainelli
2024-06-28 9:24 ` Russell King (Oracle) [this message]
2024-06-28 9:37 ` Florian Fainelli
[not found] ` <20240701062144.552508-1-youwan@nfschina.com>
2024-07-01 16:32 ` [net-next,v1] " Andrew Lunn
2024-07-09 11:37 ` [net-next,v2] " Youwan Wang
2024-07-29 8:03 ` Russell King (Oracle)
2024-07-30 8:15 ` [net-next,v3] " Youwan Wang
2024-07-30 9:28 ` Wojciech Drewek
2024-07-31 9:15 ` [net-next,v4] " Youwan Wang
2024-07-31 13:41 ` Jakub Kicinski
2024-08-01 15:51 ` Jakub Kicinski
2024-08-07 2:40 ` patchwork-bot+netdevbpf
2024-07-30 0:48 ` [net-next,v3] " Youwan Wang
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=Zn6BZ4b4h8YJ3Z0u@shell.armlinux.org.uk \
--to=linux@armlinux.org.uk \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=youwan@nfschina.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.