diff options
-rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmgenet.c | 37 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmmii.c | 8 |
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, | |||
1961 | static int bcmgenet_wol_resume(struct bcmgenet_priv *priv) | 1962 | static 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 | ||
2169 | static int bcmgenet_close(struct net_device *dev) | 2175 | static 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 | ||
144 | void bcmgenet_mii_reset(struct net_device *dev) | 148 | void bcmgenet_mii_reset(struct net_device *dev) |