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
parent
9c8fe6a94e
commit
d825b1d549
30
clock.c
30
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,
|
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;
|
||||||
|
|
6
clock.h
6
clock.h
|
@ -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
31
ptp4l.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue