aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorFugang Duan <B38611@freescale.com>2014-02-19 01:46:27 -0500
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:57:34 -0400
commit5f1ad2c7d1d1056d14161633bc2b444ccb5134f0 (patch)
tree011527ae8fc5baf1786565c346c6a75c13919694 /drivers/net
parent73b970f5b1f8a9df1457d3ae4032f10ab6cd9580 (diff)
ENGR00300074-1 net:fec_ptp: avoid fec register access when clock is disabled
Avoid fec register access when clock is disabled. After fec probed or "ifconfig ethx down", it disable fec clock to save power. PTP use period timer softirq to read ptp timer count register regardless any ethernet status, which cause system hang. The patch fix the issue. Signed-off-by: Fugang Duan <B38611@freescale.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c4
-rw-r--r--drivers/net/ethernet/freescale/fec_ptp.c8
2 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 9c3962945c3f..7bf70b8ea30f 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -740,7 +740,9 @@ fec_restart(struct net_device *ndev, int duplex)
740 writel(ecntl, fep->hwp + FEC_ECNTRL); 740 writel(ecntl, fep->hwp + FEC_ECNTRL);
741 fec_enet_active_rxring(ndev); 741 fec_enet_active_rxring(ndev);
742 742
743 if (fep->bufdesc_ex) 743 if (fep->bufdesc_ex && (fep->hwts_tx_en_ioctl ||
744 fep->hwts_rx_en_ioctl || fep->hwts_tx_en ||
745 fep->hwts_rx_en))
744 fec_ptp_start_cyclecounter(ndev); 746 fec_ptp_start_cyclecounter(ndev);
745 747
746 /* Enable interrupts we wish to service */ 748 /* Enable interrupts we wish to service */
diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c
index 2b4a567ac27d..eaf0169dff90 100644
--- a/drivers/net/ethernet/freescale/fec_ptp.c
+++ b/drivers/net/ethernet/freescale/fec_ptp.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Fast Ethernet Controller (ENET) PTP driver for MX6x. 2 * Fast Ethernet Controller (ENET) PTP driver for MX6x.
3 * 3 *
4 * Copyright (C) 2012-2013 Freescale Semiconductor, Inc. 4 * Copyright (C) 2012-2014 Freescale Semiconductor, Inc.
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify it 6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License, 7 * under the terms and conditions of the GNU General Public License,
@@ -220,6 +220,8 @@ void fec_ptp_stop(struct net_device *ndev)
220 220
221 writel(0, priv->hwp + FEC_ATIME_CTRL); 221 writel(0, priv->hwp + FEC_ATIME_CTRL);
222 writel(FEC_T_CTRL_RESTART, priv->hwp + FEC_ATIME_CTRL); 222 writel(FEC_T_CTRL_RESTART, priv->hwp + FEC_ATIME_CTRL);
223
224 del_timer_sync(&priv->time_keep);
223} 225}
224 226
225static void fec_get_curr_cnt(struct fec_enet_private *priv, 227static void fec_get_curr_cnt(struct fec_enet_private *priv,
@@ -606,6 +608,9 @@ void fec_ptp_start_cyclecounter(struct net_device *ndev)
606 timecounter_init(&fep->tc, &fep->cc, ktime_to_ns(ktime_get_real())); 608 timecounter_init(&fep->tc, &fep->cc, ktime_to_ns(ktime_get_real()));
607 609
608 spin_unlock_irqrestore(&fep->tmreg_lock, flags); 610 spin_unlock_irqrestore(&fep->tmreg_lock, flags);
611
612 if (!timer_pending(&fep->time_keep) && fep->opened)
613 add_timer(&fep->time_keep);
609} 614}
610 615
611/** 616/**
@@ -943,7 +948,6 @@ void fec_ptp_init(struct platform_device *pdev)
943 fep->time_keep.data = (unsigned long)fep; 948 fep->time_keep.data = (unsigned long)fep;
944 fep->time_keep.function = fec_time_keep; 949 fep->time_keep.function = fec_time_keep;
945 fep->time_keep.expires = jiffies + HZ; 950 fep->time_keep.expires = jiffies + HZ;
946 add_timer(&fep->time_keep);
947 951
948 fep->ptp_clock = ptp_clock_register(&fep->ptp_caps, &pdev->dev); 952 fep->ptp_clock = ptp_clock_register(&fep->ptp_caps, &pdev->dev);
949 if (IS_ERR(fep->ptp_clock)) { 953 if (IS_ERR(fep->ptp_clock)) {