diff options
author | Wai-Hong Tam <waihong@google.com> | 2020-03-13 22:02:22 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-24 19:27:56 +0000 |
commit | 2b86994b8368c36a54d32f36984b2ae9a2997295 (patch) | |
tree | 4e0f38dd6ada8349b23b0df9b6a6530356c3d74d | |
parent | 0252cc3de4092702043b367ace18dfc97f3327aa (diff) | |
download | chrome-ec-2b86994b8368c36a54d32f36984b2ae9a2997295.tar.gz |
TCPMv2: Not enable PD comm on TX Phy reset if not in a connected state
If PD is not in a connected state, the previous approach was to enable
PD comm on TX Phy reset and then disable it later (the SM_RUN case in
prl_run()). In this short period of time, the TCPC wil respond GoodCRC
to the PD message and the PD partner will go forward to the next state
that messes up its state machine and causes an unexpected hard reset.
We should not enable PD comm if not in a connected state.
BRANCH=None
BUG=b:151159750
TEST=Tested on Trogdor, with extra patches to fix the DP discovery
and separate the Tx and Rx buffers. Unplugged battery and plugged
a 20V charger and verified it boot fine, no reboot loop.
TEST=Built chocodile_vpdmcu image successfully.
TEST=make runtests -j
Change-Id: Ic819787f1ec0085abdded3bab8ecbcb813495408
Signed-off-by: Wai-Hong Tam <waihong@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2107882
Reviewed-by: Sam Hurst <shurst@google.com>
-rw-r--r-- | common/usbc/usb_prl_sm.c | 4 | ||||
-rw-r--r-- | common/usbc/usb_tc_ctvpd_sm.c | 11 | ||||
-rw-r--r-- | test/fake_usbc.c | 15 |
3 files changed, 22 insertions, 8 deletions
diff --git a/common/usbc/usb_prl_sm.c b/common/usbc/usb_prl_sm.c index 5805d1278e..769a103fe5 100644 --- a/common/usbc/usb_prl_sm.c +++ b/common/usbc/usb_prl_sm.c @@ -467,10 +467,10 @@ static void prl_tx_phy_layer_reset_entry(const int port) { if (IS_ENABLED(CONFIG_USB_TYPEC_CTVPD) || IS_ENABLED(CONFIG_USB_TYPEC_VPD)) { - vpd_rx_enable(1); + vpd_rx_enable(pd_is_connected(port)); } else { tcpm_clear_pending_messages(port); - tcpm_set_rx_enable(port, 1); + tcpm_set_rx_enable(port, pd_is_connected(port)); } } diff --git a/common/usbc/usb_tc_ctvpd_sm.c b/common/usbc/usb_tc_ctvpd_sm.c index 194bb664fe..804c733485 100644 --- a/common/usbc/usb_tc_ctvpd_sm.c +++ b/common/usbc/usb_tc_ctvpd_sm.c @@ -222,6 +222,17 @@ test_mockable_static void print_current_state(const int port) CPRINTS("C%d: %s", port, tc_state_names[get_state_tc(port)]); } +int pd_is_connected(int port) +{ + return (get_state_tc(port) == TC_ATTACHED_SNK) || + (get_state_tc(port) == TC_ATTACHED_SRC); +} + +bool pd_is_disconnected(int port) +{ + return !pd_is_connected(port); +} + /** * Disabled * diff --git a/test/fake_usbc.c b/test/fake_usbc.c index c9163f1cfe..bbc565a14d 100644 --- a/test/fake_usbc.c +++ b/test/fake_usbc.c @@ -178,12 +178,20 @@ uint8_t pd_get_src_cap_cnt(int port) } #endif -#ifndef CONFIG_USB_TYPEC_DRP_ACC_TRYSRC +#if !defined(CONFIG_USB_TYPEC_DRP_ACC_TRYSRC) && \ + !defined(CONFIG_USB_TYPEC_CTVPD) +int pd_is_connected(int port) +{ + return true; +} + bool pd_is_disconnected(int port) { return false; } +#endif /* !CONFIG_USB_TYPEC_DRP_ACC_TRYSRC && !CONFIG_USB_TYPEC_CTVPD */ +#ifndef CONFIG_USB_TYPEC_DRP_ACC_TRYSRC void pd_set_dual_role(int port, enum pd_dual_role_states state) { } @@ -213,11 +221,6 @@ enum pd_cc_states pd_get_task_cc_state(int port) return PD_CC_NONE; } -int pd_is_connected(int port) -{ - return true; -} - bool pd_get_partner_unconstr_power(int port) { return 0; |