diff --git a/components/esp32/phy_init.c b/components/esp32/phy_init.c index 0e8c9b070..b8e791f7f 100644 --- a/components/esp32/phy_init.c +++ b/components/esp32/phy_init.c @@ -67,14 +67,27 @@ static _lock_t s_modem_sleep_lock; /* time stamp updated when the PHY/RF is turned on */ static int64_t s_phy_rf_en_ts = 0; +static DRAM_ATTR portMUX_TYPE s_phy_int_mux = portMUX_INITIALIZER_UNLOCKED; + uint32_t IRAM_ATTR phy_enter_critical(void) { - return portENTER_CRITICAL_NESTED(); + if (xPortInIsrContext()) { + portENTER_CRITICAL_ISR(&s_phy_int_mux); + } else { + portENTER_CRITICAL(&s_phy_int_mux); + } + // Interrupt level will be stored in current tcb, so always return zero. + return 0; } void IRAM_ATTR phy_exit_critical(uint32_t level) { - portEXIT_CRITICAL_NESTED(level); + // Param level don't need any more, ignore it. + if (xPortInIsrContext()) { + portEXIT_CRITICAL_ISR(&s_phy_int_mux); + } else { + portEXIT_CRITICAL(&s_phy_int_mux); + } } int64_t esp_phy_rf_get_on_ts(void)