summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2016-12-28 15:44:41 -0800
committerBen Hutchings <ben@decadent.org.uk>2017-03-16 02:26:40 +0000
commitca92b798b806352c34a0b156d540d282f7c0d72a (patch)
treee47b1fe61cef977e9b9f6269da902601f56cc139 /drivers/net
parentea6835ecc14b0d4af3b9959b50168265e19b8c91 (diff)
downloadlinux-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.c11
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: