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.c59
1 files changed, 22 insertions, 37 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 4e06a35ddf..3037ed1fca 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -911,6 +911,15 @@ void pe_got_hard_reset(int port)
assert(port == TASK_ID_TO_PD_PORT(task_get_current()));
/*
+ * If we're in the middle of an FRS, any error should cause us to follow
+ * the ErrorRecovery path
+ */
+ if (pe_in_frs_mode(port)) {
+ set_state_pe(port, PE_WAIT_FOR_ERROR_RECOVERY);
+ return;
+ }
+
+ /*
* Transition from any state to the PE_SRC_Hard_Reset_Received or
* PE_SNK_Transition_to_default state when:
* 1) Hard Reset Signaling is detected.
@@ -1263,8 +1272,12 @@ void pe_got_soft_reset(int port)
/*
* The PE_SRC_Soft_Reset state Shall be entered from any state when a
* Soft_Reset Message is received from the Protocol Layer.
+ *
+ * However, if we're in the middle of an FRS sequence, we need to go to
+ * ErrorRecovery instead.
*/
- set_state_pe(port, PE_SOFT_RESET);
+ set_state_pe(port, pe_in_frs_mode(port) ? PE_WAIT_FOR_ERROR_RECOVERY :
+ PE_SOFT_RESET);
}
__overridable bool pd_can_charge_from_device(int port, const int pdo_cnt,
@@ -1927,13 +1940,6 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
if (!IS_ENABLED(CONFIG_USB_PD_ALT_MODE_DFP))
assert(0);
- /*
- * DONE set once modal entry is successful, discovery completes, or
- * discovery results in a NAK
- */
- if (PE_CHK_FLAG(port, PE_FLAGS_VDM_SETUP_DONE))
- return false;
-
/* Apply Port Discovery DR Swap Policy */
if (port_discovery_dr_swap_policy(
port, pe[port].data_role,
@@ -1951,12 +1957,9 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
*/
if (pe[port].data_role == PD_ROLE_UFP &&
prl_get_rev(port, TCPCI_MSG_SOP) == PD_REV20) {
- pd_set_identity_discovery(port, TCPCI_MSG_SOP, PD_DISC_FAIL);
- pd_set_identity_discovery(port, TCPCI_MSG_SOP_PRIME,
- PD_DISC_FAIL);
+ pd_disable_discovery(port);
pd_notify_event(port, PD_STATUS_EVENT_SOP_DISC_DONE);
pd_notify_event(port, PD_STATUS_EVENT_SOP_PRIME_DISC_DONE);
- PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
return false;
}
@@ -1970,12 +1973,6 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
return true;
}
- /* If mode entry was successful, disable the timer */
- if (PE_CHK_FLAG(port, PE_FLAGS_VDM_SETUP_DONE)) {
- pd_timer_disable(port, PE_TIMER_DISCOVER_IDENTITY);
- return false;
- }
-
/*
* Run discovery functions when the timer indicating either cable
* discovery spacing or BUSY spacing runs out.
@@ -2014,6 +2011,9 @@ __maybe_unused static bool pe_attempt_port_discovery(int port)
pe[port].tx_type = TCPCI_MSG_SOP_PRIME;
set_state_pe(port, PE_INIT_VDM_MODES_REQUEST);
return true;
+ } else {
+ pd_timer_disable(port, PE_TIMER_DISCOVER_IDENTITY);
+ return false;
}
}
@@ -5164,10 +5164,9 @@ static void pe_prs_snk_src_send_swap_run(int port)
* Handle discarded message
*/
if (msg_check & PE_MSG_DISCARDED) {
- if (pe_in_frs_mode(port))
- pe_set_hard_reset(port);
- else
- set_state_pe(port, PE_SNK_READY);
+ set_state_pe(port, pe_in_frs_mode(port) ?
+ PE_WAIT_FOR_ERROR_RECOVERY :
+ PE_SNK_READY);
return;
}
@@ -6144,19 +6143,12 @@ static void pe_vdm_request_dpm_run(int port)
uint32_t *payload = (uint32_t *)rx_emsg[port].buf;
int sop = PD_HEADER_GET_SOP(rx_emsg[port].header);
uint8_t cnt = PD_HEADER_CNT(rx_emsg[port].header);
- uint16_t svid = PD_VDO_VID(payload[0]);
- uint8_t vdm_cmd = PD_VDO_CMD(payload[0]);
/*
* PE initiator VDM-ACKed state for requested VDM, like
* PE_INIT_VDM_FOO_ACKed, embedded here.
*/
dpm_vdm_acked(port, sop, cnt, payload);
-
- if (sop == TCPCI_MSG_SOP && svid == USB_SID_DISPLAYPORT &&
- vdm_cmd == CMD_DP_CONFIG) {
- PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
- }
break;
}
case VDM_RESULT_NAK: {
@@ -6166,7 +6158,6 @@ static void pe_vdm_request_dpm_run(int port)
* PE initiator VDM-NAKed state for requested VDM, like
* PE_INIT_VDM_FOO_NAKed, embedded here.
*/
- PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
/*
* Because Not Supported messages or response timeouts are
@@ -6194,7 +6185,6 @@ static void pe_vdm_request_dpm_exit(int port)
{
if (PE_CHK_FLAG(port, PE_FLAGS_VDM_REQUEST_TIMEOUT)) {
PE_CLR_FLAG(port, PE_FLAGS_VDM_REQUEST_TIMEOUT);
- PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE);
/*
* Mark failure to respond as discovery failure.
@@ -7797,12 +7787,7 @@ void pd_dfp_discovery_init(int port)
void pd_dfp_mode_init(int port)
{
- /*
- * Clear the VDM Setup Done and Modal Operation flags so we will
- * have a fresh discovery
- */
- PE_CLR_MASK(port, BIT(PE_FLAGS_VDM_SETUP_DONE_FN) |
- BIT(PE_FLAGS_MODAL_OPERATION_FN));
+ PE_CLR_FLAG(port, PE_FLAGS_MODAL_OPERATION);
memset(pe[port].partner_amodes, 0, sizeof(pe[port].partner_amodes));