Skip to content

Commit

Permalink
mdio: mux: make child bus walking more permissive and errors more ver…
Browse files Browse the repository at this point in the history
…bose

If any errors are encountered while walking the device tree structure of
the MDIO bus for children, the code may silently continue, silently
exit, or throw an error and exit.  This make it difficult for device
tree writers to know there is an error.  Also, it makes any error in a
child entry of the MDIO bus be fatal for all entries.  Instead, we
should provide verbose errors describing the error and then attempt to
continue if it all possible.  Also, use of_mdio_parse_addr()

Signed-off-by: Jon Mason <jon.mason@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jon Mason authored and davem330 committed Jun 4, 2017
1 parent e8317a4 commit 342fa19
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions drivers/net/phy/mdio-mux.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,27 +135,33 @@ int mdio_mux_init(struct device *dev,
for_each_available_child_of_node(dev->of_node, child_bus_node) {
u32 v;

r = of_property_read_u32(child_bus_node, "reg", &v);
if (r)
v = of_mdio_parse_addr(dev, child_bus_node);
if (v < 0) {
dev_err(dev,
"Error: Failed to find reg for child %s\n",
of_node_full_name(child_bus_node));
continue;
}

cb = devm_kzalloc(dev, sizeof(*cb), GFP_KERNEL);
if (cb == NULL) {
dev_err(dev,
"Error: Failed to allocate memory for child\n");
"Error: Failed to allocate memory for child %s\n",
of_node_full_name(child_bus_node));
ret_val = -ENOMEM;
of_node_put(child_bus_node);
break;
continue;
}
cb->bus_number = v;
cb->parent = pb;

cb->mii_bus = mdiobus_alloc();
if (!cb->mii_bus) {
dev_err(dev,
"Error: Failed to allocate MDIO bus for child %s\n",
of_node_full_name(child_bus_node));
ret_val = -ENOMEM;
devm_kfree(dev, cb);
of_node_put(child_bus_node);
break;
continue;
}
cb->mii_bus->priv = cb;

Expand All @@ -167,6 +173,9 @@ int mdio_mux_init(struct device *dev,
cb->mii_bus->write = mdio_mux_write;
r = of_mdiobus_register(cb->mii_bus, child_bus_node);
if (r) {
dev_err(dev,
"Error: Failed to register MDIO bus for child %s\n",
of_node_full_name(child_bus_node));
mdiobus_free(cb->mii_bus);
devm_kfree(dev, cb);
} else {
Expand All @@ -180,6 +189,7 @@ int mdio_mux_init(struct device *dev,
return 0;
}

dev_err(dev, "Error: No acceptable child buses found\n");
devm_kfree(dev, pb);
err_pb_kz:
/* balance the reference of_mdio_find_bus() took */
Expand Down

0 comments on commit 342fa19

Please sign in to comment.