diff --git a/arch/arm/src/stm32/stm32_otgfsdev.c b/arch/arm/src/stm32/stm32_otgfsdev.c index 461d500ad17..2d6ca9831c4 100644 --- a/arch/arm/src/stm32/stm32_otgfsdev.c +++ b/arch/arm/src/stm32/stm32_otgfsdev.c @@ -3900,7 +3900,7 @@ static void stm32_epout_disable(FAR struct stm32_ep_s *privep) * Name: stm32_epin_disable * * Description: - * Diable an IN endpoint will no longer be used + * Disable an IN endpoint when it will no longer be used * *******************************************************************************/ @@ -3912,6 +3912,17 @@ static void stm32_epin_disable(FAR struct stm32_ep_s *privep) usbtrace(TRACE_EPDISABLE, privep->epphy); + /* After USB reset, the endpoint will already be deactivated by the + * hardware. Trying to disable again will just hang in the wait. + */ + + regaddr = STM32_OTGFS_DIEPCTL(privep->epphy); + regval = stm32_getreg(regaddr); + if ((regval & OTGFS_DIEPCTL_USBAEP) == 0) + { + return; + } + /* Make sure that there is no pending IPEPNE interrupt (because we are * to poll this bit below). */