fsm: Make the transition out of INITIALIZING part of the FSM code.
The state machines in 1588 do not specify an event that causes a transition out of the initializing state. This was left as a local issue. For this transition, the current code assigns the next state outside of the FSM. But doing so prevents an alternative FSM to handle this transition differently. By introducing a new event, this patch places this transition where it belongs, namely under the control of the FSM code, Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
01ee947457
commit
b738afb604
22
fsm.c
22
fsm.c
|
@ -27,7 +27,16 @@ enum port_state ptp_fsm(enum port_state state, enum fsm_event event, int mdiff)
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PS_INITIALIZING:
|
case PS_INITIALIZING:
|
||||||
next = PS_LISTENING;
|
switch (event) {
|
||||||
|
case EV_FAULT_DETECTED:
|
||||||
|
next = PS_FAULTY;
|
||||||
|
break;
|
||||||
|
case EV_INIT_COMPLETE:
|
||||||
|
next = PS_LISTENING;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PS_FAULTY:
|
case PS_FAULTY:
|
||||||
|
@ -220,7 +229,16 @@ enum port_state ptp_slave_fsm(enum port_state state, enum fsm_event event,
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PS_INITIALIZING:
|
case PS_INITIALIZING:
|
||||||
next = PS_LISTENING;
|
switch (event) {
|
||||||
|
case EV_FAULT_DETECTED:
|
||||||
|
next = PS_FAULTY;
|
||||||
|
break;
|
||||||
|
case EV_INIT_COMPLETE:
|
||||||
|
next = PS_LISTENING;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PS_FAULTY:
|
case PS_FAULTY:
|
||||||
|
|
1
fsm.h
1
fsm.h
|
@ -48,6 +48,7 @@ enum fsm_event {
|
||||||
EV_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES,
|
EV_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES,
|
||||||
EV_SYNCHRONIZATION_FAULT,
|
EV_SYNCHRONIZATION_FAULT,
|
||||||
EV_MASTER_CLOCK_SELECTED,
|
EV_MASTER_CLOCK_SELECTED,
|
||||||
|
EV_INIT_COMPLETE,
|
||||||
EV_RS_MASTER,
|
EV_RS_MASTER,
|
||||||
EV_RS_GRAND_MASTER,
|
EV_RS_GRAND_MASTER,
|
||||||
EV_RS_SLAVE,
|
EV_RS_SLAVE,
|
||||||
|
|
15
port.c
15
port.c
|
@ -2120,6 +2120,7 @@ static void port_p2p_transition(struct port *p, enum port_state next)
|
||||||
break;
|
break;
|
||||||
case PS_LISTENING:
|
case PS_LISTENING:
|
||||||
port_set_announce_tmo(p);
|
port_set_announce_tmo(p);
|
||||||
|
port_set_delay_tmo(p);
|
||||||
break;
|
break;
|
||||||
case PS_PRE_MASTER:
|
case PS_PRE_MASTER:
|
||||||
port_set_qualification_tmo(p);
|
port_set_qualification_tmo(p);
|
||||||
|
@ -2158,7 +2159,7 @@ int port_dispatch(struct port *p, enum fsm_event event, int mdiff)
|
||||||
fault_interval(p, last_fault_type(p), &i);
|
fault_interval(p, last_fault_type(p), &i);
|
||||||
if (clear_fault_asap(&i)) {
|
if (clear_fault_asap(&i)) {
|
||||||
pr_notice("port %hu: clearing fault immediately", portnum(p));
|
pr_notice("port %hu: clearing fault immediately", portnum(p));
|
||||||
next = PS_INITIALIZING;
|
next = p->state_machine(next, EV_FAULT_CLEARED, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (PS_INITIALIZING == next) {
|
if (PS_INITIALIZING == next) {
|
||||||
|
@ -2170,14 +2171,12 @@ int port_dispatch(struct port *p, enum fsm_event event, int mdiff)
|
||||||
if (port_is_enabled(p)) {
|
if (port_is_enabled(p)) {
|
||||||
port_disable(p);
|
port_disable(p);
|
||||||
}
|
}
|
||||||
next = port_initialize(p) ? PS_FAULTY : PS_LISTENING;
|
if (port_initialize(p)) {
|
||||||
port_show_transition(p, next, event);
|
event = EV_FAULT_DETECTED;
|
||||||
p->state = next;
|
} else {
|
||||||
if (next == PS_LISTENING && p->delayMechanism == DM_P2P) {
|
event = EV_INIT_COMPLETE;
|
||||||
port_set_delay_tmo(p);
|
|
||||||
}
|
}
|
||||||
port_notify_event(p, NOTIFY_PORT_STATE);
|
next = p->state_machine(next, event, 0);
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next == p->state)
|
if (next == p->state)
|
||||||
|
|
1
util.c
1
util.c
|
@ -61,6 +61,7 @@ const char *ev_str[] = {
|
||||||
"ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES",
|
"ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES",
|
||||||
"SYNCHRONIZATION_FAULT",
|
"SYNCHRONIZATION_FAULT",
|
||||||
"MASTER_CLOCK_SELECTED",
|
"MASTER_CLOCK_SELECTED",
|
||||||
|
"INIT_COMPLETE",
|
||||||
"RS_MASTER",
|
"RS_MASTER",
|
||||||
"RS_GRAND_MASTER",
|
"RS_GRAND_MASTER",
|
||||||
"RS_SLAVE",
|
"RS_SLAVE",
|
||||||
|
|
Loading…
Reference in New Issue