Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbc5d90b authored by Neil Armstrong's avatar Neil Armstrong Committed by David S. Miller
Browse files

net: dsa: complete dsa_switch_destroy



When unbinding dsa, complete the dsa_switch_destroy to unregister the
fixed link phy then cleanly unregister and destroy the net devices.

Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e410ddb8
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/of_platform.h>
#include <linux/of_net.h>
#include <linux/sysfs.h>
#include <linux/phy_fixed.h>
#include "dsa_priv.h"

char dsa_driver_version[] = "0.1";
@@ -420,10 +421,46 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,

static void dsa_switch_destroy(struct dsa_switch *ds)
{
	struct device_node *port_dn;
	struct phy_device *phydev;
	struct dsa_chip_data *cd = ds->pd;
	int port;

#ifdef CONFIG_NET_DSA_HWMON
	if (ds->hwmon_dev)
		hwmon_device_unregister(ds->hwmon_dev);
#endif

	/* Disable configuration of the CPU and DSA ports */
	for (port = 0; port < DSA_MAX_PORTS; port++) {
		if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
			continue;

		port_dn = cd->port_dn[port];
		if (of_phy_is_fixed_link(port_dn)) {
			phydev = of_phy_find_device(port_dn);
			if (phydev) {
				int addr = phydev->addr;

				phy_device_free(phydev);
				of_node_put(port_dn);
				fixed_phy_del(addr);
			}
		}
	}

	/* Destroy network devices for physical switch ports. */
	for (port = 0; port < DSA_MAX_PORTS; port++) {
		if (!(ds->phys_port_mask & (1 << port)))
			continue;

		if (!ds->ports[port])
			continue;

		unregister_netdev(ds->ports[port]);
		free_netdev(ds->ports[port]);
	}

	mdiobus_unregister(ds->slave_mii_bus);
	mdiobus_free(ds->slave_mii_bus);
}