The code that determines the index of the PHC device is useful to all
kinds of clock devices.

Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
---
 clock.c | 30 ++++++++++++++++++++++++++----
 clock.h |  6 +++---
 ptp4l.c | 31 ++-----------------------------
 3 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/clock.c b/clock.c
index 17c9687..c59046a 100644
--- a/clock.c
+++ b/clock.c
@@ -801,19 +801,18 @@ static void clock_remove_port(struct clock *c, struct 
port *p)
 }
 
 struct clock *clock_create(enum clock_type type, struct config *config,
-                          int phc_index)
+                          const char *phc_device)
 {
        enum timestamp_type timestamping =
                config_get_int(config, NULL, "time_stamping");
        int fadj = 0, max_adj = 0, sw_ts = timestamping == TS_SOFTWARE ? 1 : 0;
        enum servo_type servo = config_get_int(config, NULL, "clock_servo");
+       int phc_index, required_modes = 0;
        struct clock *c = &the_clock;
-       int required_modes = 0;
        struct port *p;
        unsigned char oui[OUI_LEN];
        char phc[32], *tmp;
-       struct interface *udsif = &c->uds_interface;
-       struct interface *iface = STAILQ_FIRST(&config->interfaces);
+       struct interface *iface, *udsif = &c->uds_interface;
        struct timespec ts;
        int sfl;
 
@@ -936,6 +935,29 @@ struct clock *clock_create(enum clock_type type, struct 
config *config,
        }
 
        iface = STAILQ_FIRST(&config->interfaces);
+
+       /* determine PHC Clock index */
+       if (config_get_int(config, NULL, "free_running")) {
+               phc_index = -1;
+       } else if (config_get_int(config, NULL, "time_stamping") == TS_SOFTWARE 
||
+                  config_get_int(config, NULL, "time_stamping") == 
TS_LEGACY_HW) {
+               phc_index = -1;
+       } else if (phc_device) {
+               if (1 != sscanf(phc_device, "/dev/ptp%d", &phc_index)) {
+                       pr_err("bad ptp device string");
+                       return NULL;
+               }
+       } else if (iface->ts_info.valid) {
+               phc_index = iface->ts_info.phc_index;
+       } else {
+               pr_err("PTP device not specified and automatic determination"
+                      " is not supported. Please specify PTP device.");
+               return NULL;
+       }
+       if (phc_index >= 0) {
+               pr_info("selected /dev/ptp%d as PTP clock", phc_index);
+       }
+
        if (generate_clock_identity(&c->dds.clockIdentity, iface->name)) {
                pr_err("failed to generate a clock identity");
                return NULL;
diff --git a/clock.h b/clock.h
index d4a57e9..fcd9328 100644
--- a/clock.h
+++ b/clock.h
@@ -78,12 +78,12 @@ struct config *clock_config(struct clock *c);
  *
  * @param type         Specifies which type of clock to create.
  * @param config       Pointer to the configuration database.
- * @param phc_index    PTP hardware clock device to use.
- *                     Pass -1 to select CLOCK_REALTIME.
+ * @param phc_device   PTP hardware clock device to use. Pass NULL for 
automatic
+ *                     selection based on the network interface.
  * @return             A pointer to the single global clock instance.
  */
 struct clock *clock_create(enum clock_type type, struct config *config,
-                          int phc_index);
+                          const char *phc_device);
 
 /**
  * Obtains a clock's default data set.
diff --git a/ptp4l.c b/ptp4l.c
index c3694b0..a87e7e6 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -73,11 +73,9 @@ static void usage(char *progname)
 int main(int argc, char *argv[])
 {
        char *config = NULL, *req_phc = NULL, *progname;
-       int c, err = -1;
-       struct interface *iface;
+       int c, err = -1, print_level;
        struct clock *clock = NULL;
        struct config *cfg;
-       int phc_index = -1, print_level;
 
        if (handle_term_signals())
                return -1;
@@ -197,33 +195,8 @@ int main(int argc, char *argv[])
                goto out;
        }
 
-       /* determine PHC Clock index */
-       iface = STAILQ_FIRST(&cfg->interfaces);
-       if (config_get_int(cfg, NULL, "free_running")) {
-               phc_index = -1;
-       } else if (config_get_int(cfg, NULL, "time_stamping") == TS_SOFTWARE ||
-                  config_get_int(cfg, NULL, "time_stamping") == TS_LEGACY_HW) {
-               phc_index = -1;
-       } else if (req_phc) {
-               if (1 != sscanf(req_phc, "/dev/ptp%d", &phc_index)) {
-                       fprintf(stderr, "bad ptp device string\n");
-                       goto out;
-               }
-       } else if (iface->ts_info.valid) {
-               phc_index = iface->ts_info.phc_index;
-       } else {
-               fprintf(stderr, "ptp device not specified and\n"
-                               "automatic determination is not\n"
-                               "supported. please specify ptp device\n");
-               goto out;
-       }
-
-       if (phc_index >= 0) {
-               pr_info("selected /dev/ptp%d as PTP clock", phc_index);
-       }
-
        clock = clock_create(cfg->n_interfaces > 1 ? CLOCK_TYPE_BOUNDARY :
-                            CLOCK_TYPE_ORDINARY, cfg, phc_index);
+                            CLOCK_TYPE_ORDINARY, cfg, req_phc);
        if (!clock) {
                fprintf(stderr, "failed to create a clock\n");
                goto out;
-- 
2.1.4


------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial! http://pubads.g.doubleclick.net/
gampad/clk?id=1444514301&iu=/ca-pub-7940484522588532
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to