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.c70
1 files changed, 38 insertions, 32 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 54c311e1ed..82337b3bde 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -4972,43 +4972,49 @@ static void pe_vcs_send_ps_rdy_swap_entry(int port)
static void pe_vcs_send_ps_rdy_swap_run(int port)
{
- if (PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) {
- PE_CLR_FLAG(port, PE_FLAGS_TX_COMPLETE);
+ /* TODO(b/152058087): TCPMv2: Break up pe_vcs_send_ps_rdy_swap */
+ switch (pe[port].sub) {
+ case PE_SUB0:
+ /*
+ * After a VCONN Swap the VCONN Source needs to reset
+ * the Cable Plug’s Protocol Layer in order to ensure
+ * MessageID synchronization.
+ */
+ if (PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) {
+ PE_CLR_FLAG(port, PE_FLAGS_TX_COMPLETE);
- switch (pe[port].sub) {
- case PE_SUB0:
- /*
- * After a VCONN Swap the VCONN Source needs to reset
- * the Cable Plug’s Protocol Layer in order to ensure
- * MessageID synchronization.
- */
prl_send_ctrl_msg(port, TCPC_TX_SOP_PRIME,
- PD_CTRL_SOFT_RESET);
+ PD_CTRL_SOFT_RESET);
pe[port].sub = PE_SUB1;
- pe[port].timeout = get_time().val + 100*MSEC;
- break;
- case PE_SUB1:
- /* Got ACCEPT or REJECT from Cable Plug */
- if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED) ||
- get_time().val > pe[port].timeout) {
- PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED);
- /*
- * A VCONN Swap Shall reset the
- * DiscoverIdentityCounter to zero
- */
- pe[port].discover_port_identity_counter = 0;
- pe[port].dr_swap_attempt_counter = 0;
+ }
+ break;
+ case PE_SUB1:
+ if (PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) {
+ PE_CLR_FLAG(port, PE_FLAGS_TX_COMPLETE);
+ pe[port].sender_response_timer = get_time().val +
+ PD_T_SENDER_RESPONSE;
+ }
- if (pe[port].power_role == PD_ROLE_SOURCE)
- set_state_pe(port, PE_SRC_READY);
- else
- set_state_pe(port, PE_SNK_READY);
- }
- break;
- case PE_SUB2:
- /* Do nothing */
- break;
+ /* Got ACCEPT or REJECT from Cable Plug */
+ if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED) ||
+ get_time().val > pe[port].sender_response_timer) {
+ PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED);
+ /*
+ * A VCONN Swap Shall reset the
+ * DiscoverIdentityCounter to zero
+ */
+ pe[port].discover_port_identity_counter = 0;
+ pe[port].dr_swap_attempt_counter = 0;
+
+ if (pe[port].power_role == PD_ROLE_SOURCE)
+ set_state_pe(port, PE_SRC_READY);
+ else
+ set_state_pe(port, PE_SNK_READY);
}
+ break;
+ case PE_SUB2:
+ /* Do nothing */
+ break;
}
if (PE_CHK_FLAG(port, PE_FLAGS_PROTOCOL_ERROR)) {