Implement the get_wol() and set_wol() helpers in the Annapurna Labs
Alpine Ethernet driver.
---
 drivers/net/ethernet/annapurna/al_eth.c | 44 +++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/ethernet/annapurna/al_eth.c 
b/drivers/net/ethernet/annapurna/al_eth.c
index 8dd84f66b5d1..d06a75a49ce5 100644
--- a/drivers/net/ethernet/annapurna/al_eth.c
+++ b/drivers/net/ethernet/annapurna/al_eth.c
@@ -2519,10 +2519,54 @@ static u32 al_eth_get_rxfh_indir_size(struct net_device 
*netdev)
        return AL_ETH_RX_RSS_TABLE_SIZE;
 }
 
+static void al_eth_get_wol(struct net_device *netdev,
+                          struct ethtool_wolinfo *wol)
+{
+       struct al_eth_adapter *adapter = netdev_priv(netdev);
+       struct phy_device *phydev;
+
+       wol->wolopts = adapter->wol;
+
+       if ((adapter) && (adapter->phy_exist) && (adapter->mdio_bus)) {
+               phydev = mdiobus_get_phy(adapter->mdio_bus, adapter->phy_addr);
+               if (phydev) {
+                       phy_ethtool_get_wol(phydev, wol);
+                       wol->supported |= WAKE_PHY;
+                       return;
+               }
+       }
+
+       wol->supported |= WAKE_UCAST | WAKE_MCAST | WAKE_BCAST;
+}
+
+static int al_eth_set_wol(struct net_device *netdev,
+                         struct ethtool_wolinfo *wol)
+{
+       struct al_eth_adapter *adapter = netdev_priv(netdev);
+       struct phy_device *phydev;
+
+       if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE))
+               return -EOPNOTSUPP;
+
+       adapter->wol = wol->wolopts;
+
+       if ((adapter) && (adapter->phy_exist) && (adapter->mdio_bus)) {
+               phydev = mdiobus_get_phy(adapter->mdio_bus, adapter->phy_addr);
+               if (phydev)
+                       return phy_ethtool_set_wol(phydev, wol);
+       }
+
+       device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
+
+       return 0;
+}
+
 static const struct ethtool_ops al_eth_ethtool_ops = {
        .get_settings           = al_eth_get_settings,
        .set_settings           = al_eth_set_settings,
        .get_drvinfo            = al_eth_get_drvinfo,
+       .get_wol                = al_eth_get_wol,
+       .set_wol                = al_eth_set_wol,
        .get_msglevel           = al_eth_get_msglevel,
        .set_msglevel           = al_eth_set_msglevel,
 
-- 
2.11.0

Reply via email to