diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2020-09-01 14:43:48 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-09-03 15:06:03 -0700 |
commit | 6328a126896eadd6559866334d8f16fbfb47ae86 (patch) | |
tree | a2e3e6a9b1959939b191ba9c273e4c63eaaa2d13 | |
parent | 31bc72d97656af11b89ebf108685ffc8ded8c5f4 (diff) |
net: systemport: Manage Wake-on-LAN clock
It is necessary to manage the Wake-on-LAN clock to turn on the
appropriate blocks for MPD or CFP-based packet matching to work
otherwise we will not be able to reliably match packets during suspend.
Reported-by: Blair Prescott <blair.prescott@broadcom.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.h | 1 |
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 91eadba5540c..b25c70b74c92 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -2583,6 +2583,10 @@ static int bcm_sysport_probe(struct platform_device *pdev) if (!ret) device_set_wakeup_capable(&pdev->dev, 1); + priv->wol_clk = devm_clk_get_optional(&pdev->dev, "sw_sysportwol"); + if (IS_ERR(priv->wol_clk)) + return PTR_ERR(priv->wol_clk); + /* Set the needed headroom once and for all */ BUILD_BUG_ON(sizeof(struct bcm_tsb) != 8); dev->needed_headroom += sizeof(struct bcm_tsb); @@ -2772,8 +2776,10 @@ static int __maybe_unused bcm_sysport_suspend(struct device *d) bcm_sysport_fini_rx_ring(priv); /* Get prepared for Wake-on-LAN */ - if (device_may_wakeup(d) && priv->wolopts) + if (device_may_wakeup(d) && priv->wolopts) { + clk_prepare_enable(priv->wol_clk); ret = bcm_sysport_suspend_to_wol(priv); + } clk_disable_unprepare(priv->clk); @@ -2791,6 +2797,8 @@ static int __maybe_unused bcm_sysport_resume(struct device *d) return 0; clk_prepare_enable(priv->clk); + if (priv->wolopts) + clk_disable_unprepare(priv->wol_clk); umac_reset(priv); diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h index 51800053e88c..3a5cb6f128f5 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.h +++ b/drivers/net/ethernet/broadcom/bcmsysport.h @@ -771,6 +771,7 @@ struct bcm_sysport_priv { u8 sopass[SOPASS_MAX]; unsigned int wol_irq_disabled:1; struct clk *clk; + struct clk *wol_clk; /* MIB related fields */ struct bcm_sysport_mib mib; |