summaryrefslogtreecommitdiff
path: root/common/usbc
diff options
context:
space:
mode:
Diffstat (limited to 'common/usbc')
-rw-r--r--common/usbc/build.mk2
-rw-r--r--common/usbc/usb_pd_dpm.c17
-rw-r--r--common/usbc/usb_pe_drp_sm.c59
-rw-r--r--common/usbc/usb_pe_private.h2
4 files changed, 28 insertions, 52 deletions
diff --git a/common/usbc/build.mk b/common/usbc/build.mk
index 15c9f06001..99043ffab8 100644
--- a/common/usbc/build.mk
+++ b/common/usbc/build.mk
@@ -31,7 +31,7 @@ all-obj-$(CONFIG_USB_CTVPD)+=$(_usbc_dir)usb_pe_ctvpd_sm.o
all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usbc_pd_policy.o
all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usb_pe_drp_sm.o
all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usb_pd_dpm.o
-all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)dp_alt_mode.o
+all-obj-$(CONFIG_USB_PD_DP_MODE)+=$(_usbc_dir)dp_alt_mode.o
all-obj-$(CONFIG_USB_PD_TBT_COMPAT_MODE)+=$(_usbc_dir)tbt_alt_mode.o
all-obj-$(CONFIG_USB_PD_USB4)+=$(_usbc_dir)usb_mode.o
all-obj-$(CONFIG_CMD_PD)+=$(_usbc_dir)usb_pd_console.o
diff --git a/common/usbc/usb_pd_dpm.c b/common/usbc/usb_pd_dpm.c
index 2fc75bc746..397e5071e5 100644
--- a/common/usbc/usb_pd_dpm.c
+++ b/common/usbc/usb_pd_dpm.c
@@ -283,27 +283,20 @@ enum ec_status pd_request_enter_mode(int port, enum typec_mode mode)
DPM_FLAG_ENTER_USB4))
return EC_RES_BUSY;
- switch (mode) {
- case TYPEC_MODE_DP:
+ if (IS_ENABLED(CONFIG_USB_PD_DP_MODE) && mode == TYPEC_MODE_DP) {
if (dp_is_idle(port))
dp_init(port);
DPM_SET_FLAG(port, DPM_FLAG_ENTER_DP);
- break;
-#ifdef CONFIG_USB_PD_TBT_COMPAT_MODE
- case TYPEC_MODE_TBT:
+ } else if (IS_ENABLED(CONFIG_USB_PD_TBT_COMPAT_MODE) &&
+ mode == TYPEC_MODE_TBT) {
/* TODO(b/235984702#comment21): Refactor alt mode modules
* to better support mode reentry. */
if (dp_is_idle(port))
dp_init(port);
DPM_SET_FLAG(port, DPM_FLAG_ENTER_TBT);
- break;
-#endif /* CONFIG_USB_PD_TBT_COMPAT_MODE */
-#ifdef CONFIG_USB_PD_USB4
- case TYPEC_MODE_USB4:
+ } else if (IS_ENABLED(CONFIG_USB_PD_USB4) && mode == TYPEC_MODE_USB4) {
DPM_SET_FLAG(port, DPM_FLAG_ENTER_USB4);
- break;
-#endif
- default:
+ } else {
return EC_RES_INVALID_PARAM;
}
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));
diff --git a/common/usbc/usb_pe_private.h b/common/usbc/usb_pe_private.h
index c6703f6fd3..6bbf947bea 100644
--- a/common/usbc/usb_pe_private.h
+++ b/common/usbc/usb_pe_private.h
@@ -48,8 +48,6 @@ enum {
PE_FLAGS_PS_RESET_COMPLETE_FN,
/* VCONN swap operation has completed */
PE_FLAGS_VCONN_SWAP_COMPLETE_FN,
- /* Flag to note no more setup VDMs (discovery, etc.) should be sent */
- PE_FLAGS_VDM_SETUP_DONE_FN,
/* Flag to note PR Swap just completed for Startup entry */
PE_FLAGS_PR_SWAP_COMPLETE_FN,
/* Flag to note FRS/PRS context in shared state machine path */