diff options
Diffstat (limited to 'common/usbc')
-rw-r--r-- | common/usbc/build.mk | 2 | ||||
-rw-r--r-- | common/usbc/usb_pd_dpm.c | 17 | ||||
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 59 | ||||
-rw-r--r-- | common/usbc/usb_pe_private.h | 2 |
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 */ |