diff options
author | Diana Z <dzigterman@chromium.org> | 2021-05-07 15:14:39 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-05-17 15:51:57 +0000 |
commit | 967b00cb27e6f07d863904d5ea669b6d2c38d380 (patch) | |
tree | 9fb581e872aa2eac6bef4c502a18a019ca1fe2a2 /common/usbc/usb_pe_drp_sm.c | |
parent | 395055341666146beaf40a72feb0bb50ea8bffb3 (diff) | |
download | chrome-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.c | 11 |
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)) |