feat(phy): add skip list to sleep phy link context and fix deinit crash

This commit is contained in:
cjin
2026-09-14 19:37:59 +08:00
parent 7d9240e67d
commit 520f9ec6a5
5 changed files with 58 additions and 43 deletions
+6
View File
@@ -260,5 +260,11 @@ menu "PHY"
help
Select to print PHY version in esp_phy_enable. This config only applies to esp32hxx for now.
config ESP_PHY_HW_SWITCH_RF
bool "Enable Hardware Triggered RF Switch"
depends on SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
default n
help
Enabling this feature will allow PHY disable and enable using REGDMA.
endif
endmenu # PHY
@@ -212,6 +212,7 @@ void esp_phy_modem_init(uint8_t modem);
* @param modem Modem calling phy retention
*/
void esp_phy_modem_deinit(uint8_t modem);
#if CONFIG_MAC_BB_PD
/**
* @brief Initialize backup memory for MAC and Baseband power up/down
+17 -9
View File
@@ -95,7 +95,7 @@ static bool s_is_phy_reg_stored = false;
/* Memory to store PHY digital registers */
static uint32_t* s_phy_digital_regs_mem = NULL;
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP || CONFIG_ESP_PHY_HW_SWITCH_RF
static uint8_t s_phy_modem_init_ref = 0;
#endif
@@ -338,7 +338,11 @@ void esp_phy_enable(esp_phy_modem_t modem)
if (!pm_mac_modem_rf_already_enabled()) {
#endif /* SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP */
if (sleep_modem_phy_link_enabled() && sleep_modem_phy_link_done()) {
sleep_modem_do_phy_retention(true);
uint8_t modem_flags = SLEEP_MODEM_SKIP_I2C_MST_CLK_RETENTION;
if (!sleep_modem_wifi_modem_state_is_enabled()) {
modem_flags |= SLEEP_MODEM_SKIP_WIFI_RETENTION;
}
sleep_modem_do_phy_retention(true, modem_flags);
} else {
phy_wakeup_init();
}
@@ -409,7 +413,11 @@ void esp_phy_disable(esp_phy_modem_t modem)
pm_mac_modem_clear_rf_power_state();
#endif /* SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP */
if (sleep_modem_phy_link_enabled()) {
sleep_modem_do_phy_retention(false);
uint8_t modem_flags = SLEEP_MODEM_SKIP_I2C_MST_CLK_RETENTION;
if (!sleep_modem_wifi_modem_state_is_enabled()) {
modem_flags |= SLEEP_MODEM_SKIP_WIFI_RETENTION;
}
sleep_modem_do_phy_retention(false, modem_flags);
} else
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */
{
@@ -478,7 +486,7 @@ void esp_wifi_bt_power_domain_off(void)
void esp_phy_modem_init(uint8_t modem)
{
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP || CONFIG_ESP_PHY_HW_SWITCH_RF
_lock_acquire(&s_phy_access_lock);
s_phy_modem_init_ref++;
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
@@ -486,16 +494,16 @@ void esp_phy_modem_init(uint8_t modem)
s_phy_digital_regs_mem = (uint32_t *)heap_caps_malloc(SOC_PHY_DIG_REGS_MEM_SIZE, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL);
}
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
#if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#if (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
sleep_modem_phy_init(modem);
#endif // CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#endif // (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
_lock_release(&s_phy_access_lock);
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
}
void esp_phy_modem_deinit(uint8_t modem)
{
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP || CONFIG_ESP_PHY_HW_SWITCH_RF
_lock_acquire(&s_phy_access_lock);
if (s_phy_modem_init_ref == 0) {
@@ -516,9 +524,9 @@ void esp_phy_modem_deinit(uint8_t modem)
#endif // CONFIG_IDF_TARGET_ESP32C3
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
}
#if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#if (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
sleep_modem_phy_deinit(modem);
#endif // SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
#endif // (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
_lock_release(&s_phy_access_lock);
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
}