mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Merge branch 'net-add-phylink-managed-wol-and-convert-stmmac'
Russell King says: ==================== net: add phylink managed WoL and convert stmmac This series is implementing the thoughts of Andrew, Florian and myself to improve the quality of Wake-on-Lan (WoL) implementations. This changes nothing for MAC drivers that do not wish to participate in this, but if they do, then they gain the benefit of phylink configuring WoL at the point closest to the media as possible. We first need to solve the problem that the multitude of PHY drivers report their device supports WoL, but are not capable of waking the system. Correcting this is fundamental to choosing where WoL should be enabled - a mis-reported WoL support can render WoL completely ineffective. The only PHY drivers which uses the driver model's wakeup support is drivers/net/phy/broadcom.c, and until recently, realtek. This means we have the opportunity for PHY drivers to be _correctly_ converted to use this method of signalling wake-up capability only when they can actually wake the system, and thus providing a way for phylink to know whether to use PHY-based WoL at all. However, a PHY driver not implementing that logic doesn't become a blocker to MACs wanting to convert. In full, the logic is: - phylink supports a flag, wol_phy_legacy, which forces phylink to use the PHY-based WoL even if the MDIO device is not marked as wake-up capable. - when wol_phy_legacy is not set, we check whether the PHY MDIO device is wake-up capable. If it is, we offer the WoL request to the PHY. - if neither wol_phy_legacy is set, or the PHY is not wake-up capable, we do not offer the WoL request to the PHY. In both cases, after setting any PHY based WoL, we remove the options that the PHY now reports are enabled from the options mask, and offer these (if any) to the MAC. The mac will get a "mac_set_wol()" method call when any settings change. Phylink mainatains the WoL state for the MAC, so there's no need for a "mac_get_wol()" method. There may be the need to set the initial state but this is not supported at present. I've also added support for doing the PHY speed-up/speed-down at suspend/resume time depending on the WoL state, which takes another issue from the MAC authors. Lastly, with phylink now having the full picture for WoL, the "mac_wol" argument for phylink_suspend() becomes redundant, and for MAC drivers that implement mac_set_wol(), the value passed becomes irrelevant. ==================== Link: https://patch.msgid.link/aPnyW54J80h9DmhB@shell.armlinux.org.uk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -291,6 +291,7 @@ struct stmmac_priv {
|
||||
int hw_cap_support;
|
||||
int synopsys_id;
|
||||
u32 msg_enable;
|
||||
/* Our MAC Wake-on-Lan options */
|
||||
int wolopts;
|
||||
int wol_irq;
|
||||
u32 gmii_address_bus_config;
|
||||
@@ -379,16 +380,6 @@ enum stmmac_state {
|
||||
|
||||
extern const struct dev_pm_ops stmmac_simple_pm_ops;
|
||||
|
||||
static inline bool stmmac_wol_enabled_mac(struct stmmac_priv *priv)
|
||||
{
|
||||
return priv->plat->pmt && device_may_wakeup(priv->device);
|
||||
}
|
||||
|
||||
static inline bool stmmac_wol_enabled_phy(struct stmmac_priv *priv)
|
||||
{
|
||||
return !priv->plat->pmt && device_may_wakeup(priv->device);
|
||||
}
|
||||
|
||||
int stmmac_mdio_unregister(struct net_device *ndev);
|
||||
int stmmac_mdio_register(struct net_device *ndev);
|
||||
int stmmac_mdio_reset(struct mii_bus *mii);
|
||||
|
||||
@@ -724,41 +724,14 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (!priv->plat->pmt)
|
||||
return phylink_ethtool_get_wol(priv->phylink, wol);
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
if (device_can_wakeup(priv->device)) {
|
||||
wol->supported = WAKE_MAGIC | WAKE_UCAST;
|
||||
if (priv->hw_cap_support && !priv->dma_cap.pmt_magic_frame)
|
||||
wol->supported &= ~WAKE_MAGIC;
|
||||
wol->wolopts = priv->wolopts;
|
||||
}
|
||||
mutex_unlock(&priv->lock);
|
||||
return phylink_ethtool_get_wol(priv->phylink, wol);
|
||||
}
|
||||
|
||||
static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
device_set_wakeup_enable(priv->device, !!wol->wolopts);
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
priv->wolopts = wol->wolopts;
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
return 0;
|
||||
return phylink_ethtool_set_wol(priv->phylink, wol);
|
||||
}
|
||||
|
||||
static int stmmac_ethtool_op_get_eee(struct net_device *dev,
|
||||
|
||||
@@ -1073,6 +1073,20 @@ static int stmmac_mac_enable_tx_lpi(struct phylink_config *config, u32 timer,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stmmac_mac_wol_set(struct phylink_config *config, u32 wolopts,
|
||||
const u8 *sopass)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(to_net_dev(config->dev));
|
||||
|
||||
device_set_wakeup_enable(priv->device, !!wolopts);
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
priv->wolopts = wolopts;
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct phylink_mac_ops stmmac_phylink_mac_ops = {
|
||||
.mac_get_caps = stmmac_mac_get_caps,
|
||||
.mac_select_pcs = stmmac_mac_select_pcs,
|
||||
@@ -1082,6 +1096,7 @@ static const struct phylink_mac_ops stmmac_phylink_mac_ops = {
|
||||
.mac_link_up = stmmac_mac_link_up,
|
||||
.mac_disable_tx_lpi = stmmac_mac_disable_tx_lpi,
|
||||
.mac_enable_tx_lpi = stmmac_mac_enable_tx_lpi,
|
||||
.mac_wol_set = stmmac_mac_wol_set,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1190,14 +1205,6 @@ static int stmmac_init_phy(struct net_device *dev)
|
||||
phylink_ethtool_set_eee(priv->phylink, &eee);
|
||||
}
|
||||
|
||||
if (!priv->plat->pmt) {
|
||||
struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
|
||||
|
||||
phylink_ethtool_get_wol(priv->phylink, &wol);
|
||||
device_set_wakeup_capable(priv->device, !!wol.supported);
|
||||
device_set_wakeup_enable(priv->device, !!wol.wolopts);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1266,6 +1273,16 @@ static int stmmac_phylink_setup(struct stmmac_priv *priv)
|
||||
config->eee_enabled_default = true;
|
||||
}
|
||||
|
||||
config->wol_phy_speed_ctrl = true;
|
||||
if (priv->plat->flags & STMMAC_FLAG_USE_PHY_WOL) {
|
||||
config->wol_phy_legacy = true;
|
||||
} else {
|
||||
if (priv->dma_cap.pmt_remote_wake_up)
|
||||
config->wol_mac_support |= WAKE_UCAST;
|
||||
if (priv->dma_cap.pmt_magic_frame)
|
||||
config->wol_mac_support |= WAKE_MAGIC;
|
||||
}
|
||||
|
||||
fwnode = priv->plat->port_node;
|
||||
if (!fwnode)
|
||||
fwnode = dev_fwnode(priv->device);
|
||||
@@ -7760,7 +7777,7 @@ int stmmac_suspend(struct device *dev)
|
||||
priv->plat->serdes_powerdown(ndev, priv->plat->bsp_priv);
|
||||
|
||||
/* Enable Power down mode by programming the PMT regs */
|
||||
if (stmmac_wol_enabled_mac(priv)) {
|
||||
if (priv->wolopts) {
|
||||
stmmac_pmt(priv, priv->hw, priv->wolopts);
|
||||
priv->irq_wake = 1;
|
||||
} else {
|
||||
@@ -7771,10 +7788,7 @@ int stmmac_suspend(struct device *dev)
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
rtnl_lock();
|
||||
if (stmmac_wol_enabled_phy(priv))
|
||||
phylink_speed_down(priv->phylink, false);
|
||||
|
||||
phylink_suspend(priv->phylink, stmmac_wol_enabled_mac(priv));
|
||||
phylink_suspend(priv->phylink, !!priv->wolopts);
|
||||
rtnl_unlock();
|
||||
|
||||
if (stmmac_fpe_supported(priv))
|
||||
@@ -7850,7 +7864,7 @@ int stmmac_resume(struct device *dev)
|
||||
* this bit because it can generate problems while resuming
|
||||
* from another devices (e.g. serial console).
|
||||
*/
|
||||
if (stmmac_wol_enabled_mac(priv)) {
|
||||
if (priv->wolopts) {
|
||||
mutex_lock(&priv->lock);
|
||||
stmmac_pmt(priv, priv->hw, 0);
|
||||
mutex_unlock(&priv->lock);
|
||||
@@ -7912,9 +7926,6 @@ int stmmac_resume(struct device *dev)
|
||||
* workqueue thread, which will race with initialisation.
|
||||
*/
|
||||
phylink_resume(priv->phylink);
|
||||
if (stmmac_wol_enabled_phy(priv))
|
||||
phylink_speed_up(priv->phylink);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
netif_device_attach(ndev);
|
||||
|
||||
@@ -969,7 +969,7 @@ static int __maybe_unused stmmac_pltfr_noirq_suspend(struct device *dev)
|
||||
if (!netif_running(ndev))
|
||||
return 0;
|
||||
|
||||
if (!stmmac_wol_enabled_mac(priv)) {
|
||||
if (!priv->wolopts) {
|
||||
/* Disable clock in case of PWM is off */
|
||||
clk_disable_unprepare(priv->plat->clk_ptp_ref);
|
||||
|
||||
@@ -990,7 +990,7 @@ static int __maybe_unused stmmac_pltfr_noirq_resume(struct device *dev)
|
||||
if (!netif_running(ndev))
|
||||
return 0;
|
||||
|
||||
if (!stmmac_wol_enabled_mac(priv)) {
|
||||
if (!priv->wolopts) {
|
||||
/* enable the clk previously disabled */
|
||||
ret = pm_runtime_force_resume(dev);
|
||||
if (ret)
|
||||
|
||||
@@ -251,6 +251,16 @@ static bool phy_drv_wol_enabled(struct phy_device *phydev)
|
||||
return wol.wolopts != 0;
|
||||
}
|
||||
|
||||
bool phy_may_wakeup(struct phy_device *phydev)
|
||||
{
|
||||
/* If the PHY is using driver-model based wakeup, use that state. */
|
||||
if (phy_can_wakeup(phydev))
|
||||
return device_may_wakeup(&phydev->mdio.dev);
|
||||
|
||||
return phy_drv_wol_enabled(phydev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phy_may_wakeup);
|
||||
|
||||
static void phy_link_change(struct phy_device *phydev, bool up)
|
||||
{
|
||||
struct net_device *netdev = phydev->attached_dev;
|
||||
@@ -302,7 +312,7 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
|
||||
/* If the PHY on the mido bus is not attached but has WOL enabled
|
||||
* we cannot suspend the PHY.
|
||||
*/
|
||||
if (!netdev && phy_drv_wol_enabled(phydev))
|
||||
if (!netdev && phy_may_wakeup(phydev))
|
||||
return false;
|
||||
|
||||
/* PHY not attached? May suspend if the PHY has not already been
|
||||
@@ -1909,7 +1919,7 @@ int phy_suspend(struct phy_device *phydev)
|
||||
if (phydev->suspended || !phydrv)
|
||||
return 0;
|
||||
|
||||
phydev->wol_enabled = phy_drv_wol_enabled(phydev) ||
|
||||
phydev->wol_enabled = phy_may_wakeup(phydev) ||
|
||||
(netdev && netdev->ethtool->wol_enabled);
|
||||
/* If the device has WOL enabled, we cannot suspend the PHY */
|
||||
if (phydev->wol_enabled && !(phydrv->flags & PHY_ALWAYS_CALL_SUSPEND))
|
||||
|
||||
@@ -93,6 +93,9 @@ struct phylink {
|
||||
u8 sfp_port;
|
||||
|
||||
struct eee_config eee_cfg;
|
||||
|
||||
u32 wolopts_mac;
|
||||
u8 wol_sopass[SOPASS_MAX];
|
||||
};
|
||||
|
||||
#define phylink_printk(level, pl, fmt, ...) \
|
||||
@@ -2562,6 +2565,23 @@ void phylink_rx_clk_stop_unblock(struct phylink *pl)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_rx_clk_stop_unblock);
|
||||
|
||||
static bool phylink_mac_supports_wol(struct phylink *pl)
|
||||
{
|
||||
return !!pl->mac_ops->mac_wol_set;
|
||||
}
|
||||
|
||||
static bool phylink_phy_supports_wol(struct phylink *pl,
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
return phydev && (pl->config->wol_phy_legacy || phy_can_wakeup(phydev));
|
||||
}
|
||||
|
||||
static bool phylink_phy_pm_speed_ctrl(struct phylink *pl)
|
||||
{
|
||||
return pl->config->wol_phy_speed_ctrl && !pl->wolopts_mac &&
|
||||
pl->phydev && phy_may_wakeup(pl->phydev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phylink_suspend() - handle a network device suspend event
|
||||
* @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
@@ -2575,11 +2595,17 @@ EXPORT_SYMBOL_GPL(phylink_rx_clk_stop_unblock);
|
||||
* can also bring down the link between the MAC and PHY.
|
||||
* - If Wake-on-Lan is active, but being handled by the MAC, the MAC
|
||||
* still needs to receive packets, so we can not bring the link down.
|
||||
*
|
||||
* Note: when phylink managed Wake-on-Lan is in use, @mac_wol is ignored.
|
||||
* (struct phylink_mac_ops.mac_set_wol populated.)
|
||||
*/
|
||||
void phylink_suspend(struct phylink *pl, bool mac_wol)
|
||||
{
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (phylink_mac_supports_wol(pl))
|
||||
mac_wol = !!pl->wolopts_mac;
|
||||
|
||||
if (mac_wol && (!pl->netdev || pl->netdev->ethtool->wol_enabled)) {
|
||||
/* Wake-on-Lan enabled, MAC handling */
|
||||
mutex_lock(&pl->state_mutex);
|
||||
@@ -2605,6 +2631,9 @@ void phylink_suspend(struct phylink *pl, bool mac_wol)
|
||||
} else {
|
||||
phylink_stop(pl);
|
||||
}
|
||||
|
||||
if (phylink_phy_pm_speed_ctrl(pl))
|
||||
phylink_speed_down(pl, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_suspend);
|
||||
|
||||
@@ -2644,6 +2673,9 @@ void phylink_resume(struct phylink *pl)
|
||||
{
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (phylink_phy_pm_speed_ctrl(pl))
|
||||
phylink_speed_up(pl);
|
||||
|
||||
if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) {
|
||||
/* Wake-on-Lan enabled, MAC handling */
|
||||
|
||||
@@ -2689,8 +2721,24 @@ void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
|
||||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
|
||||
if (pl->phydev)
|
||||
phy_ethtool_get_wol(pl->phydev, wol);
|
||||
if (phylink_mac_supports_wol(pl)) {
|
||||
if (phylink_phy_supports_wol(pl, pl->phydev))
|
||||
phy_ethtool_get_wol(pl->phydev, wol);
|
||||
|
||||
/* Where the MAC augments the WoL support, merge its support and
|
||||
* current configuration.
|
||||
*/
|
||||
if (~wol->wolopts & pl->wolopts_mac & WAKE_MAGICSECURE)
|
||||
memcpy(wol->sopass, pl->wol_sopass,
|
||||
sizeof(wol->sopass));
|
||||
|
||||
wol->supported |= pl->config->wol_mac_support;
|
||||
wol->wolopts |= pl->wolopts_mac;
|
||||
} else {
|
||||
/* Legacy */
|
||||
if (pl->phydev)
|
||||
phy_ethtool_get_wol(pl->phydev, wol);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_ethtool_get_wol);
|
||||
|
||||
@@ -2707,12 +2755,48 @@ EXPORT_SYMBOL_GPL(phylink_ethtool_get_wol);
|
||||
*/
|
||||
int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct ethtool_wolinfo w = { .cmd = ETHTOOL_GWOL };
|
||||
int ret = -EOPNOTSUPP;
|
||||
bool changed;
|
||||
u32 wolopts;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (pl->phydev)
|
||||
ret = phy_ethtool_set_wol(pl->phydev, wol);
|
||||
if (phylink_mac_supports_wol(pl)) {
|
||||
wolopts = wol->wolopts;
|
||||
|
||||
if (phylink_phy_supports_wol(pl, pl->phydev)) {
|
||||
ret = phy_ethtool_set_wol(pl->phydev, wol);
|
||||
if (ret != 0 && ret != -EOPNOTSUPP)
|
||||
return ret;
|
||||
|
||||
phy_ethtool_get_wol(pl->phydev, &w);
|
||||
|
||||
/* Any Wake-on-Lan modes which the PHY is handling
|
||||
* should not be passed on to the MAC.
|
||||
*/
|
||||
wolopts &= ~w.wolopts;
|
||||
}
|
||||
|
||||
wolopts &= pl->config->wol_mac_support;
|
||||
changed = pl->wolopts_mac != wolopts;
|
||||
if (wolopts & WAKE_MAGICSECURE)
|
||||
changed |= !!memcmp(wol->sopass, pl->wol_sopass,
|
||||
sizeof(wol->sopass));
|
||||
memcpy(pl->wol_sopass, wol->sopass, sizeof(pl->wol_sopass));
|
||||
|
||||
if (changed) {
|
||||
ret = pl->mac_ops->mac_wol_set(pl->config, wolopts,
|
||||
wol->sopass);
|
||||
if (!ret)
|
||||
pl->wolopts_mac = wolopts;
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
} else {
|
||||
if (pl->phydev)
|
||||
ret = phy_ethtool_set_wol(pl->phydev, wol);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1379,6 +1379,27 @@ static inline void phy_disable_eee_mode(struct phy_device *phydev, u32 link_mode
|
||||
linkmode_clear_bit(link_mode, phydev->advertising_eee);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_can_wakeup() - indicate whether PHY has driver model wakeup capabilities
|
||||
* @phydev: The phy_device struct
|
||||
*
|
||||
* Returns: true/false depending on the PHY driver's device_set_wakeup_capable()
|
||||
* setting.
|
||||
*/
|
||||
static inline bool phy_can_wakeup(struct phy_device *phydev)
|
||||
{
|
||||
return device_can_wakeup(&phydev->mdio.dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_may_wakeup() - indicate whether PHY has wakeup enabled
|
||||
* @phydev: The phy_device struct
|
||||
*
|
||||
* Returns: true/false depending on the PHY driver's device_set_wakeup_enabled()
|
||||
* setting if using the driver model, otherwise the legacy determination.
|
||||
*/
|
||||
bool phy_may_wakeup(struct phy_device *phydev);
|
||||
|
||||
void phy_resolve_aneg_pause(struct phy_device *phydev);
|
||||
void phy_resolve_aneg_linkmode(struct phy_device *phydev);
|
||||
|
||||
|
||||
@@ -156,6 +156,9 @@ enum phylink_op_type {
|
||||
* @lpi_capabilities: MAC speeds which can support LPI signalling
|
||||
* @lpi_timer_default: Default EEE LPI timer setting.
|
||||
* @eee_enabled_default: If set, EEE will be enabled by phylink at creation time
|
||||
* @wol_phy_legacy: Use Wake-on-Lan with PHY even if phy_can_wakeup() is false
|
||||
* @wol_phy_speed_ctrl: Use phy speed control on suspend/resume
|
||||
* @wol_mac_support: Bitmask of MAC supported %WAKE_* options
|
||||
*/
|
||||
struct phylink_config {
|
||||
struct device *dev;
|
||||
@@ -173,6 +176,11 @@ struct phylink_config {
|
||||
unsigned long lpi_capabilities;
|
||||
u32 lpi_timer_default;
|
||||
bool eee_enabled_default;
|
||||
|
||||
/* Wake-on-Lan support */
|
||||
bool wol_phy_legacy;
|
||||
bool wol_phy_speed_ctrl;
|
||||
u32 wol_mac_support;
|
||||
};
|
||||
|
||||
void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed);
|
||||
@@ -188,6 +196,7 @@ void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed);
|
||||
* @mac_link_up: allow the link to come up.
|
||||
* @mac_disable_tx_lpi: disable LPI.
|
||||
* @mac_enable_tx_lpi: enable and configure LPI.
|
||||
* @mac_wol_set: configure Wake-on-Lan settings at the MAC.
|
||||
*
|
||||
* The individual methods are described more fully below.
|
||||
*/
|
||||
@@ -211,6 +220,9 @@ struct phylink_mac_ops {
|
||||
void (*mac_disable_tx_lpi)(struct phylink_config *config);
|
||||
int (*mac_enable_tx_lpi)(struct phylink_config *config, u32 timer,
|
||||
bool tx_clk_stop);
|
||||
|
||||
int (*mac_wol_set)(struct phylink_config *config, u32 wolopts,
|
||||
const u8 *sopass);
|
||||
};
|
||||
|
||||
#if 0 /* For kernel-doc purposes only. */
|
||||
@@ -440,6 +452,22 @@ void mac_disable_tx_lpi(struct phylink_config *config);
|
||||
*/
|
||||
int mac_enable_tx_lpi(struct phylink_config *config, u32 timer,
|
||||
bool tx_clk_stop);
|
||||
|
||||
/**
|
||||
* mac_wol_set() - configure the Wake-on-Lan parameters
|
||||
* @config: a pointer to a &struct phylink_config.
|
||||
* @wolopts: Bitmask of %WAKE_* flags for enabled Wake-On-Lan modes.
|
||||
* @sopass: SecureOn(tm) password; meaningful only for %WAKE_MAGICSECURE
|
||||
*
|
||||
* Enable the specified Wake-on-Lan options at the MAC. Options that the
|
||||
* PHY can handle will have been removed from @wolopts.
|
||||
*
|
||||
* The presence of this method enables phylink-managed WoL support.
|
||||
*
|
||||
* Returns: 0 on success.
|
||||
*/
|
||||
int (*mac_wol_set)(struct phylink_config *config, u32 wolopts,
|
||||
const u8 *sopass);
|
||||
#endif
|
||||
|
||||
struct phylink_pcs_ops;
|
||||
|
||||
Reference in New Issue
Block a user