Commit 6328a126 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller

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: default avatarBlair Prescott <blair.prescott@broadcom.com>
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 31bc72d9
...@@ -2583,6 +2583,10 @@ static int bcm_sysport_probe(struct platform_device *pdev) ...@@ -2583,6 +2583,10 @@ static int bcm_sysport_probe(struct platform_device *pdev)
if (!ret) if (!ret)
device_set_wakeup_capable(&pdev->dev, 1); 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 */ /* Set the needed headroom once and for all */
BUILD_BUG_ON(sizeof(struct bcm_tsb) != 8); BUILD_BUG_ON(sizeof(struct bcm_tsb) != 8);
dev->needed_headroom += sizeof(struct bcm_tsb); dev->needed_headroom += sizeof(struct bcm_tsb);
...@@ -2772,8 +2776,10 @@ static int __maybe_unused bcm_sysport_suspend(struct device *d) ...@@ -2772,8 +2776,10 @@ static int __maybe_unused bcm_sysport_suspend(struct device *d)
bcm_sysport_fini_rx_ring(priv); bcm_sysport_fini_rx_ring(priv);
/* Get prepared for Wake-on-LAN */ /* 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); ret = bcm_sysport_suspend_to_wol(priv);
}
clk_disable_unprepare(priv->clk); clk_disable_unprepare(priv->clk);
...@@ -2791,6 +2797,8 @@ static int __maybe_unused bcm_sysport_resume(struct device *d) ...@@ -2791,6 +2797,8 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)
return 0; return 0;
clk_prepare_enable(priv->clk); clk_prepare_enable(priv->clk);
if (priv->wolopts)
clk_disable_unprepare(priv->wol_clk);
umac_reset(priv); umac_reset(priv);
......
...@@ -771,6 +771,7 @@ struct bcm_sysport_priv { ...@@ -771,6 +771,7 @@ struct bcm_sysport_priv {
u8 sopass[SOPASS_MAX]; u8 sopass[SOPASS_MAX];
unsigned int wol_irq_disabled:1; unsigned int wol_irq_disabled:1;
struct clk *clk; struct clk *clk;
struct clk *wol_clk;
/* MIB related fields */ /* MIB related fields */
struct bcm_sysport_mib mib; struct bcm_sysport_mib mib;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment