diff options
| author | Bryan O'Donoghue <pure.logic@nexus-software.ie> | 2015-04-16 12:56:03 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-04-16 13:57:07 -0400 |
| commit | e743471f8d9c6ad00eb10a6d1e05803231e1de83 (patch) | |
| tree | 656c0280625b37eacfa1f7e8a395767c39b6f93b /drivers/net/ethernet/stmicro | |
| parent | 31976cfdc7e2e8b0b23d731703e4f1e21ff79466 (diff) | |
stmmac: fix oops on rmmod after assigning ip addr
An oops exists in the flow of stmmac_release().
phy_ethtool_get_wol() depends on phydev->drv.
phydev->drv will be null after stmmac_mdio_unreg() completes.
Steps to reproduce on Quark X1000:
1. ifconfig eth0 192.168.0.1
2. rmmod stmmac_pci
To fix this stmmac_mdio_unreg() should be run after unregister_netdev().
Signed-off-by: Bryan O'Donoghue <pure.logic@nexus-software.ie>
Reported-by: Dan O'Donovan <dan.odonovan@emutex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/stmicro')
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 06103cad7c77..60651738f2a9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -2970,15 +2970,15 @@ int stmmac_dvr_remove(struct net_device *ndev) | |||
| 2970 | priv->hw->dma->stop_tx(priv->ioaddr); | 2970 | priv->hw->dma->stop_tx(priv->ioaddr); |
| 2971 | 2971 | ||
| 2972 | stmmac_set_mac(priv->ioaddr, false); | 2972 | stmmac_set_mac(priv->ioaddr, false); |
| 2973 | if (priv->pcs != STMMAC_PCS_RGMII && priv->pcs != STMMAC_PCS_TBI && | ||
| 2974 | priv->pcs != STMMAC_PCS_RTBI) | ||
| 2975 | stmmac_mdio_unregister(ndev); | ||
| 2976 | netif_carrier_off(ndev); | 2973 | netif_carrier_off(ndev); |
| 2977 | unregister_netdev(ndev); | 2974 | unregister_netdev(ndev); |
| 2978 | if (priv->stmmac_rst) | 2975 | if (priv->stmmac_rst) |
| 2979 | reset_control_assert(priv->stmmac_rst); | 2976 | reset_control_assert(priv->stmmac_rst); |
| 2980 | clk_disable_unprepare(priv->pclk); | 2977 | clk_disable_unprepare(priv->pclk); |
| 2981 | clk_disable_unprepare(priv->stmmac_clk); | 2978 | clk_disable_unprepare(priv->stmmac_clk); |
| 2979 | if (priv->pcs != STMMAC_PCS_RGMII && priv->pcs != STMMAC_PCS_TBI && | ||
| 2980 | priv->pcs != STMMAC_PCS_RTBI) | ||
| 2981 | stmmac_mdio_unregister(ndev); | ||
| 2982 | free_netdev(ndev); | 2982 | free_netdev(ndev); |
| 2983 | 2983 | ||
| 2984 | return 0; | 2984 | return 0; |
