/** * phylink_ethtool_set_wol() - set wake on lan parameters * @pl: a pointer to a &struct phylink returned from phylink_create() * @wol: a pointer to &struct ethtool_wolinfo for the desired parameters * * Set the wake on lan parameters for the PHY attached to the phylink * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP * error. * * Returns zero on success or negative errno code. */ int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) { int ret = -EOPNOTSUPP; ASSERT_RTNL(); if (pl->phydev) ret = phy_ethtool_set_wol(pl->phydev, wol); return ret; }
int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) { int ret = -EOPNOTSUPP; WARN_ON(!lockdep_rtnl_is_held()); if (pl->phydev) ret = phy_ethtool_set_wol(pl->phydev, wol); return ret; }
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 (priv->phy_wol_plus & wol->wolopts) { int ret; pr_info("stmmac: use Phy WoL+\n"); spin_lock_irq(&priv->lock); ret = phy_ethtool_set_wol(priv->phydev, wol); spin_unlock_irq(&priv->lock); return ret; } /* By default almost all GMAC devices support the WoL via * magic frame but we can disable it if the HW capability * register shows no support for pmt_magic_frame. */ if ((priv->hw_cap_support) && (!priv->dma_cap.pmt_magic_frame)) wol->wolopts &= ~WAKE_MAGIC; if (!device_can_wakeup(priv->device)) return -EINVAL; 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 { device_set_wakeup_enable(priv->device, 0); disable_irq_wake(priv->wol_irq); } spin_lock_irq(&priv->lock); priv->wolopts = wol->wolopts; spin_unlock_irq(&priv->lock); return 0; }