This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 382debc996518b63fed2fd893e12e2aca2ece90f
Author: Tiago Medicci Serrano <[email protected]>
AuthorDate: Fri Aug 18 08:56:11 2023 -0300

    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 ++++++-----
 arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c | 29 ++++++++++++---------
 arch/xtensa/src/esp32/esp32_ble_adapter.c      | 19 +++++++++++---
 arch/xtensa/src/esp32/esp32_wifi_adapter.c     | 35 +++++++++++++++-----------
 arch/xtensa/src/esp32s3/esp32s3_ble_adapter.c  |  8 +++---
 arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c | 29 ++++++++++++---------
 6 files changed, 83 insertions(+), 52 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)
+    }
+  else
+    {
+      if (block_time_ms > 0)
+        {
+          ret = nxsem_tickwait(sem, MSEC2TICK(block_time_ms));
+        }
+      else
         {
-          wlerr("Failed to wait sem %d\n", ret);
+          ret = nxsem_trywait(sem);
         }
     }
-  else
+
+  if (ret)
     {
-      ret = nxsem_tickwait(sem, MSEC2TICK(block_time_ms));
+      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));
 }
 
 /****************************************************************************

Reply via email to