On Tue, Jun 07, 2016 at 02:22:12AM +0200, Andrew Lunn wrote: > > @@ -304,6 +312,18 @@ static int dsa_ds_apply(struct dsa_switch_tree *dst, > > struct dsa_switch *ds) > > if (err < 0) > > return err; > > > > + if (!ds->slave_mii_bus && ds->drv->phy_read) { > > + ds->slave_mii_bus = devm_mdiobus_alloc(ds->dev); > > + if (!ds->slave_mii_bus) > > + return err; > > + > > + dsa_slave_mii_bus_init(ds); > > + > > + err = mdiobus_register(ds->slave_mii_bus); > > + if (err < 0) > > + return err; > > + } > > + > > for (index = 0; index < DSA_MAX_PORTS; index++) { > > port = ds->ports[index].dn; > > if (!port) > > Hi Florian
... > It is also missing the unregister in dsa_ds_unapply(). Looking at this again... You use devm_mdiobus_alloc(), so the memory for the bus will get freed eventually. However, it won't get unregistered before it is freed. So an explicit unregister is needed. Doing that in dsa_ds_unapply() makes sense, so we have a clear life cycle for this mdio bus. Andrew