summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorFugang Duan <B38611@freescale.com>2014-03-20 17:24:02 +0800
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 08:58:03 -0500
commit416be470435087f9b2b92a98e41280c29ff4bf99 (patch)
treea26016851dc60ba7f589e6123a922422037dfffe /drivers/net
parentca341aeaaa4b3a996d94734b8d725e5517e4f345 (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.c24
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;
}