Lines Matching +full:magic +full:- +full:packet

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Broadcom GENET (Gigabit Ethernet) Wake-on-LAN support
5 * Copyright (c) 2014-2020 Broadcom
37 /* ethtool function - get WOL (Wake on LAN) settings, Only Magic Packet
43 struct device *kdev = &priv->pdev->dev; in bcmgenet_get_wol()
45 if (dev->phydev) { in bcmgenet_get_wol()
46 phy_ethtool_get_wol(dev->phydev, wol); in bcmgenet_get_wol()
47 if (wol->supported) in bcmgenet_get_wol()
52 wol->supported = 0; in bcmgenet_get_wol()
53 wol->wolopts = 0; in bcmgenet_get_wol()
57 wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER; in bcmgenet_get_wol()
58 wol->wolopts = priv->wolopts; in bcmgenet_get_wol()
59 memset(wol->sopass, 0, sizeof(wol->sopass)); in bcmgenet_get_wol()
61 if (wol->wolopts & WAKE_MAGICSECURE) in bcmgenet_get_wol()
62 memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass)); in bcmgenet_get_wol()
65 /* ethtool function - set WOL (Wake on LAN) settings.
66 * Only for magic packet detection mode.
71 struct device *kdev = &priv->pdev->dev; in bcmgenet_set_wol()
74 /* Try Wake-on-LAN from the PHY first */ in bcmgenet_set_wol()
75 if (dev->phydev) { in bcmgenet_set_wol()
76 ret = phy_ethtool_set_wol(dev->phydev, wol); in bcmgenet_set_wol()
77 if (ret != -EOPNOTSUPP) in bcmgenet_set_wol()
82 return -ENOTSUPP; in bcmgenet_set_wol()
84 if (wol->wolopts & ~(WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER)) in bcmgenet_set_wol()
85 return -EINVAL; in bcmgenet_set_wol()
87 if (wol->wolopts & WAKE_MAGICSECURE) in bcmgenet_set_wol()
88 memcpy(priv->sopass, wol->sopass, sizeof(priv->sopass)); in bcmgenet_set_wol()
91 if (wol->wolopts) { in bcmgenet_set_wol()
94 if (priv->wol_irq_disabled) { in bcmgenet_set_wol()
95 enable_irq_wake(priv->wol_irq); in bcmgenet_set_wol()
96 enable_irq_wake(priv->irq0); in bcmgenet_set_wol()
98 priv->wol_irq_disabled = false; in bcmgenet_set_wol()
102 if (!priv->wol_irq_disabled) { in bcmgenet_set_wol()
103 disable_irq_wake(priv->wol_irq); in bcmgenet_set_wol()
104 disable_irq_wake(priv->irq0); in bcmgenet_set_wol()
106 priv->wol_irq_disabled = true; in bcmgenet_set_wol()
109 priv->wolopts = wol->wolopts; in bcmgenet_set_wol()
116 struct net_device *dev = priv->dev; in bcmgenet_poll_wol_status()
124 return -ETIMEDOUT; in bcmgenet_poll_wol_status()
134 bcmgenet_umac_writel(priv, get_unaligned_be16(&priv->sopass[0]), in bcmgenet_set_mpd_password()
136 bcmgenet_umac_writel(priv, get_unaligned_be32(&priv->sopass[2]), in bcmgenet_set_mpd_password()
143 struct net_device *dev = priv->dev; in bcmgenet_wol_power_down_cfg()
150 return -EINVAL; in bcmgenet_wol_power_down_cfg()
163 if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) { in bcmgenet_wol_power_down_cfg()
166 if (priv->wolopts & WAKE_MAGICSECURE) { in bcmgenet_wol_power_down_cfg()
174 if (priv->wolopts & WAKE_FILTER) { in bcmgenet_wol_power_down_cfg()
175 list_for_each_entry(rule, &priv->rxnfc_list, list) in bcmgenet_wol_power_down_cfg()
176 if (rule->fs.ring_cookie == RX_CLS_FLOW_WAKE) in bcmgenet_wol_power_down_cfg()
177 hfb_enable |= (1 << rule->fs.location); in bcmgenet_wol_power_down_cfg()
192 netif_dbg(priv, wol, dev, "MPD WOL-ready status set after %d msec\n", in bcmgenet_wol_power_down_cfg()
195 clk_prepare_enable(priv->clk_wol); in bcmgenet_wol_power_down_cfg()
196 priv->wol_active = 1; in bcmgenet_wol_power_down_cfg()
207 priv->crc_fwd_en = 1; in bcmgenet_wol_power_down_cfg()
229 netif_err(priv, wol, priv->dev, "invalid mode: %d\n", mode); in bcmgenet_wol_power_up_cfg()
233 if (!priv->wol_active) in bcmgenet_wol_power_up_cfg()
236 priv->wol_active = 0; in bcmgenet_wol_power_up_cfg()
237 clk_disable_unprepare(priv->clk_wol); in bcmgenet_wol_power_up_cfg()
238 priv->crc_fwd_en = 0; in bcmgenet_wol_power_up_cfg()
240 /* Disable Magic Packet Detection */ in bcmgenet_wol_power_up_cfg()
241 if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) { in bcmgenet_wol_power_up_cfg()
250 if (priv->wolopts & WAKE_FILTER) { in bcmgenet_wol_power_up_cfg()