In the probe, if 'of_mdiobus_register()' fails, 'nexus->buses[i]' will still have a non-NULL value. So in the remove function, we will try to unregister a bus that has not been registered. In order to avoid that NULLify 'nexus->buses[i]'. 'oct_mdio_writeq(0,...)' must also be called here. Suggested-by: Russell King - ARM Linux admin <linux@xxxxxxxxxxxxxxx> Fixes: 379d7ac7ca31 ("phy: mdio-thunder: Add driver for Cavium Thunder SoC MDIO buses.") Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx> --- Calling 'devm_mdiobus_free()' would also be cleaner, IMHO. I've not added it because: - it should be fine, even without it - I'm not sure how to use it The best I could think-of (not even compile tested) is: devm_mdiobus_free(&pdev->dev, container_of(mii_bus, struct mdiobus_devres, mii)); which is not very nice looking. (unless I missed something obvious!) If I'm correct, just passing 'mii_bus' to have something that look logical would require changing 'devm_mdiobus_alloc_size()' and 'devm_mdiobus_free()'. --- drivers/net/mdio/mdio-thunder.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/mdio/mdio-thunder.c b/drivers/net/mdio/mdio-thunder.c index 822d2cdd2f35..140c405d4a41 100644 --- a/drivers/net/mdio/mdio-thunder.c +++ b/drivers/net/mdio/mdio-thunder.c @@ -97,8 +97,14 @@ static int thunder_mdiobus_pci_probe(struct pci_dev *pdev, bus->mii_bus->write = cavium_mdiobus_write; err = of_mdiobus_register(bus->mii_bus, node); - if (err) + if (err) { dev_err(&pdev->dev, "of_mdiobus_register failed\n"); + /* non-registered buses must not be unregistered in + * the .remove function + */ + oct_mdio_writeq(0, bus->register_base + SMI_EN); + nexus->buses[i] = NULL; + } dev_info(&pdev->dev, "Added bus at %llx\n", r.start); if (i >= ARRAY_SIZE(nexus->buses)) -- 2.30.2