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.
Unified · Split
| @@ -441,7 +441,7 @@ static int macb_mii_init(struct macb *bp) · 440 unmodified lines | |||
| 441 | snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", | 441 | snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
| 442 | bp->pdev->name, bp->pdev->id); | 442 | bp->pdev->name, bp->pdev->id); |
| 443 | bp->mii_bus->priv = bp; | 443 | bp->mii_bus->priv = bp; |
| 444 | bp->mii_bus->parent = &bp->dev->dev; | 444 | bp->mii_bus->parent = &bp->pdev->dev; |
| 445 | pdata = dev_get_platdata(&bp->pdev->dev); | 445 | pdata = dev_get_platdata(&bp->pdev->dev); |
| 446 | 446 | ||
| 447 | dev_set_drvdata(&bp->dev->dev, bp->mii_bus); | 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 | if (err) | 3020 | if (err) |
| 3021 | goto err_out_free_netdev; | 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 | err = register_netdev(dev); | 3031 | err = register_netdev(dev); |
| 3024 | if (err) { | 3032 | if (err) { |
| 3025 | dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); | 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); | 3037 | phy_attached_info(phydev); |
| 3030 | if (err) | ||
| 3031 | goto err_out_unregister_netdev; | ||
| 3032 | |||
| 3033 | netif_carrier_off(dev); | ||
| 3034 | 3038 | ||
| 3035 | netdev_info(dev, "Cadence %s rev 0x%08x at 0x%08lx irq %d (%pM)\n", | 3039 | netdev_info(dev, "Cadence %s rev 0x%08x at 0x%08lx irq %d (%pM)\n", |
| 3036 | macb_is_gem(bp) ? "GEM" : "MACB", macb_readl(bp, MID), | 3040 | macb_is_gem(bp) ? "GEM" : "MACB", macb_readl(bp, MID), |
| 3037 | dev->base_addr, dev->irq, dev->dev_addr); | 3041 | dev->base_addr, dev->irq, dev->dev_addr); |
| 3038 | 3042 | ||
| 3039 | phydev = bp->phy_dev; | ||
| 3040 | phy_attached_info(phydev); | ||
| 3041 | |||
| 3042 | return 0; | 3043 | return 0; |
| 3043 | 3044 | ||
| 3044 | err_out_unregister_netdev: | 3045 | err_out_unregister_mdio: |
| 3045 | unregister_netdev(dev); | 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 | err_out_free_netdev: | 3054 | err_out_free_netdev: |
| 3048 | free_netdev(dev); | 3055 | free_netdev(dev); |