[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <YIgBJQi1H+f2VGWf@lunn.ch>
Date: Tue, 27 Apr 2021 14:18:45 +0200
From: Andrew Lunn <andrew@...n.ch>
To: Joakim Zhang <qiangqing.zhang@....com>
Cc: "Jisheng.Zhang@...aptics.com" <Jisheng.Zhang@...aptics.com>,
"peppe.cavallaro@...com" <peppe.cavallaro@...com>,
"alexandre.torgue@...com" <alexandre.torgue@...com>,
"joabreu@...opsys.com" <joabreu@...opsys.com>,
"davem@...emloft.net" <davem@...emloft.net>,
"kuba@...nel.org" <kuba@...nel.org>,
"f.fainelli@...il.com" <f.fainelli@...il.com>,
"netdev@...r.kernel.org" <netdev@...r.kernel.org>,
dl-linux-imx <linux-imx@....com>
Subject: Re: [PATCH V2 net] net: stmmac: fix MAC WoL unwork if PHY doesn't
support WoL
> According to your comments, I did a quick draft, and have not test
> yet, could you please review the logic to see if I understand you
> correctly?
>
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
> @@ -647,18 +647,7 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
> static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
> {
> struct stmmac_priv *priv = netdev_priv(dev);
> - u32 support = WAKE_MAGIC | WAKE_UCAST;
> -
> - if (!device_can_wakeup(priv->device))
> - return -EOPNOTSUPP;
> -
> - if (!priv->plat->pmt) {
> - int ret = phylink_ethtool_set_wol(priv->phylink, wol);
> -
> - if (!ret)
> - device_set_wakeup_enable(priv->device, !!wol->wolopts);
> - return ret;
> - }
> + u32 support = WAKE_MAGIC | WAKE_UCAST | WAKE_MAGICSECURE | WAKE_BCAST;
>
> /* By default almost all GMAC devices support the WoL via
> * magic frame but we can disable it if the HW capability
> @@ -669,13 +658,24 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
> if (wol->wolopts & ~support)
> return -EINVAL;
>
> - if (wol->wolopts) {
> - pr_info("stmmac: wakeup enable\n");
> - device_set_wakeup_enable(priv->device, 1);
> - enable_irq_wake(priv->wol_irq);
> - } else {
> + if (!wol->wolopts) {
> + device_set_wakeup_capable(priv->device, 0);
> device_set_wakeup_enable(priv->device, 0);
> disable_irq_wake(priv->wol_irq);
> + } else {
> + if (priv->plat->pmt && ((wol->wolopts & WAKE_MAGIC) || (wol->wolopts & WAKE_UCAST))) {
> + pr_info("stmmac: mac wakeup enable\n");
> + enable_irq_wake(priv->wol_irq);
> + } else {
> + int ret = phylink_ethtool_set_wol(priv->phylink, wol);
You can have multiple wake up sources enabled at the same time. So the
if/else is wrong here. It could be, some are provided by the MAC and
some by the PHY.
If you are trying to save power, it is better if the PHY provides the
WoL sources. If the PHY can provide all the required WoL sources, you
can turn the MAC off and save more power. So give priority to the PHY.
Andrew
Powered by blists - more mailing lists