Skip to content

Commit

Permalink
net: dsa: mv88e6xxx: Unregister MDIO bus on error path
Browse files Browse the repository at this point in the history
The MDIO busses need to be unregistered before they are freed,
otherwise BUG() is called. Add a call to the unregister code if the
registration fails, since we can have multiple busses, of which some
may correctly register before one fails. This requires moving the code
around a little.

Fixes: a3c53be ("net: dsa: mv88e6xxx: Support multiple MDIO busses")
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Andrew Lunn authored and David S. Miller committed Dec 7, 2017
1 parent 3d5fdba commit 3126aee
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions drivers/net/dsa/mv88e6xxx/chip.c
Original file line number Diff line number Diff line change
Expand Up @@ -2177,6 +2177,19 @@ static const struct of_device_id mv88e6xxx_mdio_external_match[] = {
{ },
};

static void mv88e6xxx_mdios_unregister(struct mv88e6xxx_chip *chip)

{
struct mv88e6xxx_mdio_bus *mdio_bus;
struct mii_bus *bus;

list_for_each_entry(mdio_bus, &chip->mdios, list) {
bus = mdio_bus->bus;

mdiobus_unregister(bus);
}
}

static int mv88e6xxx_mdios_register(struct mv88e6xxx_chip *chip,
struct device_node *np)
{
Expand All @@ -2201,27 +2214,16 @@ static int mv88e6xxx_mdios_register(struct mv88e6xxx_chip *chip,
match = of_match_node(mv88e6xxx_mdio_external_match, child);
if (match) {
err = mv88e6xxx_mdio_register(chip, child, true);
if (err)
if (err) {
mv88e6xxx_mdios_unregister(chip);
return err;
}
}
}

return 0;
}

static void mv88e6xxx_mdios_unregister(struct mv88e6xxx_chip *chip)

{
struct mv88e6xxx_mdio_bus *mdio_bus;
struct mii_bus *bus;

list_for_each_entry(mdio_bus, &chip->mdios, list) {
bus = mdio_bus->bus;

mdiobus_unregister(bus);
}
}

static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
{
struct mv88e6xxx_chip *chip = ds->priv;
Expand Down

0 comments on commit 3126aee

Please sign in to comment.