[PATCH net-next v3 3/5] net: phy: mxl-gpy: release MxL86211C Super Isolate
From: Robert Marko
Date: Tue Oct 20 2026 - 05:38:47 EST
The MxL86211C can be strapped into Super Isolate mode, leaving the PHY
halted after reset until software releases it.
Release Super Isolate before gpy_probe() reads the firmware version. Do it
again in config_init, where optional VDDP setup is reapplied after each
hardware reset.
Signed-off-by: Robert Marko <robert.marko@xxxxxxxxxx>
---
Changes in v3:
- Release Super Isolate during probe before reading the firmware version.
- Reapply the MDIO pad voltage only when a VDDP supply is provided.
Changes in v2:
- Move Super Isolate release from probe to config_init for resets.
- Reapply the MDIO pad voltage before releasing Super Isolate.
drivers/net/phy/mxl-gpy.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/drivers/net/phy/mxl-gpy.c b/drivers/net/phy/mxl-gpy.c
index 952272faac1e8..dba0777158b2d 100644
--- a/drivers/net/phy/mxl-gpy.c
+++ b/drivers/net/phy/mxl-gpy.c
@@ -114,6 +114,7 @@
/* Packet Manager Control */
#define VSPEC1_PM_CTRL 0x0c
#define VSPEC1_PM_CTRL_MDIO_VOL BIT(14)
+#define VSPEC1_PM_CTRL_SI BIT(12) /* Super Isolate */
/* Temperature sensor */
#define VSPEC1_TEMP_STA 0x0E
@@ -427,6 +428,30 @@ static void mxl86211c_disable_vddp(void *data)
regulator_disable(data);
}
+static int mxl86211c_release_super_isolate(struct phy_device *phydev)
+{
+ return phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_PM_CTRL,
+ VSPEC1_PM_CTRL_SI, 0);
+}
+
+static int mxl86211c_config_init(struct phy_device *phydev)
+{
+ struct gpy_priv *priv = phydev->priv;
+ int ret;
+
+ if (priv->vddp) {
+ ret = mxl86211c_configure_mdio_voltage(phydev, priv->vddp);
+ if (ret)
+ return ret;
+ }
+
+ ret = mxl86211c_release_super_isolate(phydev);
+ if (ret)
+ return ret;
+
+ return gpy21x_config_init(phydev);
+}
+
static int mxl86211c_probe(struct phy_device *phydev)
{
struct device *dev = &phydev->mdio.dev;
@@ -456,6 +481,10 @@ static int mxl86211c_probe(struct phy_device *phydev)
return ret;
}
+ ret = mxl86211c_release_super_isolate(phydev);
+ if (ret)
+ return ret;
+
ret = gpy_probe(phydev);
if (ret)
return ret;
@@ -1481,7 +1510,7 @@ static struct phy_driver gpy_drivers[] = {
PHY_ID_MATCH_MODEL(PHY_ID_MXL86211C),
.name = "Maxlinear Ethernet MxL86211C",
.get_features = genphy_c45_pma_read_abilities,
- .config_init = gpy21x_config_init,
+ .config_init = mxl86211c_config_init,
.probe = mxl86211c_probe,
.inband_caps = gpy_inband_caps,
.config_inband = gpy_config_inband,
--
2.56.0