diff options
-rw-r--r-- | common/usbc/usb_prl_sm.c | 12 | ||||
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_common.c | 9 | ||||
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_drp.c | 30 | ||||
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_snk.c | 10 | ||||
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_src.c | 11 | ||||
-rw-r--r-- | zephyr/include/emul/tcpc/emul_tcpci_partner_common.h | 10 |
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); + +/** * @} */ |