The current sequence makes us register for a network device prior to registering and probing the MDIO bus which could lead to some unwanted consequences, like a thread of execution calling into ndo_open before register_netdev() returns, while the MDIO bus is not ready yet. Rework the sequence to register for the MDIO bus, and therefore attach to a PHY prior to calling register_netdev(), which implies reworking the error path a bit.
Showing the changes to drivers/net (1 of 1 file). Show all
Unified · Split
| @@ -441,7 +441,7 @@ static int macb_mii_init(struct macb *bp) · 440 unmodified lines | ||
| 441 | 441 | snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
| 442 | 442 | bp->pdev->name, bp->pdev->id); |
| 443 | 443 | bp->mii_bus->priv = bp; |
| 444 | − bp->mii_bus->parent = &bp->dev->dev; | |
| 444 | + bp->mii_bus->parent = &bp->pdev->dev; | |
| 445 | 445 | pdata = dev_get_platdata(&bp->pdev->dev); |
| 446 | 446 | |
| 447 | 447 | dev_set_drvdata(&bp->dev->dev, bp->mii_bus); |
| @@ -3020,29 +3020,36 @@ static int macb_probe(struct platform_device *pdev) · 2572 unmodified lines | ||
| 3020 | 3020 | if (err) |
| 3021 | 3021 | goto err_out_free_netdev; |
| 3022 | 3022 | |
| 3023 | + err = macb_mii_init(bp); | |
| 3024 | + if (err) | |
| 3025 | + goto err_out_free_netdev; | |
| 3026 | + | |
| 3027 | + phydev = bp->phy_dev; | |
| 3028 | + | |
| 3029 | + netif_carrier_off(dev); | |
| 3030 | + | |
| 3023 | 3031 | err = register_netdev(dev); |
| 3024 | 3032 | if (err) { |
| 3025 | 3033 | dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); |
| 3026 | − goto err_out_unregister_netdev; | |
| 3034 | + goto err_out_unregister_mdio; | |
| 3027 | 3035 | } |
| 3028 | 3036 | |
| 3029 | − err = macb_mii_init(bp); | |
| 3030 | − if (err) | |
| 3031 | − goto err_out_unregister_netdev; | |
| 3032 | − | |
| 3033 | − netif_carrier_off(dev); | |
| 3037 | + phy_attached_info(phydev); | |
| 3034 | 3038 | |
| 3035 | 3039 | netdev_info(dev, "Cadence %s rev 0x%08x at 0x%08lx irq %d (%pM)\n", |
| 3036 | 3040 | macb_is_gem(bp) ? "GEM" : "MACB", macb_readl(bp, MID), |
| 3037 | 3041 | dev->base_addr, dev->irq, dev->dev_addr); |
| 3038 | 3042 | |
| 3039 | − phydev = bp->phy_dev; | |
| 3040 | − phy_attached_info(phydev); | |
| 3041 | − | |
| 3042 | 3043 | return 0; |
| 3043 | 3044 | |
| 3044 | −err_out_unregister_netdev: | |
| 3045 | − unregister_netdev(dev); | |
| 3045 | +err_out_unregister_mdio: | |
| 3046 | + phy_disconnect(bp->phy_dev); | |
| 3047 | + mdiobus_unregister(bp->mii_bus); | |
| 3048 | + mdiobus_free(bp->mii_bus); | |
| 3049 | + | |
| 3050 | + /* Shutdown the PHY if there is a GPIO reset */ | |
| 3051 | + if (bp->reset_gpio) | |
| 3052 | + gpiod_set_value(bp->reset_gpio, 0); | |
| 3046 | 3053 | |
| 3047 | 3054 | err_out_free_netdev: |
| 3048 | 3055 | free_netdev(dev); |