summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWon Chung <wonchung@google.com>2022-08-09 20:11:09 +0000
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-08-15 19:25:33 +0000
commit487174e0067ed01616f0981c0669e040f39af909 (patch)
treec4eba7561f6d4ea49b4ebe80554b5dd91563f8cb
parent6d446440a610eaae41de38bb54f7bdc5860cffc9 (diff)
downloadchrome-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.c15
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(