diff options
author | Abe Levkoy <alevkoy@chromium.org> | 2023-02-09 16:12:12 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-02-13 22:08:44 +0000 |
commit | 13b898fbf00ed8aced0d9758c323a3cd58a8c6a0 (patch) | |
tree | fd574df365cfc6eac1dee177ffb546e4f3c956de | |
parent | 6a0c42bf25c153f53f6377f1c0b776286771bf2e (diff) | |
download | chrome-ec-13b898fbf00ed8aced0d9758c323a3cd58a8c6a0.tar.gz |
TCPMv2: Remove PE_FLAGS_VDM_SETUP_DONE
Remove a PE flag that is redundant with the discovery state. Update the
discovery state where appropriate to keep it internally consistent.
BUG=b:189353401
TEST=voxel: Attach TBT4 hub; verify discovery sequence
BRANCH=none
Change-Id: I8ea870271ee95eb1dd4633370f7e39ca789f1328
Signed-off-by: Abe Levkoy <alevkoy@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4237156
Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r-- | common/usb_pd_discovery.c | 11 | ||||
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 14 | ||||
-rw-r--r-- | common/usbc/usb_pe_private.h | 2 | ||||
-rw-r--r-- | include/usb_pd.h | 7 | ||||
-rw-r--r-- | test/usb_pe_drp_old.c | 39 |
5 files changed, 55 insertions, 18 deletions
diff --git a/common/usb_pd_discovery.c b/common/usb_pd_discovery.c index 9cadd197be..3fad82d10d 100644 --- a/common/usb_pd_discovery.c +++ b/common/usb_pd_discovery.c @@ -185,6 +185,17 @@ void dfp_consume_modes(int port, enum tcpci_msg_type type, int cnt, PD_DISC_COMPLETE); } +void pd_disable_discovery(int port) +{ + /* Mark identity and SVIDs for the port partner and cable as failed. + * With no discovered SVIDs, there are no modes to mark as failed. + */ + pd_set_identity_discovery(port, TCPCI_MSG_SOP, PD_DISC_FAIL); + pd_set_svids_discovery(port, TCPCI_MSG_SOP, PD_DISC_FAIL); + pd_set_identity_discovery(port, TCPCI_MSG_SOP_PRIME, PD_DISC_FAIL); + pd_set_svids_discovery(port, TCPCI_MSG_SOP_PRIME, PD_DISC_FAIL); +} + void pd_set_identity_discovery(int port, enum tcpci_msg_type type, enum pd_discovery_state disc) { diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index 249526d36e..5eb983a89c 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -1927,13 +1927,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 +1944,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; } @@ -2009,7 +1999,6 @@ __maybe_unused static bool pe_attempt_port_discovery(int port) set_state_pe(port, PE_INIT_VDM_MODES_REQUEST); return true; } else { - PE_SET_FLAG(port, PE_FLAGS_VDM_SETUP_DONE); pd_timer_disable(port, PE_TIMER_DISCOVER_IDENTITY); return false; } @@ -7782,7 +7771,6 @@ void pd_dfp_discovery_init(int port) BIT(task_get_current())); memset(pe[port].discovery, 0, sizeof(pe[port].discovery)); - PE_CLR_FLAG(port, PE_FLAGS_VDM_SETUP_DONE); } void pd_dfp_mode_init(int port) 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 */ diff --git a/include/usb_pd.h b/include/usb_pd.h index 08fa9b1dbd..ddc632e91c 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -1960,6 +1960,13 @@ void pd_dfp_discovery_init(int port); void pd_dfp_mode_init(int port); /** + * Mark all discovery types as failed to prevent any further discovery attempts + * until a connection change or DPM request triggers discovery again. + * @param port USB-C port number + */ +void pd_disable_discovery(int port); + +/** * Set identity discovery state for this type and port * * @param port USB-C port number diff --git a/test/usb_pe_drp_old.c b/test/usb_pe_drp_old.c index 4ea07c1ec9..c352760d1d 100644 --- a/test/usb_pe_drp_old.c +++ b/test/usb_pe_drp_old.c @@ -83,11 +83,40 @@ void pd_set_error_recovery(int port) { } +/* Skip discovery (and the corresponding DRS and VCS sequences) by default. A + * test may enable this to allow those sequences to run. + */ +static bool discovery_enabled; + +__override bool port_discovery_dr_swap_policy(int port, enum pd_data_role dr, + bool dr_swap_flag) +{ + if (!discovery_enabled) + return false; + + if (dr_swap_flag && dr == PD_ROLE_UFP) + return true; + + return false; +} + +__override bool port_discovery_vconn_swap_policy(int port, bool vconn_swap_flag) +{ + if (!discovery_enabled) + return false; + + if (IS_ENABLED(CONFIG_USBC_VCONN) && vconn_swap_flag && + !tc_is_vconn_src(port) && tc_check_vconn_swap(port)) + return true; + + return false; +} + test_static void setup_source(void) { /* Start PE. */ task_wait_event(10 * MSEC); - pe_set_flag(PORT0, PE_FLAGS_VDM_SETUP_DONE); + pd_disable_discovery(PORT0); pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT); /* As long as we're hacking our way to ready, clear any DPM requests */ pe_clr_dpm_requests(PORT0); @@ -103,7 +132,7 @@ test_static void setup_sink(void) task_wait_event(10 * MSEC); pd_comm_enable(PORT0, 1); task_wait_event(10 * MSEC); - pe_set_flag(PORT0, PE_FLAGS_VDM_SETUP_DONE); + pd_disable_discovery(PORT0); pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT); /* As long as we're hacking our way to ready, clear any DPM requests */ pe_clr_dpm_requests(PORT0); @@ -131,7 +160,7 @@ static int test_pe_frs(void) * background tasks (ex. discovery) aren't running. */ tc_prs_src_snk_assert_rd(PORT0); - pe_set_flag(PORT0, PE_FLAGS_VDM_SETUP_DONE); + pd_disable_discovery(PORT0); pe_set_flag(PORT0, PE_FLAGS_EXPLICIT_CONTRACT); pe_clr_dpm_requests(PORT0); set_state_pe(PORT0, PE_SNK_READY); @@ -332,6 +361,8 @@ test_static int test_prl_is_busy(enum pd_power_role pr) { int ready_state; + discovery_enabled = true; + if (pr == PD_ROLE_SOURCE) ready_state = PE_SRC_READY; else @@ -363,6 +394,8 @@ test_static int test_prl_is_busy(enum pd_power_role pr) */ TEST_ASSERT(get_state_pe(PORT0) != ready_state); + discovery_enabled = false; + return EC_SUCCESS; } |