diff options
author | Abe Levkoy <alevkoy@chromium.org> | 2023-03-13 14:44:23 -0600 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-03-15 16:07:29 +0000 |
commit | 3efa30fa07272980f85be0caa711d2fbfeeca287 (patch) | |
tree | e5ae24590949abee4e1c4edb7623e31805157471 /zephyr/emul/tcpc/emul_tcpci_partner_common.c | |
parent | 8fd62bab5711a126e50559e3133e053c0130e764 (diff) | |
download | chrome-ec-3efa30fa07272980f85be0caa711d2fbfeeca287.tar.gz |
partner emul: Optionally reject DR_Swap
Support runtime configuration of the partner emulator to Reject a Data
Role Swap based on the new role of the partner emulator.
BUG=b:271613370
TEST=twister -s drivers/drivers.usbc_alt_mode
BRANCH=none
Change-Id: I47a6b99d334d083ad0d9e40b211507a4e21248b3
Signed-off-by: Abe Levkoy <alevkoy@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4334627
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'zephyr/emul/tcpc/emul_tcpci_partner_common.c')
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_common.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c index 7a1670fe0e..e7be6250b6 100644 --- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c +++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c @@ -5,6 +5,7 @@ #include "common.h" #include "driver/tcpm/tcpci.h" +#include "ec_commands.h" #include "emul/tcpc/emul_tcpci.h" #include "emul/tcpc/emul_tcpci_partner_common.h" #include "usb_pd.h" @@ -957,8 +958,14 @@ void tcpci_partner_common_swap_data_role(struct tcpci_partner_data *data) static enum tcpci_partner_handler_res tcpci_partner_common_dr_swap_handler(struct tcpci_partner_data *data) { - tcpci_partner_send_control_msg(data, PD_CTRL_ACCEPT, 0); - tcpci_partner_common_swap_data_role(data); + enum pd_ctrl_msg_type response = PD_CTRL_REJECT; + + if ((data->data_role == PD_ROLE_DFP && data->drs_to_ufp_supported) || + (data->data_role == PD_ROLE_UFP && data->drs_to_dfp_supported)) + response = PD_CTRL_ACCEPT; + tcpci_partner_send_control_msg(data, response, 0); + if (response == PD_CTRL_ACCEPT) + tcpci_partner_common_swap_data_role(data); return TCPCI_PARTNER_COMMON_MSG_HANDLED; } @@ -1642,6 +1649,8 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev) data->send_goodcrc = true; data->rev = rev; + data->drs_to_dfp_supported = true; + data->drs_to_ufp_supported = true; data->vconn_supported = true; data->ops.transmit = tcpci_partner_transmit_op; @@ -1659,6 +1668,14 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev) data->cable = NULL; } +void tcpci_partner_set_drs_support(struct tcpci_partner_data *data, + bool drs_to_ufp_supported, + bool drs_to_dfp_supported) +{ + data->drs_to_ufp_supported = drs_to_ufp_supported; + data->drs_to_dfp_supported = drs_to_dfp_supported; +} + void tcpci_partner_set_vconn_support(struct tcpci_partner_data *data, bool vconn_supported) { |