net: bcmgenet: Add support for PHY-based Wake-on-LAN
authorFlorian Fainelli <f.fainelli@gmail.com>
Thu, 11 May 2023 17:21:10 +0000 (10:21 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 13 May 2023 15:56:29 +0000 (16:56 +0100)
If available, interrogate the PHY to find out whether we can use it for
Wake-on-LAN. This can be a more power efficient way of implementing
that feature, especially when the MAC is powered off in low power
states.

Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c

index 3a4b6cb7b7b95b6dabfec545aaedec86b55c38c9..7a41cad5788f4edd6691552901f4b2eb8fdebc36 100644 (file)
@@ -42,6 +42,12 @@ void bcmgenet_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
        struct bcmgenet_priv *priv = netdev_priv(dev);
        struct device *kdev = &priv->pdev->dev;
 
+       if (dev->phydev) {
+               phy_ethtool_get_wol(dev->phydev, wol);
+               if (wol->supported)
+                       return;
+       }
+
        if (!device_can_wakeup(kdev)) {
                wol->supported = 0;
                wol->wolopts = 0;
@@ -63,6 +69,14 @@ int bcmgenet_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        struct bcmgenet_priv *priv = netdev_priv(dev);
        struct device *kdev = &priv->pdev->dev;
+       int ret;
+
+       /* Try Wake-on-LAN from the PHY first */
+       if (dev->phydev) {
+               ret = phy_ethtool_set_wol(dev->phydev, wol);
+               if (ret != -EOPNOTSUPP)
+                       return ret;
+       }
 
        if (!device_can_wakeup(kdev))
                return -ENOTSUPP;