From: Stuart Hodgson <smhodgson@solarflare.com>
To: Richard Cochran <richardcochran@gmail.com>
Cc: Ben Hutchings <bhutchings@solarflare.com>,
David Miller <davem@davemloft.net>, <netdev@vger.kernel.org>,
<linux-net-drivers@solarflare.com>,
Andrew Jackson <ajackson@solarflare.com>
Subject: Re: [PATCH net-next 4/7] sfc: Add support for IEEE-1588 PTP
Date: Fri, 20 Jul 2012 10:15:46 +0100 [thread overview]
Message-ID: <500921C2.1080001@solarflare.com> (raw)
In-Reply-To: <20120720063102.GB2330@netboy.at.omicron.at>
>>> This code looks like it is trying to find the offset between two
>>> clocks. Is there some reason why you cannot use <linux/timecompare.h>
>>> to accomplish this?
>>
>> This is what the code is doing. <linux/timecompare.h> states
>>
>> "the assumption is that reading the source
>> time is slow and involves equal time for sending the request and
>> receiving the reply"
>>
>> While in our case event though it is slow we cannot guarantee the second
>> assumption. The code above takes into account some of the particulars of the sfc
>> hardware and gives us good results.
>
> Fair enough, but then maybe a comment mentioning how timecompare is
> unsuitable would be nice to have.
>
This can be added
>>> I am trying to purge the whole SYS thing (only blackfin is left)
>>> because there is a much better way to go about this, namely
>>> synchronizing the system time to the PHC time via an internal PPS
>>> signal.
>>
Do you mean using the PPS kernel consumer to govern the system time?
> I don't understand what the issue is here. Can't you just call
> ptp_clock_event, like you already have...
>
>>>> +static void efx_ptp_pps_worker(struct work_struct *work)
>>>> +{
>>>> + struct efx_ptp_data *ptp =
>>>> + container_of(work, struct efx_ptp_data, pps_work);
>>>> + struct efx_nic *efx = ptp->channel->efx;
>>>> + struct timespec event_gen_time;
>>>> + struct ptp_clock_event ptp_pps_evt;
>>>> + ktime_t gen_time_host;
>>>> +
>>>> + if (efx_ptp_synchronize(efx, PTP_SYNC_ATTEMPTS))
>>>> + return;
>>>> +
>>>> + gen_time_host = ktime_sub(ptp->mc_base_time,
>>>> + ptp->host_base_time);
>>>> + event_gen_time = ktime_to_timespec(gen_time_host);
>>>> +
>>>> + ptp_pps_evt.type = PTP_CLOCK_EXTTS;
>>>> + ptp_pps_evt.timestamp = ktime_to_ns(gen_time_host);
>>>> + ptp_clock_event(ptp->phc_clock, &ptp_pps_evt);
>>>> +}
>
> ... here?
>
In order for a PPS to arrive at the kernel consumer ptp_clock_event
needs to be called with PTP_CLOCK_PPS. This then calls pps_get_ts
and stamps the event with the current system time, not the time
that was put into the event.
Using PTP_CLOCK_EXTTS the PPS is visible to userspace via a read
on the phc device and can then be used in our modified ptpd2.
>>>> +static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta)
>>>> +{
>
> You can set the time here somehow by doing, T' = T + offset, and so...
>
>>>> +}
>
>>>> +static int efx_phc_settime(struct ptp_clock_info *ptp,
>>>> + const struct timespec *e_ts)
>>>> +{
>>>> + /* We must provide this function, but we cannot actually set the time */
>>>
>>> Huh? You can adjtime, so must be able to settime, too, right?
>>>
>>> If you have enough range in the RAW timestamp in the MC firmware (like
>>> 64 bits of nanoseconds), and you allow settime, then you can spare the
>>> system time synchronization code altogether.
>>>
>>
>> You will have to elaborate further on this point.
>
> ... why can't you also just set the time?
Our hardware can only have an offset applied to the clock. In order to set time
we need to know the time now, then work out and offset to get to the target time.
At the point that we apply this offset the clock will have moved on and not be
set to the target time. We can apply some measured average times to the offset
to get closer but with this hardware settime will not leave the NIC clock at the
desired time.
>
> Thanks,
> Richard
next prev parent reply other threads:[~2012-07-20 9:15 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-18 18:16 pull request: sfc-next 2012-07-18 Ben Hutchings
2012-07-18 18:19 ` [PATCH net-next 1/7] sfc: Add explicit RX queue flag to channel Ben Hutchings
2012-07-18 18:20 ` [PATCH net-next 2/7] sfc: Add channel specific receive_skb handler and post_remove callback Ben Hutchings
2012-07-18 18:32 ` David Miller
2012-07-18 18:42 ` Ben Hutchings
2012-07-18 18:43 ` David Miller
2012-07-18 18:20 ` [PATCH net-next 3/7] sfc: Allow efx_mcdi_rpc to be called in two parts Ben Hutchings
2012-07-18 18:21 ` [PATCH net-next 4/7] sfc: Add support for IEEE-1588 PTP Ben Hutchings
2012-07-19 14:25 ` Richard Cochran
2012-07-19 14:37 ` Ben Hutchings
2012-07-19 16:05 ` Andrew Jackson
2012-07-20 6:11 ` Richard Cochran
2012-07-19 15:29 ` Stuart Hodgson
2012-07-19 15:43 ` David Miller
2012-07-19 15:50 ` Ben Hutchings
2012-07-20 7:37 ` Richard Cochran
2012-07-20 6:31 ` Richard Cochran
2012-07-20 9:15 ` Stuart Hodgson [this message]
2012-07-20 15:30 ` Richard Cochran
2012-07-30 10:03 ` Stuart Hodgson
2012-07-18 18:21 ` [PATCH net-next 5/7] sfc: Support variable-length response to MCDI GET_BOARD_CFG Ben Hutchings
2012-07-18 18:22 ` [PATCH net-next 6/7] sfc: Expose FPGA bitfile partition through MTD Ben Hutchings
2012-07-18 18:22 ` [PATCH net-next 7/7] sfc: Bump version to 3.2 Ben Hutchings
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=500921C2.1080001@solarflare.com \
--to=smhodgson@solarflare.com \
--cc=ajackson@solarflare.com \
--cc=bhutchings@solarflare.com \
--cc=davem@davemloft.net \
--cc=linux-net-drivers@solarflare.com \
--cc=netdev@vger.kernel.org \
--cc=richardcochran@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.