summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Massey <aaronmassey@google.com>2022-05-04 17:24:13 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-05-11 17:50:07 +0000
commit6de89457da53af9704793665956f3b0efbdda98f (patch)
treeb98f067a23d45f4fbb503797cef4b0a9e793e2b1
parente1e8002afea491d39fca3a138ad0ad9e01bd8de0 (diff)
downloadchrome-ec-6de89457da53af9704793665956f3b0efbdda98f.tar.gz
emul: partner emuls reset roles on hard reset
The tcpci_partner emulators did not reset their roles when receiving a hard reset from the TCPM. Reset data and power roles in the tcpci partner emulator hard reset handlers. BRANCH=none BUG=b:230656752 TEST=zmake test test-drivers Signed-off-by: Aaron Massey <aaronmassey@google.com> Change-Id: Ib3072f1a483d1031991dd9ff83a23d863e661fc9 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3626074 Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r--common/usbc/usb_prl_sm.c12
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_common.c9
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_drp.c30
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_snk.c10
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_src.c11
-rw-r--r--zephyr/include/emul/tcpc/emul_tcpci_partner_common.h10
6 files changed, 52 insertions, 30 deletions
diff --git a/common/usbc/usb_prl_sm.c b/common/usbc/usb_prl_sm.c
index 5460edf1d4..805e6dfcd8 100644
--- a/common/usbc/usb_prl_sm.c
+++ b/common/usbc/usb_prl_sm.c
@@ -2206,16 +2206,10 @@ static void prl_rx_wait_for_phy_message(const int port, int evt)
* processing this requirement in the PRL RX.
*/
if (PD_HEADER_GET_SOP(header) == TCPCI_MSG_SOP &&
- PD_HEADER_DROLE(header) == pd_get_data_role(port)) {
+ PD_HEADER_DROLE(header) == pd_get_data_role(port)) {
CPRINTS("C%d Error: Data role mismatch (0x%08x)", port, header);
- /*
- * TODO(b/230656752): Ensure emulated test partners send
- * correct data roles
- */
- if (!IS_ENABLED(CONFIG_ZTEST)) {
- tc_start_error_recovery(port);
- return;
- }
+ tc_start_error_recovery(port);
+ return;
}
/* Handle incoming soft reset as special case */
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
index f6e59b7ab6..d8ba9ac62a 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c
@@ -22,6 +22,15 @@ LOG_MODULE_REGISTER(tcpci_partner, CONFIG_TCPCI_EMUL_LOG_LEVEL);
#define TCPCI_MSG_HEADER_LEN 2
/** Check description in emul_common_tcpci_partner.h */
+void tcpci_partner_common_hard_reset_as_role(struct tcpci_partner_data *data,
+ enum pd_power_role power_role)
+{
+ data->power_role = power_role;
+ data->data_role = power_role == PD_ROLE_SOURCE ? PD_ROLE_DFP :
+ PD_ROLE_UFP;
+}
+
+/** Check description in emul_common_tcpci_partner.h */
struct tcpci_partner_msg *tcpci_partner_alloc_msg(int data_objects)
{
struct tcpci_partner_msg *new_msg;
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_drp.c b/zephyr/emul/tcpc/emul_tcpci_partner_drp.c
index 91d26a1a45..c1deeeb887 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_drp.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_drp.c
@@ -104,18 +104,6 @@ enum tcpci_partner_handler_res tcpci_drp_emul_handle_sop_msg(
return TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED;
}
-/** Check description in emul_tcpci_partner_drp.h */
-void tcpci_drp_emul_hard_reset(void *emul)
-{
- struct tcpci_drp_emul *drp_emul = emul;
-
- if (drp_emul->data.sink) {
- tcpci_snk_emul_hard_reset(&drp_emul->snk_data);
- } else {
- tcpci_src_emul_hard_reset(&drp_emul->src_data);
- }
-}
-
/**
* @brief Function called when TCPM wants to transmit message. Accept received
* message and generate response.
@@ -283,11 +271,21 @@ void tcpci_drp_emul_init_with_pd_role(struct tcpci_drp_emul *emul,
enum pd_rev_type rev,
enum pd_power_role power_role)
{
- tcpci_partner_init(&emul->common_data, tcpci_drp_emul_hard_reset, emul);
+ tcpci_partner_hard_reset_func hard_reset_handler;
+ void *reset_data;
+
+ if (power_role == PD_ROLE_SINK) {
+ hard_reset_handler = &tcpci_snk_emul_hard_reset;
+ reset_data = &emul->snk_data;
+ } else {
+ hard_reset_handler = &tcpci_src_emul_hard_reset;
+ reset_data = &emul->src_data;
+ }
+
+ tcpci_partner_init(&emul->common_data, hard_reset_handler, reset_data);
- emul->common_data.power_role = power_role;
- emul->common_data.data_role =
- (power_role == PD_ROLE_SINK) ? PD_ROLE_UFP : PD_ROLE_DFP;
+ /* Use common handler to initialize roles */
+ tcpci_partner_common_hard_reset_as_role(&emul->common_data, power_role);
emul->common_data.rev = rev;
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_snk.c b/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
index ee7728f15c..0ad740cd08 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
@@ -418,6 +418,9 @@ void tcpci_snk_emul_hard_reset(void *data)
{
struct tcpci_snk_emul_data *snk_emul_data = data;
+ tcpci_partner_common_hard_reset_as_role(snk_emul_data->common_data,
+ PD_ROLE_SINK);
+
snk_emul_data->wait_for_ps_rdy = false;
snk_emul_data->pd_completed = false;
}
@@ -566,8 +569,11 @@ void tcpci_snk_emul_init(struct tcpci_snk_emul *emul, enum pd_rev_type rev)
tcpci_partner_init(&emul->common_data, tcpci_snk_emul_hard_reset,
&emul->data);
- emul->common_data.data_role = PD_ROLE_UFP;
- emul->common_data.power_role = PD_ROLE_SINK;
+
+ /* Use common handler to initialize roles */
+ tcpci_partner_common_hard_reset_as_role(&emul->common_data,
+ PD_ROLE_SINK);
+
emul->common_data.rev = rev;
emul->ops.transmit = tcpci_snk_emul_transmit_op;
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_src.c b/zephyr/emul/tcpc/emul_tcpci_partner_src.c
index e6a51bfc98..99d9dae332 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_src.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_src.c
@@ -181,9 +181,12 @@ void tcpci_src_emul_hard_reset(void *data)
{
struct tcpci_src_emul_data *src_emul_data = data;
+ tcpci_partner_common_hard_reset_as_role(src_emul_data->common_data,
+ PD_ROLE_SOURCE);
+
/* Send capability to establish PD again */
tcpci_src_emul_send_capability_msg_with_timer(
- src_emul_data, src_emul_data->common_data, 0);
+ src_emul_data, src_emul_data->common_data, 0);
}
/**
@@ -448,8 +451,10 @@ void tcpci_src_emul_init(struct tcpci_src_emul *emul, enum pd_rev_type rev)
tcpci_partner_init(&emul->common_data, tcpci_src_emul_hard_reset,
&emul->data);
- emul->common_data.data_role = PD_ROLE_DFP;
- emul->common_data.power_role = PD_ROLE_SOURCE;
+ /* Use common handler to initialize roles */
+ tcpci_partner_common_hard_reset_as_role(&emul->common_data,
+ PD_ROLE_SOURCE);
+
emul->common_data.rev = rev;
emul->ops.transmit = tcpci_src_emul_transmit_op;
diff --git a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
index 61dd282d57..94d2b1071c 100644
--- a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
+++ b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
@@ -424,6 +424,16 @@ void tcpci_partner_common_set_ams_ctrl_msg(struct tcpci_partner_data *data,
void tcpci_partner_common_clear_ams_ctrl_msg(struct tcpci_partner_data *data);
/**
+ * @brief Called by partner emulators internally. Resets the common tcpci
+ * partner data with the provided role.
+ *
+ * @param data Pointer to TCPCI partner data
+ * @param power_role USB PD power role
+ */
+void tcpci_partner_common_hard_reset_as_role(struct tcpci_partner_data *data,
+ enum pd_power_role power_role);
+
+/**
* @}
*/