Message ID | 84396eacd75b4abed36a7819d8c2c33f9ced1ad5.1348851539.git.richardcochran@gmail.com |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
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
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
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
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. >
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
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
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
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
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.
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
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
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
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.
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
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.
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 --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 };
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(-)