]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: phy: bcm54811: Fix GMII/MII/MII-Lite selection
authorKamil Horák - 2N <kamilh@axis.com>
Thu, 9 Oct 2025 13:06:56 +0000 (15:06 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 Oct 2025 00:36:20 +0000 (17:36 -0700)
The Broadcom bcm54811 is hardware-strapped to select among RGMII and
GMII/MII/MII-Lite modes. However, the corresponding bit, RGMII Enable
in Miscellaneous Control Register must be also set to select desired
RGMII or MII(-lite)/GMII mode.

Fixes: 3117a11fff5af9e7 ("net: phy: bcm54811: PHY initialization")
Signed-off-by: Kamil Horák - 2N <kamilh@axis.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20251009130656.1308237-2-kamilh@axis.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/broadcom.c
include/linux/brcmphy.h

index 3459a0e9d8b98d31c3da606d23d972513d0df801..cb306f9e80cca6f810afcab967923dd1896638dd 100644 (file)
@@ -405,7 +405,7 @@ static int bcm5481x_set_brrmode(struct phy_device *phydev, bool on)
 static int bcm54811_config_init(struct phy_device *phydev)
 {
        struct bcm54xx_phy_priv *priv = phydev->priv;
-       int err, reg, exp_sync_ethernet;
+       int err, reg, exp_sync_ethernet, aux_rgmii_en;
 
        /* Enable CLK125 MUX on LED4 if ref clock is enabled. */
        if (!(phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED)) {
@@ -434,6 +434,24 @@ static int bcm54811_config_init(struct phy_device *phydev)
        if (err < 0)
                return err;
 
+       /* Enable RGMII if configured */
+       if (phy_interface_is_rgmii(phydev))
+               aux_rgmii_en = MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RGMII_EN |
+                              MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RGMII_SKEW_EN;
+       else
+               aux_rgmii_en = 0;
+
+       /* Also writing Reserved bits 6:5 because the documentation requires
+        * them to be written to 0b11
+        */
+       err = bcm54xx_auxctl_write(phydev,
+                                  MII_BCM54XX_AUXCTL_SHDWSEL_MISC,
+                                  MII_BCM54XX_AUXCTL_MISC_WREN |
+                                  aux_rgmii_en |
+                                  MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RSVD);
+       if (err < 0)
+               return err;
+
        return bcm5481x_set_brrmode(phydev, priv->brr_mode);
 }
 
index 15c35655f482620b69a3a1be086ff128b7d789d9..115a964f3006965e9bfd247eb969b9ca586ae675 100644 (file)
 
 #define MII_BCM54XX_AUXCTL_SHDWSEL_MISC                        0x07
 #define MII_BCM54XX_AUXCTL_SHDWSEL_MISC_WIRESPEED_EN   0x0010
+#define MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RSVD           0x0060
 #define MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RGMII_EN       0x0080
 #define MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RGMII_SKEW_EN  0x0100
 #define MII_BCM54XX_AUXCTL_MISC_FORCE_AMDIX            0x0200