Commit 696450c0 authored by Florian Fainelli's avatar Florian Fainelli Committed by Jakub Kicinski

net: bcmgenet: Clear RGMII_LINK upon link down

Clear the RGMII_LINK bit upon detecting link down to be consistent with
setting the bit upon link up. We also move the clearing of the
out-of-band disable to the runtime initialization rather than for each
link up/down transition.
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20221118213754.1383364-1-f.fainelli@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 4e9a6139
...@@ -72,7 +72,6 @@ static void bcmgenet_mac_config(struct net_device *dev) ...@@ -72,7 +72,6 @@ static void bcmgenet_mac_config(struct net_device *dev)
* Receive clock is provided by the PHY. * Receive clock is provided by the PHY.
*/ */
reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL); reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
reg &= ~OOB_DISABLE;
reg |= RGMII_LINK; reg |= RGMII_LINK;
bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL); bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
...@@ -95,10 +94,18 @@ static void bcmgenet_mac_config(struct net_device *dev) ...@@ -95,10 +94,18 @@ static void bcmgenet_mac_config(struct net_device *dev)
*/ */
void bcmgenet_mii_setup(struct net_device *dev) void bcmgenet_mii_setup(struct net_device *dev)
{ {
struct bcmgenet_priv *priv = netdev_priv(dev);
struct phy_device *phydev = dev->phydev; struct phy_device *phydev = dev->phydev;
u32 reg;
if (phydev->link) if (phydev->link) {
bcmgenet_mac_config(dev); bcmgenet_mac_config(dev);
} else {
reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
reg &= ~RGMII_LINK;
bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
}
phy_print_status(phydev); phy_print_status(phydev);
} }
...@@ -266,18 +273,20 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) ...@@ -266,18 +273,20 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
(priv->phy_interface != PHY_INTERFACE_MODE_MOCA); (priv->phy_interface != PHY_INTERFACE_MODE_MOCA);
/* This is an external PHY (xMII), so we need to enable the RGMII /* This is an external PHY (xMII), so we need to enable the RGMII
* block for the interface to work * block for the interface to work, unconditionally clear the
* Out-of-band disable since we do not need it.
*/ */
reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
reg &= ~OOB_DISABLE;
if (priv->ext_phy) { if (priv->ext_phy) {
reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
reg &= ~ID_MODE_DIS; reg &= ~ID_MODE_DIS;
reg |= id_mode_dis; reg |= id_mode_dis;
if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv)) if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv))
reg |= RGMII_MODE_EN_V123; reg |= RGMII_MODE_EN_V123;
else else
reg |= RGMII_MODE_EN; reg |= RGMII_MODE_EN;
bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
} }
bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
if (init) if (init)
dev_info(kdev, "configuring instance for %s\n", phy_name); dev_info(kdev, "configuring instance for %s\n", phy_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment