aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2014-08-11 17:50:44 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-11 18:10:11 -0400
commitc677ba8b3c47650358572091ed8a6af50bfca877 (patch)
tree0708972d3881aa53abd1075d39b3bc39cde1022a /drivers/net/ethernet
parentcc013fb4889892cd6058cfb122c43aeea7d930e8 (diff)
net: bcmgenet: update UMAC_CMD only when link is detected
When we bring the interface down, phy_stop() will schedule the PHY state machine to call our link adjustment callback. By the time we do so, we may have clock gated off the GENET hardware block, and this will cause bus errors to happen in bcmgenet_mii_setup(): Make sure that we only touch the UMAC_CMD register when there is an actual link. This is safe to do for two reasons: - updating the Ethernet MAC registers only make sense when a physical link is present - the PHY library state machine first set phydev->link = 0 before invoking phydev->adjust_link in the PHY_HALTED case Fixes: 240524089d7a ("net: bcmgenet: only update UMAC_CMD if something changed") Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c8
1 files changed, 6 insertions, 2 deletions
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)