Let the clock code figure the PHC index.

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

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
master
Richard Cochran 2015-10-21 10:52:25 +02:00
parent 9c8fe6a94e
commit d825b1d549
3 changed files with 31 additions and 36 deletions

30
clock.c
View File

@ -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, struct clock *clock_create(enum clock_type type, struct config *config,
int phc_index) const char *phc_device)
{ {
enum timestamp_type timestamping = enum timestamp_type timestamping =
config_get_int(config, NULL, "time_stamping"); config_get_int(config, NULL, "time_stamping");
int fadj = 0, max_adj = 0, sw_ts = timestamping == TS_SOFTWARE ? 1 : 0; int fadj = 0, max_adj = 0, sw_ts = timestamping == TS_SOFTWARE ? 1 : 0;
enum servo_type servo = config_get_int(config, NULL, "clock_servo"); enum servo_type servo = config_get_int(config, NULL, "clock_servo");
int phc_index, required_modes = 0;
struct clock *c = &the_clock; struct clock *c = &the_clock;
int required_modes = 0;
struct port *p; struct port *p;
unsigned char oui[OUI_LEN]; unsigned char oui[OUI_LEN];
char phc[32], *tmp; char phc[32], *tmp;
struct interface *udsif = &c->uds_interface; struct interface *iface, *udsif = &c->uds_interface;
struct interface *iface = STAILQ_FIRST(&config->interfaces);
struct timespec ts; struct timespec ts;
int sfl; int sfl;
@ -936,6 +935,29 @@ struct clock *clock_create(enum clock_type type, struct config *config,
} }
iface = STAILQ_FIRST(&config->interfaces); 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)) { if (generate_clock_identity(&c->dds.clockIdentity, iface->name)) {
pr_err("failed to generate a clock identity"); pr_err("failed to generate a clock identity");
return NULL; return NULL;

View File

@ -78,12 +78,12 @@ struct config *clock_config(struct clock *c);
* *
* @param type Specifies which type of clock to create. * @param type Specifies which type of clock to create.
* @param config Pointer to the configuration database. * @param config Pointer to the configuration database.
* @param phc_index PTP hardware clock device to use. * @param phc_device PTP hardware clock device to use. Pass NULL for automatic
* Pass -1 to select CLOCK_REALTIME. * selection based on the network interface.
* @return A pointer to the single global clock instance. * @return A pointer to the single global clock instance.
*/ */
struct clock *clock_create(enum clock_type type, struct config *config, 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. * Obtains a clock's default data set.

31
ptp4l.c
View File

@ -73,11 +73,9 @@ static void usage(char *progname)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
char *config = NULL, *req_phc = NULL, *progname; char *config = NULL, *req_phc = NULL, *progname;
int c, err = -1; int c, err = -1, print_level;
struct interface *iface;
struct clock *clock = NULL; struct clock *clock = NULL;
struct config *cfg; struct config *cfg;
int phc_index = -1, print_level;
if (handle_term_signals()) if (handle_term_signals())
return -1; return -1;
@ -197,33 +195,8 @@ int main(int argc, char *argv[])
goto out; 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 = clock_create(cfg->n_interfaces > 1 ? CLOCK_TYPE_BOUNDARY :
CLOCK_TYPE_ORDINARY, cfg, phc_index); CLOCK_TYPE_ORDINARY, cfg, req_phc);
if (!clock) { if (!clock) {
fprintf(stderr, "failed to create a clock\n"); fprintf(stderr, "failed to create a clock\n");
goto out; goto out;