diff options
| author | Fugang Duan <B38611@freescale.com> | 2014-02-19 01:46:27 -0500 |
|---|---|---|
| committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 09:57:34 -0400 |
| commit | 5f1ad2c7d1d1056d14161633bc2b444ccb5134f0 (patch) | |
| tree | 011527ae8fc5baf1786565c346c6a75c13919694 /drivers/net | |
| parent | 73b970f5b1f8a9df1457d3ae4032f10ab6cd9580 (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.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/freescale/fec_ptp.c | 8 |
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 | ||
| 225 | static void fec_get_curr_cnt(struct fec_enet_private *priv, | 227 | static 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)) { |
