blob: 0a19805c1cb268c8166dfb62b399ac46b1518022 [file] [log] [blame]
/*
* Copyright (c) 2024 BayLibre SAS
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include "state_machine.h"
enum ptp_port_state ptp_state_machine(enum ptp_port_state state,
enum ptp_port_event event,
bool tt_diff)
{
enum ptp_port_state new_state = state;
if (event == PTP_EVT_INITIALIZE || event == PTP_EVT_POWERUP) {
/* initialize port data sets, HW and communication facilities */
return PTP_PS_INITIALIZING;
}
switch (state) {
case PTP_PS_INITIALIZING:
switch (event) {
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_INIT_COMPLETE:
new_state = IS_ENABLED(CONFIG_PTP_LISTENING_PRESENT) ?
PTP_PS_LISTENING : PTP_PS_TIME_TRANSMITTER;
break;
default:
break;
}
break;
#if CONFIG_PTP_FAULTY_PRESENT
case PTP_PS_FAULTY:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_CLEARED:
new_state = PTP_PS_INITIALIZING;
break;
default:
break;
}
break;
#endif /* CONFIG_PTP_FAULTY_PRESENT */
#if CONFIG_PTP_DISABLED_PRESENT
case PTP_PS_DISABLED:
if (event == PTP_EVT_DESIGNATED_ENABLED) {
new_state = PTP_PS_INITIALIZING;
}
break;
#endif /* CONFIG_PTP_DISABLED_PRESENT */
#if CONFIG_PTP_LISTENING_PRESENT
case PTP_PS_LISTENING:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES:
new_state = PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_TIME_TRANSMITTER:
new_state = IS_ENABLED(CONFIG_PTP_PRE_TIME_TRANSMITTER_PRESENT) ?
PTP_PS_PRE_TIME_TRANSMITTER : PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_GRAND_MASTER:
new_state = PTP_PS_GRAND_MASTER;
break;
case PTP_EVT_RS_PASSIVE:
new_state = PTP_PS_PASSIVE;
break;
case PTP_EVT_RS_TIME_RECEIVER:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : PTP_PS_TIME_RECEIVER;
break;
default:
break;
}
break;
#endif /* CONFIG_PTP_LISTENING_PRESENT */
#if CONFIG_PTP_PRE_TIME_TRANSMITTER_PRESENT
case PTP_PS_PRE_TIME_TRANSMITTER:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_QUALIFICATION_TIMEOUT_EXPIRES:
new_state = PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_PASSIVE:
new_state = PTP_PS_PASSIVE;
break;
case PTP_EVT_RS_TIME_RECEIVER:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : PTP_PS_TIME_RECEIVER;
break;
default:
break;
}
break;
#endif /* CONFIG_PTP_PRE_TIME_TRANSMITTER_PRESENT */
case PTP_PS_TIME_TRANSMITTER:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_RS_PASSIVE:
new_state = PTP_PS_PASSIVE;
break;
case PTP_EVT_RS_TIME_RECEIVER:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : PTP_PS_TIME_RECEIVER;
break;
default:
break;
}
break;
case PTP_PS_PASSIVE:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_RS_TIME_TRANSMITTER:
new_state = IS_ENABLED(CONFIG_PTP_PRE_TIME_TRANSMITTER_PRESENT) ?
PTP_PS_PRE_TIME_TRANSMITTER : PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_GRAND_MASTER:
new_state = PTP_PS_GRAND_MASTER;
break;
case PTP_EVT_RS_TIME_RECEIVER:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : PTP_PS_TIME_RECEIVER;
break;
default:
break;
}
break;
#if CONFIG_PTP_UNCALIBRATED_PRESENT
case PTP_PS_UNCALIBRATED:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES:
new_state = PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_TIME_TRANSMITTER_CLOCK_SELECTED:
new_state = PTP_PS_TIME_RECEIVER;
break;
case PTP_EVT_RS_TIME_TRANSMITTER:
new_state = IS_ENABLED(CONFIG_PTP_PRE_TIME_TRANSMITTER_PRESENT) ?
PTP_PS_PRE_TIME_TRANSMITTER : PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_GRAND_MASTER:
new_state = PTP_PS_GRAND_MASTER;
break;
case PTP_EVT_RS_PASSIVE:
new_state = PTP_PS_PASSIVE;
break;
default:
break;
}
break;
#endif /* CONFIG_PTP_UNCALIBRATED_PRESENT */
case PTP_PS_TIME_RECEIVER:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_SYNCHRONIZATION_FAULT:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : new_state;
break;
case PTP_EVT_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES:
new_state = PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_TIME_TRANSMITTER:
new_state = IS_ENABLED(CONFIG_PTP_PRE_TIME_TRANSMITTER_PRESENT) ?
PTP_PS_PRE_TIME_TRANSMITTER : PTP_PS_TIME_TRANSMITTER;
break;
case PTP_EVT_RS_GRAND_MASTER:
new_state = PTP_PS_GRAND_MASTER;
break;
case PTP_EVT_RS_PASSIVE:
new_state = PTP_PS_PASSIVE;
break;
case PTP_EVT_RS_TIME_RECEIVER:
if (tt_diff) {
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : new_state;
}
break;
default:
break;
}
break;
default:
break;
}
return new_state;
}
enum ptp_port_state ptp_tr_state_machine(enum ptp_port_state state,
enum ptp_port_event event,
bool tt_diff)
{
enum ptp_port_state new_state = state;
if (event == PTP_EVT_INITIALIZE || event == PTP_EVT_POWERUP) {
/* initialize port data sets, HW and communication facilities */
return PTP_PS_INITIALIZING;
}
switch (state) {
case PTP_PS_INITIALIZING:
switch (event) {
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_INIT_COMPLETE:
new_state = IS_ENABLED(CONFIG_PTP_LISTENING_PRESENT) ?
PTP_PS_LISTENING : PTP_PS_TIME_RECEIVER;
break;
default:
break;
}
break;
#if CONFIG_PTP_FAULTY_PRESENT
case PTP_PS_FAULTY:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_CLEARED:
new_state = PTP_PS_INITIALIZING;
break;
default:
break;
}
break;
#endif
#if CONFIG_PTP_DISABLED_PRESENT
case PTP_PS_DISABLED:
if (event == PTP_EVT_DESIGNATED_ENABLED) {
new_state = PTP_PS_INITIALIZING;
}
break;
#endif
#if CONFIG_PTP_LISTENING_PRESENT
case PTP_PS_LISTENING:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_RS_TIME_RECEIVER:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : PTP_PS_TIME_RECEIVER;
break;
default:
break;
}
break;
#endif
#if CONFIG_PTP_UNCALIBRATED_PRESENT
case PTP_PS_UNCALIBRATED:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES:
__fallthrough;
case PTP_EVT_RS_TIME_TRANSMITTER:
__fallthrough;
case PTP_EVT_RS_GRAND_MASTER:
__fallthrough;
case PTP_EVT_RS_PASSIVE:
new_state = IS_ENABLED(CONFIG_PTP_LISTENING_PRESENT) ?
PTP_PS_LISTENING : new_state;
break;
case PTP_EVT_TIME_TRANSMITTER_CLOCK_SELECTED:
new_state = PTP_PS_TIME_RECEIVER;
default:
break;
}
break;
#endif
case PTP_PS_TIME_RECEIVER:
switch (event) {
case PTP_EVT_DESIGNATED_DISABLED:
new_state = IS_ENABLED(CONFIG_PTP_DISABLED_PRESENT) ?
PTP_PS_DISABLED : new_state;
break;
case PTP_EVT_FAULT_DETECTED:
new_state = IS_ENABLED(CONFIG_PTP_FAULTY_PRESENT) ?
PTP_PS_FAULTY : new_state;
break;
case PTP_EVT_SYNCHRONIZATION_FAULT:
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : new_state;
break;
case PTP_EVT_ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES:
__fallthrough;
case PTP_EVT_RS_TIME_TRANSMITTER:
__fallthrough;
case PTP_EVT_RS_GRAND_MASTER:
__fallthrough;
case PTP_EVT_RS_PASSIVE:
new_state = IS_ENABLED(CONFIG_PTP_LISTENING_PRESENT) ?
PTP_PS_LISTENING : new_state;
break;
case PTP_EVT_RS_TIME_RECEIVER:
if (tt_diff) {
new_state = IS_ENABLED(CONFIG_PTP_UNCALIBRATED_PRESENT) ?
PTP_PS_UNCALIBRATED : new_state;
}
break;
default:
break;
}
break;
default:
break;
}
return new_state;
}