* [PATCH RFC net-next 1/4] bfin_mac: only advertise hardware time stamped when enabled.
2012-09-28 17:20 [PATCH RFC net-next 0/4] Convert blackfin to phc and remove timecompare Richard Cochran
@ 2012-09-28 17:20 ` Richard Cochran
2012-09-28 17:20 ` [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead Richard Cochran
` (2 subsequent siblings)
3 siblings, 0 replies; 22+ messages in thread
From: Richard Cochran @ 2012-09-28 17:20 UTC (permalink / raw)
To: netdev
Cc: device-drivers-devel, uclinux-dist-devel, David Miller,
Jacob Keller, Jeff Kirsher, John Ronciak, John Stultz,
Mike Frysinger, Miroslav Lichvar, Patrick Ohly, Sonic Zhang
The hardware time stamping code is a compile time option for the blackfin.
When it is not enabled, the driver should fall back to the standard
ethtool reply to the get_ts_info query.
Compile tested only.
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
drivers/net/ethernet/adi/bfin_mac.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/net/ethernet/adi/bfin_mac.c b/drivers/net/ethernet/adi/bfin_mac.c
index f816426..2349abb 100644
--- a/drivers/net/ethernet/adi/bfin_mac.c
+++ b/drivers/net/ethernet/adi/bfin_mac.c
@@ -548,6 +548,7 @@ static int bfin_mac_ethtool_setwol(struct net_device *dev,
return 0;
}
+#ifdef CONFIG_BFIN_MAC_USE_HWSTAMP
static int bfin_mac_ethtool_get_ts_info(struct net_device *dev,
struct ethtool_ts_info *info)
{
@@ -566,6 +567,7 @@ static int bfin_mac_ethtool_get_ts_info(struct net_device *dev,
(1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
return 0;
}
+#endif
static const struct ethtool_ops bfin_mac_ethtool_ops = {
.get_settings = bfin_mac_ethtool_getsettings,
@@ -574,7 +576,9 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = {
.get_drvinfo = bfin_mac_ethtool_getdrvinfo,
.get_wol = bfin_mac_ethtool_getwol,
.set_wol = bfin_mac_ethtool_setwol,
+#ifdef CONFIG_BFIN_MAC_USE_HWSTAMP
.get_ts_info = bfin_mac_ethtool_get_ts_info,
+#endif
};
/**************************************************************************/
--
1.7.2.5
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-09-28 17:20 [PATCH RFC net-next 0/4] Convert blackfin to phc and remove timecompare Richard Cochran
2012-09-28 17:20 ` [PATCH RFC net-next 1/4] bfin_mac: only advertise hardware time stamped when enabled Richard Cochran
@ 2012-09-28 17:20 ` Richard Cochran
2012-10-30 9:17 ` [uclinux-dist-devel] " Bob Liu
2012-10-31 6:47 ` Bob Liu
2012-09-28 17:20 ` [PATCH RFC net-next 3/4] bfin_mac: offer a PTP Hardware Clock Richard Cochran
2012-09-28 17:20 ` [PATCH RFC net-next 4/4] time: remove the timecompare code Richard Cochran
3 siblings, 2 replies; 22+ messages in thread
From: Richard Cochran @ 2012-09-28 17:20 UTC (permalink / raw)
To: netdev
Cc: device-drivers-devel, uclinux-dist-devel, David Miller,
Jacob Keller, Jeff Kirsher, John Ronciak, John Stultz,
Mike Frysinger, Miroslav Lichvar, Patrick Ohly, Sonic Zhang
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);
-}
-
-/*
- * 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
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-09-28 17:20 ` [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead Richard Cochran
@ 2012-10-30 9:17 ` Bob Liu
2012-10-30 13:41 ` Richard Cochran
2012-10-31 6:47 ` Bob Liu
1 sibling, 1 reply; 22+ messages in thread
From: Bob Liu @ 2012-10-30 9:17 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
--
Regards,
--Bob
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-30 9:17 ` [uclinux-dist-devel] " Bob Liu
@ 2012-10-30 13:41 ` Richard Cochran
2012-10-31 6:29 ` Bob Liu
0 siblings, 1 reply; 22+ messages in thread
From: Richard Cochran @ 2012-10-30 13:41 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-30 13:41 ` Richard Cochran
@ 2012-10-31 6:29 ` Bob Liu
2012-10-31 6:36 ` Bob Liu
2012-10-31 8:36 ` Richard Cochran
0 siblings, 2 replies; 22+ messages in thread
From: Bob Liu @ 2012-10-31 6:29 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 6:29 ` Bob Liu
@ 2012-10-31 6:36 ` Bob Liu
2012-10-31 8:21 ` Richard Cochran
2012-10-31 8:36 ` Richard Cochran
1 sibling, 1 reply; 22+ messages in thread
From: Bob Liu @ 2012-10-31 6:36 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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.
>
--
Thanks,
--Bob
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 6:36 ` Bob Liu
@ 2012-10-31 8:21 ` Richard Cochran
0 siblings, 0 replies; 22+ messages in thread
From: Richard Cochran @ 2012-10-31 8:21 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 6:29 ` Bob Liu
2012-10-31 6:36 ` Bob Liu
@ 2012-10-31 8:36 ` Richard Cochran
2012-10-31 9:00 ` Bob Liu
1 sibling, 1 reply; 22+ messages in thread
From: Richard Cochran @ 2012-10-31 8:36 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 8:36 ` Richard Cochran
@ 2012-10-31 9:00 ` Bob Liu
2012-10-31 12:46 ` Richard Cochran
0 siblings, 1 reply; 22+ messages in thread
From: Bob Liu @ 2012-10-31 9:00 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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.
--
Thanks,
--Bob
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 9:00 ` Bob Liu
@ 2012-10-31 12:46 ` Richard Cochran
2012-11-01 2:08 ` Bob Liu
0 siblings, 1 reply; 22+ messages in thread
From: Richard Cochran @ 2012-10-31 12:46 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 12:46 ` Richard Cochran
@ 2012-11-01 2:08 ` Bob Liu
2012-11-01 8:41 ` Richard Cochran
0 siblings, 1 reply; 22+ messages in thread
From: Bob Liu @ 2012-11-01 2:08 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
--
Regards,
--Bob
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-11-01 2:08 ` Bob Liu
@ 2012-11-01 8:41 ` Richard Cochran
2012-11-01 8:54 ` Bob Liu
0 siblings, 1 reply; 22+ messages in thread
From: Richard Cochran @ 2012-11-01 8:41 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-11-01 8:41 ` Richard Cochran
@ 2012-11-01 8:54 ` Bob Liu
2012-11-01 9:35 ` Richard Cochran
0 siblings, 1 reply; 22+ messages in thread
From: Bob Liu @ 2012-11-01 8:54 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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.
--
Thanks,
--Bob
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-11-01 8:54 ` Bob Liu
@ 2012-11-01 9:35 ` Richard Cochran
[not found] ` <20121101093540.GB5949-TJb37gCd1q6chkuNt9O67llkmcu1nq/N@public.gmane.org>
0 siblings, 1 reply; 22+ messages in thread
From: Richard Cochran @ 2012-11-01 9:35 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-09-28 17:20 ` [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead Richard Cochran
2012-10-30 9:17 ` [uclinux-dist-devel] " Bob Liu
@ 2012-10-31 6:47 ` Bob Liu
2012-10-31 7:57 ` Richard Cochran
1 sibling, 1 reply; 22+ messages in thread
From: Bob Liu @ 2012-10-31 6:47 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
--
Regards,
--Bob
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [uclinux-dist-devel] [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead.
2012-10-31 6:47 ` Bob Liu
@ 2012-10-31 7:57 ` Richard Cochran
0 siblings, 0 replies; 22+ messages in thread
From: Richard Cochran @ 2012-10-31 7:57 UTC (permalink / raw)
To: Bob Liu
Cc: netdev, Miroslav Lichvar, John Ronciak, John Stultz, Jeff Kirsher,
device-drivers-devel, Jacob Keller, uclinux-dist-devel,
Patrick Ohly, David Miller
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
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH RFC net-next 3/4] bfin_mac: offer a PTP Hardware Clock.
2012-09-28 17:20 [PATCH RFC net-next 0/4] Convert blackfin to phc and remove timecompare Richard Cochran
2012-09-28 17:20 ` [PATCH RFC net-next 1/4] bfin_mac: only advertise hardware time stamped when enabled Richard Cochran
2012-09-28 17:20 ` [PATCH RFC net-next 2/4] bfin_mac: replace sys time stamps with raw ones instead Richard Cochran
@ 2012-09-28 17:20 ` Richard Cochran
2012-09-28 17:20 ` [PATCH RFC net-next 4/4] time: remove the timecompare code Richard Cochran
3 siblings, 0 replies; 22+ messages in thread
From: Richard Cochran @ 2012-09-28 17:20 UTC (permalink / raw)
To: netdev
Cc: device-drivers-devel, uclinux-dist-devel, David Miller,
Jacob Keller, Jeff Kirsher, John Ronciak, John Stultz,
Mike Frysinger, Miroslav Lichvar, Patrick Ohly, Sonic Zhang
The BF518 has a PTP time unit that works in a similar way to other MAC
based clocks, like gianfar, ixp46x, and igb. This patch adds support for
using the blackfin as a PHC. Although the blackfin hardware does offer a
few ancillary features, this patch implements only the basic operations.
Compile tested only.
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
drivers/net/ethernet/adi/Kconfig | 2 +-
drivers/net/ethernet/adi/bfin_mac.c | 170 ++++++++++++++++++++++++++++++++++-
drivers/net/ethernet/adi/bfin_mac.h | 6 ++
3 files changed, 175 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/adi/Kconfig b/drivers/net/ethernet/adi/Kconfig
index 49a30d3..175c38c 100644
--- a/drivers/net/ethernet/adi/Kconfig
+++ b/drivers/net/ethernet/adi/Kconfig
@@ -61,7 +61,7 @@ config BFIN_RX_DESC_NUM
config BFIN_MAC_USE_HWSTAMP
bool "Use IEEE 1588 hwstamp"
- depends on BFIN_MAC && BF518
+ depends on BFIN_MAC && BF518 && PTP_1588_CLOCK && !(BFIN_MAC=y && PTP_1588_CLOCK=m)
default y
---help---
To support the IEEE 1588 Precision Time Protocol (PTP), select y here
diff --git a/drivers/net/ethernet/adi/bfin_mac.c b/drivers/net/ethernet/adi/bfin_mac.c
index 393d1b5..88053a4 100644
--- a/drivers/net/ethernet/adi/bfin_mac.c
+++ b/drivers/net/ethernet/adi/bfin_mac.c
@@ -552,11 +552,13 @@ static int bfin_mac_ethtool_setwol(struct net_device *dev,
static int bfin_mac_ethtool_get_ts_info(struct net_device *dev,
struct ethtool_ts_info *info)
{
+ struct bfin_mac_local *lp = netdev_priv(dev);
+
info->so_timestamping =
SOF_TIMESTAMPING_TX_HARDWARE |
SOF_TIMESTAMPING_RX_HARDWARE |
SOF_TIMESTAMPING_RAW_HARDWARE;
- info->phc_index = -1;
+ info->phc_index = lp->phc_index;
info->tx_types =
(1 << HWTSTAMP_TX_OFF) |
(1 << HWTSTAMP_TX_ON);
@@ -887,7 +889,7 @@ static void bfin_rx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
static void bfin_mac_hwtstamp_init(struct net_device *netdev)
{
struct bfin_mac_local *lp = netdev_priv(netdev);
- u64 addend;
+ u64 addend, ppb;
u32 input_clk, phc_clk;
/* Initialize hardware timer */
@@ -898,18 +900,175 @@ static void bfin_mac_hwtstamp_init(struct net_device *netdev)
bfin_write_EMAC_PTP_ADDEND((u32)addend);
lp->addend = addend;
+ ppb = 1000000000ULL * input_clk;
+ do_div(ppb, phc_clk);
+ lp->max_ppb = ppb - 1000000000ULL - 1ULL;
/* Initialize hwstamp config */
lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
lp->stamp_cfg.tx_type = HWTSTAMP_TX_OFF;
}
+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;
+}
+
+static void bfin_ptp_time_write(struct bfin_mac_local *lp, u64 ns)
+{
+ u32 hi, lo;
+
+ ns >>= lp->shift;
+ hi = ns >> 32;
+ lo = ns & 0xffffffff;
+
+ bfin_write_EMAC_PTP_TIMELO(lo);
+ bfin_write_EMAC_PTP_TIMEHI(hi);
+}
+
+/* PTP Hardware Clock operations */
+
+static int bfin_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
+{
+ u64 adj;
+ u32 diff, addend;
+ int neg_adj = 0;
+ struct bfin_mac_local *lp =
+ container_of(ptp, struct bfin_mac_local, caps);
+
+ if (ppb < 0) {
+ neg_adj = 1;
+ ppb = -ppb;
+ }
+ addend = lp->addend;
+ adj = addend;
+ adj *= ppb;
+ diff = div_u64(adj, 1000000000ULL);
+
+ addend = neg_adj ? addend - diff : addend + diff;
+
+ bfin_write_EMAC_PTP_ADDEND(addend);
+
+ return 0;
+}
+
+static int bfin_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
+{
+ s64 now;
+ unsigned long flags;
+ struct bfin_mac_local *lp =
+ container_of(ptp, struct bfin_mac_local, caps);
+
+ spin_lock_irqsave(&lp->phc_lock, flags);
+
+ now = bfin_ptp_time_read(lp);
+ now += delta;
+ bfin_ptp_time_write(lp, now);
+
+ spin_unlock_irqrestore(&lp->phc_lock, flags);
+
+ return 0;
+}
+
+static int bfin_ptp_gettime(struct ptp_clock_info *ptp, struct timespec *ts)
+{
+ u64 ns;
+ u32 remainder;
+ unsigned long flags;
+ struct bfin_mac_local *lp =
+ container_of(ptp, struct bfin_mac_local, caps);
+
+ spin_lock_irqsave(&lp->phc_lock, flags);
+
+ ns = bfin_ptp_time_read(lp);
+
+ spin_unlock_irqrestore(&lp->phc_lock, flags);
+
+ ts->tv_sec = div_u64_rem(ns, 1000000000, &remainder);
+ ts->tv_nsec = remainder;
+ return 0;
+}
+
+static int bfin_ptp_settime(struct ptp_clock_info *ptp,
+ const struct timespec *ts)
+{
+ u64 ns;
+ unsigned long flags;
+ struct bfin_mac_local *lp =
+ container_of(ptp, struct bfin_mac_local, caps);
+
+ ns = ts->tv_sec * 1000000000ULL;
+ ns += ts->tv_nsec;
+
+ spin_lock_irqsave(&lp->phc_lock, flags);
+
+ bfin_ptp_time_write(lp, ns);
+
+ spin_unlock_irqrestore(&lp->phc_lock, flags);
+
+ return 0;
+}
+
+static int bfin_ptp_enable(struct ptp_clock_info *ptp,
+ struct ptp_clock_request *rq, int on)
+{
+ return -EOPNOTSUPP;
+}
+
+static struct ptp_clock_info bfin_ptp_caps = {
+ .owner = THIS_MODULE,
+ .name = "BF518 clock",
+ .max_adj = 0,
+ .n_alarm = 0,
+ .n_ext_ts = 0,
+ .n_per_out = 0,
+ .pps = 0,
+ .adjfreq = bfin_ptp_adjfreq,
+ .adjtime = bfin_ptp_adjtime,
+ .gettime = bfin_ptp_gettime,
+ .settime = bfin_ptp_settime,
+ .enable = bfin_ptp_enable,
+};
+
+static int bfin_phc_init(struct net_device *netdev, struct device *dev)
+{
+ struct bfin_mac_local *lp = netdev_priv(netdev);
+
+ lp->caps = bfin_ptp_caps;
+ lp->caps.max_adj = lp->max_ppb;
+ lp->clock = ptp_clock_register(&lp->caps, dev);
+ if (IS_ERR(lp->clock))
+ return PTR_ERR(lp->clock);
+
+ lp->phc_index = ptp_clock_index(lp->clock);
+ spin_lock_init(&lp->phc_lock);
+
+ return 0;
+}
+
+static void bfin_phc_release(struct bfin_mac_local *lp)
+{
+ ptp_clock_unregister(lp->clock);
+}
+
#else
# define bfin_mac_hwtstamp_is_none(cfg) 0
# define bfin_mac_hwtstamp_init(dev)
# define bfin_mac_hwtstamp_ioctl(dev, ifr, cmd) (-EOPNOTSUPP)
# define bfin_rx_hwtstamp(dev, skb)
# define bfin_tx_hwtstamp(dev, skb)
+# define bfin_phc_init(netdev, dev) 0
+# define bfin_phc_release(lp)
#endif
static inline void _tx_reclaim_skb(void)
@@ -1544,12 +1703,17 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
}
bfin_mac_hwtstamp_init(ndev);
+ if (bfin_phc_init(ndev, &pdev->dev)) {
+ dev_err(&pdev->dev, "Cannot register PHC device!\n");
+ goto out_err_phc;
+ }
/* now, print out the card info, in a short format.. */
netdev_info(ndev, "%s, Version %s\n", DRV_DESC, DRV_VERSION);
return 0;
+out_err_phc:
out_err_reg_ndev:
free_irq(IRQ_MAC_RX, ndev);
out_err_request_irq:
@@ -1568,6 +1732,8 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev)
struct net_device *ndev = platform_get_drvdata(pdev);
struct bfin_mac_local *lp = netdev_priv(ndev);
+ bfin_phc_release(lp);
+
platform_set_drvdata(pdev, NULL);
lp->mii_bus->priv = NULL;
diff --git a/drivers/net/ethernet/adi/bfin_mac.h b/drivers/net/ethernet/adi/bfin_mac.h
index 57f042c..7a07ee0 100644
--- a/drivers/net/ethernet/adi/bfin_mac.h
+++ b/drivers/net/ethernet/adi/bfin_mac.h
@@ -11,6 +11,7 @@
#define _BFIN_MAC_H_
#include <linux/net_tstamp.h>
+#include <linux/ptp_clock_kernel.h>
#include <linux/timer.h>
#include <linux/etherdevice.h>
#include <linux/bfin_mac.h>
@@ -94,7 +95,12 @@ struct bfin_mac_local {
#if defined(CONFIG_BFIN_MAC_USE_HWSTAMP)
u32 addend;
unsigned int shift;
+ s32 max_ppb;
struct hwtstamp_config stamp_cfg;
+ struct ptp_clock_info caps;
+ struct ptp_clock *clock;
+ int phc_index;
+ spinlock_t phc_lock; /* protects time lo/hi registers */
#endif
};
--
1.7.2.5
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH RFC net-next 4/4] time: remove the timecompare code.
2012-09-28 17:20 [PATCH RFC net-next 0/4] Convert blackfin to phc and remove timecompare Richard Cochran
` (2 preceding siblings ...)
2012-09-28 17:20 ` [PATCH RFC net-next 3/4] bfin_mac: offer a PTP Hardware Clock Richard Cochran
@ 2012-09-28 17:20 ` Richard Cochran
2012-09-28 17:44 ` John Stultz
3 siblings, 1 reply; 22+ messages in thread
From: Richard Cochran @ 2012-09-28 17:20 UTC (permalink / raw)
To: netdev
Cc: device-drivers-devel, uclinux-dist-devel, David Miller,
Jacob Keller, Jeff Kirsher, John Ronciak, John Stultz,
Mike Frysinger, Miroslav Lichvar, Patrick Ohly, Sonic Zhang
This patch removes the timecompare code from the kernel. The top five
reasons to do this are:
1. There are no more users of this code.
2. The original idea was a bit weak.
3. The original author has disappeared.
4. The code was not general purpose but tuned to a particular hardware,
5. There are better ways to accomplish clock synchronization.
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
include/linux/timecompare.h | 125 ----------------------------
kernel/time/Makefile | 2 +-
kernel/time/timecompare.c | 193 -------------------------------------------
3 files changed, 1 insertions(+), 319 deletions(-)
delete mode 100644 include/linux/timecompare.h
delete mode 100644 kernel/time/timecompare.c
diff --git a/include/linux/timecompare.h b/include/linux/timecompare.h
deleted file mode 100644
index 546e223..0000000
--- a/include/linux/timecompare.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Utility code which helps transforming between two different time
- * bases, called "source" and "target" time in this code.
- *
- * Source time has to be provided via the timecounter API while target
- * time is accessed via a function callback whose prototype
- * intentionally matches ktime_get() and ktime_get_real(). These
- * interfaces where chosen like this so that the code serves its
- * initial purpose without additional glue code.
- *
- * This purpose is synchronizing a hardware clock in a NIC with system
- * time, in order to implement the Precision Time Protocol (PTP,
- * IEEE1588) with more accurate hardware assisted time stamping. In
- * that context only synchronization against system time (=
- * ktime_get_real()) is currently needed. But this utility code might
- * become useful in other situations, which is why it was written as
- * general purpose utility code.
- *
- * The source timecounter is assumed to return monotonically
- * increasing time (but this code does its best to compensate if that
- * is not the case) whereas target time may jump.
- *
- * The target time corresponding to a source time is determined by
- * reading target time, reading source time, reading target time
- * again, then assuming that average target time corresponds to source
- * time. In other words, the assumption is that reading the source
- * time is slow and involves equal time for sending the request and
- * receiving the reply, whereas reading target time is assumed to be
- * fast.
- *
- * Copyright (C) 2009 Intel Corporation.
- * Author: Patrick Ohly <patrick.ohly@intel.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#ifndef _LINUX_TIMECOMPARE_H
-#define _LINUX_TIMECOMPARE_H
-
-#include <linux/clocksource.h>
-#include <linux/ktime.h>
-
-/**
- * struct timecompare - stores state and configuration for the two clocks
- *
- * Initialize to zero, then set source/target/num_samples.
- *
- * Transformation between source time and target time is done with:
- * target_time = source_time + offset +
- * (source_time - last_update) * skew /
- * TIMECOMPARE_SKEW_RESOLUTION
- *
- * @source: used to get source time stamps via timecounter_read()
- * @target: function returning target time (for example, ktime_get
- * for monotonic time, or ktime_get_real for wall clock)
- * @num_samples: number of times that source time and target time are to
- * be compared when determining their offset
- * @offset: (target time - source time) at the time of the last update
- * @skew: average (target time - source time) / delta source time *
- * TIMECOMPARE_SKEW_RESOLUTION
- * @last_update: last source time stamp when time offset was measured
- */
-struct timecompare {
- struct timecounter *source;
- ktime_t (*target)(void);
- int num_samples;
-
- s64 offset;
- s64 skew;
- u64 last_update;
-};
-
-/**
- * timecompare_transform - transform source time stamp into target time base
- * @sync: context for time sync
- * @source_tstamp: the result of timecounter_read() or
- * timecounter_cyc2time()
- */
-extern ktime_t timecompare_transform(struct timecompare *sync,
- u64 source_tstamp);
-
-/**
- * timecompare_offset - measure current (target time - source time) offset
- * @sync: context for time sync
- * @offset: average offset during sample period returned here
- * @source_tstamp: average source time during sample period returned here
- *
- * Returns number of samples used. Might be zero (= no result) in the
- * unlikely case that target time was monotonically decreasing for all
- * samples (= broken).
- */
-extern int timecompare_offset(struct timecompare *sync,
- s64 *offset,
- u64 *source_tstamp);
-
-extern void __timecompare_update(struct timecompare *sync,
- u64 source_tstamp);
-
-/**
- * timecompare_update - update offset and skew by measuring current offset
- * @sync: context for time sync
- * @source_tstamp: the result of timecounter_read() or
- * timecounter_cyc2time(), pass zero to force update
- *
- * Updates are only done at most once per second.
- */
-static inline void timecompare_update(struct timecompare *sync,
- u64 source_tstamp)
-{
- if (!source_tstamp ||
- (s64)(source_tstamp - sync->last_update) >= NSEC_PER_SEC)
- __timecompare_update(sync, source_tstamp);
-}
-
-#endif /* _LINUX_TIMECOMPARE_H */
diff --git a/kernel/time/Makefile b/kernel/time/Makefile
index e2fd74b..ff7d9d2 100644
--- a/kernel/time/Makefile
+++ b/kernel/time/Makefile
@@ -1,4 +1,4 @@
-obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o timecompare.o
+obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o
obj-y += timeconv.o posix-clock.o alarmtimer.o
obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o
diff --git a/kernel/time/timecompare.c b/kernel/time/timecompare.c
deleted file mode 100644
index a9ae369..0000000
--- a/kernel/time/timecompare.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2009 Intel Corporation.
- * Author: Patrick Ohly <patrick.ohly@intel.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/timecompare.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/math64.h>
-#include <linux/kernel.h>
-
-/*
- * fixed point arithmetic scale factor for skew
- *
- * Usually one would measure skew in ppb (parts per billion, 1e9), but
- * using a factor of 2 simplifies the math.
- */
-#define TIMECOMPARE_SKEW_RESOLUTION (((s64)1)<<30)
-
-ktime_t timecompare_transform(struct timecompare *sync,
- u64 source_tstamp)
-{
- u64 nsec;
-
- nsec = source_tstamp + sync->offset;
- nsec += (s64)(source_tstamp - sync->last_update) * sync->skew /
- TIMECOMPARE_SKEW_RESOLUTION;
-
- return ns_to_ktime(nsec);
-}
-EXPORT_SYMBOL_GPL(timecompare_transform);
-
-int timecompare_offset(struct timecompare *sync,
- s64 *offset,
- u64 *source_tstamp)
-{
- u64 start_source = 0, end_source = 0;
- struct {
- s64 offset;
- s64 duration_target;
- } buffer[10], sample, *samples;
- int counter = 0, i;
- int used;
- int index;
- int num_samples = sync->num_samples;
-
- if (num_samples > ARRAY_SIZE(buffer)) {
- samples = kmalloc(sizeof(*samples) * num_samples, GFP_ATOMIC);
- if (!samples) {
- samples = buffer;
- num_samples = ARRAY_SIZE(buffer);
- }
- } else {
- samples = buffer;
- }
-
- /* run until we have enough valid samples, but do not try forever */
- i = 0;
- counter = 0;
- while (1) {
- u64 ts;
- ktime_t start, end;
-
- start = sync->target();
- ts = timecounter_read(sync->source);
- end = sync->target();
-
- if (!i)
- start_source = ts;
-
- /* ignore negative durations */
- sample.duration_target = ktime_to_ns(ktime_sub(end, start));
- if (sample.duration_target >= 0) {
- /*
- * assume symetric delay to and from source:
- * average target time corresponds to measured
- * source time
- */
- sample.offset =
- (ktime_to_ns(end) + ktime_to_ns(start)) / 2 -
- ts;
-
- /* simple insertion sort based on duration */
- index = counter - 1;
- while (index >= 0) {
- if (samples[index].duration_target <
- sample.duration_target)
- break;
- samples[index + 1] = samples[index];
- index--;
- }
- samples[index + 1] = sample;
- counter++;
- }
-
- i++;
- if (counter >= num_samples || i >= 100000) {
- end_source = ts;
- break;
- }
- }
-
- *source_tstamp = (end_source + start_source) / 2;
-
- /* remove outliers by only using 75% of the samples */
- used = counter * 3 / 4;
- if (!used)
- used = counter;
- if (used) {
- /* calculate average */
- s64 off = 0;
- for (index = 0; index < used; index++)
- off += samples[index].offset;
- *offset = div_s64(off, used);
- }
-
- if (samples && samples != buffer)
- kfree(samples);
-
- return used;
-}
-EXPORT_SYMBOL_GPL(timecompare_offset);
-
-void __timecompare_update(struct timecompare *sync,
- u64 source_tstamp)
-{
- s64 offset;
- u64 average_time;
-
- if (!timecompare_offset(sync, &offset, &average_time))
- return;
-
- if (!sync->last_update) {
- sync->last_update = average_time;
- sync->offset = offset;
- sync->skew = 0;
- } else {
- s64 delta_nsec = average_time - sync->last_update;
-
- /* avoid division by negative or small deltas */
- if (delta_nsec >= 10000) {
- s64 delta_offset_nsec = offset - sync->offset;
- s64 skew; /* delta_offset_nsec *
- TIMECOMPARE_SKEW_RESOLUTION /
- delta_nsec */
- u64 divisor;
-
- /* div_s64() is limited to 32 bit divisor */
- skew = delta_offset_nsec * TIMECOMPARE_SKEW_RESOLUTION;
- divisor = delta_nsec;
- while (unlikely(divisor >= ((s64)1) << 32)) {
- /* divide both by 2; beware, right shift
- of negative value has undefined
- behavior and can only be used for
- the positive divisor */
- skew = div_s64(skew, 2);
- divisor >>= 1;
- }
- skew = div_s64(skew, divisor);
-
- /*
- * Calculate new overall skew as 4/16 the
- * old value and 12/16 the new one. This is
- * a rather arbitrary tradeoff between
- * only using the latest measurement (0/16 and
- * 16/16) and even more weight on past measurements.
- */
-#define TIMECOMPARE_NEW_SKEW_PER_16 12
- sync->skew =
- div_s64((16 - TIMECOMPARE_NEW_SKEW_PER_16) *
- sync->skew +
- TIMECOMPARE_NEW_SKEW_PER_16 * skew,
- 16);
- sync->last_update = average_time;
- sync->offset = offset;
- }
- }
-}
-EXPORT_SYMBOL_GPL(__timecompare_update);
--
1.7.2.5
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH RFC net-next 4/4] time: remove the timecompare code.
2012-09-28 17:20 ` [PATCH RFC net-next 4/4] time: remove the timecompare code Richard Cochran
@ 2012-09-28 17:44 ` John Stultz
0 siblings, 0 replies; 22+ messages in thread
From: John Stultz @ 2012-09-28 17:44 UTC (permalink / raw)
To: Richard Cochran
Cc: netdev, device-drivers-devel, uclinux-dist-devel, David Miller,
Jacob Keller, Jeff Kirsher, John Ronciak, Mike Frysinger,
Miroslav Lichvar, Patrick Ohly, Sonic Zhang
On 09/28/2012 10:20 AM, Richard Cochran wrote:
> This patch removes the timecompare code from the kernel. The top five
> reasons to do this are:
>
> 1. There are no more users of this code.
> 2. The original idea was a bit weak.
> 3. The original author has disappeared.
> 4. The code was not general purpose but tuned to a particular hardware,
> 5. There are better ways to accomplish clock synchronization.
>
> Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Nice cleanup!
Acked-by: John Stultz <john.stultz@linaro.org>
thanks!
-john
^ permalink raw reply [flat|nested] 22+ messages in thread