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>
This commit is contained in:
parent
31bc72d976
commit
6328a12689
@ -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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user