]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: phy: bcm5481x: MII-Lite activation
authorKamil Horák - 2N <kamilh@axis.com>
Tue, 8 Jul 2025 09:01:39 +0000 (11:01 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 10 Jul 2025 02:32:31 +0000 (19:32 -0700)
Broadcom PHYs featuring the BroadR-Reach two-wire link mode are usually
capable to operate in simplified MII mode, without TXER, RXER, CRS and
COL signals as defined for the MII. The absence of COL signal makes
half-duplex link modes impossible, however, the BroadR-Reach modes are
all full-duplex only.
Depending on the IC encapsulation, there exist MII-Lite-only PHYs such
as bcm54811 in MLP. The PHY itself is hardware-strapped to select among
multiple RGMII and MII-Lite modes, but the MII-Lite mode must be also
activated by software.

Add MII-Lite activation for bcm5481x PHYs.

Signed-off-by: Kamil Horák - 2N <kamilh@axis.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/20250708090140.61355-4-kamilh@axis.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/broadcom.c
include/linux/brcmphy.h

index 9b1de54fd4835ce358bf1a3e36c195efae74b6a2..8547983bd72f4cd7ab01e404750558302fd5a47e 100644 (file)
@@ -407,7 +407,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;
+       int err, reg, exp_sync_ethernet;
 
        /* Enable CLK125 MUX on LED4 if ref clock is enabled. */
        if (!(phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED)) {
@@ -424,6 +424,18 @@ static int bcm54811_config_init(struct phy_device *phydev)
        if (priv->brr_mode)
                phydev->autoneg = 0;
 
+       /* Enable MII Lite (No TXER, RXER, CRS, COL) if configured */
+       if (phydev->interface == PHY_INTERFACE_MODE_MIILITE)
+               exp_sync_ethernet = BCM_EXP_SYNC_ETHERNET_MII_LITE;
+       else
+               exp_sync_ethernet = 0;
+
+       err = bcm_phy_modify_exp(phydev, BCM_EXP_SYNC_ETHERNET,
+                                BCM_EXP_SYNC_ETHERNET_MII_LITE,
+                                exp_sync_ethernet);
+       if (err < 0)
+               return err;
+
        return bcm5481x_set_brrmode(phydev, priv->brr_mode);
 }
 
index 028b3e00378e3dc9f07362284b1e772fc044dc19..15c35655f482620b69a3a1be086ff128b7d789d9 100644 (file)
 #define BCM_LED_MULTICOLOR_ACT         0x9
 #define BCM_LED_MULTICOLOR_PROGRAM     0xa
 
+/*
+ * Broadcom Synchronous Ethernet Controls (expansion register 0x0E)
+ */
+#define BCM_EXP_SYNC_ETHERNET          (MII_BCM54XX_EXP_SEL_ER + 0x0E)
+#define BCM_EXP_SYNC_ETHERNET_MII_LITE BIT(11)
+
 /*
  * BCM5482: Shadow registers
  * Shadow values go into bits [14:10] of register 0x1c to select a shadow