From 24e18d46f1698385b204dcea206a5ab8a650448a Mon Sep 17 00:00:00 2001 From: Sam Hurst Date: Fri, 23 Dec 2022 14:26:12 -0800 Subject: [PATCH] usb_c: Properly handle Protocol Errors during DRS From 8.3.3.4.2.1 PE_SNK_Send_Soft_Reset State, Error Recovery should be performed if a Protocol Error happens during a Data Role Swap. Signed-off-by: Sam Hurst --- subsys/usb/usb_c/usbc_pe_common.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/subsys/usb/usb_c/usbc_pe_common.c b/subsys/usb/usb_c/usbc_pe_common.c index 0f8540e16f7..b7d1edf4851 100644 --- a/subsys/usb/usb_c/usbc_pe_common.c +++ b/subsys/usb/usb_c/usbc_pe_common.c @@ -680,11 +680,16 @@ void pe_drs_send_swap_run(void *obj) policy_notify(dev, (pe->data_role == TC_ROLE_UFP) ? DATA_ROLE_IS_UFP : DATA_ROLE_IS_DFP); } else { - /* Protocol Error */ - policy_notify(dev, PROTOCOL_ERROR); - pe_send_soft_reset(dev, PD_PACKET_SOP); + /* + * A Protocol Error during a Data Role Swap when the + * DFP/UFP roles are changing shall directly trigger + * a Type-C Error Recovery. + */ + usbc_request(dev, REQUEST_TC_ERROR_RECOVERY); return; } + + /* return to ready state */ pe_set_state(dev, PE_SNK_READY); return; } else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {