]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: bcmgenet: Clear RGMII_LINK upon link down
authorFlorian Fainelli <f.fainelli@gmail.com>
Wed, 15 May 2024 17:02:24 +0000 (10:02 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2024 09:56:24 +0000 (11:56 +0200)
commit 696450c05181559a35d4d5bee55c465b1ac6fe2e upstream

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: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20221118213754.1383364-1-f.fainelli@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/broadcom/genet/bcmmii.c

index 1779ee524dac77d21fd5435db3f4f1e7c798b284..cc3afb605b1ec83a2f988e6af773525e2f8ae7bc 100644 (file)
@@ -72,7 +72,6 @@ static void bcmgenet_mac_config(struct net_device *dev)
         * Receive clock is provided by the PHY.
         */
        reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
-       reg &= ~OOB_DISABLE;
        reg |= RGMII_LINK;
        bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
 
@@ -100,10 +99,18 @@ static void bcmgenet_mac_config(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;
+       u32 reg;
 
-       if (phydev->link)
+       if (phydev->link) {
                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);
 }
 
@@ -264,18 +271,20 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
                        (priv->phy_interface != PHY_INTERFACE_MODE_MOCA);
 
        /* 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) {
-               reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
                reg &= ~ID_MODE_DIS;
                reg |= id_mode_dis;
                if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv))
                        reg |= RGMII_MODE_EN_V123;
                else
                        reg |= RGMII_MODE_EN;
-               bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
        }
+       bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
 
        if (init)
                dev_info(kdev, "configuring instance for %s\n", phy_name);