summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Hurst <shurst@google.com>2019-11-21 13:57:26 -0800
committerCommit Bot <commit-bot@chromium.org>2019-12-10 03:35:19 +0000
commit0ee58e53ecb9417b7c264be0d3c199e1919fafd6 (patch)
tree070eb605ff49b8b27cc847da0e34104e804b0100
parent3973af40f9ca5dd7ba06629b6968b39e912d1c40 (diff)
downloadchrome-ec-0ee58e53ecb9417b7c264be0d3c199e1919fafd6.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>
-rw-r--r--common/usbc/usb_pe_drp_sm.c9
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c2
-rw-r--r--include/usb_tc_sm.h8
-rw-r--r--test/fake_usbc.c3
-rw-r--r--test/usb_pe_drp.c4
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