From 382debc996518b63fed2fd893e12e2aca2ece90f Mon Sep 17 00:00:00 2001 From: Tiago Medicci Serrano Date: Fri, 18 Aug 2023 08:56:11 -0300 Subject: [PATCH] esp32_c3_s3/wifi_ble: Use `nxsem_trywait` to take semphr from ISR Use the non-blocking `nxsem_trywait` to try to take the semaphore during the interrupt handler. --- arch/risc-v/src/esp32c3/esp32c3_ble_adapter.c | 15 ++++---- .../risc-v/src/esp32c3/esp32c3_wifi_adapter.c | 29 ++++++++------- arch/xtensa/src/esp32/esp32_ble_adapter.c | 21 ++++++++--- arch/xtensa/src/esp32/esp32_wifi_adapter.c | 35 +++++++++++-------- arch/xtensa/src/esp32s3/esp32s3_ble_adapter.c | 8 +++-- .../xtensa/src/esp32s3/esp32s3_wifi_adapter.c | 29 ++++++++------- 6 files changed, 84 insertions(+), 53 deletions(-) diff --git a/arch/risc-v/src/esp32c3/esp32c3_ble_adapter.c b/arch/risc-v/src/esp32c3/esp32c3_ble_adapter.c index dce292f5d6..d05cd5a63b 100644 --- a/arch/risc-v/src/esp32c3/esp32c3_ble_adapter.c +++ b/arch/risc-v/src/esp32c3/esp32c3_ble_adapter.c @@ -828,8 +828,9 @@ static void semphr_delete_wrapper(void *semphr) static int semphr_take_from_isr_wrapper(void *semphr, void *hptw) { - DEBUGPANIC(); - return false; + *(int *)hptw = 0; + + return esp_errno_trans(nxsem_trywait(semphr)); } /**************************************************************************** @@ -921,10 +922,6 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms) if (block_time_ms == OSI_FUNCS_TIME_BLOCKING) { ret = nxsem_wait(&bt_sem->sem); - if (ret) - { - wlerr("Failed to wait sem\n"); - } } else { @@ -938,6 +935,12 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms) } } + if (ret) + { + wlerr("ERROR: Failed to wait sem in %lu ticks. Error=%d\n", + MSEC2TICK(block_time_ms), ret); + } + return esp_errno_trans(ret); } diff --git a/arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c b/arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c index 46b41a0c57..86a7915388 100644 --- a/arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c +++ b/arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c @@ -1191,34 +1191,39 @@ static void esp_semphr_delete(void *semphr) * Wait semaphore within a certain period of time * * Input Parameters: - * semphr - Semaphore data pointer - * ticks - Wait system ticks + * semphr - Semaphore data pointer + * block_time_tick - Wait system ticks * * Returned Value: * True if success or false if fail * ****************************************************************************/ -static int32_t esp_semphr_take(void *semphr, uint32_t ticks) +static int32_t esp_semphr_take(void *semphr, uint32_t block_time_tick) { int ret; sem_t *sem = (sem_t *)semphr; - if (ticks == OSI_FUNCS_TIME_BLOCKING) + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { ret = nxsem_wait(sem); - if (ret) - { - wlerr("ERROR: Failed to wait sem\n"); - } } else { - ret = nxsem_tickwait(sem, ticks); - if (ret) + if (block_time_tick > 0) { - wlerr("ERROR: Failed to wait sem in %lu ticks\n", ticks); + ret = nxsem_tickwait(sem, block_time_tick); } + else + { + ret = nxsem_trywait(sem); + } + } + + if (ret) + { + wlerr("ERROR: Failed to wait sem in %lu ticks. Error=%d\n", + block_time_tick, ret); } return osi_errno_trans(ret); @@ -1271,7 +1276,7 @@ static int32_t esp_semphr_take_from_isr(void *semphr, void *hptw) { *(int *)hptw = 0; - return esp_semphr_take(semphr, 0); + return esp_errno_trans(nxsem_trywait(semphr)); } /**************************************************************************** diff --git a/arch/xtensa/src/esp32/esp32_ble_adapter.c b/arch/xtensa/src/esp32/esp32_ble_adapter.c index dc33fea4d8..4c6ff3b65c 100644 --- a/arch/xtensa/src/esp32/esp32_ble_adapter.c +++ b/arch/xtensa/src/esp32/esp32_ble_adapter.c @@ -1192,6 +1192,8 @@ static void semphr_delete_wrapper(void *semphr) static int IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw) { + *(int *)hptw = 0; + return esp_errno_trans(nxsem_trywait(semphr)); } @@ -1267,14 +1269,23 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms) if (block_time_ms == OSI_FUNCS_TIME_BLOCKING) { ret = nxsem_wait(sem); - if (ret) - { - wlerr("Failed to wait sem %d\n", ret); - } } else { - ret = nxsem_tickwait(sem, MSEC2TICK(block_time_ms)); + if (block_time_ms > 0) + { + ret = nxsem_tickwait(sem, MSEC2TICK(block_time_ms)); + } + else + { + ret = nxsem_trywait(sem); + } + } + + if (ret) + { + wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n", + MSEC2TICK(block_time_ms), ret); } return esp_errno_trans(ret); diff --git a/arch/xtensa/src/esp32/esp32_wifi_adapter.c b/arch/xtensa/src/esp32/esp32_wifi_adapter.c index 3c1d5c9ef0..0d2e5066e3 100644 --- a/arch/xtensa/src/esp32/esp32_wifi_adapter.c +++ b/arch/xtensa/src/esp32/esp32_wifi_adapter.c @@ -1113,34 +1113,39 @@ static void esp_semphr_delete(void *semphr) * Wait semaphore within a certain period of time * * Input Parameters: - * semphr - Semaphore data pointer - * ticks - Wait system ticks + * semphr - Semaphore data pointer + * block_time_tick - Wait system ticks * * Returned Value: * True if success or false if fail * ****************************************************************************/ -static int32_t esp_semphr_take(void *semphr, uint32_t ticks) +static int32_t esp_semphr_take(void *semphr, uint32_t block_time_tick) { int ret; sem_t *sem = (sem_t *)semphr; - if (ticks == OSI_FUNCS_TIME_BLOCKING) + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { ret = nxsem_wait(sem); - if (ret) - { - wlerr("Failed to wait sem\n"); - } } else { - ret = nxsem_tickwait(sem, ticks); - if (ret) + if (block_time_tick > 0) { - wlerr("Failed to wait sem in %d ticks\n", ticks); + ret = nxsem_tickwait(sem, block_time_tick); } + else + { + ret = nxsem_trywait(sem); + } + } + + if (ret) + { + wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n", + block_time_tick, ret); } return osi_errno_trans(ret); @@ -1189,11 +1194,11 @@ static int32_t esp_semphr_give(void *semphr) * ****************************************************************************/ -static int32_t esp_semphr_take_from_isr(void *semphr, void *hptw) +static int32_t IRAM_ATTR esp_semphr_take_from_isr(void *semphr, void *hptw) { *(int *)hptw = 0; - return esp_semphr_take(semphr, 0); + return osi_errno_trans(nxsem_trywait(semphr)); } /**************************************************************************** @@ -1210,11 +1215,11 @@ static int32_t esp_semphr_take_from_isr(void *semphr, void *hptw) * ****************************************************************************/ -static int32_t esp_semphr_give_from_isr(void *semphr, void *hptw) +static int32_t IRAM_ATTR esp_semphr_give_from_isr(void *semphr, void *hptw) { *(int *)hptw = 0; - return esp_semphr_give(semphr); + return osi_errno_trans(nxsem_post(semphr)); } /**************************************************************************** diff --git a/arch/xtensa/src/esp32s3/esp32s3_ble_adapter.c b/arch/xtensa/src/esp32s3/esp32s3_ble_adapter.c index 520dc9e938..31fc7c9b37 100644 --- a/arch/xtensa/src/esp32s3/esp32s3_ble_adapter.c +++ b/arch/xtensa/src/esp32s3/esp32s3_ble_adapter.c @@ -894,8 +894,9 @@ static void semphr_delete_wrapper(void *semphr) static int IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw) { - DEBUGPANIC(); - return false; + *(int *)hptw = 0; + + return esp_errno_trans(nxsem_trywait(semphr)); } /**************************************************************************** @@ -988,7 +989,8 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms) if (ret) { - wlerr("Failed to take sem error=%d\n", ret); + wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n", + MSEC2TICK(block_time_ms), ret); } return esp_errno_trans(ret); diff --git a/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c b/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c index b794f6b203..79c145bd5e 100644 --- a/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c +++ b/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c @@ -1087,34 +1087,39 @@ static void esp_semphr_delete(void *semphr) * Wait semaphore within a certain period of time * * Input Parameters: - * semphr - Semaphore data pointer - * ticks - Wait system ticks + * semphr - Semaphore data pointer + * block_time_tick - Wait system ticks * * Returned Value: * True if success or false if fail * ****************************************************************************/ -static int32_t esp_semphr_take(void *semphr, uint32_t ticks) +static int32_t esp_semphr_take(void *semphr, uint32_t block_time_tick) { int ret; sem_t *sem = (sem_t *)semphr; - if (ticks == OSI_FUNCS_TIME_BLOCKING) + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { ret = nxsem_wait(sem); - if (ret) - { - wlerr("Failed to wait sem\n"); - } } else { - ret = nxsem_tickwait(sem, ticks); - if (ret) + if (block_time_tick > 0) { - wlerr("Failed to wait sem in %d ticks\n", ticks); + ret = nxsem_tickwait(sem, block_time_tick); } + else + { + ret = nxsem_trywait(sem); + } + } + + if (ret) + { + wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n", + block_time_tick, ret); } return osi_errno_trans(ret); @@ -2289,7 +2294,7 @@ static int IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw) { *(int *)hptw = 0; - return esp_semphr_take(semphr, 0); + return osi_errno_trans(nxsem_trywait(semphr)); } /****************************************************************************