summaryrefslogtreecommitdiff
path: root/zephyr/emul/tcpc/emul_tcpci_partner_common.c
diff options
context:
space:
mode:
authorAbe Levkoy <alevkoy@chromium.org>2023-03-13 14:44:23 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-03-15 16:07:29 +0000
commit3efa30fa07272980f85be0caa711d2fbfeeca287 (patch)
treee5ae24590949abee4e1c4edb7623e31805157471 /zephyr/emul/tcpc/emul_tcpci_partner_common.c
parent8fd62bab5711a126e50559e3133e053c0130e764 (diff)
downloadchrome-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.c21
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)
{