diff options
| author | Florian Fainelli <f.fainelli@gmail.com> | 2015-03-23 18:09:56 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-03-23 22:10:43 -0400 |
| commit | a642c4f7906f36bf431da41973d6ff16b723f079 (patch) | |
| tree | 4aff92da65a3724552bfdbdade427fb32f71b4a5 | |
| parent | a9d608c153a28758e0cd11c907edbaf5cce47abc (diff) | |
net: bcmgenet: power up and down integrated GPHY when unused
Power up the GPHY while we are bringing-up the network interface, and
conversely, upon bring down, power the GPHY down. In order to avoid
creating hardware hazards, make sure that the GPHY gets powered on
during bcmgenet_open() prior to the UniMAC being reset as the UniMAC may
start creating activity towards the GPHY if we reverse the steps.
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.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmgenet.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmmii.c | 2 |
3 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index f86837f1656a..c6b15c3cf023 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
| @@ -869,6 +869,8 @@ static int bcmgenet_power_down(struct bcmgenet_priv *priv, | |||
| 869 | reg |= (EXT_PWR_DOWN_PHY | | 869 | reg |= (EXT_PWR_DOWN_PHY | |
| 870 | EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS); | 870 | EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS); |
| 871 | bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); | 871 | bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); |
| 872 | |||
| 873 | bcmgenet_phy_power_set(priv->dev, false); | ||
| 872 | } | 874 | } |
| 873 | break; | 875 | break; |
| 874 | default: | 876 | default: |
| @@ -2465,9 +2467,6 @@ static void bcmgenet_netif_start(struct net_device *dev) | |||
| 2465 | 2467 | ||
| 2466 | umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true); | 2468 | umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true); |
| 2467 | 2469 | ||
| 2468 | if (phy_is_internal(priv->phydev)) | ||
| 2469 | bcmgenet_power_up(priv, GENET_POWER_PASSIVE); | ||
| 2470 | |||
| 2471 | netif_tx_start_all_queues(dev); | 2470 | netif_tx_start_all_queues(dev); |
| 2472 | 2471 | ||
| 2473 | phy_start(priv->phydev); | 2472 | phy_start(priv->phydev); |
| @@ -2486,6 +2485,12 @@ static int bcmgenet_open(struct net_device *dev) | |||
| 2486 | if (!IS_ERR(priv->clk)) | 2485 | if (!IS_ERR(priv->clk)) |
| 2487 | clk_prepare_enable(priv->clk); | 2486 | clk_prepare_enable(priv->clk); |
| 2488 | 2487 | ||
| 2488 | /* If this is an internal GPHY, power it back on now, before UniMAC is | ||
| 2489 | * brought out of reset as absolutely no UniMAC activity is allowed | ||
| 2490 | */ | ||
| 2491 | if (phy_is_internal(priv->phydev)) | ||
| 2492 | bcmgenet_power_up(priv, GENET_POWER_PASSIVE); | ||
| 2493 | |||
| 2489 | /* take MAC out of reset */ | 2494 | /* take MAC out of reset */ |
| 2490 | bcmgenet_umac_reset(priv); | 2495 | bcmgenet_umac_reset(priv); |
| 2491 | 2496 | ||
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index a27ef777cc81..7a59879d441f 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h | |||
| @@ -664,6 +664,7 @@ int bcmgenet_mii_init(struct net_device *dev); | |||
| 664 | int bcmgenet_mii_config(struct net_device *dev, bool init); | 664 | int bcmgenet_mii_config(struct net_device *dev, bool init); |
| 665 | void bcmgenet_mii_exit(struct net_device *dev); | 665 | void bcmgenet_mii_exit(struct net_device *dev); |
| 666 | void bcmgenet_mii_reset(struct net_device *dev); | 666 | void bcmgenet_mii_reset(struct net_device *dev); |
| 667 | void bcmgenet_phy_power_set(struct net_device *dev, bool enable); | ||
| 667 | void bcmgenet_mii_setup(struct net_device *dev); | 668 | void bcmgenet_mii_setup(struct net_device *dev); |
| 668 | 669 | ||
| 669 | /* Wake-on-LAN routines */ | 670 | /* Wake-on-LAN routines */ |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c index 3320219003fb..6d3b66a103cc 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c | |||
| @@ -168,7 +168,7 @@ void bcmgenet_mii_reset(struct net_device *dev) | |||
| 168 | } | 168 | } |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | static void bcmgenet_phy_power_set(struct net_device *dev, bool enable) | 171 | void bcmgenet_phy_power_set(struct net_device *dev, bool enable) |
| 172 | { | 172 | { |
| 173 | struct bcmgenet_priv *priv = netdev_priv(dev); | 173 | struct bcmgenet_priv *priv = netdev_priv(dev); |
| 174 | u32 reg = 0; | 174 | u32 reg = 0; |
