net: mdio-mux: Don't ignore memory allocation errors
[ Upstream commit 99d81e942474cc7677d12f673f42a7ea699e2589 ]
If we are seeing memory allocation errors, don't try to continue
registering child mdiobus devices. It's unlikely they'll succeed.
Fixes: 342fa19644
("mdio: mux: make child bus walking more permissive and errors more verbose")
Signed-off-by: Saravana Kannan <saravanak@google.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Marc Zyngier <maz@kernel.org>
Tested-by: Marc Zyngier <maz@kernel.org>
Acked-by: Kevin Hilman <khilman@baylibre.com>
Tested-by: Kevin Hilman <khilman@baylibre.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Sasha Levin

parent
df61235881
commit
13af9c81e6
@@ -82,6 +82,17 @@ out:
|
|||||||
|
|
||||||
static int parent_count;
|
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,
|
int mdio_mux_init(struct device *dev,
|
||||||
struct device_node *mux_node,
|
struct device_node *mux_node,
|
||||||
int (*switch_fn)(int cur, int desired, void *data),
|
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);
|
cb = devm_kzalloc(dev, sizeof(*cb), GFP_KERNEL);
|
||||||
if (!cb) {
|
if (!cb) {
|
||||||
ret_val = -ENOMEM;
|
ret_val = -ENOMEM;
|
||||||
continue;
|
goto err_loop;
|
||||||
}
|
}
|
||||||
cb->bus_number = v;
|
cb->bus_number = v;
|
||||||
cb->parent = pb;
|
cb->parent = pb;
|
||||||
@@ -152,8 +163,7 @@ int mdio_mux_init(struct device *dev,
|
|||||||
cb->mii_bus = mdiobus_alloc();
|
cb->mii_bus = mdiobus_alloc();
|
||||||
if (!cb->mii_bus) {
|
if (!cb->mii_bus) {
|
||||||
ret_val = -ENOMEM;
|
ret_val = -ENOMEM;
|
||||||
devm_kfree(dev, cb);
|
goto err_loop;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
cb->mii_bus->priv = cb;
|
cb->mii_bus->priv = cb;
|
||||||
|
|
||||||
@@ -182,6 +192,10 @@ int mdio_mux_init(struct device *dev,
|
|||||||
|
|
||||||
dev_err(dev, "Error: No acceptable child buses found\n");
|
dev_err(dev, "Error: No acceptable child buses found\n");
|
||||||
devm_kfree(dev, pb);
|
devm_kfree(dev, pb);
|
||||||
|
|
||||||
|
err_loop:
|
||||||
|
mdio_mux_uninit_children(pb);
|
||||||
|
of_node_put(child_bus_node);
|
||||||
err_pb_kz:
|
err_pb_kz:
|
||||||
put_device(&parent_bus->dev);
|
put_device(&parent_bus->dev);
|
||||||
err_parent_bus:
|
err_parent_bus:
|
||||||
@@ -193,14 +207,8 @@ EXPORT_SYMBOL_GPL(mdio_mux_init);
|
|||||||
void mdio_mux_uninit(void *mux_handle)
|
void mdio_mux_uninit(void *mux_handle)
|
||||||
{
|
{
|
||||||
struct mdio_mux_parent_bus *pb = 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);
|
put_device(&pb->mii_bus->dev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mdio_mux_uninit);
|
EXPORT_SYMBOL_GPL(mdio_mux_uninit);
|
||||||
|
Reference in New Issue
Block a user