summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2021-04-12 13:37:29 -0600
committerCommit Bot <commit-bot@chromium.org>2021-04-13 20:12:27 +0000
commitfdea1a4e10b6f52aad7cb48a82bd64a94eb1f69f (patch)
tree49c2d4097ec1ff62ae683f876b6aee9df9271fdc
parent50c844cebd1b4ed18da981ee4c1e6b7dab0baddf (diff)
downloadchrome-ec-fdea1a4e10b6f52aad7cb48a82bd64a94eb1f69f.tar.gz
TCPMv2: Update source PDO flags always
Always ensure we update our source PDO flags when storing partner source cap replies during PE_SNK_Evaluate_Capability. However, only propose a power role swap the first time we're storing source capabilities to prevent infinite PR swap loops between Chromebooks. BRANCH=volteer BUG=b:184971310 TEST=ensure connection with a DRP partner results in correct setting of dual role flags (dual-role for anything we don't want to automatically charge from, dedicated for anything we do want to automatically charge from). Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: Ida139af43fb384096b14e686cf5bd6bbfdf16aa9 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2821602 Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r--common/usbc/usb_pe_drp_sm.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 698f905bef..af3cfddd80 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -1749,13 +1749,6 @@ static void pe_update_src_pdo_flags(int port, int pdo_cnt, uint32_t *pdos)
charge_manager_update_dualrole(port, CAP_DUALROLE);
}
}
-
- /*
- * If port policy preference is to be a power role source, then request
- * a power role swap.
- */
- if (!pd_can_source_from_device(port, pdo_cnt, pdos))
- pd_request_power_swap(port);
}
void pd_request_power_swap(int port)
@@ -3082,8 +3075,14 @@ static void pe_snk_evaluate_capability_entry(int port)
/* Parse source caps if they have changed */
if (pe[port].src_cap_cnt != num ||
memcmp(pdo, pe[port].src_caps, num << 2))
- pe_update_src_pdo_flags(port, num, pdo);
+ /*
+ * If port policy preference is to be a power role source,
+ * then request a power role swap.
+ */
+ if (!pd_can_source_from_device(port, num, pdo))
+ pd_request_power_swap(port);
+ pe_update_src_pdo_flags(port, num, pdo);
pd_set_src_caps(port, num, pdo);
/* Evaluate the options based on supplied capabilities */
@@ -6723,6 +6722,11 @@ static void pe_dr_src_get_source_cap_run(int port)
(uint32_t *)rx_emsg[port].buf;
pd_set_src_caps(port, cnt, payload);
+
+ /*
+ * If we'd prefer to charge from this partner,
+ * then propose a PR swap.
+ */
if (pd_can_source_from_device(port, cnt,
payload))
pd_request_power_swap(port);