From f84ee58abdbc71a84a0c22f75c4d6135ca6bee86 Mon Sep 17 00:00:00 2001 From: Sam Hurst Date: Sat, 7 Jan 2023 14:28:19 -0800 Subject: [PATCH] usb_c: Add protocol error flag Use a flag to report a protocol error to the states. This keeps state specific actions in the state. Currently, those state specific actions are handled in the pe_report_error function. Signed-off-by: Sam Hurst --- subsys/usb/usb_c/usbc_pe_common.c | 2 +- subsys/usb/usb_c/usbc_pe_common_internal.h | 4 ++++ subsys/usb/usb_c/usbc_pe_snk_states.c | 14 ++++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/subsys/usb/usb_c/usbc_pe_common.c b/subsys/usb/usb_c/usbc_pe_common.c index 84a068753ed..64f6359a992 100644 --- a/subsys/usb/usb_c/usbc_pe_common.c +++ b/subsys/usb/usb_c/usbc_pe_common.c @@ -230,7 +230,7 @@ void pe_report_error(const struct device *dev, const enum pe_error e, */ if (pe_get_state(dev) == PE_SEND_SOFT_RESET || pe_get_state(dev) == PE_SOFT_RESET) { - pe_set_state(dev, PE_SNK_HARD_RESET); + atomic_set_bit(pe->flags, PE_FLAGS_PROTOCOL_ERROR); return; } diff --git a/subsys/usb/usb_c/usbc_pe_common_internal.h b/subsys/usb/usb_c/usbc_pe_common_internal.h index 258d6706237..ec104d28a62 100644 --- a/subsys/usb/usb_c/usbc_pe_common_internal.h +++ b/subsys/usb/usb_c/usbc_pe_common_internal.h @@ -106,6 +106,10 @@ enum pe_flags { * Data Role Swap */ PE_FLAGS_WAIT_DATA_ROLE_SWAP = 12, + /** + * This flag is set when a protocol error occurs. + */ + PE_FLAGS_PROTOCOL_ERROR = 13, /** Number of PE Flags */ PE_FLAGS_COUNT diff --git a/subsys/usb/usb_c/usbc_pe_snk_states.c b/subsys/usb/usb_c/usbc_pe_snk_states.c index cc56b1f4b78..95cf2a0ace9 100644 --- a/subsys/usb/usb_c/usbc_pe_snk_states.c +++ b/subsys/usb/usb_c/usbc_pe_snk_states.c @@ -725,10 +725,11 @@ void pe_send_soft_reset_run(void *obj) } /* * The Policy Engine Shall transition to the PE_SNK_Hard_Reset state when: - * 1: A SenderResponseTimer timeout occurs (Handled in pe_report_error function) + * 1: A SenderResponseTimer timeout occurs * 2: Or the Protocol Layer indicates that a transmission error has occurred */ - else if (usbc_timer_expired(&pe->pd_t_sender_response)) { + else if (usbc_timer_expired(&pe->pd_t_sender_response) || + atomic_test_and_clear_bit(pe->flags, PE_FLAGS_PROTOCOL_ERROR)) { pe_set_state(dev, PE_SNK_HARD_RESET); } } @@ -774,23 +775,24 @@ void pe_soft_reset_run(void *obj) if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_SEND_SOFT_RESET)) { /* Send Accept message */ pe_send_ctrl_msg(dev, PD_PACKET_SOP, PD_CTRL_ACCEPT); - return; } - /* * The Policy Engine Shall transition to the PE_SNK_Wait_for_Capabilities * state when: * 1: The Accept Message has been sent on SOP. */ - if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_TX_COMPLETE)) { + else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_TX_COMPLETE)) { pe_set_state(dev, PE_SNK_WAIT_FOR_CAPABILITIES); } /* * The Policy Engine Shall transition to the PE_SNK_Hard_Reset * state when: * 1: The Protocol Layer indicates that a transmission error - * has occurred. (Handled in pe_report_error function) + * has occurred. */ + else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_PROTOCOL_ERROR)) { + pe_set_state(dev, PE_SNK_HARD_RESET); + } } /**