summaryrefslogtreecommitdiff
path: root/common/usbc/usb_pe_drp_sm.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/usbc/usb_pe_drp_sm.c')
-rw-r--r--common/usbc/usb_pe_drp_sm.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 0264837057..767fed302b 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -4137,6 +4137,8 @@ static void pe_send_soft_reset_entry(int port)
{
print_current_state(port);
+ PE_CLR_FLAG(port, PE_FLAGS_ENTERING_EPR);
+
/* Reset Protocol Layer (softly) */
prl_reset_soft(port);
@@ -6965,7 +6967,11 @@ static void pe_vcs_turn_off_vconn_swap_run(int port)
pe[port].discover_identity_counter = 0;
pe[port].dr_swap_attempt_counter = 0;
- pe_set_ready_state(port);
+ if (PE_CHK_FLAG(port, PE_FLAGS_ENTERING_EPR))
+ set_state_pe(port,
+ PE_SNK_EPR_MODE_ENTRY_WAIT_FOR_RESPONSE);
+ else
+ pe_set_ready_state(port);
return;
}
}
@@ -7906,6 +7912,7 @@ static void pe_ddr_perform_data_reset_exit(int port)
#ifdef CONFIG_USB_PD_EPR
static void pe_enter_epr_mode(int port)
{
+ PE_CLR_FLAG(port, PE_FLAGS_ENTERING_EPR);
PE_SET_FLAG(port, PE_FLAGS_IN_EPR);
CPRINTS("C%d: Entered EPR", port);
}
@@ -7984,6 +7991,8 @@ static void pe_snk_send_epr_mode_entry_entry(int port)
print_current_state(port);
+ PE_SET_FLAG(port, PE_FLAGS_ENTERING_EPR);
+
/* Send EPR mode entry message */
eprmdo->action = PD_EPRMDO_ACTION_ENTER;
eprmdo->data = 0; /* EPR Sink Operational PDP */
@@ -8004,6 +8013,7 @@ static void pe_snk_send_epr_mode_entry_run(int port)
msg_check = pe_sender_response_msg_run(port);
if (msg_check & PE_MSG_DISCARDED) {
+ PE_CLR_FLAG(port, PE_FLAGS_ENTERING_EPR);
set_state_pe(port, PE_SNK_READY);
return;
}
@@ -8072,11 +8082,16 @@ static void pe_snk_epr_mode_entry_wait_for_response_run(int port)
return;
} else if (eprmdo->action ==
PD_EPRMDO_ACTION_ENTER_FAILED) {
+ PE_CLR_FLAG(port, PE_FLAGS_ENTERING_EPR);
/* Table 6-50 EPR Mode Data Object */
CPRINTS("C%d: Failed to enter EPR for 0x%x",
port, eprmdo->data);
}
/* Fall through to soft reset. */
+ } else if ((ext == 0) && (cnt == 0) &&
+ (type == PD_CTRL_VCONN_SWAP)) {
+ set_state_pe(port, PE_VCS_EVALUATE_SWAP);
+ return;
}
/*
* 6.4.10.1 Process to enter EPR Mode