diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2016-12-28 15:44:41 -0800 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2017-03-16 02:26:40 +0000 |
commit | ca92b798b806352c34a0b156d540d282f7c0d72a (patch) | |
tree | e47b1fe61cef977e9b9f6269da902601f56cc139 /drivers/net | |
parent | ea6835ecc14b0d4af3b9959b50168265e19b8c91 (diff) | |
download | linux-stable-ca92b798b806352c34a0b156d540d282f7c0d72a.tar.gz linux-stable-ca92b798b806352c34a0b156d540d282f7c0d72a.tar.bz2 linux-stable-ca92b798b806352c34a0b156d540d282f7c0d72a.zip |
net: stmmac: Fix error path after register_netdev move
commit b2eb09af7370fedc6b9d9f05762f01625438467a upstream.
Commit 5701659004d6 ("net: stmmac: Fix race between stmmac_drv_probe and
stmmac_open") re-ordered how the MDIO bus registration and the network
device are registered, but missed to unwind the MDIO bus registration in
case we fail to register the network device.
Fixes: 5701659004d6 ("net: stmmac: Fix race between stmmac_drv_probe and stmmac_open")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Acked-by: Kweh, Hock Leong <hock.leong.kweh@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[bwh: Backported to 3.16:
- stmmac_dvr_probe() returns a pointer
- 'pcs' is a member of struct stmmac_priv, not struct mac_device_info]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index a6b35f2bd4c9..76fd3a2fa742 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -2794,12 +2794,19 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, } ret = register_netdev(ndev); - if (ret) + if (ret) { netdev_err(priv->dev, "%s: ERROR %i registering the device\n", __func__, ret); + goto error_netdev_register; + } - return ret ? ERR_PTR(ret) : priv; + return priv; +error_netdev_register: + if (priv->pcs != STMMAC_PCS_RGMII && + priv->pcs != STMMAC_PCS_TBI && + priv->pcs != STMMAC_PCS_RTBI) + stmmac_mdio_unregister(ndev); error_mdio_register: netif_napi_del(&priv->napi); error_hw_init: |