diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2015-07-23 10:06:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-07-27 00:51:53 -0400 |
commit | 32cba57ba74be58589aeb4cb6496183e46a5e3e5 (patch) | |
tree | cde848eeb941a9b7dc2743942f2ce565ddf44faa | |
parent | c0a1a0a698bb0f90ec4719de34f37715abfad8a5 (diff) |
net: fec: introduce fec_ptp_stop and use in probe fail path
This function frees resources and cancels delayed work item that
have been initialized in fec_ptp_init().
Use this to do proper error handling if something goes wrong in
probe function after fec_ptp_init has been called.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Acked-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/freescale/fec.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fec_ptp.c | 10 |
3 files changed, 13 insertions, 3 deletions
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 1eee73cccdf5..99d33e2d35e6 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h | |||
@@ -562,6 +562,7 @@ struct fec_enet_private { | |||
562 | }; | 562 | }; |
563 | 563 | ||
564 | void fec_ptp_init(struct platform_device *pdev); | 564 | void fec_ptp_init(struct platform_device *pdev); |
565 | void fec_ptp_stop(struct platform_device *pdev); | ||
565 | void fec_ptp_start_cyclecounter(struct net_device *ndev); | 566 | void fec_ptp_start_cyclecounter(struct net_device *ndev); |
566 | int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr); | 567 | int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr); |
567 | int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr); | 568 | int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr); |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 2945b62b6dc5..5e8b8370b5a7 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -3454,6 +3454,7 @@ failed_register: | |||
3454 | failed_mii_init: | 3454 | failed_mii_init: |
3455 | failed_irq: | 3455 | failed_irq: |
3456 | failed_init: | 3456 | failed_init: |
3457 | fec_ptp_stop(pdev); | ||
3457 | if (fep->reg_phy) | 3458 | if (fep->reg_phy) |
3458 | regulator_disable(fep->reg_phy); | 3459 | regulator_disable(fep->reg_phy); |
3459 | failed_regulator: | 3460 | failed_regulator: |
@@ -3473,14 +3474,12 @@ fec_drv_remove(struct platform_device *pdev) | |||
3473 | struct net_device *ndev = platform_get_drvdata(pdev); | 3474 | struct net_device *ndev = platform_get_drvdata(pdev); |
3474 | struct fec_enet_private *fep = netdev_priv(ndev); | 3475 | struct fec_enet_private *fep = netdev_priv(ndev); |
3475 | 3476 | ||
3476 | cancel_delayed_work_sync(&fep->time_keep); | ||
3477 | cancel_work_sync(&fep->tx_timeout_work); | 3477 | cancel_work_sync(&fep->tx_timeout_work); |
3478 | fec_ptp_stop(pdev); | ||
3478 | unregister_netdev(ndev); | 3479 | unregister_netdev(ndev); |
3479 | fec_enet_mii_remove(fep); | 3480 | fec_enet_mii_remove(fep); |
3480 | if (fep->reg_phy) | 3481 | if (fep->reg_phy) |
3481 | regulator_disable(fep->reg_phy); | 3482 | regulator_disable(fep->reg_phy); |
3482 | if (fep->ptp_clock) | ||
3483 | ptp_clock_unregister(fep->ptp_clock); | ||
3484 | of_node_put(fep->phy_node); | 3483 | of_node_put(fep->phy_node); |
3485 | free_netdev(ndev); | 3484 | free_netdev(ndev); |
3486 | 3485 | ||
diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c index a15663ad7f5e..f457a23d0bfb 100644 --- a/drivers/net/ethernet/freescale/fec_ptp.c +++ b/drivers/net/ethernet/freescale/fec_ptp.c | |||
@@ -604,6 +604,16 @@ void fec_ptp_init(struct platform_device *pdev) | |||
604 | schedule_delayed_work(&fep->time_keep, HZ); | 604 | schedule_delayed_work(&fep->time_keep, HZ); |
605 | } | 605 | } |
606 | 606 | ||
607 | void fec_ptp_stop(struct platform_device *pdev) | ||
608 | { | ||
609 | struct net_device *ndev = platform_get_drvdata(pdev); | ||
610 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
611 | |||
612 | cancel_delayed_work_sync(&fep->time_keep); | ||
613 | if (fep->ptp_clock) | ||
614 | ptp_clock_unregister(fep->ptp_clock); | ||
615 | } | ||
616 | |||
607 | /** | 617 | /** |
608 | * fec_ptp_check_pps_event | 618 | * fec_ptp_check_pps_event |
609 | * @fep: the fec_enet_private structure handle | 619 | * @fep: the fec_enet_private structure handle |