Skip to content

Commit

Permalink
Merge branch 'bugfix/wifi_deinit_cause_to_scan_issue' into 'master'
Browse files Browse the repository at this point in the history
fix: Fixed an issue where init and deinit the wifi could lead to wifi scan issue

See merge request application/esp-at!1493
  • Loading branch information
xcguang committed Dec 22, 2023
2 parents 3068a78 + 1b3fb02 commit 5fe5106
Show file tree
Hide file tree
Showing 14 changed files with 1,764 additions and 0 deletions.
248 changes: 248 additions & 0 deletions module_config/module_esp32-d2wd/patch/esp_wifi_deinit.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
From 4dc68f0a6cb3199cf4c02df4862802293e05709c Mon Sep 17 00:00:00 2001
From: Chen Wu <[email protected]>
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

4 changes: 4 additions & 0 deletions module_config/module_esp32-d2wd/patch/patch_list.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
Loading

0 comments on commit 5fe5106

Please sign in to comment.