summaryrefslogtreecommitdiff
path: root/common/usbc/usb_pe_drp_sm.c
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2021-05-07 15:14:39 -0600
committerCommit Bot <commit-bot@chromium.org>2021-05-17 15:51:57 +0000
commit967b00cb27e6f07d863904d5ea669b6d2c38d380 (patch)
tree9fb581e872aa2eac6bef4c502a18a019ca1fe2a2 /common/usbc/usb_pe_drp_sm.c
parent395055341666146beaf40a72feb0bb50ea8bffb3 (diff)
downloadchrome-ec-967b00cb27e6f07d863904d5ea669b6d2c38d380.tar.gz
TCPMv2: Hard reset on PR swap interruption
When a PR swap is interrupted, send a hard reset. Since Vbus is turning off, a soft reset wouldn't restore our Vbus and connection state for this protocol error. BRANCH=zork BUG=b:184764468 TEST=on jelboz, connect problematic dock which interrupts PR swap and ensure connection can recover successfully Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: I901c5a99af3f8cfae038d447bac8e0f37fedc9c2 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2880811 Reviewed-by: Edward Hill <ecgh@chromium.org>
Diffstat (limited to 'common/usbc/usb_pe_drp_sm.c')
-rw-r--r--common/usbc/usb_pe_drp_sm.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index eeef29e387..1aa2b4b270 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -4355,6 +4355,17 @@ static void pe_prs_src_snk_transition_to_off_entry(int port)
static void pe_prs_src_snk_transition_to_off_run(int port)
{
+ /*
+ * This is a non-interruptible AMS and power is transitioning - hard
+ * reset on interruption.
+ */
+ if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) {
+ PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED);
+
+ tc_pr_swap_complete(port, 0);
+ set_state_pe(port, PE_SRC_HARD_RESET);
+ }
+
/* Give time for supply to power off */
if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE) &&
pd_check_vbus_level(port, VBUS_SAFE0V))