Commit 99d81e94 authored by Saravana Kannan's avatar Saravana Kannan Committed by David S. Miller
Browse files

net: mdio-mux: Don't ignore memory allocation errors



If we are seeing memory allocation errors, don't try to continue
registering child mdiobus devices. It's unlikely they'll succeed.

Fixes: 342fa196 ("mdio: mux: make child bus walking more permissive and errors more verbose")
Signed-off-by: default avatarSaravana Kannan <saravanak@google.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Acked-by: default avatarMarc Zyngier <maz@kernel.org>
Tested-by: default avatarMarc Zyngier <maz@kernel.org>
Acked-by: default avatarKevin Hilman <khilman@baylibre.com>
Tested-by: default avatarKevin Hilman <khilman@baylibre.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 663d946a
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -82,6 +82,17 @@ static int mdio_mux_write(struct mii_bus *bus, int phy_id,

static int parent_count;

static void mdio_mux_uninit_children(struct mdio_mux_parent_bus *pb)
{
	struct mdio_mux_child_bus *cb = pb->children;

	while (cb) {
		mdiobus_unregister(cb->mii_bus);
		mdiobus_free(cb->mii_bus);
		cb = cb->next;
	}
}

int mdio_mux_init(struct device *dev,
		  struct device_node *mux_node,
		  int (*switch_fn)(int cur, int desired, void *data),
@@ -144,7 +155,7 @@ int mdio_mux_init(struct device *dev,
		cb = devm_kzalloc(dev, sizeof(*cb), GFP_KERNEL);
		if (!cb) {
			ret_val = -ENOMEM;
			continue;
			goto err_loop;
		}
		cb->bus_number = v;
		cb->parent = pb;
@@ -152,8 +163,7 @@ int mdio_mux_init(struct device *dev,
		cb->mii_bus = mdiobus_alloc();
		if (!cb->mii_bus) {
			ret_val = -ENOMEM;
			devm_kfree(dev, cb);
			continue;
			goto err_loop;
		}
		cb->mii_bus->priv = cb;

@@ -181,6 +191,10 @@ int mdio_mux_init(struct device *dev,
	}

	dev_err(dev, "Error: No acceptable child buses found\n");

err_loop:
	mdio_mux_uninit_children(pb);
	of_node_put(child_bus_node);
err_pb_kz:
	put_device(&parent_bus->dev);
err_parent_bus:
@@ -192,14 +206,8 @@ EXPORT_SYMBOL_GPL(mdio_mux_init);
void mdio_mux_uninit(void *mux_handle)
{
	struct mdio_mux_parent_bus *pb = mux_handle;
	struct mdio_mux_child_bus *cb = pb->children;

	while (cb) {
		mdiobus_unregister(cb->mii_bus);
		mdiobus_free(cb->mii_bus);
		cb = cb->next;
	}

	mdio_mux_uninit_children(pb);
	put_device(&pb->mii_bus->dev);
}
EXPORT_SYMBOL_GPL(mdio_mux_uninit);