diff mbox

[RFC,net-next,2/4] bfin_mac: replace sys time stamps with raw ones instead.

Message ID 84396eacd75b4abed36a7819d8c2c33f9ced1ad5.1348851539.git.richardcochran@gmail.com
State RFC, archived
Delegated to: David Miller
Headers show

Commit Message

Richard Cochran Sept. 28, 2012, 5:20 p.m. UTC
This patch replaces the sys time stamps and timecompare code with simple
raw hardware time stamps in nanosecond resolution. The only tricky bit is
to find a PTP Hardware Clock period slower than the input clock period
and a power of two.

Compile tested only.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
 drivers/net/ethernet/adi/bfin_mac.c |   91 ++++++++++-------------------------
 drivers/net/ethernet/adi/bfin_mac.h |    7 +--
 2 files changed, 28 insertions(+), 70 deletions(-)

Comments

Bob Liu Oct. 30, 2012, 9:17 a.m. UTC | #1
On Sat, Sep 29, 2012 at 1:20 AM, Richard Cochran
<richardcochran@gmail.com> wrote:
> This patch replaces the sys time stamps and timecompare code with simple
> raw hardware time stamps in nanosecond resolution. The only tricky bit is
> to find a PTP Hardware Clock period slower than the input clock period
> and a power of two.
>
> Compile tested only.
>
> Signed-off-by: Richard Cochran <richardcochran@gmail.com>
> ---
>  drivers/net/ethernet/adi/bfin_mac.c |   91 ++++++++++-------------------------
>  drivers/net/ethernet/adi/bfin_mac.h |    7 +--
>  2 files changed, 28 insertions(+), 70 deletions(-)
>
> diff --git a/drivers/net/ethernet/adi/bfin_mac.c b/drivers/net/ethernet/adi/bfin_mac.c
> index 2349abb..393d1b5 100644
> --- a/drivers/net/ethernet/adi/bfin_mac.c
> +++ b/drivers/net/ethernet/adi/bfin_mac.c
> @@ -555,7 +555,7 @@ static int bfin_mac_ethtool_get_ts_info(struct net_device *dev,
>         info->so_timestamping =
>                 SOF_TIMESTAMPING_TX_HARDWARE |
>                 SOF_TIMESTAMPING_RX_HARDWARE |
> -               SOF_TIMESTAMPING_SYS_HARDWARE;
> +               SOF_TIMESTAMPING_RAW_HARDWARE;
>         info->phc_index = -1;
>         info->tx_types =
>                 (1 << HWTSTAMP_TX_OFF) |
> @@ -653,6 +653,20 @@ static int bfin_mac_set_mac_address(struct net_device *dev, void *p)
>  #ifdef CONFIG_BFIN_MAC_USE_HWSTAMP
>  #define bfin_mac_hwtstamp_is_none(cfg) ((cfg) == HWTSTAMP_FILTER_NONE)
>
> +static u32 bfin_select_phc_clock(u32 input_clk, unsigned int *shift_result)
> +{
> +       u32 ipn = 1000000000UL / input_clk;
> +       u32 ppn = 1;
> +       unsigned int shift = 0;
> +
> +       while (ppn <= ipn) {
> +               ppn <<= 1;
> +               shift++;
> +       }
> +       *shift_result = shift;
> +       return 1000000000UL / ppn;
> +}
> +
>  static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
>                 struct ifreq *ifr, int cmd)
>  {
> @@ -802,19 +816,7 @@ static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
>                 bfin_read_EMAC_PTP_TXSNAPLO();
>                 bfin_read_EMAC_PTP_TXSNAPHI();
>
> -               /*
> -                * Set registers so that rollover occurs soon to test this.
> -                */
> -               bfin_write_EMAC_PTP_TIMELO(0x00000000);
> -               bfin_write_EMAC_PTP_TIMEHI(0xFF800000);
> -
>                 SSYNC();
> -
> -               lp->compare.last_update = 0;
> -               timecounter_init(&lp->clock,
> -                               &lp->cycles,
> -                               ktime_to_ns(ktime_get_real()));
> -               timecompare_update(&lp->compare, 0);
>         }
>
>         lp->stamp_cfg = config;
> @@ -822,15 +824,6 @@ static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
>                 -EFAULT : 0;
>  }
>
> -static void bfin_dump_hwtamp(char *s, ktime_t *hw, ktime_t *ts, struct timecompare *cmp)
> -{
> -       ktime_t sys = ktime_get_real();
> -
> -       pr_debug("%s %s hardware:%d,%d transform system:%d,%d system:%d,%d, cmp:%lld, %lld\n",
> -                       __func__, s, hw->tv.sec, hw->tv.nsec, ts->tv.sec, ts->tv.nsec, sys.tv.sec,
> -                       sys.tv.nsec, cmp->offset, cmp->skew);
> -}
> -
>  static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>  {
>         struct bfin_mac_local *lp = netdev_priv(netdev);
> @@ -861,15 +854,9 @@ static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>                         regval = bfin_read_EMAC_PTP_TXSNAPLO();
>                         regval |= (u64)bfin_read_EMAC_PTP_TXSNAPHI() << 32;
>                         memset(&shhwtstamps, 0, sizeof(shhwtstamps));
> -                       ns = timecounter_cyc2time(&lp->clock,
> -                                       regval);
> -                       timecompare_update(&lp->compare, ns);
> +                       ns = regval >> lp->shift;
>                         shhwtstamps.hwtstamp = ns_to_ktime(ns);
> -                       shhwtstamps.syststamp =
> -                               timecompare_transform(&lp->compare, ns);
>                         skb_tstamp_tx(skb, &shhwtstamps);
> -
> -                       bfin_dump_hwtamp("TX", &shhwtstamps.hwtstamp, &shhwtstamps.syststamp, &lp->compare);
>                 }
>         }
>  }
> @@ -892,51 +879,25 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>
>         regval = bfin_read_EMAC_PTP_RXSNAPLO();
>         regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
> -       ns = timecounter_cyc2time(&lp->clock, regval);
> -       timecompare_update(&lp->compare, ns);
> +       ns = regval >> lp->shift;
>         memset(shhwtstamps, 0, sizeof(*shhwtstamps));
>         shhwtstamps->hwtstamp = ns_to_ktime(ns);
> -       shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
> -
> -       bfin_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
> -}

In my test,  system time in slave side can't be updated although here
have set shhwtstamps->hwtstamp = ns_to_ktime(ns).
Any idea?

> -
> -/*
> - * bfin_read_clock - read raw cycle counter (to be used by time counter)
> - */
> -static cycle_t bfin_read_clock(const struct cyclecounter *tc)
> -{
> -       u64 stamp;
> -
> -       stamp =  bfin_read_EMAC_PTP_TIMELO();
> -       stamp |= (u64)bfin_read_EMAC_PTP_TIMEHI() << 32ULL;
> -
> -       return stamp;
>  }
>
> -#define PTP_CLK 25000000
> -
>  static void bfin_mac_hwtstamp_init(struct net_device *netdev)
>  {
>         struct bfin_mac_local *lp = netdev_priv(netdev);
> -       u64 append;
> +       u64 addend;
> +       u32 input_clk, phc_clk;
>
>         /* Initialize hardware timer */
> -       append = PTP_CLK * (1ULL << 32);
> -       do_div(append, get_sclk());
> -       bfin_write_EMAC_PTP_ADDEND((u32)append);
> -
> -       memset(&lp->cycles, 0, sizeof(lp->cycles));
> -       lp->cycles.read = bfin_read_clock;
> -       lp->cycles.mask = CLOCKSOURCE_MASK(64);
> -       lp->cycles.mult = 1000000000 / PTP_CLK;
> -       lp->cycles.shift = 0;
> -
> -       /* Synchronize our NIC clock against system wall clock */
> -       memset(&lp->compare, 0, sizeof(lp->compare));
> -       lp->compare.source = &lp->clock;
> -       lp->compare.target = ktime_get_real;
> -       lp->compare.num_samples = 10;
> +       input_clk = get_sclk();
> +       phc_clk = bfin_select_phc_clock(input_clk, &lp->shift);
> +       addend = phc_clk * (1ULL << 32);
> +       do_div(addend, input_clk);
> +       bfin_write_EMAC_PTP_ADDEND((u32)addend);
> +
> +       lp->addend = addend;
>
>         /* Initialize hwstamp config */
>         lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
> diff --git a/drivers/net/ethernet/adi/bfin_mac.h b/drivers/net/ethernet/adi/bfin_mac.h
> index 960905c..57f042c 100644
> --- a/drivers/net/ethernet/adi/bfin_mac.h
> +++ b/drivers/net/ethernet/adi/bfin_mac.h
> @@ -11,8 +11,6 @@
>  #define _BFIN_MAC_H_
>
>  #include <linux/net_tstamp.h>
> -#include <linux/clocksource.h>
> -#include <linux/timecompare.h>
>  #include <linux/timer.h>
>  #include <linux/etherdevice.h>
>  #include <linux/bfin_mac.h>
> @@ -94,9 +92,8 @@ struct bfin_mac_local {
>         struct mii_bus *mii_bus;
>
>  #if defined(CONFIG_BFIN_MAC_USE_HWSTAMP)
> -       struct cyclecounter cycles;
> -       struct timecounter clock;
> -       struct timecompare compare;
> +       u32 addend;
> +       unsigned int shift;
>         struct hwtstamp_config stamp_cfg;
>  #endif
>  };
> --
> 1.7.2.5
>
> _______________________________________________
> Uclinux-dist-devel mailing list
> Uclinux-dist-devel@blackfin.uclinux.org
> https://blackfin.uclinux.org/mailman/listinfo/uclinux-dist-devel
Richard Cochran Oct. 30, 2012, 1:41 p.m. UTC | #2
On Tue, Oct 30, 2012 at 05:17:51PM +0800, Bob Liu wrote:

> > @@ -892,51 +879,25 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
> >
> >         regval = bfin_read_EMAC_PTP_RXSNAPLO();
> >         regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
> > -       ns = timecounter_cyc2time(&lp->clock, regval);
> > -       timecompare_update(&lp->compare, ns);
> > +       ns = regval >> lp->shift;
> >         memset(shhwtstamps, 0, sizeof(*shhwtstamps));
> >         shhwtstamps->hwtstamp = ns_to_ktime(ns);
> > -       shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
> > -
> > -       bfin_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
> > -}
> 
> In my test,  system time in slave side can't be updated although here
> have set shhwtstamps->hwtstamp = ns_to_ktime(ns).
> Any idea?

So the "system time" in shhwtstamps->syststamp has been removed. Only
the raw value remains.

Or what do you mean by "can't be updated"?

How did you test this?

I would suggest the following:

1. test using Documentation/ptp/testptp to make sure the clock is
   working reasconably.

2. try ptp4l from http://linuxptp.sourceforge.net/ to make sure the
   time stamping is working

Thanks,
Richard
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bob Liu Oct. 31, 2012, 6:29 a.m. UTC | #3
On Tue, Oct 30, 2012 at 9:41 PM, Richard Cochran
<richardcochran@gmail.com> wrote:
> On Tue, Oct 30, 2012 at 05:17:51PM +0800, Bob Liu wrote:
>
>> > @@ -892,51 +879,25 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>> >
>> >         regval = bfin_read_EMAC_PTP_RXSNAPLO();
>> >         regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
>> > -       ns = timecounter_cyc2time(&lp->clock, regval);
>> > -       timecompare_update(&lp->compare, ns);
>> > +       ns = regval >> lp->shift;
>> >         memset(shhwtstamps, 0, sizeof(*shhwtstamps));
>> >         shhwtstamps->hwtstamp = ns_to_ktime(ns);
>> > -       shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
>> > -
>> > -       bfin_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
>> > -}
>>
>> In my test,  system time in slave side can't be updated although here
>> have set shhwtstamps->hwtstamp = ns_to_ktime(ns).
>> Any idea?
>
> So the "system time" in shhwtstamps->syststamp has been removed. Only
> the raw value remains.
>
> Or what do you mean by "can't be updated"?
>
> How did you test this?
>

Using ptpv2 from ptpd.sourceforge.net.
That's the tool we used to test ptp, it's out of date now?

> I would suggest the following:
>
> 1. test using Documentation/ptp/testptp to make sure the clock is
>    working reasconably.
>

Seems work fine:
---------------------
root:/> ./testptp -c
capabilities:
  279999999 maximum frequency adjustment (ppb)
  0 programmable alarms
  0 external time stamp channels
  0 programmable periodic signals
  0 pulse per second
root:/> ./testptp -g
clock time: 221.372644272 or Thu Jan  1 00:03:41 1970
root:/> date
Fri Jan  2 10:52:06 UTC 1970
root:/>
root:/>  date -s 2010.03.16-15:30
Tue Mar 16 15:30:00 UTC 2010
root:/>
root:/> ./testptp -g
clock time: 242.392199760 or Thu Jan  1 00:04:02 1970
root:/> ./testptp -s
set time okay
root:/> ./testptp -g
clock time: 1268753411.506626656 or Tue Mar 16 15:30:11 2010
root:/>


> 2. try ptp4l from http://linuxptp.sourceforge.net/ to make sure the
>    time stamping is working
>

Any guide how to use ptp4l to sync system time between two machines
over ethernet?
We used to use PTPd - Precision Time Protocol daemon.

Thanks,
--Bob
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bob Liu Oct. 31, 2012, 6:36 a.m. UTC | #4
On Wed, Oct 31, 2012 at 2:29 PM, Bob Liu <lliubbo@gmail.com> wrote:
> On Tue, Oct 30, 2012 at 9:41 PM, Richard Cochran
> <richardcochran@gmail.com> wrote:
>> On Tue, Oct 30, 2012 at 05:17:51PM +0800, Bob Liu wrote:
>>
>>> > @@ -892,51 +879,25 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>>> >
>>> >         regval = bfin_read_EMAC_PTP_RXSNAPLO();
>>> >         regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
>>> > -       ns = timecounter_cyc2time(&lp->clock, regval);
>>> > -       timecompare_update(&lp->compare, ns);
>>> > +       ns = regval >> lp->shift;
>>> >         memset(shhwtstamps, 0, sizeof(*shhwtstamps));
>>> >         shhwtstamps->hwtstamp = ns_to_ktime(ns);
>>> > -       shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
>>> > -
>>> > -       bfin_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
>>> > -}
>>>
>>> In my test,  system time in slave side can't be updated although here
>>> have set shhwtstamps->hwtstamp = ns_to_ktime(ns).
>>> Any idea?
>>
>> So the "system time" in shhwtstamps->syststamp has been removed. Only
>> the raw value remains.
>>
>> Or what do you mean by "can't be updated"?
>>
>> How did you test this?
>>
>
> Using ptpv2 from ptpd.sourceforge.net.
> That's the tool we used to test ptp, it's out of date now?
>

Sorry, we used to use this one:
 https://github.com/richardcochran/ptpd-phc.git

>> I would suggest the following:
>>
>> 1. test using Documentation/ptp/testptp to make sure the clock is
>>    working reasconably.
>>
>
> Seems work fine:
> ---------------------
> root:/> ./testptp -c
> capabilities:
>   279999999 maximum frequency adjustment (ppb)
>   0 programmable alarms
>   0 external time stamp channels
>   0 programmable periodic signals
>   0 pulse per second
> root:/> ./testptp -g
> clock time: 221.372644272 or Thu Jan  1 00:03:41 1970
> root:/> date
> Fri Jan  2 10:52:06 UTC 1970
> root:/>
> root:/>  date -s 2010.03.16-15:30
> Tue Mar 16 15:30:00 UTC 2010
> root:/>
> root:/> ./testptp -g
> clock time: 242.392199760 or Thu Jan  1 00:04:02 1970
> root:/> ./testptp -s
> set time okay
> root:/> ./testptp -g
> clock time: 1268753411.506626656 or Tue Mar 16 15:30:11 2010
> root:/>
>
>
>> 2. try ptp4l from http://linuxptp.sourceforge.net/ to make sure the
>>    time stamping is working
>>
>
> Any guide how to use ptp4l to sync system time between two machines
> over ethernet?
> We used to use PTPd - Precision Time Protocol daemon.
>
Bob Liu Oct. 31, 2012, 6:47 a.m. UTC | #5
On Sat, Sep 29, 2012 at 1:20 AM, Richard Cochran
<richardcochran@gmail.com> wrote:
> This patch replaces the sys time stamps and timecompare code with simple
> raw hardware time stamps in nanosecond resolution. The only tricky bit is
> to find a PTP Hardware Clock period slower than the input clock period
> and a power of two.
>
> Compile tested only.
>
> Signed-off-by: Richard Cochran <richardcochran@gmail.com>
> ---
>  drivers/net/ethernet/adi/bfin_mac.c |   91 ++++++++++-------------------------
>  drivers/net/ethernet/adi/bfin_mac.h |    7 +--
>  2 files changed, 28 insertions(+), 70 deletions(-)
>
> diff --git a/drivers/net/ethernet/adi/bfin_mac.c b/drivers/net/ethernet/adi/bfin_mac.c
> index 2349abb..393d1b5 100644
> --- a/drivers/net/ethernet/adi/bfin_mac.c
> +++ b/drivers/net/ethernet/adi/bfin_mac.c
> @@ -555,7 +555,7 @@ static int bfin_mac_ethtool_get_ts_info(struct net_device *dev,
>         info->so_timestamping =
>                 SOF_TIMESTAMPING_TX_HARDWARE |
>                 SOF_TIMESTAMPING_RX_HARDWARE |
> -               SOF_TIMESTAMPING_SYS_HARDWARE;
> +               SOF_TIMESTAMPING_RAW_HARDWARE;
>         info->phc_index = -1;
>         info->tx_types =
>                 (1 << HWTSTAMP_TX_OFF) |
> @@ -653,6 +653,20 @@ static int bfin_mac_set_mac_address(struct net_device *dev, void *p)
>  #ifdef CONFIG_BFIN_MAC_USE_HWSTAMP
>  #define bfin_mac_hwtstamp_is_none(cfg) ((cfg) == HWTSTAMP_FILTER_NONE)
>
> +static u32 bfin_select_phc_clock(u32 input_clk, unsigned int *shift_result)
> +{
> +       u32 ipn = 1000000000UL / input_clk;
> +       u32 ppn = 1;
> +       unsigned int shift = 0;
> +
> +       while (ppn <= ipn) {
> +               ppn <<= 1;
> +               shift++;
> +       }
> +       *shift_result = shift;
> +       return 1000000000UL / ppn;
> +}
> +
>  static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
>                 struct ifreq *ifr, int cmd)
>  {
> @@ -802,19 +816,7 @@ static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
>                 bfin_read_EMAC_PTP_TXSNAPLO();
>                 bfin_read_EMAC_PTP_TXSNAPHI();
>
> -               /*
> -                * Set registers so that rollover occurs soon to test this.
> -                */
> -               bfin_write_EMAC_PTP_TIMELO(0x00000000);
> -               bfin_write_EMAC_PTP_TIMEHI(0xFF800000);
> -
>                 SSYNC();
> -
> -               lp->compare.last_update = 0;
> -               timecounter_init(&lp->clock,
> -                               &lp->cycles,
> -                               ktime_to_ns(ktime_get_real()));
> -               timecompare_update(&lp->compare, 0);
>         }
>
>         lp->stamp_cfg = config;
> @@ -822,15 +824,6 @@ static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
>                 -EFAULT : 0;
>  }
>
> -static void bfin_dump_hwtamp(char *s, ktime_t *hw, ktime_t *ts, struct timecompare *cmp)
> -{
> -       ktime_t sys = ktime_get_real();
> -
> -       pr_debug("%s %s hardware:%d,%d transform system:%d,%d system:%d,%d, cmp:%lld, %lld\n",
> -                       __func__, s, hw->tv.sec, hw->tv.nsec, ts->tv.sec, ts->tv.nsec, sys.tv.sec,
> -                       sys.tv.nsec, cmp->offset, cmp->skew);
> -}
> -
>  static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>  {
>         struct bfin_mac_local *lp = netdev_priv(netdev);
> @@ -861,15 +854,9 @@ static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>                         regval = bfin_read_EMAC_PTP_TXSNAPLO();
>                         regval |= (u64)bfin_read_EMAC_PTP_TXSNAPHI() << 32;
>                         memset(&shhwtstamps, 0, sizeof(shhwtstamps));
> -                       ns = timecounter_cyc2time(&lp->clock,
> -                                       regval);
> -                       timecompare_update(&lp->compare, ns);
> +                       ns = regval >> lp->shift;

Why not set ns = regval << lp->shift?
I think it's conflicted with patch [3/4]
+static u64 bfin_ptp_time_read(struct bfin_mac_local *lp)
+{
+       u64 ns;
+       u32 lo, hi;
+
+       lo = bfin_read_EMAC_PTP_TIMELO();
+       hi = bfin_read_EMAC_PTP_TIMEHI();
+
+       ns = ((u64) hi) << 32;
+       ns |= lo;
+       ns <<= lp->shift;
+
+       return ns;
+}

>                         shhwtstamps.hwtstamp = ns_to_ktime(ns);
> -                       shhwtstamps.syststamp =
> -                               timecompare_transform(&lp->compare, ns);
>                         skb_tstamp_tx(skb, &shhwtstamps);
> -
> -                       bfin_dump_hwtamp("TX", &shhwtstamps.hwtstamp, &shhwtstamps.syststamp, &lp->compare);
>                 }
>         }
>  }
> @@ -892,51 +879,25 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
>
>         regval = bfin_read_EMAC_PTP_RXSNAPLO();
>         regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
> -       ns = timecounter_cyc2time(&lp->clock, regval);
> -       timecompare_update(&lp->compare, ns);
> +       ns = regval >> lp->shift;

So is here.

>         memset(shhwtstamps, 0, sizeof(*shhwtstamps));
>         shhwtstamps->hwtstamp = ns_to_ktime(ns);
> -       shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
> -
> -       bfin_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
> -}
> -
> -/*
> - * bfin_read_clock - read raw cycle counter (to be used by time counter)
> - */
> -static cycle_t bfin_read_clock(const struct cyclecounter *tc)
> -{
> -       u64 stamp;
> -
> -       stamp =  bfin_read_EMAC_PTP_TIMELO();
> -       stamp |= (u64)bfin_read_EMAC_PTP_TIMEHI() << 32ULL;
> -
> -       return stamp;
>  }
>
> -#define PTP_CLK 25000000
> -
>  static void bfin_mac_hwtstamp_init(struct net_device *netdev)
>  {
>         struct bfin_mac_local *lp = netdev_priv(netdev);
> -       u64 append;
> +       u64 addend;
> +       u32 input_clk, phc_clk;
>
>         /* Initialize hardware timer */
> -       append = PTP_CLK * (1ULL << 32);
> -       do_div(append, get_sclk());
> -       bfin_write_EMAC_PTP_ADDEND((u32)append);
> -
> -       memset(&lp->cycles, 0, sizeof(lp->cycles));
> -       lp->cycles.read = bfin_read_clock;
> -       lp->cycles.mask = CLOCKSOURCE_MASK(64);
> -       lp->cycles.mult = 1000000000 / PTP_CLK;
> -       lp->cycles.shift = 0;
> -
> -       /* Synchronize our NIC clock against system wall clock */
> -       memset(&lp->compare, 0, sizeof(lp->compare));
> -       lp->compare.source = &lp->clock;
> -       lp->compare.target = ktime_get_real;
> -       lp->compare.num_samples = 10;
> +       input_clk = get_sclk();
> +       phc_clk = bfin_select_phc_clock(input_clk, &lp->shift);
> +       addend = phc_clk * (1ULL << 32);
> +       do_div(addend, input_clk);
> +       bfin_write_EMAC_PTP_ADDEND((u32)addend);
> +
> +       lp->addend = addend;
>
>         /* Initialize hwstamp config */
>         lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
> diff --git a/drivers/net/ethernet/adi/bfin_mac.h b/drivers/net/ethernet/adi/bfin_mac.h
> index 960905c..57f042c 100644
> --- a/drivers/net/ethernet/adi/bfin_mac.h
> +++ b/drivers/net/ethernet/adi/bfin_mac.h
> @@ -11,8 +11,6 @@
>  #define _BFIN_MAC_H_
>
>  #include <linux/net_tstamp.h>
> -#include <linux/clocksource.h>
> -#include <linux/timecompare.h>
>  #include <linux/timer.h>
>  #include <linux/etherdevice.h>
>  #include <linux/bfin_mac.h>
> @@ -94,9 +92,8 @@ struct bfin_mac_local {
>         struct mii_bus *mii_bus;
>
>  #if defined(CONFIG_BFIN_MAC_USE_HWSTAMP)
> -       struct cyclecounter cycles;
> -       struct timecounter clock;
> -       struct timecompare compare;
> +       u32 addend;
> +       unsigned int shift;
>         struct hwtstamp_config stamp_cfg;
>  #endif
>  };
> --
> 1.7.2.5
>
> _______________________________________________
> Uclinux-dist-devel mailing list
> Uclinux-dist-devel@blackfin.uclinux.org
> https://blackfin.uclinux.org/mailman/listinfo/uclinux-dist-devel
Richard Cochran Oct. 31, 2012, 7:57 a.m. UTC | #6
On Wed, Oct 31, 2012 at 02:47:21PM +0800, Bob Liu wrote:
> > @@ -861,15 +854,9 @@ static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
> >                         regval = bfin_read_EMAC_PTP_TXSNAPLO();
> >                         regval |= (u64)bfin_read_EMAC_PTP_TXSNAPHI() << 32;
> >                         memset(&shhwtstamps, 0, sizeof(shhwtstamps));
> > -                       ns = timecounter_cyc2time(&lp->clock,
> > -                                       regval);
> > -                       timecompare_update(&lp->compare, ns);
> > +                       ns = regval >> lp->shift;
> 
> Why not set ns = regval << lp->shift?
> I think it's conflicted with patch [3/4]

Yes, you are right. I will fix this in V2.

> > @@ -892,51 +879,25 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
> >
> >         regval = bfin_read_EMAC_PTP_RXSNAPLO();
> >         regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
> > -       ns = timecounter_cyc2time(&lp->clock, regval);
> > -       timecompare_update(&lp->compare, ns);
> > +       ns = regval >> lp->shift;
> 
> So is here.

Thanks for the careful review,
Richard
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Richard Cochran Oct. 31, 2012, 8:21 a.m. UTC | #7
On Wed, Oct 31, 2012 at 02:36:17PM +0800, Bob Liu wrote:
> Sorry, we used to use this one:
>  https://github.com/richardcochran/ptpd-phc.git

I removed that repo since it was only a proof-of-concept hack, and it
is now out of date.  However, I would think that it should still work
with my new changes.

Thanks,
Richard
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Richard Cochran Oct. 31, 2012, 8:36 a.m. UTC | #8
On Wed, Oct 31, 2012 at 02:29:23PM +0800, Bob Liu wrote:

> Any guide how to use ptp4l to sync system time between two machines
> over ethernet?

You can run ptp4l on two machines like this

  ptp4l -i eth0 -q -v     # master
  ptp4l -i eth0 -q -v -s  # slave

and you should see the "master offset" on the slave converge within
about 30 seconds or so.

Thanks,
Richard


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bob Liu Oct. 31, 2012, 9 a.m. UTC | #9
On Wed, Oct 31, 2012 at 4:36 PM, Richard Cochran
<richardcochran@gmail.com> wrote:
> On Wed, Oct 31, 2012 at 02:29:23PM +0800, Bob Liu wrote:
>
>> Any guide how to use ptp4l to sync system time between two machines
>> over ethernet?
>
> You can run ptp4l on two machines like this
>
>   ptp4l -i eth0 -q -v     # master
>   ptp4l -i eth0 -q -v -s  # slave
>

Thank you.
But i'm still failed to sync system time.

On mater:
-------------------------------
root:/> date
Wed Dec 20 01:31:02 UTC 2006
root:/>
root:/>   ptp4l -i eth0 -q -v
ptp4l[33.520]: selected /dev/ptp0 as PTP clock
ptp4l[33.520]: m
ptp4l[33.520]: driver rejected most general HWTSTAMP filter
ptp4l[33.520]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[33.524]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[39.524]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
.....

-----------------------------
On slave:
root:~> date
Fri Jan  2 13:16:07 UTC 1970

root:~>   ptp4l -i eth0 -q -v -s
ptp4l[39.624]: selected /dev/ptp0 as PTP clock
ptp4l[39.628]: m
ptp4l[39.628]: driver rejected most general HWTSTAMP filter
ptp4l[39.628]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[39.632]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[39.664]: port 1: new foreign master 00e022.fffe.fe8529-1
ptp4l[43.672]: selected best master clock 00e022.fffe.fe8529
ptp4l[43.676]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[44.688]: master offset -7968957480 s0 adj      +0 path delay       8120
ptp4l[45.692]: master offset -7968953124 s0 adj      +0 path delay       9076
ptp4l[46.696]: master offset -7968947340 s0 adj      +0 path delay       8860
ptp4l[47.700]: master offset -7968941884 s1 adj      +0 path delay       8860
ptp4l[48.704]: master offset       4564 s2 adj   +4564 path delay       8860
ptp4l[48.704]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[49.708]: master offset       5154 s2 adj   +6523 path delay       9086
ptp4l[50.712]: master offset       3686 s2 adj   +6601 path delay       9322
ptp4l[51.716]: master offset       2582 s2 adj   +6603 path delay       9322
ptp4l[52.720]: master offset       1362 s2 adj   +6158 path delay       9438
ptp4l[53.724]: master offset        658 s2 adj   +5862 path delay       9438
ptp4l[54.728]: master offset        -85 s2 adj   +5317 path delay       9685
ptp4l[55.732]: master offset       -113 s2 adj   +5263 path delay       9873
ptp4l[56.748]: master offset         86 s2 adj   +5428 path delay       9930
ptp4l[57.740]: master offset        166 s2 adj   +5534 path delay       9930
ptp4l[58.744]: master offset       -247 s2 adj   +5171 path delay      10151
ptp4l[59.748]: master offset        -39 s2 adj   +5305 path delay      10151
ptp4l[60.752]: master offset        217 s2 adj   +5549 path delay      10151
ptp4l[61.756]: master offset        256 s2 adj   +5653 path delay      10128
.....

root:~> date
Fri Jan  2 13:16:45 UTC 1970
root:~>

The system time in slave didn't change.
Richard Cochran Oct. 31, 2012, 12:46 p.m. UTC | #10
On Wed, Oct 31, 2012 at 05:00:55PM +0800, Bob Liu wrote:
> On Wed, Oct 31, 2012 at 4:36 PM, Richard Cochran
> <richardcochran@gmail.com> wrote:
> > On Wed, Oct 31, 2012 at 02:29:23PM +0800, Bob Liu wrote:
> >
> >> Any guide how to use ptp4l to sync system time between two machines
> >> over ethernet?
> >
> > You can run ptp4l on two machines like this
> >
> >   ptp4l -i eth0 -q -v     # master
> >   ptp4l -i eth0 -q -v -s  # slave
> >
> 
> Thank you.
> But i'm still failed to sync system time.
> 
> On mater:
> -------------------------------
> root:/> date
> Wed Dec 20 01:31:02 UTC 2006
> root:/>
> root:/>   ptp4l -i eth0 -q -v
> ptp4l[33.520]: selected /dev/ptp0 as PTP clock
> ptp4l[33.520]: m
> ptp4l[33.520]: driver rejected most general HWTSTAMP filter
> ptp4l[33.520]: port 1: INITIALIZING to LISTENING on INITIALIZE
> ptp4l[33.524]: port 0: INITIALIZING to LISTENING on INITIALIZE
> ptp4l[39.524]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
> .....
> 
> -----------------------------
> On slave:
> root:~> date
> Fri Jan  2 13:16:07 UTC 1970
> 
> root:~>   ptp4l -i eth0 -q -v -s
> ptp4l[39.624]: selected /dev/ptp0 as PTP clock
> ptp4l[39.628]: m
> ptp4l[39.628]: driver rejected most general HWTSTAMP filter
> ptp4l[39.628]: port 1: INITIALIZING to LISTENING on INITIALIZE
> ptp4l[39.632]: port 0: INITIALIZING to LISTENING on INITIALIZE
> ptp4l[39.664]: port 1: new foreign master 00e022.fffe.fe8529-1
> ptp4l[43.672]: selected best master clock 00e022.fffe.fe8529
> ptp4l[43.676]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
> ptp4l[44.688]: master offset -7968957480 s0 adj      +0 path delay       8120
> ptp4l[45.692]: master offset -7968953124 s0 adj      +0 path delay       9076
> ptp4l[46.696]: master offset -7968947340 s0 adj      +0 path delay       8860
> ptp4l[47.700]: master offset -7968941884 s1 adj      +0 path delay       8860
> ptp4l[48.704]: master offset       4564 s2 adj   +4564 path delay       8860
> ptp4l[48.704]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
> ptp4l[49.708]: master offset       5154 s2 adj   +6523 path delay       9086
> ptp4l[50.712]: master offset       3686 s2 adj   +6601 path delay       9322
> ptp4l[51.716]: master offset       2582 s2 adj   +6603 path delay       9322
> ptp4l[52.720]: master offset       1362 s2 adj   +6158 path delay       9438
> ptp4l[53.724]: master offset        658 s2 adj   +5862 path delay       9438
> ptp4l[54.728]: master offset        -85 s2 adj   +5317 path delay       9685
> ptp4l[55.732]: master offset       -113 s2 adj   +5263 path delay       9873
> ptp4l[56.748]: master offset         86 s2 adj   +5428 path delay       9930
> ptp4l[57.740]: master offset        166 s2 adj   +5534 path delay       9930
> ptp4l[58.744]: master offset       -247 s2 adj   +5171 path delay      10151
> ptp4l[59.748]: master offset        -39 s2 adj   +5305 path delay      10151
> ptp4l[60.752]: master offset        217 s2 adj   +5549 path delay      10151
> ptp4l[61.756]: master offset        256 s2 adj   +5653 path delay      10128
> .....

This looks perfect. Did you fixup the wrong time stamp shift?

> 
> root:~> date
> Fri Jan  2 13:16:45 UTC 1970
> root:~>
> 
> The system time in slave didn't change.

That is correct. Using RAW time stamping and PHC, the time in the PHC
changes, but not the system time. The system time may be slaved to
the PHC time using the phc2sys program.

Anyhow, it looks like this is working fine to me.

Thanks,
Richard
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bob Liu Nov. 1, 2012, 2:08 a.m. UTC | #11
On Wed, Oct 31, 2012 at 8:46 PM, Richard Cochran
<richardcochran@gmail.com> wrote:
> On Wed, Oct 31, 2012 at 05:00:55PM +0800, Bob Liu wrote:
>> On Wed, Oct 31, 2012 at 4:36 PM, Richard Cochran
>> <richardcochran@gmail.com> wrote:
>> > On Wed, Oct 31, 2012 at 02:29:23PM +0800, Bob Liu wrote:
>> >
>> >> Any guide how to use ptp4l to sync system time between two machines
>> >> over ethernet?
>> >
>> > You can run ptp4l on two machines like this
>> >
>> >   ptp4l -i eth0 -q -v     # master
>> >   ptp4l -i eth0 -q -v -s  # slave
>> >
>>
>> Thank you.
>> But i'm still failed to sync system time.
>>
>> On mater:
>> -------------------------------
>> root:/> date
>> Wed Dec 20 01:31:02 UTC 2006
>> root:/>
>> root:/>   ptp4l -i eth0 -q -v
>> ptp4l[33.520]: selected /dev/ptp0 as PTP clock
>> ptp4l[33.520]: m
>> ptp4l[33.520]: driver rejected most general HWTSTAMP filter
>> ptp4l[33.520]: port 1: INITIALIZING to LISTENING on INITIALIZE
>> ptp4l[33.524]: port 0: INITIALIZING to LISTENING on INITIALIZE
>> ptp4l[39.524]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
>> .....
>>
>> -----------------------------
>> On slave:
>> root:~> date
>> Fri Jan  2 13:16:07 UTC 1970
>>
>> root:~>   ptp4l -i eth0 -q -v -s
>> ptp4l[39.624]: selected /dev/ptp0 as PTP clock
>> ptp4l[39.628]: m
>> ptp4l[39.628]: driver rejected most general HWTSTAMP filter
>> ptp4l[39.628]: port 1: INITIALIZING to LISTENING on INITIALIZE
>> ptp4l[39.632]: port 0: INITIALIZING to LISTENING on INITIALIZE
>> ptp4l[39.664]: port 1: new foreign master 00e022.fffe.fe8529-1
>> ptp4l[43.672]: selected best master clock 00e022.fffe.fe8529
>> ptp4l[43.676]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
>> ptp4l[44.688]: master offset -7968957480 s0 adj      +0 path delay       8120
>> ptp4l[45.692]: master offset -7968953124 s0 adj      +0 path delay       9076
>> ptp4l[46.696]: master offset -7968947340 s0 adj      +0 path delay       8860
>> ptp4l[47.700]: master offset -7968941884 s1 adj      +0 path delay       8860
>> ptp4l[48.704]: master offset       4564 s2 adj   +4564 path delay       8860
>> ptp4l[48.704]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
>> ptp4l[49.708]: master offset       5154 s2 adj   +6523 path delay       9086
>> ptp4l[50.712]: master offset       3686 s2 adj   +6601 path delay       9322
>> ptp4l[51.716]: master offset       2582 s2 adj   +6603 path delay       9322
>> ptp4l[52.720]: master offset       1362 s2 adj   +6158 path delay       9438
>> ptp4l[53.724]: master offset        658 s2 adj   +5862 path delay       9438
>> ptp4l[54.728]: master offset        -85 s2 adj   +5317 path delay       9685
>> ptp4l[55.732]: master offset       -113 s2 adj   +5263 path delay       9873
>> ptp4l[56.748]: master offset         86 s2 adj   +5428 path delay       9930
>> ptp4l[57.740]: master offset        166 s2 adj   +5534 path delay       9930
>> ptp4l[58.744]: master offset       -247 s2 adj   +5171 path delay      10151
>> ptp4l[59.748]: master offset        -39 s2 adj   +5305 path delay      10151
>> ptp4l[60.752]: master offset        217 s2 adj   +5549 path delay      10151
>> ptp4l[61.756]: master offset        256 s2 adj   +5653 path delay      10128
>> .....
>
> This looks perfect. Did you fixup the wrong time stamp shift?
>
>>
>> root:~> date
>> Fri Jan  2 13:16:45 UTC 1970
>> root:~>
>>
>> The system time in slave didn't change.
>
> That is correct. Using RAW time stamping and PHC, the time in the PHC
> changes, but not the system time. The system time may be slaved to
> the PHC time using the phc2sys program.
>

How to use it?

ptp4l -i eth0 -q -v     # master
ptp4l -i eth0 -q -v -s  # slave
And on slave i should also start:  phc2sys -s /dev/ptp0 -i eth0?
But this can't work.

> Anyhow, it looks like this is working fine to me.
>
> Thanks,
> Richard
Richard Cochran Nov. 1, 2012, 8:41 a.m. UTC | #12
On Thu, Nov 01, 2012 at 10:08:01AM +0800, Bob Liu wrote:
> How to use it?
 
ptp4l -i eth0 -q -v     # master
ptp4l -i eth0 -q -v -s  # slave

#
# Wait for state s2 on the slave_________
#                                        \
ptp4l[336.203]: master offset        569 s2 adj +102784 path delay 33666
#
# Then start phc2sys.
#

phc2sys -s /dev/ptp0

> But this can't work.

Can you post the output of the ptp4l and phc2sys on the slave?

Thanks again for testing this for me,
Richard
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bob Liu Nov. 1, 2012, 8:54 a.m. UTC | #13
On Thu, Nov 1, 2012 at 4:41 PM, Richard Cochran
<richardcochran@gmail.com> wrote:
> On Thu, Nov 01, 2012 at 10:08:01AM +0800, Bob Liu wrote:
>> How to use it?
>
> ptp4l -i eth0 -q -v     # master
> ptp4l -i eth0 -q -v -s  # slave
>
> #
> # Wait for state s2 on the slave_________
> #                                        \
> ptp4l[336.203]: master offset        569 s2 adj +102784 path delay 33666
> #
> # Then start phc2sys.
> #
>
> phc2sys -s /dev/ptp0
>
>> But this can't work.
>
> Can you post the output of the ptp4l and phc2sys on the slave?
>

I opened three consoles on slave machine using telnet:
console 1:
root:~> ptp4l -i eth0 -q -v -s
ptp4l[75.904]: selected /dev/ptp0 as PTP clock
ptp4l[75.908]: m
ptp4l[75.908]: driver rejected most general HWTSTAMP filter
ptp4l[75.908]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[75.912]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[76.244]: port 1: new foreign master 00e022.fffe.fe8529-1
ptp4l[80.252]: selected best master clock 00e022.fffe.fe8529
ptp4l[80.252]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[81.288]: master offset -17688624512 s0 adj      +0 path delay       7456
ptp4l[82.292]: master offset -17688618592 s0 adj      +0 path delay       7456
ptp4l[83.296]: master offset -17688613232 s0 adj      +0 path delay       7584
ptp4l[84.300]: master offset -17688607696 s1 adj      +0 path delay       7584
ptp4l[85.304]: master offset       4736 s2 adj   +4736 path delay
 7584
ptp4l[85.308]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[86.308]: master offset       5600 s2 adj   +7021 path delay       7584
ptp4l[87.312]: master offset       2582 s2 adj   +5683 path delay       9066
ptp4l[88.316]: master offset       2370 s2 adj   +6245 path delay       9262
ptp4l[89.320]: master offset       1568 s2 adj   +6154 path delay       9424
ptp4l[90.324]: master offset        880 s2 adj   +5937 path delay       9424
ptp4l[91.328]: master offset        680 s2 adj   +6001 path delay       9512
ptp4l[92.332]: master offset        165 s2 adj   +5690 path delay       9595
ptp4l[93.336]: master offset        -59 s2 adj   +5515 path delay       9595
ptp4l[94.340]: master offset        -12 s2 adj   +5545 path delay       9644
ptp4l[95.344]: master offset        -95 s2 adj   +5458 path delay       9679
ptp4l[96.348]: master offset         49 s2 adj   +5574 path delay       9679
ptp4l[97.352]: master offset       -143 s2 adj   +5396 path delay       9935


After see s2 state, i start phc2sys in console 2:
root:~> phc2sys -s /dev/ptp0
phc   3421792 s1 46.828595280 drift 0.00
phc   3430512 s2 47.832595280 drift 0.00
phc   3436256 s3 48.836595280 drift 0.00
phc   3454080 s4 49.840595280 drift 10719.79
phc    -37919 s4 50.841130481 drift -655.91
phc     10983 s4 51.845157639 drift 2638.99
phc      7277 s4 52.849147421 drift 4822.09
phc     12694 s4 53.853137462 drift 8630.29
phc     -6028 s4 54.857119908 drift 6821.89
phc     -7998 s4 55.861117234 drift 4422.49
phc     -2657 s4 56.865118399 drift 3625.39
phc     -5072 s4 57.869116640 drift 2103.79
phc     23391 s4 58.873118079 drift 9121.09
phc     -8035 s4 59.877092589 drift 6710.59
phc    -68278 s4 60.881091402 drift -13772.81
phc     53773 s4 61.881152717 drift 2359.09
phc     25317 s4 62.885112965 drift 9954.19
phc     19080 s4 63.889085128 drift 15678.19
phc     -6000 s4 64.893055984 drift 13878.19
phc    -17746 s4 65.897046190 drift 8554.39
phc    -13533 s4 66.901050019 drift 4494.49
phc     14260 s4 67.905055012 drift 8772.49
phc     -7786 s4 68.909036278 drift 6436.69


Then in console 3:
root:~> date
Thu Jan  1 00:00:58 UTC 1970
root:~> date
Thu Jan  1 00:00:59 UTC 1970
root:~> date
Thu Jan  1 00:00:59 UTC 1970
root:~> date
Thu Jan  1 00:01:01 UTC 1970
root:~> date
Thu Jan  1 00:01:01 UTC 1970
root:~> date
Thu Jan  1 00:01:14 UTC 1970

date in master side is:
root:/> date
Thu Dec 21 01:34:26 UTC 2006
root:/>

So the system time didn't sync.
Richard Cochran Nov. 1, 2012, 9:35 a.m. UTC | #14
On Thu, Nov 01, 2012 at 04:54:30PM +0800, Bob Liu wrote:
> 
> date in master side is:
> root:/> date
> Thu Dec 21 01:34:26 UTC 2006
> root:/>

What is the time on the master from the 'testptp -g' command?
 
> So the system time didn't sync.

I guess that you need to set the PHC time on the master, using 'testptp -s'.

[ There are always two clocks on each host, the Linux system time and
  the PHC time in the hardware clock. ]

Thanks,
Richard

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bob Liu Nov. 1, 2012, 9:39 a.m. UTC | #15
On Thu, Nov 1, 2012 at 5:35 PM, Richard Cochran
<richardcochran@gmail.com> wrote:
> On Thu, Nov 01, 2012 at 04:54:30PM +0800, Bob Liu wrote:
>>
>> date in master side is:
>> root:/> date
>> Thu Dec 21 01:34:26 UTC 2006
>> root:/>
>
> What is the time on the master from the 'testptp -g' command?
>
>> So the system time didn't sync.
>
> I guess that you need to set the PHC time on the master, using 'testptp -s'.
>
> [ There are always two clocks on each host, the Linux system time and
>   the PHC time in the hardware clock. ]
>

Thank you very much.
It works.
Richard Cochran Nov. 1, 2012, 9:42 a.m. UTC | #16
On Thu, Nov 01, 2012 at 05:39:01PM +0800, Bob Liu wrote:
> 
> Thank you very much.
> It works.

Thanks, Bob.

Can you add your Acked- or Tested-by to the V2 series that I posted?

Richard
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/ethernet/adi/bfin_mac.c b/drivers/net/ethernet/adi/bfin_mac.c
index 2349abb..393d1b5 100644
--- a/drivers/net/ethernet/adi/bfin_mac.c
+++ b/drivers/net/ethernet/adi/bfin_mac.c
@@ -555,7 +555,7 @@  static int bfin_mac_ethtool_get_ts_info(struct net_device *dev,
 	info->so_timestamping =
 		SOF_TIMESTAMPING_TX_HARDWARE |
 		SOF_TIMESTAMPING_RX_HARDWARE |
-		SOF_TIMESTAMPING_SYS_HARDWARE;
+		SOF_TIMESTAMPING_RAW_HARDWARE;
 	info->phc_index = -1;
 	info->tx_types =
 		(1 << HWTSTAMP_TX_OFF) |
@@ -653,6 +653,20 @@  static int bfin_mac_set_mac_address(struct net_device *dev, void *p)
 #ifdef CONFIG_BFIN_MAC_USE_HWSTAMP
 #define bfin_mac_hwtstamp_is_none(cfg) ((cfg) == HWTSTAMP_FILTER_NONE)
 
+static u32 bfin_select_phc_clock(u32 input_clk, unsigned int *shift_result)
+{
+	u32 ipn = 1000000000UL / input_clk;
+	u32 ppn = 1;
+	unsigned int shift = 0;
+
+	while (ppn <= ipn) {
+		ppn <<= 1;
+		shift++;
+	}
+	*shift_result = shift;
+	return 1000000000UL / ppn;
+}
+
 static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
 		struct ifreq *ifr, int cmd)
 {
@@ -802,19 +816,7 @@  static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
 		bfin_read_EMAC_PTP_TXSNAPLO();
 		bfin_read_EMAC_PTP_TXSNAPHI();
 
-		/*
-		 * Set registers so that rollover occurs soon to test this.
-		 */
-		bfin_write_EMAC_PTP_TIMELO(0x00000000);
-		bfin_write_EMAC_PTP_TIMEHI(0xFF800000);
-
 		SSYNC();
-
-		lp->compare.last_update = 0;
-		timecounter_init(&lp->clock,
-				&lp->cycles,
-				ktime_to_ns(ktime_get_real()));
-		timecompare_update(&lp->compare, 0);
 	}
 
 	lp->stamp_cfg = config;
@@ -822,15 +824,6 @@  static int bfin_mac_hwtstamp_ioctl(struct net_device *netdev,
 		-EFAULT : 0;
 }
 
-static void bfin_dump_hwtamp(char *s, ktime_t *hw, ktime_t *ts, struct timecompare *cmp)
-{
-	ktime_t sys = ktime_get_real();
-
-	pr_debug("%s %s hardware:%d,%d transform system:%d,%d system:%d,%d, cmp:%lld, %lld\n",
-			__func__, s, hw->tv.sec, hw->tv.nsec, ts->tv.sec, ts->tv.nsec, sys.tv.sec,
-			sys.tv.nsec, cmp->offset, cmp->skew);
-}
-
 static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
 {
 	struct bfin_mac_local *lp = netdev_priv(netdev);
@@ -861,15 +854,9 @@  static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
 			regval = bfin_read_EMAC_PTP_TXSNAPLO();
 			regval |= (u64)bfin_read_EMAC_PTP_TXSNAPHI() << 32;
 			memset(&shhwtstamps, 0, sizeof(shhwtstamps));
-			ns = timecounter_cyc2time(&lp->clock,
-					regval);
-			timecompare_update(&lp->compare, ns);
+			ns = regval >> lp->shift;
 			shhwtstamps.hwtstamp = ns_to_ktime(ns);
-			shhwtstamps.syststamp =
-				timecompare_transform(&lp->compare, ns);
 			skb_tstamp_tx(skb, &shhwtstamps);
-
-			bfin_dump_hwtamp("TX", &shhwtstamps.hwtstamp, &shhwtstamps.syststamp, &lp->compare);
 		}
 	}
 }
@@ -892,51 +879,25 @@  static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
 
 	regval = bfin_read_EMAC_PTP_RXSNAPLO();
 	regval |= (u64)bfin_read_EMAC_PTP_RXSNAPHI() << 32;
-	ns = timecounter_cyc2time(&lp->clock, regval);
-	timecompare_update(&lp->compare, ns);
+	ns = regval >> lp->shift;
 	memset(shhwtstamps, 0, sizeof(*shhwtstamps));
 	shhwtstamps->hwtstamp = ns_to_ktime(ns);
-	shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
-
-	bfin_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
-}
-
-/*
- * bfin_read_clock - read raw cycle counter (to be used by time counter)
- */
-static cycle_t bfin_read_clock(const struct cyclecounter *tc)
-{
-	u64 stamp;
-
-	stamp =  bfin_read_EMAC_PTP_TIMELO();
-	stamp |= (u64)bfin_read_EMAC_PTP_TIMEHI() << 32ULL;
-
-	return stamp;
 }
 
-#define PTP_CLK 25000000
-
 static void bfin_mac_hwtstamp_init(struct net_device *netdev)
 {
 	struct bfin_mac_local *lp = netdev_priv(netdev);
-	u64 append;
+	u64 addend;
+	u32 input_clk, phc_clk;
 
 	/* Initialize hardware timer */
-	append = PTP_CLK * (1ULL << 32);
-	do_div(append, get_sclk());
-	bfin_write_EMAC_PTP_ADDEND((u32)append);
-
-	memset(&lp->cycles, 0, sizeof(lp->cycles));
-	lp->cycles.read = bfin_read_clock;
-	lp->cycles.mask = CLOCKSOURCE_MASK(64);
-	lp->cycles.mult = 1000000000 / PTP_CLK;
-	lp->cycles.shift = 0;
-
-	/* Synchronize our NIC clock against system wall clock */
-	memset(&lp->compare, 0, sizeof(lp->compare));
-	lp->compare.source = &lp->clock;
-	lp->compare.target = ktime_get_real;
-	lp->compare.num_samples = 10;
+	input_clk = get_sclk();
+	phc_clk = bfin_select_phc_clock(input_clk, &lp->shift);
+	addend = phc_clk * (1ULL << 32);
+	do_div(addend, input_clk);
+	bfin_write_EMAC_PTP_ADDEND((u32)addend);
+
+	lp->addend = addend;
 
 	/* Initialize hwstamp config */
 	lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
diff --git a/drivers/net/ethernet/adi/bfin_mac.h b/drivers/net/ethernet/adi/bfin_mac.h
index 960905c..57f042c 100644
--- a/drivers/net/ethernet/adi/bfin_mac.h
+++ b/drivers/net/ethernet/adi/bfin_mac.h
@@ -11,8 +11,6 @@ 
 #define _BFIN_MAC_H_
 
 #include <linux/net_tstamp.h>
-#include <linux/clocksource.h>
-#include <linux/timecompare.h>
 #include <linux/timer.h>
 #include <linux/etherdevice.h>
 #include <linux/bfin_mac.h>
@@ -94,9 +92,8 @@  struct bfin_mac_local {
 	struct mii_bus *mii_bus;
 
 #if defined(CONFIG_BFIN_MAC_USE_HWSTAMP)
-	struct cyclecounter cycles;
-	struct timecounter clock;
-	struct timecompare compare;
+	u32 addend;
+	unsigned int shift;
 	struct hwtstamp_config stamp_cfg;
 #endif
 };