diff options
author | Fugang Duan <B38611@freescale.com> | 2014-03-20 17:24:02 +0800 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 08:58:03 -0500 |
commit | 416be470435087f9b2b92a98e41280c29ff4bf99 (patch) | |
tree | a26016851dc60ba7f589e6123a922422037dfffe /drivers/net | |
parent | ca341aeaaa4b3a996d94734b8d725e5517e4f345 (diff) |
ENGR00304446 net: fec: free resource after phy probe fail
Current flow call .fec_enet_close() function after phy probe
fail, which is not right. It must free memory and disable all
related clocks when there has no phy connection or phy probe
fail.
Signed-off-by: Fugang Duan <B38611@freescale.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index c0a531db1dbf..816e6ae63e5b 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -2095,16 +2095,6 @@ fec_enet_open(struct net_device *ndev) platform_get_device_id(fep->pdev); int ret; - pm_runtime_get_sync(ndev->dev.parent); - if (id_entry->driver_data & FEC_QUIRK_BUG_WAITMODE) - pm_qos_add_request(&ndev->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - 0); - else - pm_qos_add_request(&ndev->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - pinctrl_pm_select_default_state(&fep->pdev->dev); fec_enet_clk_enable(ndev, true); @@ -2120,7 +2110,9 @@ fec_enet_open(struct net_device *ndev) /* Probe and connect to PHY when open the interface */ ret = fec_enet_mii_probe(ndev); if (ret) { - fec_enet_close(ndev); + fec_enet_free_buffers(ndev); + fec_enet_clk_enable(ndev, false); + pinctrl_pm_select_sleep_state(&fep->pdev->dev); return ret; } @@ -2132,6 +2124,16 @@ fec_enet_open(struct net_device *ndev) /* reset phy */ fec_reset_phy(fep->pdev); + pm_runtime_get_sync(ndev->dev.parent); + if (id_entry->driver_data & FEC_QUIRK_BUG_WAITMODE) + pm_qos_add_request(&ndev->pm_qos_req, + PM_QOS_CPU_DMA_LATENCY, + 0); + else + pm_qos_add_request(&ndev->pm_qos_req, + PM_QOS_CPU_DMA_LATENCY, + PM_QOS_DEFAULT_VALUE); + return 0; } |