[PATCH 4/8] net: fec_mxc: fix remove with DM_MDIO

Alexander Feilke Alexander.Feilke at ew.tq-group.com
Fri Nov 21 18:34:44 CET 2025


From: Markus Niebel <Markus.Niebel at ew.tq-group.com>

If DM_MDIO is used and the FEC device is removed the mdio API
must not be used to remove the bus structure. Store pointer the
the udevice for MDIO bus created by dm_fec_bind_mdio and use DM
functions to cleanup the device in fecmxc_remove.

Fixes: 3b8f99a3e762 ("net: fec: add support for DM_MDIO")

Signed-off-by: Markus Niebel <Markus.Niebel at ew.tq-group.com>
Signed-off-by: Alexander Stein <alexander.stein at ew.tq-group.com>
Signed-off-by: Alexander Feilke <alexander.feilke at ew.tq-group.com>
---
 drivers/net/fec_mxc.c | 14 +++++++++++++-
 drivers/net/fec_mxc.h |  3 +++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index 18c717855b4..69a76e879b1 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -9,6 +9,7 @@
 
 #include <cpu_func.h>
 #include <dm.h>
+#include <dm/device-internal.h>
 #include <env.h>
 #include <log.h>
 #include <malloc.h>
@@ -1089,8 +1090,12 @@ static int dm_fec_bind_mdio(struct udevice *dev)
 
 		/* need to probe it as there is no compatible to do so */
 		ret = uclass_get_device_by_ofnode(UCLASS_MDIO, mdio, &mdiodev);
-		if (!ret)
+		if (!ret) {
+			struct fec_priv *priv = dev_get_priv(dev);
+
+			priv->mdio_bus = mdiodev;
 			return 0;
+		}
 		printf("%s probe %s failed: %d\n", __func__, name, ret);
 	}
 
@@ -1431,8 +1436,15 @@ static int fecmxc_remove(struct udevice *dev)
 
 	free(priv->phydev);
 	fec_free_descs(priv);
+#ifdef CONFIG_DM_MDIO
+	if (priv->mdio_bus) {
+		device_remove(priv->mdio_bus, DM_REMOVE_NORMAL);
+		device_unbind(priv->mdio_bus);
+	}
+#else
 	mdio_unregister(priv->bus);
 	mdio_free(priv->bus);
+#endif
 
 #ifdef CONFIG_DM_REGULATOR
 	if (priv->phy_supply)
diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h
index 77bfc1cbf45..12cc00423fa 100644
--- a/drivers/net/fec_mxc.h
+++ b/drivers/net/fec_mxc.h
@@ -255,6 +255,9 @@ struct fec_priv {
 	int phy_id;
 	int (*mii_postcall)(int);
 #endif
+#ifdef CONFIG_DM_MDIO
+	struct udevice *mdio_bus;
+#endif
 #ifdef CONFIG_DM_REGULATOR
 	struct udevice *phy_supply;
 #endif
-- 
2.34.1



More information about the U-Boot mailing list