From 1b3fb024d4483b7f4dc338d826c71c3538d08f9d Mon Sep 17 00:00:00 2001 From: Chen Wu Date: Thu, 21 Dec 2023 18:00:52 +0800 Subject: [PATCH] fix: Fixed an issue where init and deinit the wifi could lead to wifi scan issue --- .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../module_esp32-d2wd/patch/patch_list.ini | 4 + .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../module_esp32-sdio/patch/patch_list.ini | 4 + .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../module_esp32_default/patch/patch_list.ini | 4 + .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../module_esp32c3-spi/patch/patch_list.ini | 4 + .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../patch/patch_list.ini | 4 + .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../patch/patch_list.ini | 4 + .../patch/esp_wifi_deinit.patch | 248 ++++++++++++++++++ .../module_wrover-32/patch/patch_list.ini | 4 + 14 files changed, 1764 insertions(+) create mode 100644 module_config/module_esp32-d2wd/patch/esp_wifi_deinit.patch create mode 100644 module_config/module_esp32-sdio/patch/esp_wifi_deinit.patch create mode 100644 module_config/module_esp32_default/patch/esp_wifi_deinit.patch create mode 100644 module_config/module_esp32c3-spi/patch/esp_wifi_deinit.patch create mode 100644 module_config/module_esp32c3_default/patch/esp_wifi_deinit.patch create mode 100644 module_config/module_esp32c3_rainmaker/patch/esp_wifi_deinit.patch create mode 100644 module_config/module_wrover-32/patch/esp_wifi_deinit.patch diff --git a/module_config/module_esp32-d2wd/patch/esp_wifi_deinit.patch b/module_config/module_esp32-d2wd/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_esp32-d2wd/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_esp32-d2wd/patch/patch_list.ini b/module_config/module_esp32-d2wd/patch/patch_list.ini index 67c7b423..6595b343 100644 --- a/module_config/module_esp32-d2wd/patch/patch_list.ini +++ b/module_config/module_esp32-d2wd/patch/patch_list.ini @@ -7,3 +7,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)" diff --git a/module_config/module_esp32-sdio/patch/esp_wifi_deinit.patch b/module_config/module_esp32-sdio/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_esp32-sdio/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_esp32-sdio/patch/patch_list.ini b/module_config/module_esp32-sdio/patch/patch_list.ini index 67c7b423..6595b343 100644 --- a/module_config/module_esp32-sdio/patch/patch_list.ini +++ b/module_config/module_esp32-sdio/patch/patch_list.ini @@ -7,3 +7,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)" diff --git a/module_config/module_esp32_default/patch/esp_wifi_deinit.patch b/module_config/module_esp32_default/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_esp32_default/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_esp32_default/patch/patch_list.ini b/module_config/module_esp32_default/patch/patch_list.ini index 67c7b423..6595b343 100644 --- a/module_config/module_esp32_default/patch/patch_list.ini +++ b/module_config/module_esp32_default/patch/patch_list.ini @@ -7,3 +7,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)" diff --git a/module_config/module_esp32c3-spi/patch/esp_wifi_deinit.patch b/module_config/module_esp32c3-spi/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_esp32c3-spi/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_esp32c3-spi/patch/patch_list.ini b/module_config/module_esp32c3-spi/patch/patch_list.ini index 67c7b423..6595b343 100644 --- a/module_config/module_esp32c3-spi/patch/patch_list.ini +++ b/module_config/module_esp32c3-spi/patch/patch_list.ini @@ -7,3 +7,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)" diff --git a/module_config/module_esp32c3_default/patch/esp_wifi_deinit.patch b/module_config/module_esp32c3_default/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_esp32c3_default/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_esp32c3_default/patch/patch_list.ini b/module_config/module_esp32c3_default/patch/patch_list.ini index 67c7b423..6595b343 100644 --- a/module_config/module_esp32c3_default/patch/patch_list.ini +++ b/module_config/module_esp32c3_default/patch/patch_list.ini @@ -7,3 +7,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)" diff --git a/module_config/module_esp32c3_rainmaker/patch/esp_wifi_deinit.patch b/module_config/module_esp32c3_rainmaker/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_esp32c3_rainmaker/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_esp32c3_rainmaker/patch/patch_list.ini b/module_config/module_esp32c3_rainmaker/patch/patch_list.ini index 819d30ea..3843e4a5 100644 --- a/module_config/module_esp32c3_rainmaker/patch/patch_list.ini +++ b/module_config/module_esp32c3_rainmaker/patch/patch_list.ini @@ -15,3 +15,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)" diff --git a/module_config/module_wrover-32/patch/esp_wifi_deinit.patch b/module_config/module_wrover-32/patch/esp_wifi_deinit.patch new file mode 100644 index 00000000..40beefa8 --- /dev/null +++ b/module_config/module_wrover-32/patch/esp_wifi_deinit.patch @@ -0,0 +1,248 @@ +From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001 +From: Chen Wu +Date: Thu, 21 Dec 2023 17:48:36 +0800 +Subject: [PATCH] fix(wifi): fix deinit init wifi scan fail issue + +--- + components/esp_hw_support/periph_ctrl.c | 4 ++-- + components/esp_phy/src/phy_init.c | 10 +++++++--- + components/hal/esp32/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32c3/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s2/include/hal/clk_gate_ll.h | 8 +++----- + components/hal/esp32s3/include/hal/clk_gate_ll.h | 8 +++----- + components/soc/esp32/include/soc/dport_reg.h | 4 +++- + components/soc/esp32s2/include/soc/syscon_reg.h | 3 ++- + 9 files changed, 29 insertions(+), 32 deletions(-) + +diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c +index 8a226b236f..83b1f8ccbf 100644 +--- a/components/esp_hw_support/periph_ctrl.c ++++ b/components/esp_hw_support/periph_ctrl.c +@@ -47,7 +47,7 @@ IRAM_ATTR void wifi_bt_common_module_enable(void) + { + portENTER_CRITICAL_SAFE(&periph_spinlock); + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_enable_clk_clear_rst(); ++ periph_ll_wifi_bt_module_enable_clk(); + } + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; + portEXIT_CRITICAL_SAFE(&periph_spinlock); +@@ -58,7 +58,7 @@ IRAM_ATTR void wifi_bt_common_module_disable(void) + portENTER_CRITICAL_SAFE(&periph_spinlock); + ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; + if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { +- periph_ll_wifi_bt_module_disable_clk_set_rst(); ++ periph_ll_wifi_bt_module_disable_clk(); + } + portEXIT_CRITICAL_SAFE(&periph_spinlock); + } +diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c +index e70b0ea104..2586438603 100644 +--- a/components/esp_phy/src/phy_init.c ++++ b/components/esp_phy/src/phy_init.c +@@ -295,14 +295,18 @@ void IRAM_ATTR esp_wifi_bt_power_domain_on(void) + _lock_acquire(&s_wifi_bt_pd_controller.lock); + if (s_wifi_bt_pd_controller.count++ == 0) { + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PD); +- +-#if !CONFIG_IDF_TARGET_ESP32 ++ esp_rom_delay_us(10); ++ wifi_bt_common_module_enable(); ++#if CONFIG_IDF_TARGET_ESP32 ++ DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++ DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); ++#else + // modem reset when power on + SET_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + CLEAR_PERI_REG_MASK(SYSCON_WIFI_RST_EN_REG, MODEM_RESET_FIELD_WHEN_PU); + #endif +- + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_ISO); ++ wifi_bt_common_module_disable(); + } + _lock_release(&s_wifi_bt_pd_controller.lock); + #endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD +diff --git a/components/hal/esp32/include/hal/clk_gate_ll.h b/components/hal/esp32/include/hal/clk_gate_ll.h +index 8944c22ba2..7afaaf0548 100644 +--- a/components/hal/esp32/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -228,16 +228,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c2/include/hal/clk_gate_ll.h b/components/hal/esp32c2/include/hal/clk_gate_ll.h +index 522efa77ff..37cba21134 100644 +--- a/components/hal/esp32c2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -166,16 +166,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h +index 8f8526e1a9..edbc6451fe 100644 +--- a/components/hal/esp32c3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -215,16 +215,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h +index a1ef5be97a..acc1ce0e54 100644 +--- a/components/hal/esp32s2/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -241,16 +241,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h +index d3bd68d085..5e41f752fb 100644 +--- a/components/hal/esp32s3/include/hal/clk_gate_ll.h ++++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h +@@ -1,5 +1,5 @@ + /* +- * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD ++ * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +@@ -262,16 +262,14 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) + DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk(void) + { + DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + +-static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) ++static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk(void) + { + DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M); +- DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); + } + + static inline void periph_ll_reset(periph_module_t periph) +diff --git a/components/soc/esp32/include/soc/dport_reg.h b/components/soc/esp32/include/soc/dport_reg.h +index 3091138c39..74b87421df 100644 +--- a/components/soc/esp32/include/soc/dport_reg.h ++++ b/components/soc/esp32/include/soc/dport_reg.h +@@ -1077,8 +1077,10 @@ + #define DPORT_RW_BTMAC_RST BIT(9) + #define DPORT_RW_BTLP_RST BIT(10) + ++//ESP32 should not reset FE in esp_wifi_bt_power_domain_on(). ++//The FE of ESP32 is not in the WIFI PD power domain. ++//When turning off WIFI PD, the FE will not power down, so phy_wakeup_init() did not rewrite the FE register. + #define MODEM_RESET_FIELD_WHEN_PU (DPORT_WIFIBB_RST | \ +- DPORT_FE_RST | \ + DPORT_WIFIMAC_RST | \ + DPORT_BTBB_RST | \ + DPORT_BTMAC_RST | \ +diff --git a/components/soc/esp32s2/include/soc/syscon_reg.h b/components/soc/esp32s2/include/soc/syscon_reg.h +index 91d9e15375..62e031b55b 100644 +--- a/components/soc/esp32s2/include/soc/syscon_reg.h ++++ b/components/soc/esp32s2/include/soc/syscon_reg.h +@@ -443,7 +443,8 @@ extern "C" { + #define DPORT_WIFI_CLK_BT_EN_V 0x61 + #define DPORT_WIFI_CLK_BT_EN_S 11 + /* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +-#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 ++#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M + + /* Digital team to check */ + //bluetooth baseband bit11 +-- +2.34.1 + diff --git a/module_config/module_wrover-32/patch/patch_list.ini b/module_config/module_wrover-32/patch/patch_list.ini index 67c7b423..6595b343 100644 --- a/module_config/module_wrover-32/patch/patch_list.ini +++ b/module_config/module_wrover-32/patch/patch_list.ini @@ -7,3 +7,7 @@ [esp_tls_parse_ecc_key.patch] path = esp-idf note = "Fixed an issue where esp-tls is unable to parse ECC keys" + +[esp_wifi_deinit.patch] + path = esp-idf + note = "Fixed an issue where initializing and deinitializing the wifi could lead to wifi scanning failures (AR2023-009)"