diff options
| author | David S. Miller <davem@davemloft.net> | 2014-08-11 18:10:17 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-08-11 18:10:17 -0400 |
| commit | 61dac43ee6bedd8507294c7af8959157b686c221 (patch) | |
| tree | debcce8f9747a00e4d46d4c90847952d1ed74360 | |
| parent | 8dff81e87d5c2867d7401f8ee7b1eb3e3aa2ba8d (diff) | |
| parent | 98bb7399d29a53a58f497409f98acb3bc0434ded (diff) | |
Merge branch 'bcmgenet'
Florian Fainelli says:
====================
net: bcmgenet: Wake-on-LAN and suspend fixes
This patch series fixes some mistakes that were introduced during the driver
changes adding support suspend/resume and Wake-on-LAN.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
| -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) |
