diff options
author | Diana Z <dzigterman@chromium.org> | 2021-04-12 13:37:29 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-14 16:11:51 +0000 |
commit | 3f8ab76c4e9e2d79e905d7d4a2a763bf1fd19485 (patch) | |
tree | c02afeaff03e1707f2452cc04971f57f773f9593 | |
parent | fdaf8763014b294f6a1beb3f7035f3a2ee15d50c (diff) | |
download | chrome-ec-3f8ab76c4e9e2d79e905d7d4a2a763bf1fd19485.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>
(cherry picked from commit fdea1a4e10b6f52aad7cb48a82bd64a94eb1f69f)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2822281
Tested-by: Amber Chen <amber.chen@lcfc.corp-partner.google.com>
Commit-Queue: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 20 |
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 66a5bf4c50..2c1b019356 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 */ @@ -6722,6 +6721,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); |