From 2ff9085d4d36c82ff149d53736b7cd540ecd75c4 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Thu, 20 Feb 2025 16:05:27 +0100 Subject: [PATCH] fix(usb/host): Fix disconnection error handling In a very rare case of having 2 or more events of type DISCONNECTION/ERROR/OVERCURRENT in a short time, the driver has not yet recovered from the 1st error but already got a 2nd error. Closes https://github.com/espressif/esp-idf/issues/13364 Closes https://github.com/espressif/esp-idf/issues/15290 --- components/usb/hub.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/components/usb/hub.c b/components/usb/hub.c index 2b98a057b4..4a713c618e 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -826,6 +826,13 @@ reset_err: // There is an enabled (active) device. We need to indicate to USBH that the device is gone pass_event_to_usbh = true; break; + case ROOT_PORT_STATE_RECOVERY: + // In a very rare case of having 2 or more events of type DISCONNECTION/ERROR/OVERCURRENT + // in a short time, we can endup here, where the driver has not yet recovered from + // the 1st error but already got a 2nd error. + // Just check that the RECOVER action is requested and return + assert(p_hub_driver_obj->dynamic.port_reqs | PORT_REQ_RECOVER); + break; default: abort(); // Should never occur break;