mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 23:51:39 +00:00
drivers: net: xgene: fix: Oops in linkwatch_fire_event
[ 1065.801569] Internal error: Oops: 96000006 [#1] SMP ... [ 1065.866655] Hardware name: AppliedMicro Mustang/Mustang, BIOS 1.1.0 Apr 22 2015 [ 1065.873937] Workqueue: events_power_efficient phy_state_machine [ 1065.879837] task: fffffe01de105e80 ti: fffffe00bcf18000 task.ti: fffffe00bcf18000 [ 1065.887288] PC is at linkwatch_fire_event+0xac/0xc0 [ 1065.892141] LR is at linkwatch_fire_event+0xa0/0xc0 [ 1065.896995] pc : [<fffffe000060284c>] lr : [<fffffe0000602840>] pstate: 200001c5 [ 1065.904356] sp : fffffe00bcf1bd00 ... [ 1066.196813] Call Trace: [ 1066.199248] [<fffffe000060284c>] linkwatch_fire_event+0xac/0xc0 [ 1066.205140] [<fffffe000061167c>] netif_carrier_off+0x54/0x64 [ 1066.210773] [<fffffe00004f1654>] phy_state_machine+0x120/0x3bc [ 1066.216578] [<fffffe00000d8d10>] process_one_work+0x15c/0x3a8 [ 1066.222296] [<fffffe00000d9090>] worker_thread+0x134/0x470 [ 1066.227757] [<fffffe00000df014>] kthread+0xe0/0xf8 [ 1066.232525] Code: 97f65ee9 f9420660 d538d082 8b000042 (885f7c40) The fix is to call phy_disconnect() from xgene_enet_mdio_remove, which in turn call cancel_delayed_work_sync(). Signed-off-by: Iyappan Subramanian <isubramanian@apm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a6c1aea044
commit
ccc02ddb1b
@ -801,6 +801,9 @@ int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata)
|
|||||||
|
|
||||||
void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata)
|
void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata)
|
||||||
{
|
{
|
||||||
|
if (pdata->phy_dev)
|
||||||
|
phy_disconnect(pdata->phy_dev);
|
||||||
|
|
||||||
mdiobus_unregister(pdata->mdio_bus);
|
mdiobus_unregister(pdata->mdio_bus);
|
||||||
mdiobus_free(pdata->mdio_bus);
|
mdiobus_free(pdata->mdio_bus);
|
||||||
pdata->mdio_bus = NULL;
|
pdata->mdio_bus = NULL;
|
||||||
|
@ -1277,9 +1277,10 @@ static int xgene_enet_remove(struct platform_device *pdev)
|
|||||||
mac_ops->tx_disable(pdata);
|
mac_ops->tx_disable(pdata);
|
||||||
|
|
||||||
xgene_enet_napi_del(pdata);
|
xgene_enet_napi_del(pdata);
|
||||||
xgene_enet_mdio_remove(pdata);
|
if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII)
|
||||||
xgene_enet_delete_desc_rings(pdata);
|
xgene_enet_mdio_remove(pdata);
|
||||||
unregister_netdev(ndev);
|
unregister_netdev(ndev);
|
||||||
|
xgene_enet_delete_desc_rings(pdata);
|
||||||
pdata->port_ops->shutdown(pdata);
|
pdata->port_ops->shutdown(pdata);
|
||||||
free_netdev(ndev);
|
free_netdev(ndev);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user