Message ID | 20210706090209.1897027-1-pei.lee.ling@intel.com |
---|---|
State | New |
Headers | show |
Series | [net] net: phy: skip disabling interrupt when WOL is enabled in shutdown | expand |
> -----Original Message----- > From: Andrew Lunn <andrew@lunn.ch> > Sent: Tuesday, July 6, 2021 9:14 PM > To: Ling, Pei Lee <pei.lee.ling@intel.com> > Cc: Heiner Kallweit <hkallweit1@gmail.com>; Russell King > <linux@armlinux.org.uk>; davem@davemloft.net; Jakub Kicinski > <kuba@kernel.org>; Ioana Ciornei <ioana.ciornei@nxp.com>; > netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Voon, Weifeng > <weifeng.voon@intel.com>; vee.khee.wong@linux.intel.com; Wong, Vee Khee > <vee.khee.wong@intel.com>; Ismail, Mohammad Athari > <mohammad.athari.ismail@intel.com> > Subject: Re: [PATCH net] net: phy: skip disabling interrupt when WOL is enabled > in shutdown > > On Tue, Jul 06, 2021 at 05:02:09PM +0800, Ling Pei Lee wrote: > > From: Mohammad Athari Bin Ismail <mohammad.athari.ismail@intel.com> > > > > PHY WOL requires WOL interrupt event to trigger the WOL signal in > > order to wake up the system. Hence, the PHY driver should not disable > > the interrupt during shutdown if PHY WOL is enabled. > > If the device is being used to wake the system up, why is it being shutdown? > Hi Andrew, When the platform goes to S5 state (ex: shutdown -h now), regardless PHY WOL is enabled or not, phy_shutdown() is called. So, for the platform that support WOL from S5, we need to make sure the PHY still can trigger WOL event. Disabling the interrupt through phy_disable_interrupts() in phy_shutdown() will disable WOL interrupt as well and cause the PHY WOL not able to trigger. -Athari- > Andrew
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 1539ea021ac0..f4b88f613dc1 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2994,9 +2994,13 @@ static int phy_remove(struct device *dev) static void phy_shutdown(struct device *dev) { + struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; struct phy_device *phydev = to_phy_device(dev); - phy_disable_interrupts(phydev); + /* If the device has WOL enabled, don't disable interrupts. */ + phy_ethtool_get_wol(phydev, &wol); + if (!wol.wolopts) + phy_disable_interrupts(phydev); } /**