Hi Andrew, Andrew Lunn <and...@lunn.ch> writes:
> -static void dsa_switch_destroy(struct dsa_switch *ds) > +void dsa_cpu_dsa_destroy(struct device_node *port_dn) > { > - struct device_node *port_dn; > struct phy_device *phydev; > + > + if (of_phy_is_fixed_link(port_dn)) { > + phydev = of_phy_find_device(port_dn); > + if (phydev) { > + phy_device_free(phydev); > + fixed_phy_unregister(phydev); > + } > + } > +} > + > +static void dsa_switch_destroy(struct dsa_switch *ds) > +{ > int port; > > #ifdef CONFIG_NET_DSA_HWMON > @@ -445,17 +467,11 @@ static void dsa_switch_destroy(struct dsa_switch *ds) > dsa_slave_destroy(ds->ports[port].netdev); > } > > - /* Remove any fixed link PHYs */ > + /* Disable configuration of the CPU and DSA ports */ > for (port = 0; port < DSA_MAX_PORTS; port++) { > - port_dn = ds->ports[port].dn; > - if (of_phy_is_fixed_link(port_dn)) { > - phydev = of_phy_find_device(port_dn); > - if (phydev) { > - phy_device_free(phydev); > - of_node_put(port_dn); Why does dsa_cpu_dsa_destroy drop that of_node_put call? > - fixed_phy_unregister(phydev); > - } > - } > + if ((dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))) > + continue; Why do we skip DSA and CPU ports here? The previous code didn't. > + dsa_cpu_dsa_destroy(ds->ports[port].dn); Thanks, Vivien