aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2014-08-11 17:50:45 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-11 18:10:11 -0400
commit98bb7399d29a53a58f497409f98acb3bc0434ded (patch)
treedebcce8f9747a00e4d46d4c90847952d1ed74360
parentc677ba8b3c47650358572091ed8a6af50bfca877 (diff)
net: bcmgenet: correctly resume adapter from Wake-on-LAN
In case we configured the adapter to be a wake up source from Wake-on-LAN, but we never actually woke up using Wake-on-LAN, we will leave the adapter in MagicPacket matching mode, which prevents any other type of packets from reaching the RX engine. Fix this by calling bcmgenet_power_up() with GENET_POWER_WOL_MAGIC to restore the adapter configuration in bcmgenet_resume(). The second problem we had was an imbalanced clock disabling in bcmgenet_wol_resume(), the Wake-on-LAN slow clock is only enabled in bcmgenet_suspend() if we configured Wake-on-LAN, yet we unconditionally disabled the clock in bcmgenet_wol_resume(). Fixes: 8c90db72f926 ("net: bcmgenet: suspend and resume from Wake-on-LAN") 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/genet/bcmgenet.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 90eb9c4b1b2c..3f9d4de8173c 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1962,7 +1962,8 @@ static void bcmgenet_set_hw_addr(struct bcmgenet_priv *priv,
1962static int bcmgenet_wol_resume(struct bcmgenet_priv *priv) 1962static int bcmgenet_wol_resume(struct bcmgenet_priv *priv)
1963{ 1963{
1964 /* From WOL-enabled suspend, switch to regular clock */ 1964 /* From WOL-enabled suspend, switch to regular clock */
1965 clk_disable_unprepare(priv->clk_wol); 1965 if (priv->wolopts)
1966 clk_disable_unprepare(priv->clk_wol);
1966 1967
1967 phy_init_hw(priv->phydev); 1968 phy_init_hw(priv->phydev);
1968 /* Speed settings must be restored */ 1969 /* Speed settings must be restored */
@@ -2668,9 +2669,7 @@ static int bcmgenet_resume(struct device *d)
2668 if (ret) 2669 if (ret)
2669 goto out_clk_disable; 2670 goto out_clk_disable;
2670 2671
2671 if (priv->wolopts) 2672 ret = bcmgenet_wol_resume(priv);
2672 ret = bcmgenet_wol_resume(priv);
2673
2674 if (ret) 2673 if (ret)
2675 goto out_clk_disable; 2674 goto out_clk_disable;
2676 2675
@@ -2685,6 +2684,9 @@ static int bcmgenet_resume(struct device *d)
2685 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); 2684 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
2686 } 2685 }
2687 2686
2687 if (priv->wolopts)
2688 bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
2689
2688 /* Disable RX/TX DMA and flush TX queues */ 2690 /* Disable RX/TX DMA and flush TX queues */
2689 dma_ctrl = bcmgenet_dma_disable(priv); 2691 dma_ctrl = bcmgenet_dma_disable(priv);
2690 2692