diff options
author | Sam Hurst <shurst@google.com> | 2019-11-21 13:57:26 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-12-23 15:07:23 +0000 |
commit | 15c765f8cf04ad66638e6c51f74d7bb1d58f3e41 (patch) | |
tree | d4bd2ae7ebb6b7e744266dcf9ab341f0715cdc60 | |
parent | 3859f9bf523c506e3b13fe8d67c238f97e701258 (diff) | |
download | chrome-ec-15c765f8cf04ad66638e6c51f74d7bb1d58f3e41.tar.gz |
TCPMv2: Fixed PR swap request from charge manager
The PR swap request from the charge manager was locking up the
TC state machine. The pd_request_power_swap function was changed
so that it sends the request to the policy engine instead of
initiating it directly.
BUG=chromium:1027247
BRANCH=none
TEST=make -j buildall
Tested with apple dongle "A2119 2019 HBR3" known to reproduce this
problem.
Change-Id: Ic59036056434ed525a839cd781cff93e3b5bfc53
Signed-off-by: Sam Hurst <shurst@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1928795
Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1979566
Tested-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Commit-Queue: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 9 | ||||
-rw-r--r-- | common/usbc/usb_tc_drp_acc_trysrc_sm.c | 2 | ||||
-rw-r--r-- | include/usb_tc_sm.h | 8 | ||||
-rw-r--r-- | test/fake_usbc.c | 3 | ||||
-rw-r--r-- | test/usb_pe_drp.c | 4 |
5 files changed, 20 insertions, 6 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index 590a72640d..8f68a5db3e 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -931,6 +931,11 @@ static void pe_update_pdo_flags(int port, uint32_t pdo) #endif } +void pd_request_power_swap(int port) +{ + pe_dpm_request(port, DPM_REQUEST_PR_SWAP); +} + int pd_is_port_partner_dualrole(int port) { return PE_CHK_FLAG(port, PE_FLAGS_PORT_PARTNER_IS_DUALROLE); @@ -2894,7 +2899,7 @@ static void pe_prs_src_snk_evaluate_swap_entry(int port) /* PE_PRS_SRC_SNK_Reject_PR_Swap state embedded here */ prl_send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_REJECT); } else { - pd_request_power_swap(port); + tc_request_power_swap(port); /* PE_PRS_SRC_SNK_Accept_Swap state embedded here */ PE_SET_FLAG(port, PE_FLAGS_ACCEPT); prl_send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_ACCEPT); @@ -3080,7 +3085,7 @@ static void pe_prs_snk_src_evaluate_swap_entry(int port) /* PE_PRS_SNK_SRC_Reject_Swap state embedded here */ prl_send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_REJECT); } else { - pd_request_power_swap(port); + tc_request_power_swap(port); /* PE_PRS_SNK_SRC_Accept_Swap state embedded here */ PE_SET_FLAG(port, PE_FLAGS_ACCEPT); prl_send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_ACCEPT); diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index a3e6f5f67f..c0169d704a 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -366,7 +366,7 @@ void pd_set_new_power_request(int port) } } -void pd_request_power_swap(int port) +void tc_request_power_swap(int port) { if (IS_ENABLED(CONFIG_USB_PE_SM)) { /* diff --git a/include/usb_tc_sm.h b/include/usb_tc_sm.h index f94360ad3f..b4b559152f 100644 --- a/include/usb_tc_sm.h +++ b/include/usb_tc_sm.h @@ -177,6 +177,14 @@ void tc_prs_src_snk_assert_rd(int port); void tc_prs_snk_src_assert_rp(int port); /** + * Informs the Type-C State Machine that a Power Role Swap is starting. + * This function is called from the Policy Engine. + * + * @parm port USB_C port number + */ +void tc_request_power_swap(int port); + +/** * Informs the Type-C State Machine that a Power Role Swap is complete. * This function is called from the Policy Engine. * diff --git a/test/fake_usbc.c b/test/fake_usbc.c index b0137cb893..a563f3d4d8 100644 --- a/test/fake_usbc.c +++ b/test/fake_usbc.c @@ -16,9 +16,6 @@ int pd_is_vbus_present(int port) void pd_request_data_swap(int port) {} -void pd_request_power_swap(int port) -{} - void pd_request_vconn_swap_off(int port) {} diff --git a/test/usb_pe_drp.c b/test/usb_pe_drp.c index c6a1dc0af7..e8167cc1ac 100644 --- a/test/usb_pe_drp.c +++ b/test/usb_pe_drp.c @@ -29,6 +29,10 @@ int board_vbus_source_enabled(int port) { return 0; } +void tc_request_power_swap(int port) +{ + /* Do nothing */ +} /** * Test section |