aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c37
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c8
2 files changed, 30 insertions, 15 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index ce455aed5a2f..3f9d4de8173c 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -739,7 +739,6 @@ static void bcmgenet_power_down(struct bcmgenet_priv *priv,
739 739
740 case GENET_POWER_PASSIVE: 740 case GENET_POWER_PASSIVE:
741 /* Power down LED */ 741 /* Power down LED */
742 bcmgenet_mii_reset(priv->dev);
743 if (priv->hw_params->flags & GENET_HAS_EXT) { 742 if (priv->hw_params->flags & GENET_HAS_EXT) {
744 reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); 743 reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
745 reg |= (EXT_PWR_DOWN_PHY | 744 reg |= (EXT_PWR_DOWN_PHY |
@@ -779,7 +778,9 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,
779 } 778 }
780 779
781 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); 780 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
782 bcmgenet_mii_reset(priv->dev); 781
782 if (mode == GENET_POWER_PASSIVE)
783 bcmgenet_mii_reset(priv->dev);
783} 784}
784 785
785/* ioctl handle special commands that are not present in ethtool. */ 786/* ioctl handle special commands that are not present in ethtool. */
@@ -1961,7 +1962,8 @@ static void bcmgenet_set_hw_addr(struct bcmgenet_priv *priv,
1961static int bcmgenet_wol_resume(struct bcmgenet_priv *priv) 1962static int bcmgenet_wol_resume(struct bcmgenet_priv *priv)
1962{ 1963{
1963 /* From WOL-enabled suspend, switch to regular clock */ 1964 /* From WOL-enabled suspend, switch to regular clock */
1964 clk_disable_unprepare(priv->clk_wol); 1965 if (priv->wolopts)
1966 clk_disable_unprepare(priv->clk_wol);
1965 1967
1966 phy_init_hw(priv->phydev); 1968 phy_init_hw(priv->phydev);
1967 /* Speed settings must be restored */ 1969 /* Speed settings must be restored */
@@ -2164,6 +2166,10 @@ static void bcmgenet_netif_stop(struct net_device *dev)
2164 * disabled no new work will be scheduled. 2166 * disabled no new work will be scheduled.
2165 */ 2167 */
2166 cancel_work_sync(&priv->bcmgenet_irq_work); 2168 cancel_work_sync(&priv->bcmgenet_irq_work);
2169
2170 priv->old_pause = -1;
2171 priv->old_link = -1;
2172 priv->old_duplex = -1;
2167} 2173}
2168 2174
2169static int bcmgenet_close(struct net_device *dev) 2175static int bcmgenet_close(struct net_device *dev)
@@ -2533,6 +2539,13 @@ static int bcmgenet_probe(struct platform_device *pdev)
2533 priv->pdev = pdev; 2539 priv->pdev = pdev;
2534 priv->version = (enum bcmgenet_version)of_id->data; 2540 priv->version = (enum bcmgenet_version)of_id->data;
2535 2541
2542 priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
2543 if (IS_ERR(priv->clk))
2544 dev_warn(&priv->pdev->dev, "failed to get enet clock\n");
2545
2546 if (!IS_ERR(priv->clk))
2547 clk_prepare_enable(priv->clk);
2548
2536 bcmgenet_set_hw_params(priv); 2549 bcmgenet_set_hw_params(priv);
2537 2550
2538 /* Mii wait queue */ 2551 /* Mii wait queue */
@@ -2541,17 +2554,10 @@ static int bcmgenet_probe(struct platform_device *pdev)
2541 priv->rx_buf_len = RX_BUF_LENGTH; 2554 priv->rx_buf_len = RX_BUF_LENGTH;
2542 INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task); 2555 INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task);
2543 2556
2544 priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
2545 if (IS_ERR(priv->clk))
2546 dev_warn(&priv->pdev->dev, "failed to get enet clock\n");
2547
2548 priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol"); 2557 priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol");
2549 if (IS_ERR(priv->clk_wol)) 2558 if (IS_ERR(priv->clk_wol))
2550 dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n"); 2559 dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n");
2551 2560
2552 if (!IS_ERR(priv->clk))
2553 clk_prepare_enable(priv->clk);
2554
2555 err = reset_umac(priv); 2561 err = reset_umac(priv);
2556 if (err) 2562 if (err)
2557 goto err_clk_disable; 2563 goto err_clk_disable;
@@ -2611,6 +2617,8 @@ static int bcmgenet_suspend(struct device *d)
2611 2617
2612 bcmgenet_netif_stop(dev); 2618 bcmgenet_netif_stop(dev);
2613 2619
2620 phy_suspend(priv->phydev);
2621
2614 netif_device_detach(dev); 2622 netif_device_detach(dev);
2615 2623
2616 /* Disable MAC receive */ 2624 /* Disable MAC receive */
@@ -2661,9 +2669,7 @@ static int bcmgenet_resume(struct device *d)
2661 if (ret) 2669 if (ret)
2662 goto out_clk_disable; 2670 goto out_clk_disable;
2663 2671
2664 if (priv->wolopts) 2672 ret = bcmgenet_wol_resume(priv);
2665 ret = bcmgenet_wol_resume(priv);
2666
2667 if (ret) 2673 if (ret)
2668 goto out_clk_disable; 2674 goto out_clk_disable;
2669 2675
@@ -2678,6 +2684,9 @@ static int bcmgenet_resume(struct device *d)
2678 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); 2684 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
2679 } 2685 }
2680 2686
2687 if (priv->wolopts)
2688 bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
2689
2681 /* Disable RX/TX DMA and flush TX queues */ 2690 /* Disable RX/TX DMA and flush TX queues */
2682 dma_ctrl = bcmgenet_dma_disable(priv); 2691 dma_ctrl = bcmgenet_dma_disable(priv);
2683 2692
@@ -2693,6 +2702,8 @@ static int bcmgenet_resume(struct device *d)
2693 2702
2694 netif_device_attach(dev); 2703 netif_device_attach(dev);
2695 2704
2705 phy_resume(priv->phydev);
2706
2696 bcmgenet_netif_start(dev); 2707 bcmgenet_netif_start(dev);
2697 2708
2698 return 0; 2709 return 0;
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index b56f1bbb17bf..c88f7ae99636 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -129,7 +129,10 @@ static void bcmgenet_mii_setup(struct net_device *dev)
129 cmd_bits |= CMD_RX_PAUSE_IGNORE | CMD_TX_PAUSE_IGNORE; 129 cmd_bits |= CMD_RX_PAUSE_IGNORE | CMD_TX_PAUSE_IGNORE;
130 } 130 }
131 131
132 if (status_changed) { 132 if (!status_changed)
133 return;
134
135 if (phydev->link) {
133 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 136 reg = bcmgenet_umac_readl(priv, UMAC_CMD);
134 reg &= ~((CMD_SPEED_MASK << CMD_SPEED_SHIFT) | 137 reg &= ~((CMD_SPEED_MASK << CMD_SPEED_SHIFT) |
135 CMD_HD_EN | 138 CMD_HD_EN |
@@ -137,8 +140,9 @@ static void bcmgenet_mii_setup(struct net_device *dev)
137 reg |= cmd_bits; 140 reg |= cmd_bits;
138 bcmgenet_umac_writel(priv, reg, UMAC_CMD); 141 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
139 142
140 phy_print_status(phydev);
141 } 143 }
144
145 phy_print_status(phydev);
142} 146}
143 147
144void bcmgenet_mii_reset(struct net_device *dev) 148void bcmgenet_mii_reset(struct net_device *dev)