net: fec: ptp: Use the 31-bit ptp timer.
authorLuwei Zhou <b45643@freescale.com>
Fri, 10 Oct 2014 05:15:28 +0000 (13:15 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Oct 2014 18:45:08 +0000 (14:45 -0400)
When ptp switches from software adjustment to hardware ajustment, linux ptp can't converge.
It is caused by the IP limit. Hardware adjustment logcial have issue when ptp counter
runs over 0x80000000(31 bit counter). The internal IP reference manual already remove 32bit
free-running count support. This patch replace the 32-bit PTP timer with 31-bit.

Signed-off-by: Luwei Zhou <b45643@freescale.com>
Signed-off-by: Frank Li <Frank.Li@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/fec_ptp.c

index cca3617a2321fa22198658e83b1ee5d65176f298..8016bdd1995f7ca80bfe14daa823754ac775e678 100644 (file)
@@ -70,6 +70,7 @@
 #define FEC_TS_TIMESTAMP       0x418
 
 #define FEC_CC_MULT    (1 << 31)
+#define FEC_COUNTER_PERIOD     (1 << 31)
 /**
  * fec_ptp_read - read raw cycle counter (to be used by time counter)
  * @cc: the cyclecounter structure
@@ -113,14 +114,15 @@ void fec_ptp_start_cyclecounter(struct net_device *ndev)
        /* 1ns counter */
        writel(inc << FEC_T_INC_OFFSET, fep->hwp + FEC_ATIME_INC);
 
-       /* use free running count */
-       writel(0, fep->hwp + FEC_ATIME_EVT_PERIOD);
+       /* use 31-bit timer counter */
+       writel(FEC_COUNTER_PERIOD, fep->hwp + FEC_ATIME_EVT_PERIOD);
 
-       writel(FEC_T_CTRL_ENABLE, fep->hwp + FEC_ATIME_CTRL);
+       writel(FEC_T_CTRL_ENABLE | FEC_T_CTRL_PERIOD_RST,
+               fep->hwp + FEC_ATIME_CTRL);
 
        memset(&fep->cc, 0, sizeof(fep->cc));
        fep->cc.read = fec_ptp_read;
-       fep->cc.mask = CLOCKSOURCE_MASK(32);
+       fep->cc.mask = CLOCKSOURCE_MASK(31);
        fep->cc.shift = 31;
        fep->cc.mult = FEC_CC_MULT;