diff options
author | Won Chung <wonchung@google.com> | 2022-08-09 20:11:09 +0000 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-08-15 19:25:33 +0000 |
commit | 487174e0067ed01616f0981c0669e040f39af909 (patch) | |
tree | c4eba7561f6d4ea49b4ebe80554b5dd91563f8cb | |
parent | 6d446440a610eaae41de38bb54f7bdc5860cffc9 (diff) | |
download | chrome-ec-487174e0067ed01616f0981c0669e040f39af909.tar.gz |
usbc: Add an edge case of DR Swap fail due to PD 2.0
In USB PD 2.0, Discover Identity can only be initiated by the DFP. When
a charger that uses USB PD 2.0 is hotplugged, USB-C port's attempt to
swap from UFP to DFP may be rejected. Handle such edge case to mark
identity discovery as failed and send SOP_DISC_DONE event.
BUG=b:238340215
TEST=Hotplug PD 2.0 charger to DUT and check if kernel receives
SOP_DISC_DONE.
BRANCH=none
Signed-off-by: Won Chung <wonchung@google.com>
Change-Id: I96dba6654d63ff52daa69510e981ebb3b84f1d6c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3821049
Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index e5ed34b989..23e8901481 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -1945,6 +1945,21 @@ __maybe_unused static bool pe_attempt_port_discovery(int port) return true; } + /* + * An edge case of DR Swap fail (port still UFP) and partner in PD 2.0. + * PD 2.0 allows only DFP to initiate Discover Identity, but partner may + * reject a DR Swap. + */ + 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_notify_event(port, PD_STATUS_EVENT_SOP_DISC_DONE); + pd_notify_event(port, PD_STATUS_EVENT_SOP_PRIME_DISC_DONE); + return false; + } + /* Apply Port Discovery VCONN Swap Policy */ if (IS_ENABLED(CONFIG_USBC_VCONN) && port_discovery_vconn_swap_policy( |