Hi,

I have a boundary clock with ports eth0 and pru10:

ptp4l config (most important params shown):

[eth0]
boundary_clock_jbod 1

[pru10]
boundary_clock_jbod 1

GMC is connected to pru10, nothing connected to eth0. I start ptp4l and phc2sys:
ptp4l -f <cfg>
phc2sys -arm

Everything goes well:

phc2sys[1530231.490]: reconfiguring after port state change
phc2sys[1530231.491]: pru10: UNCALIBRATED -> new state SLAVE
phc2sys[1530231.491]: selecting eth0 (MASTER) for synchronization
phc2sys[1530231.492]: dst_cnt: 1

CLOCK_REALTIMEis finally added to list of dst clocks (line 477 of phc2sys.c)

phc2sys[1530231.493]: selecting CLOCK_REALTIME for synchronization:
phc2sys[1530231.494]: selecting pru10 (SLAVE) as the master clock

ptp4l[1530234.487]: master offset         20 s2 freq   -9940 path delay         
9

phc2sys is syncing CLOCK_REALTIME and eth0 as expected
phc2sys[1530235.310]: CLOCK_REALTIME phc offset     -2833 s0 freq   -9911 delay 
  3091
phc2sys[1530236.360]: eth0 phc offset      -100 s0 freq   -9882

--------
Now I disconnect GMC. I would expect that the last sync source is taken and 
this last sync source syncs also the CLOCK_REALTIME.

phc2sys[1530250.221]: reconfiguring after port state change
phc2sys[1530250.221]: pru10: SLAVE -> new state MASTER
phc2sys[1530250.221]: selecting pru10 (MASTER) for synchronization
phc2sys[1530250.221]: selecting eth0 (MASTER) for synchronization
phc2sys[1530250.222]: dst_cnt: 2
phc2sys[1530250.222]: no source, selecting pru10 (SLAVE aka MASTER) as the 
default clock

ok. So far. But the CLOCK_REALTIME is not added to list of dst clocks! As a 
consequence, CLOCK_REALTIME is not synced anymore.

phc2sys[1530254.251]: eth0 phc offset    -89483 s0 freq   -9955
phc2sys[1530256.350]: eth0 phc offset    -39106 s0 freq  +34863

Is this the intended behaviour?

I see the problem here:

static void reconfigure(struct node *node)
{
....
                if (dst_cnt > 1 && !src) {
                                if (!rt || rt->dest_only) {
                                                node->master = last;
                                                /* Reset to original state in 
next reconfiguration. */
                                                node->master->new_state = 
node->master->state;
                                                node->master->state = PS_SLAVE;
                                                if (rt)
                                                                rt->state = 
PS_SLAVE;
                                                pr_info("no source, selecting 
%s as the default clock",
                                                                last->device);
Here we return if last sync source is taken, but CLOCK_REALTIME is not added to 
node->dst_clocks!...
                                                return;
                                }
                }
                if (src_cnt > 1) {
                                pr_info("multiple master clocks available, 
postponing sync...");
                                node->master = NULL;
                                return;
                }
                if (src_cnt > 0 && !src) {
                                pr_info("master clock not ready, waiting...");
                                node->master = NULL;
                                return;
                }
                if (!src_cnt && !dst_cnt) {
                                pr_info("no PHC ready, waiting...");
                                node->master = NULL;
                                return;
                }
                if ((!src_cnt && (!rt || rt->dest_only)) ||
                    (!dst_cnt && !rt)) {
                                pr_info("nothing to synchronize");
                                node->master = NULL;
                                return;
                }
                if (!src_cnt) {
                                src = rt;
                                rt->state = PS_SLAVE;
                } else if (rt) {
                                if (rt->state != PS_MASTER) {
                                                rt->state = PS_MASTER;
                                                clock_reinit(node, rt, 
rt->state);
                                }
.. here we add the CLOCK_REALTIME in the normal sync case:
                                LIST_INSERT_HEAD(&node->dst_clocks, rt, 
dst_list);
                                pr_info("selecting %s for synchronization", 
rt->device);
                }
                node->master = src;
                pr_info("selecting %s as the master clock", src->device);
}

Best regards, Chris

_______________________________________________
Linuxptp-users mailing list
Linuxptp-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-users

Reply via email to