net: bcmgenet: apply MII configuration in bcmgenet_open()
In case an interface has been brought down before entering S3, and then brought up out of S3, all the initialization done during bcmgenet_probe() by bcmgenet_mii_init() calling bcmgenet_mii_config() is just lost since register contents are restored to their reset values. Re-apply this configuration anytime we call bcmgenet_open() to make sure our port multiplexer is properly configured to match the PHY interface. Since we are now calling bcmgenet_mii_config() everytime bcmgenet_open() is called, make sure we only print the message during initialization time not to pollute the console. Fixes:b6e978e504
("net: bcmgenet: add suspend/resume callbacks") Fixes:1c1008c793
("net: bcmgenet: add main driver file") Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c96e731c93
commit
dbd479db79
3 changed files with 9 additions and 5 deletions
|
@ -2140,6 +2140,9 @@ static int bcmgenet_open(struct net_device *dev)
|
||||||
goto err_irq0;
|
goto err_irq0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Re-configure the port multiplexer towards the PHY device */
|
||||||
|
bcmgenet_mii_config(priv->dev, false);
|
||||||
|
|
||||||
phy_connect_direct(dev, priv->phydev, bcmgenet_mii_setup,
|
phy_connect_direct(dev, priv->phydev, bcmgenet_mii_setup,
|
||||||
priv->phy_interface);
|
priv->phy_interface);
|
||||||
|
|
||||||
|
@ -2691,7 +2694,7 @@ static int bcmgenet_resume(struct device *d)
|
||||||
|
|
||||||
phy_init_hw(priv->phydev);
|
phy_init_hw(priv->phydev);
|
||||||
/* Speed settings must be restored */
|
/* Speed settings must be restored */
|
||||||
bcmgenet_mii_config(priv->dev);
|
bcmgenet_mii_config(priv->dev, false);
|
||||||
|
|
||||||
/* disable ethernet MAC while updating its registers */
|
/* disable ethernet MAC while updating its registers */
|
||||||
umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false);
|
umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false);
|
||||||
|
|
|
@ -617,7 +617,7 @@ GENET_IO_MACRO(rbuf, GENET_RBUF_OFF);
|
||||||
|
|
||||||
/* MDIO routines */
|
/* MDIO routines */
|
||||||
int bcmgenet_mii_init(struct net_device *dev);
|
int bcmgenet_mii_init(struct net_device *dev);
|
||||||
int bcmgenet_mii_config(struct net_device *dev);
|
int bcmgenet_mii_config(struct net_device *dev, bool init);
|
||||||
void bcmgenet_mii_exit(struct net_device *dev);
|
void bcmgenet_mii_exit(struct net_device *dev);
|
||||||
void bcmgenet_mii_reset(struct net_device *dev);
|
void bcmgenet_mii_reset(struct net_device *dev);
|
||||||
void bcmgenet_mii_setup(struct net_device *dev);
|
void bcmgenet_mii_setup(struct net_device *dev);
|
||||||
|
|
|
@ -211,7 +211,7 @@ static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv)
|
||||||
bcmgenet_sys_writel(priv, reg, SYS_PORT_CTRL);
|
bcmgenet_sys_writel(priv, reg, SYS_PORT_CTRL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bcmgenet_mii_config(struct net_device *dev)
|
int bcmgenet_mii_config(struct net_device *dev, bool init)
|
||||||
{
|
{
|
||||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||||
struct phy_device *phydev = priv->phydev;
|
struct phy_device *phydev = priv->phydev;
|
||||||
|
@ -298,7 +298,8 @@ int bcmgenet_mii_config(struct net_device *dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(kdev, "configuring instance for %s\n", phy_name);
|
if (init)
|
||||||
|
dev_info(kdev, "configuring instance for %s\n", phy_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -350,7 +351,7 @@ static int bcmgenet_mii_probe(struct net_device *dev)
|
||||||
* PHY speed which is needed for bcmgenet_mii_config() to configure
|
* PHY speed which is needed for bcmgenet_mii_config() to configure
|
||||||
* things appropriately.
|
* things appropriately.
|
||||||
*/
|
*/
|
||||||
ret = bcmgenet_mii_config(dev);
|
ret = bcmgenet_mii_config(dev, true);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
phy_disconnect(priv->phydev);
|
phy_disconnect(priv->phydev);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Add table
Reference in a new issue