diff --git a/arch/risc-v/src/esp32c3/esp_wifi_adapter.c b/arch/risc-v/src/esp32c3/esp_wifi_adapter.c index 0ddc7f1c85bbe..e51504592a8cf 100644 --- a/arch/risc-v/src/esp32c3/esp_wifi_adapter.c +++ b/arch/risc-v/src/esp32c3/esp_wifi_adapter.c @@ -40,6 +40,7 @@ #include "esp_hr_timer.h" #include "esp_log.h" +#include "esp_intr_alloc.h" #include "esp_mac.h" #include "esp_random.h" #include "esp_private/wifi_os_adapter.h" @@ -85,6 +86,12 @@ struct vector_desc_t vector_desc_t *next; }; +/* From esp_hw_support/intr_alloc.c: returns a pointer to a HAL-owned + * vector descriptor for some intno and cpu. + */ + +extern vector_desc_t *get_desc_for_int(int intno, int cpu); + /**************************************************************************** * Private Function Prototypes ****************************************************************************/ @@ -532,7 +539,9 @@ static void wifi_delete_queue_wrapper(void *queue) * Name: set_intr_wrapper * * Description: - * Do nothing + * Route the Wi-Fi interrupt source and attach a handle that uses the HAL + * global vector descriptor list. Mark the CPU line as non-IRAM so + * esp_intr_noniram_disable() masks it while SPI flash holds the cache off. * * Input Parameters: * cpu_no - The CPU which the interrupt number belongs. @@ -550,6 +559,7 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, { intr_handle_t handle; int irq = ESP_SOURCE2IRQ(intr_source); + esp_err_t err; wlinfo("cpu_no=%" PRId32 ", intr_source=%" PRIu32 ", intr_num=%" PRIu32 ", intr_prio=%" PRId32 "\n", @@ -566,22 +576,24 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, return; } - handle->vector_desc = kmm_calloc(1, sizeof(vector_desc_t)); + handle->vector_desc = get_desc_for_int(intr_num, cpu_no); if (handle->vector_desc == NULL) { - wlerr("Failed to kmm_calloc\n"); + wlerr("get_desc_for_int failed\n"); kmm_free(handle); return; } - handle->vector_desc->intno = intr_num; - handle->vector_desc->cpu = cpu_no; handle->vector_desc->source = intr_source; - handle->vector_desc->shared_vec_info = NULL; - handle->vector_desc->next = NULL; handle->shared_vector_desc = NULL; esp_set_handle(cpu_no, irq, handle); + + err = esp_intr_set_in_iram(handle, false); + if (err != ESP_OK) + { + wlerr("esp_intr_set_in_iram failed: %d\n", err); + } } /**************************************************************************** diff --git a/arch/risc-v/src/esp32c6/esp_wifi_adapter.c b/arch/risc-v/src/esp32c6/esp_wifi_adapter.c index 862af21cebff4..77896f311b5bd 100644 --- a/arch/risc-v/src/esp32c6/esp_wifi_adapter.c +++ b/arch/risc-v/src/esp32c6/esp_wifi_adapter.c @@ -121,6 +121,12 @@ struct vector_desc_t vector_desc_t *next; }; +/* From esp_hw_support/intr_alloc.c: returns a pointer to a HAL-owned + * vector descriptor for some intno and cpu. + */ + +extern vector_desc_t *get_desc_for_int(int intno, int cpu); + /**************************************************************************** * Private Function Prototypes ****************************************************************************/ @@ -566,7 +572,9 @@ static void wifi_delete_queue_wrapper(void *queue) * Name: set_intr_wrapper * * Description: - * Do nothing + * Route the Wi-Fi interrupt source and attach a handle that uses the HAL + * global vector descriptor list. Mark the CPU line as non-IRAM so + * esp_intr_noniram_disable() masks it while SPI flash holds the cache off. * * Input Parameters: * cpu_no - The CPU which the interrupt number belongs. @@ -584,6 +592,7 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, { intr_handle_t handle; int irq = ESP_SOURCE2IRQ(intr_source); + esp_err_t err; wlinfo("cpu_no=%" PRId32 ", intr_source=%" PRIu32 ", intr_num=%" PRIu32 ", intr_prio=%" PRId32 "\n", @@ -600,22 +609,24 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, return; } - handle->vector_desc = kmm_calloc(1, sizeof(vector_desc_t)); + handle->vector_desc = get_desc_for_int(intr_num, cpu_no); if (handle->vector_desc == NULL) { - wlerr("Failed to kmm_calloc\n"); + wlerr("get_desc_for_int failed\n"); kmm_free(handle); return; } - handle->vector_desc->intno = intr_num; - handle->vector_desc->cpu = cpu_no; handle->vector_desc->source = intr_source; - handle->vector_desc->shared_vec_info = NULL; - handle->vector_desc->next = NULL; handle->shared_vector_desc = NULL; esp_set_handle(cpu_no, irq, handle); + + err = esp_intr_set_in_iram(handle, false); + if (err != ESP_OK) + { + wlerr("esp_intr_set_in_iram failed: %d\n", err); + } } /**************************************************************************** diff --git a/arch/xtensa/src/esp32/esp32_wifi_adapter.c b/arch/xtensa/src/esp32/esp32_wifi_adapter.c index 5a6659919bb3d..fddae265cc089 100644 --- a/arch/xtensa/src/esp32/esp32_wifi_adapter.c +++ b/arch/xtensa/src/esp32/esp32_wifi_adapter.c @@ -49,6 +49,7 @@ #include "esp32_wifi_adapter.h" #include "esp_hr_timer.h" #include "esp_irq.h" +#include "esp_intr_alloc.h" #include "esp_cpu.h" #include "espressif/esp_wireless.h" #include "espressif/esp_wifi_utils.h" @@ -1752,7 +1753,9 @@ static bool wifi_env_is_chip(void) * Name: set_intr_wrapper * * Description: - * Do nothing + * Route the Wi-Fi interrupt source and attach a handle that uses the HAL + * global vector descriptor list. Mark the CPU line as non-IRAM so + * esp_intr_noniram_disable() masks it while SPI flash holds the cache off. * * Input Parameters: * cpu_no - The CPU which the interrupt number belongs. @@ -1770,6 +1773,7 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, { intr_handle_t handle; int irq = ESP_SOURCE2IRQ(intr_source); + esp_err_t err; wlinfo("cpu_no=%" PRId32 ", intr_source=%" PRIu32 ", intr_num=%" PRIu32 ", intr_prio=%" PRId32 "\n", @@ -1785,11 +1789,25 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, } handle->vector_desc = get_desc_for_int(intr_num, cpu_no); + if (handle->vector_desc == NULL) + { + wlerr("get_desc_for_int failed\n"); + kmm_free(handle); + return; + } + handle->vector_desc->source = intr_source; + handle->shared_vector_desc = NULL; /* Register the handle - it contains all needed information (cpuint, cpu) */ esp_set_handle(cpu_no, irq, handle); + + err = esp_intr_set_in_iram(handle, false); + if (err != OK) + { + wlerr("esp_intr_set_in_iram failed: %d\n", err); + } } /**************************************************************************** diff --git a/arch/xtensa/src/esp32s2/esp32s2_wifi_adapter.c b/arch/xtensa/src/esp32s2/esp32s2_wifi_adapter.c index 6f30680a3ca46..bb8a3deb8aa6b 100644 --- a/arch/xtensa/src/esp32s2/esp32s2_wifi_adapter.c +++ b/arch/xtensa/src/esp32s2/esp32s2_wifi_adapter.c @@ -44,6 +44,7 @@ #include "xtensa.h" #include "esp_attr.h" #include "esp_irq.h" +#include "esp_intr_alloc.h" #include "esp_cpu.h" #include "hardware/esp32s2_system.h" #include "soc/rtc_cntl_reg.h" @@ -95,6 +96,12 @@ struct vector_desc_t vector_desc_t *next; }; +/* From esp_hw_support/intr_alloc.c: returns a pointer to a HAL-owned + * vector descriptor for some intno and cpu. + */ + +extern vector_desc_t *get_desc_for_int(int intno, int cpu); + /**************************************************************************** * Private Function Prototypes ****************************************************************************/ @@ -1604,7 +1611,9 @@ static bool wifi_env_is_chip(void) * Name: set_intr_wrapper * * Description: - * Do nothing + * Route the Wi-Fi interrupt source and attach a handle that uses the HAL + * global vector descriptor list. Mark the CPU line as non-IRAM so + * esp_intr_noniram_disable() masks it while SPI flash holds the cache off. * * Input Parameters: * cpu_no - The CPU which the interrupt number belongs. @@ -1622,6 +1631,7 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, { intr_handle_t handle; int irq = ESP_SOURCE2IRQ(intr_source); + esp_err_t err; wlinfo("cpu_no=%" PRId32 ", intr_source=%" PRIu32 ", intr_num=%" PRIu32 ", intr_prio=%" PRId32 "\n", @@ -1636,24 +1646,26 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, return; } - handle->vector_desc = kmm_calloc(1, sizeof(vector_desc_t)); + handle->vector_desc = get_desc_for_int(intr_num, cpu_no); if (handle->vector_desc == NULL) { - wlerr("Failed to kmm_calloc\n"); + wlerr("get_desc_for_int failed\n"); kmm_free(handle); return; } - handle->vector_desc->intno = intr_num; - handle->vector_desc->cpu = cpu_no; handle->vector_desc->source = intr_source; - handle->vector_desc->shared_vec_info = NULL; - handle->vector_desc->next = NULL; handle->shared_vector_desc = NULL; /* Register the handle - it contains all needed information (cpuint, cpu) */ esp_set_handle(cpu_no, irq, handle); + + err = esp_intr_set_in_iram(handle, false); + if (err != OK) + { + wlerr("esp_intr_set_in_iram failed: %d\n", err); + } } /**************************************************************************** diff --git a/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c b/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c index 61f72f9beebd8..3d9d5339b5382 100644 --- a/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c +++ b/arch/xtensa/src/esp32s3/esp32s3_wifi_adapter.c @@ -44,6 +44,7 @@ #include "xtensa.h" #include "esp_attr.h" #include "esp_irq.h" +#include "esp_intr_alloc.h" #include "esp_cpu.h" #include "hardware/esp32s3_system.h" #include "soc/rtc_cntl_reg.h" @@ -267,6 +268,10 @@ static int coex_schm_flexible_period_set_wrapper(uint8_t period); static uint8_t coex_schm_flexible_period_get_wrapper(void); static void * coex_schm_get_phase_by_idx_wrapper(int phase_idx); +/* From esp_hw_support/intr_alloc.c: returns a pointer to a HAL-owned + * vector descriptor for some intno and cpu. + */ + extern vector_desc_t *get_desc_for_int(int intno, int cpu); /**************************************************************************** @@ -1738,7 +1743,9 @@ static bool wifi_env_is_chip(void) * Name: set_intr_wrapper * * Description: - * Do nothing + * Route the Wi-Fi interrupt source and attach a handle that uses the HAL + * global vector descriptor list. Mark the CPU line as non-IRAM so + * esp_intr_noniram_disable() masks it while SPI flash holds the cache off. * * Input Parameters: * cpu_no - The CPU which the interrupt number belongs. @@ -1756,6 +1763,7 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, { intr_handle_t handle; int irq = ESP_SOURCE2IRQ(intr_source); + esp_err_t err; wlinfo("cpu_no=%" PRId32 ", intr_source=%" PRIu32 ", intr_num=%" PRIu32 ", intr_prio=%" PRId32 "\n", @@ -1771,12 +1779,25 @@ static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, } handle->vector_desc = get_desc_for_int(intr_num, cpu_no); + if (handle->vector_desc == NULL) + { + wlerr("get_desc_for_int failed\n"); + kmm_free(handle); + return; + } handle->vector_desc->source = intr_source; + handle->shared_vector_desc = NULL; /* Register the handle - it contains all needed information (cpuint, cpu) */ esp_set_handle(cpu_no, irq, handle); + + err = esp_intr_set_in_iram(handle, false); + if (err != OK) + { + wlerr("esp_intr_set_in_iram failed: %d\n", err); + } } /****************************************************************************