diff --git a/components/esp_hal_pmu/esp32c5/include/hal/pau_ll.h b/components/esp_hal_pmu/esp32c5/include/hal/pau_ll.h index 877bb992b46..f480d84fc9b 100644 --- a/components/esp_hal_pmu/esp32c5/include/hal/pau_ll.h +++ b/components/esp_hal_pmu/esp32c5/include/hal/pau_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -54,6 +54,31 @@ static inline void pau_ll_set_regdma_entry_link_backup_start_enable(pau_dev_t *d dev->regdma_conf.start = enable; } +static inline void pau_ll_set_regdma_select_wifimac_link(pau_dev_t *dev) +{ + dev->regdma_conf.sel_mac = 1; +} + +static inline void pau_ll_set_regdma_deselect_wifimac_link(pau_dev_t *dev) +{ + dev->regdma_conf.sel_mac = 0; +} + +static inline void pau_ll_set_regdma_wifimac_link_backup_direction(pau_dev_t *dev, bool to_mem) +{ + dev->regdma_conf.to_mem_mac = to_mem ? 1 : 0; +} + +static inline void pau_ll_set_regdma_wifimac_link_backup_start_enable(pau_dev_t *dev) +{ + dev->regdma_conf.start_mac = 1; +} + +static inline void pau_ll_set_regdma_wifimac_link_backup_start_disable(pau_dev_t *dev) +{ + dev->regdma_conf.start_mac = 0; +} + static inline uint32_t pau_ll_get_regdma_current_link_addr(pau_dev_t *dev) { return dev->regdma_current_link_addr.val; diff --git a/components/esp_hal_pmu/esp32c5/pau_hal.c b/components/esp_hal_pmu/esp32c5/pau_hal.c index d0887f780ea..f627c746c34 100644 --- a/components/esp_hal_pmu/esp32c5/pau_hal.c +++ b/components/esp_hal_pmu/esp32c5/pau_hal.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -32,6 +32,25 @@ void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal) pau_ll_clear_regdma_backup_done_intr_state(hal->dev); } +#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND +void IRAM_ATTR pau_hal_start_regdma_wifimac_link(pau_hal_context_t *hal, bool backup_or_restore) +{ + pau_ll_clear_regdma_backup_done_intr_state(hal->dev); + pau_ll_set_regdma_select_wifimac_link(hal->dev); + pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore); + pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev); + + while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW)); +} + +void IRAM_ATTR pau_hal_stop_regdma_wifimac_link(pau_hal_context_t *hal) +{ + pau_ll_set_regdma_wifimac_link_backup_start_disable(hal->dev); + pau_ll_set_regdma_deselect_wifimac_link(hal->dev); + pau_ll_clear_regdma_backup_done_intr_state(hal->dev); +} +#endif + void IRAM_ATTR pau_hal_start_regdma_extra_link(pau_hal_context_t *hal, bool backup_or_restore) { pau_ll_clear_regdma_backup_done_intr_state(hal->dev); diff --git a/components/esp_hal_pmu/include/hal/pau_hal.h b/components/esp_hal_pmu/include/hal/pau_hal.h index 522889a85b6..60b5c129599 100644 --- a/components/esp_hal_pmu/include/hal/pau_hal.h +++ b/components/esp_hal_pmu/include/hal/pau_hal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -61,6 +61,23 @@ void pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_rest * @param hal regdma hal context */ void pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal); + +#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND +/** + * @brief Start transmission on regdma WiFi MAC SEL link + * + * @param hal regdma hal context + * @param backup_or_restore false: restore, true: backup + */ +void pau_hal_start_regdma_wifimac_link(pau_hal_context_t *hal, bool backup_or_restore); + +/** + * @brief Stop transmission on regdma WiFi MAC SEL link + * + * @param hal regdma hal context + */ +void pau_hal_stop_regdma_wifimac_link(pau_hal_context_t *hal); +#endif #endif #if SOC_PM_RETENTION_SW_TRIGGER_REGDMA diff --git a/components/esp_hw_support/include/esp_private/esp_pau.h b/components/esp_hw_support/include/esp_private/esp_pau.h index f82d0f7dbbe..89b628affa9 100644 --- a/components/esp_hw_support/include/esp_private/esp_pau.h +++ b/components/esp_hw_support/include/esp_private/esp_pau.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -41,6 +41,18 @@ void pau_regdma_trigger_modem_link_backup(void); * @brief Software trigger regdma to perform modem link restore */ void pau_regdma_trigger_modem_link_restore(void); + +#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND +/** + * @brief Software trigger REGDMA backup on WiFi MAC SEL link + */ +void pau_regdma_trigger_wifimac_link_backup(void); + +/** + * @brief Software trigger REGDMA restore on WiFi MAC SEL link + */ +void pau_regdma_trigger_wifimac_link_restore(void); +#endif #endif #if SOC_PM_RETENTION_SW_TRIGGER_REGDMA diff --git a/components/esp_hw_support/include/esp_private/sleep_modem.h b/components/esp_hw_support/include/esp_private/sleep_modem.h index 5e6aa72fa3f..47ad7548e6e 100644 --- a/components/esp_hw_support/include/esp_private/sleep_modem.h +++ b/components/esp_hw_support/include/esp_private/sleep_modem.h @@ -83,8 +83,9 @@ void sleep_modem_mac_bb_power_up_prepare(void); * @brief The retention action in the modem state of WiFi PHY module * * @param restore true for restore the PHY context, false for backup the PHY context + * @param wifimac_link_is_sel true to trigger REGDMA via WiFi MAC link */ -void sleep_modem_wifi_do_phy_retention(bool restore); +void sleep_modem_wifi_do_phy_retention(bool restore, bool wifimac_link_is_sel); /** * @brief Get WiFi modem state diff --git a/components/esp_hw_support/include/esp_private/sleep_retention.h b/components/esp_hw_support/include/esp_private/sleep_retention.h index 3b5671eb828..e10199af0b8 100644 --- a/components/esp_hw_support/include/esp_private/sleep_retention.h +++ b/components/esp_hw_support/include/esp_private/sleep_retention.h @@ -293,8 +293,10 @@ void sleep_retention_do_system_retention(bool backup_or_restore); * * @param backup_or_restore true for backup register context to memory * or false for restore to register from memory + * @param wifimac_link_is_sel true to use dedicated WiFi MAC link, + * false to use modem entry link */ -void sleep_retention_do_phy_retention(bool backup_or_restore); +void sleep_retention_do_phy_retention(bool backup_or_restore, bool wifimac_link_is_sel); #endif /*SOC_PM_SUPPORT_PMU_MODEM_STATE */ #endif // SOC_PAU_SUPPORTED diff --git a/components/esp_hw_support/linker.lf b/components/esp_hw_support/linker.lf index 3b1687008be..c3363ea55a9 100644 --- a/components/esp_hw_support/linker.lf +++ b/components/esp_hw_support/linker.lf @@ -84,6 +84,18 @@ entries: sleep_modes: esp_sleep_enable_vbat_under_volt_wakeup (noflash) sleep_modes: esp_sleep_sub_mode_config (noflash) sleep_modes: esp_sleep_sub_mode_force_disable (noflash) + if SOC_PM_MODEM_RETENTION_BY_REGDMA = y && ESP_PHY_MAC_BB_PD = y: + sleep_retention:sleep_retention_find_link_by_id (noflash) + regdma_link:regdma_find_link_by_id (noflash) + regdma_link:regdma_link_get_next (noflash) + regdma_link:regdma_link_get_next_continuous_wrapper (noflash) + regdma_link:regdma_link_get_next_addr_map_wrapper (noflash) + regdma_link:regdma_link_get_next_write_wait_wrapper (noflash) + regdma_link:regdma_link_get_next_branch_continuous_wrapper (noflash) + regdma_link:regdma_link_get_next_branch_addr_map_wrapper (noflash) + regdma_link:regdma_link_get_next_branch_write_wait_wrapper (noflash) + regdma_link:regdma_link_set_write_wait_content (noflash) + regdma_link:regdma_link_get_instance (noflash) [mapping:hal_gpio_pm] archive: libesp_hal_gpio.a diff --git a/components/esp_hw_support/port/pau_regdma.c b/components/esp_hw_support/port/pau_regdma.c index 03281ce7b76..ae1bf22f8c9 100644 --- a/components/esp_hw_support/port/pau_regdma.c +++ b/components/esp_hw_support/port/pau_regdma.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -87,6 +87,20 @@ void IRAM_ATTR pau_regdma_trigger_modem_link_restore(void) pau_hal_start_regdma_modem_link(PAU_instance()->hal, false); pau_hal_stop_regdma_modem_link(PAU_instance()->hal); } + +#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND +void IRAM_ATTR pau_regdma_trigger_wifimac_link_backup(void) +{ + pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, true); + pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal); +} + +void IRAM_ATTR pau_regdma_trigger_wifimac_link_restore(void) +{ + pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, false); + pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal); +} +#endif #endif #if SOC_PM_RETENTION_SW_TRIGGER_REGDMA diff --git a/components/esp_hw_support/port/regdma_link.c b/components/esp_hw_support/port/regdma_link.c index 9e6fef5bbfc..1fb365877f1 100644 --- a/components/esp_hw_support/port/regdma_link.c +++ b/components/esp_hw_support/port/regdma_link.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -318,43 +318,43 @@ void * regdma_link_init(const regdma_link_config_t *config, bool branch, int mod return link; } -static void * regdma_link_get_next_continuous_wrapper(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_next_continuous_wrapper(void *link) { regdma_link_continuous_t *continuous = __containerof(link, regdma_link_continuous_t, head); return (void *)(continuous->body.next); } -static void * regdma_link_get_next_addr_map_wrapper(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_next_addr_map_wrapper(void *link) { regdma_link_addr_map_t *addr_map = __containerof(link, regdma_link_addr_map_t, head); return (void *)(addr_map->body.next); } -static void * regdma_link_get_next_write_wait_wrapper(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_next_write_wait_wrapper(void *link) { regdma_link_write_wait_t *write_wait = __containerof(link, regdma_link_write_wait_t, head); return (void *)(write_wait->body.next); } -static regdma_entry_buf_t * regdma_link_get_next_branch_continuous_wrapper(void *link) +__attribute__((used, noinline)) static regdma_entry_buf_t * regdma_link_get_next_branch_continuous_wrapper(void *link) { regdma_link_branch_continuous_t *branch_continuous = __containerof(link, regdma_link_branch_continuous_t, head); return &branch_continuous->body.next; } -static regdma_entry_buf_t * regdma_link_get_next_branch_addr_map_wrapper(void *link) +__attribute__((used, noinline)) static regdma_entry_buf_t * regdma_link_get_next_branch_addr_map_wrapper(void *link) { regdma_link_branch_addr_map_t *branch_addr_map = __containerof(link, regdma_link_branch_addr_map_t, head); return &branch_addr_map->body.next; } -static regdma_entry_buf_t * regdma_link_get_next_branch_write_wait_wrapper(void *link) +__attribute__((used, noinline)) static regdma_entry_buf_t * regdma_link_get_next_branch_write_wait_wrapper(void *link) { regdma_link_branch_write_wait_t *branch_write_wait = __containerof(link, regdma_link_branch_write_wait_t, head); return &branch_write_wait->body.next; } -static void * regdma_link_get_next(void *link, int entry) +__attribute__((used, noinline)) static void * regdma_link_get_next(void *link, int entry) { if (link) { regdma_link_head_t head = REGDMA_LINK_HEAD(link); @@ -407,7 +407,7 @@ void * regdma_link_recursive(void *link, int entry, void (*hook)(void *, int, in return regdma_link_recursive_impl(link, entry, 0, hook); } -static void * regdma_link_get_instance(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_instance(void *link) { void * container_memaddr[] = { (void *)__containerof(link, regdma_link_continuous_t, head), diff --git a/components/esp_hw_support/sleep_modem.c b/components/esp_hw_support/sleep_modem.c index 9bc27d130b3..1bffcf6129e 100644 --- a/components/esp_hw_support/sleep_modem.c +++ b/components/esp_hw_support/sleep_modem.c @@ -171,10 +171,10 @@ __attribute__((unused)) void sleep_modem_wifi_modem_state_deinit(void) } } -void IRAM_ATTR sleep_modem_wifi_do_phy_retention(bool restore) +void IRAM_ATTR sleep_modem_wifi_do_phy_retention(bool restore, bool wifimac_link_is_sel) { sleep_modem_state_phy_link_config(s_sleep_modem.wifi.phy_link, 1); - sleep_retention_do_phy_retention(!restore); + sleep_retention_do_phy_retention(!restore, wifimac_link_is_sel); sleep_modem_state_phy_link_config(s_sleep_modem.wifi.phy_link, 0); if (!restore) { s_sleep_modem.wifi.modem_state_phy_done = 1; diff --git a/components/esp_hw_support/sleep_retention.c b/components/esp_hw_support/sleep_retention.c index 73fbac4533c..eb4232a3e8b 100644 --- a/components/esp_hw_support/sleep_retention.c +++ b/components/esp_hw_support/sleep_retention.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -1007,7 +1007,7 @@ void IRAM_ATTR sleep_retention_do_system_retention(bool backup_or_restore) #endif #if SOC_PM_SUPPORT_PMU_MODEM_STATE -void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore) +void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore, bool wifimac_link_is_sel) { /* since the PHY link and other module links are within the sleep-retention entry (4) context, * add mutex protection to avoid data race. @@ -1016,9 +1016,23 @@ void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore) _lock_acquire_recursive(&s_retention.lock); #endif if (backup_or_restore) { - pau_regdma_trigger_modem_link_backup(); +#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND + if (wifimac_link_is_sel) { + pau_regdma_trigger_wifimac_link_backup(); + } else +#endif + { + pau_regdma_trigger_modem_link_backup(); + } } else { - pau_regdma_trigger_modem_link_restore(); +#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND + if (wifimac_link_is_sel) { + pau_regdma_trigger_wifimac_link_restore(); + } else +#endif + { + pau_regdma_trigger_modem_link_restore(); + } } #if SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY _lock_release_recursive(&s_retention.lock); diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c index 50487e10227..ea990c6e857 100644 --- a/components/esp_phy/src/phy_init.c +++ b/components/esp_phy/src/phy_init.c @@ -23,6 +23,7 @@ #include "esp_private/esp_sleep_internal.h" #include "esp_check.h" #include "sdkconfig.h" +#include "soc/soc_caps.h" #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "endian.h" @@ -73,6 +74,9 @@ extern wifi_mac_time_update_cb_t s_wifi_mac_time_update_cb; #if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP extern void pm_mac_modem_clear_rf_power_state(void); extern bool pm_mac_modem_rf_already_enabled(void); +#if SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC +extern bool pm_get_wifimac_regdma_link_selection(void); +#endif #endif static const char* TAG = "phy_init"; @@ -341,9 +345,23 @@ void esp_phy_enable(esp_phy_modem_t modem) s_is_phy_calibrated = true; } else { #if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP + bool wifimac_link_is_sel = false; if (!pm_mac_modem_rf_already_enabled()) { if (sleep_modem_wifi_modem_state_enabled() && sleep_modem_wifi_modem_link_done()) { - sleep_modem_wifi_do_phy_retention(true); +#if SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC && SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND +/* + * A race exists between SoC wakeup and modem state sleep. After modem initiates sleep, + * SoC may wake up before REGDMA completes RF close, leaving mac_modem_sleep_flag uncleared + * (it depends on regdma done). The stale flag can incorrectly trigger a sleep request + * on the next modem entry, causing abnormal sleep behavior. + * + * Therefore, this workaround ensures that mac_modem_sleep_flag is properly + * cleared by regdma closing RF with wifimac link. + * See WIFI-7246 for details. +*/ + wifimac_link_is_sel = pm_get_wifimac_regdma_link_selection(); +#endif + sleep_modem_wifi_do_phy_retention(true, wifimac_link_is_sel); } else { // TODO: IDF-15338 #if CONFIG_IDF_TARGET_ESP32C5 @@ -419,7 +437,11 @@ void esp_phy_disable(esp_phy_modem_t modem) #if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP pm_mac_modem_clear_rf_power_state(); if (sleep_modem_wifi_modem_state_enabled()) { - sleep_modem_wifi_do_phy_retention(false); + bool wifimac_link_is_sel = false; +#if SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC && SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND + wifimac_link_is_sel = pm_get_wifimac_regdma_link_selection(); +#endif + sleep_modem_wifi_do_phy_retention(false, wifimac_link_is_sel); } else #endif /* SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP */ { diff --git a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld index a12a0b60ec7..192d3b69db6 100644 --- a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld +++ b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld @@ -882,8 +882,8 @@ ampdu_dispatch_as_many_as_possible = 0x4000182c; ampdu_dispatch_movement = 0x40001830; ampdu_dispatch_upto = 0x40001834; chm_is_at_home_channel = 0x40001838; -cnx_node_is_existing = 0x4000183c; -cnx_node_search = 0x40001840; +/*cnx_node_is_existing = 0x4000183c;*/ +/*cnx_node_search = 0x40001840;*/ ic_ebuf_recycle_rx = 0x40001844; ic_ebuf_recycle_tx = 0x40001848; ic_reset_rx_ba = 0x4000184c; diff --git a/components/esp_rom/esp32c5/ld/esp32c5.rom.net80211.ld b/components/esp_rom/esp32c5/ld/esp32c5.rom.net80211.ld index 59cea298412..a1f9185cb01 100644 --- a/components/esp_rom/esp32c5/ld/esp32c5.rom.net80211.ld +++ b/components/esp_rom/esp32c5/ld/esp32c5.rom.net80211.ld @@ -26,8 +26,8 @@ ampdu_dispatch_as_many_as_possible = 0x40000b28; ampdu_dispatch_movement = 0x40000b2c; ampdu_dispatch_upto = 0x40000b30; chm_is_at_home_channel = 0x40000b34; -cnx_node_is_existing = 0x40000b38; -cnx_node_search = 0x40000b3c; +/*cnx_node_is_existing = 0x40000b38;*/ +/*cnx_node_search = 0x40000b3c;*/ ic_ebuf_recycle_rx = 0x40000b40; ic_ebuf_recycle_tx = 0x40000b44; ic_reset_rx_ba = 0x40000b48; diff --git a/components/esp_rom/esp32c6/ld/esp32c6.rom.net80211.ld b/components/esp_rom/esp32c6/ld/esp32c6.rom.net80211.ld index ef8d8dac6f7..99d7e519180 100644 --- a/components/esp_rom/esp32c6/ld/esp32c6.rom.net80211.ld +++ b/components/esp_rom/esp32c6/ld/esp32c6.rom.net80211.ld @@ -25,8 +25,8 @@ ampdu_dispatch_as_many_as_possible = 0x40000b58; ampdu_dispatch_movement = 0x40000b5c; ampdu_dispatch_upto = 0x40000b60; chm_is_at_home_channel = 0x40000b64; -cnx_node_is_existing = 0x40000b68; -cnx_node_search = 0x40000b6c; +/*cnx_node_is_existing = 0x40000b68;*/ +/*cnx_node_search = 0x40000b6c;*/ ic_ebuf_recycle_rx = 0x40000b70; ic_ebuf_recycle_tx = 0x40000b74; ic_reset_rx_ba = 0x40000b78; diff --git a/components/esp_rom/esp32c61/ld/esp32c61.rom.eco4.ld b/components/esp_rom/esp32c61/ld/esp32c61.rom.eco4.ld index ab4622513ae..81b9ff497b5 100644 --- a/components/esp_rom/esp32c61/ld/esp32c61.rom.eco4.ld +++ b/components/esp_rom/esp32c61/ld/esp32c61.rom.eco4.ld @@ -27,7 +27,7 @@ pm_set_beacon_filter = 0x40000cd8; //pm_is_in_wifi_slice_threshold = 0x40000cdc; //pm_keep_alive = 0x40000ce4; pm_process_tim = 0x40000d14; -pm_tbtt_process = 0x40000d28; +//pm_tbtt_process = 0x40000d28; pm_tx_data_process = 0x40000d44; pm_twt_process = 0x40000d54; pm_mac_try_enable_modem_state = 0x40000d68; diff --git a/components/esp_rom/esp32c61/ld/esp32c61.rom.net80211.ld b/components/esp_rom/esp32c61/ld/esp32c61.rom.net80211.ld index 90100d37050..2aeaab617f8 100644 --- a/components/esp_rom/esp32c61/ld/esp32c61.rom.net80211.ld +++ b/components/esp_rom/esp32c61/ld/esp32c61.rom.net80211.ld @@ -22,8 +22,8 @@ ampdu_dispatch_as_many_as_possible = 0x40000a90; ampdu_dispatch_movement = 0x40000a94; ampdu_dispatch_upto = 0x40000a98; chm_is_at_home_channel = 0x40000a9c; -cnx_node_is_existing = 0x40000aa0; -cnx_node_search = 0x40000aa4; +/*cnx_node_is_existing = 0x40000aa0;*/ +/*cnx_node_search = 0x40000aa4;*/ ic_ebuf_recycle_rx = 0x40000aa8; ic_ebuf_recycle_tx = 0x40000aac; ic_reset_rx_ba = 0x40000ab0; diff --git a/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld b/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld index 8577f3a056f..315b0c1e54d 100644 --- a/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld +++ b/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld @@ -124,7 +124,7 @@ pm_on_isr_set_twt_target = 0x40000d00; pm_on_isr_twt_wake = 0x40000d04; pm_on_tsf_timer = 0x40000d08; pm_on_twt_force_tx = 0x40000d0c; -pm_parse_beacon = 0x40000d10; +//pm_parse_beacon = 0x40000d10; /*pm_process_tim = 0x40000d14;*/ pm_rx_beacon_process = 0x40000d18; pm_rx_data_process = 0x40000d1c; diff --git a/components/esp_wifi/CMakeLists.txt b/components/esp_wifi/CMakeLists.txt index 13e3b8a3e28..7ac25fc670f 100644 --- a/components/esp_wifi/CMakeLists.txt +++ b/components/esp_wifi/CMakeLists.txt @@ -76,7 +76,7 @@ idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" "include/local" "wifi_apps/include" "wifi_apps/nan_app/include" REQUIRES esp_event esp_phy esp_netif - PRIV_REQUIRES esp_pm esp_timer nvs_flash + PRIV_REQUIRES esp_pm esp_timer nvs_flash efuse wpa_supplicant hal lwip esp_coex PRIV_INCLUDE_DIRS ../wpa_supplicant/src/ ../wpa_supplicant/esp_supplicant/src/ wifi_apps/roaming_app/include wifi_apps/roaming_app/src diff --git a/components/esp_wifi/Kconfig b/components/esp_wifi/Kconfig index 733632bdd43..0341e5de6a7 100644 --- a/components/esp_wifi/Kconfig +++ b/components/esp_wifi/Kconfig @@ -459,7 +459,8 @@ menu "Wi-Fi" config ESP_WIFI_SLP_BEACON_LOST_TIMEOUT int "Beacon loss timeout" range 5 100 - default 10 + default 25 if ESP_COEX_SW_COEXIST_ENABLE + default 10 if (!ESP_COEX_SW_COEXIST_ENABLE) depends on ESP_WIFI_SLP_BEACON_LOST_OPT help Timeout time for close rf phy when beacon loss occurs, Unit: 1024 microsecond. diff --git a/components/esp_wifi/esp32c5/esp_adapter.c b/components/esp_wifi/esp32c5/esp_adapter.c index 157ead0c8e9..3d3030f2d09 100644 --- a/components/esp_wifi/esp32c5/esp_adapter.c +++ b/components/esp_wifi/esp32c5/esp_adapter.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -641,6 +641,11 @@ static void esp_phy_disable_wrapper(void) esp_phy_disable(PHY_MODEM_WIFI); } +static bool esp_wifi_disable_ac_ax_wrapper(void) +{ + return false; // disable 11ac and 11ax is not supported on esp32c5. +} + wifi_osi_funcs_t g_wifi_osi_funcs = { ._version = ESP_WIFI_OS_ADAPTER_VERSION, ._env_is_chip = esp_coex_common_env_is_chip_wrapper, @@ -764,5 +769,6 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._coex_schm_flexible_period_set = coex_schm_flexible_period_set_wrapper, ._coex_schm_flexible_period_get = coex_schm_flexible_period_get_wrapper, ._coex_schm_get_phase_by_idx = coex_schm_get_phase_by_idx_wrapper, + ._wifi_disable_ac_ax = esp_wifi_disable_ac_ax_wrapper, ._magic = ESP_WIFI_OS_ADAPTER_MAGIC, }; diff --git a/components/esp_wifi/esp32c6/esp_adapter.c b/components/esp_wifi/esp32c6/esp_adapter.c index 07c46725f93..3b1af40aa1a 100644 --- a/components/esp_wifi/esp32c6/esp_adapter.c +++ b/components/esp_wifi/esp32c6/esp_adapter.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -568,17 +568,22 @@ static void esp_phy_disable_wrapper(void) } #if SOC_PM_MODEM_RETENTION_BY_REGDMA -static void regdma_link_set_write_wait_content_wrapper(void *addr, uint32_t value, uint32_t mask) +static void IRAM_ATTR regdma_link_set_write_wait_content_wrapper(void *addr, uint32_t value, uint32_t mask) { regdma_link_set_write_wait_content(addr, value, mask); } -static void *sleep_retention_find_link_by_id_wrapper(int id) +static void *IRAM_ATTR sleep_retention_find_link_by_id_wrapper(int id) { return sleep_retention_find_link_by_id(id); } #endif +static bool esp_wifi_disable_ac_ax_wrapper(void) +{ + return false; // disable 11ac and 11ax is not supported on esp32c6. +} + wifi_osi_funcs_t g_wifi_osi_funcs = { ._version = ESP_WIFI_OS_ADAPTER_VERSION, ._env_is_chip = esp_coex_common_env_is_chip_wrapper, @@ -702,5 +707,6 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._coex_schm_flexible_period_set = coex_schm_flexible_period_set_wrapper, ._coex_schm_flexible_period_get = coex_schm_flexible_period_get_wrapper, ._coex_schm_get_phase_by_idx = coex_schm_get_phase_by_idx_wrapper, + ._wifi_disable_ac_ax = esp_wifi_disable_ac_ax_wrapper, ._magic = ESP_WIFI_OS_ADAPTER_MAGIC, }; diff --git a/components/esp_wifi/esp32c61/esp_adapter.c b/components/esp_wifi/esp32c61/esp_adapter.c index 9f8555c76c5..f62435ef0d4 100644 --- a/components/esp_wifi/esp32c61/esp_adapter.c +++ b/components/esp_wifi/esp32c61/esp_adapter.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -40,6 +40,8 @@ #include "esp_private/periph_ctrl.h" #include "esp_private/esp_clk.h" #include "nvs.h" +#include "esp_efuse.h" +#include "esp_efuse_table.h" #include "os.h" #include "esp_smartconfig.h" #ifdef CONFIG_ESP_COEX_ENABLED @@ -641,6 +643,11 @@ static void esp_phy_disable_wrapper(void) esp_phy_disable(PHY_MODEM_WIFI); } +static bool esp_wifi_disable_ac_ax_wrapper(void) +{ + return esp_efuse_read_field_bit(ESP_EFUSE_DIS_WIFI6); +} + wifi_osi_funcs_t g_wifi_osi_funcs = { ._version = ESP_WIFI_OS_ADAPTER_VERSION, ._env_is_chip = esp_coex_common_env_is_chip_wrapper, @@ -764,5 +771,6 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._coex_schm_flexible_period_set = coex_schm_flexible_period_set_wrapper, ._coex_schm_flexible_period_get = coex_schm_flexible_period_get_wrapper, ._coex_schm_get_phase_by_idx = coex_schm_get_phase_by_idx_wrapper, + ._wifi_disable_ac_ax = esp_wifi_disable_ac_ax_wrapper, ._magic = ESP_WIFI_OS_ADAPTER_MAGIC, }; diff --git a/components/esp_wifi/include/esp_private/wifi_os_adapter.h b/components/esp_wifi/include/esp_private/wifi_os_adapter.h index ad06dce03fd..caf5c7ad9ee 100644 --- a/components/esp_wifi/include/esp_private/wifi_os_adapter.h +++ b/components/esp_wifi/include/esp_private/wifi_os_adapter.h @@ -156,6 +156,9 @@ typedef struct wifi_osi_funcs_t { int (*_coex_schm_flexible_period_set)(uint8_t); uint8_t (*_coex_schm_flexible_period_get)(void); void * (*_coex_schm_get_phase_by_idx)(int); +#if CONFIG_SOC_WIFI_HE_SUPPORT + bool (*_wifi_disable_ac_ax)(void); +#endif int32_t _magic; } wifi_osi_funcs_t; diff --git a/components/esp_wifi/include/esp_wifi.h b/components/esp_wifi/include/esp_wifi.h index 03f0161a475..45ed0476665 100644 --- a/components/esp_wifi/include/esp_wifi.h +++ b/components/esp_wifi/include/esp_wifi.h @@ -779,8 +779,9 @@ esp_err_t esp_wifi_get_bandwidth(wifi_interface_t ifx, wifi_bandwidth_t *bw); * * @attention 1. This API should be called after esp_wifi_start() and before esp_wifi_stop() * @attention 2. When device is in STA mode, this API should not be called when STA is scanning or connecting to an external AP - * @attention 3. When device is in softAP mode, this API should not be called when softAP has connected to external STAs - * @attention 4. When device is in STA+softAP mode, this API should not be called when in the scenarios described above + * @attention 3. When device is in softAP mode and has connected to external STAs, it initiates the CSA process + * @attention 4. When device is in STA+softAP mode, this API should not be called when STA is scanning or connecting to an external AP + * or softAP has connected to external STAs. * @attention 5. The channel info set by this API will not be stored in NVS. So If you want to remember the channel used before WiFi stop, * you need to call this API again after WiFi start, or you can call `esp_wifi_set_config()` to store the channel info in NVS. * @attention 6. When operating in 5 GHz band, the second channel is automatically determined by the primary channel according to the 802.11 standard. diff --git a/components/esp_wifi/include/esp_wifi_types_generic.h b/components/esp_wifi/include/esp_wifi_types_generic.h index 6406fbd64d4..8c6743984e4 100644 --- a/components/esp_wifi/include/esp_wifi_types_generic.h +++ b/components/esp_wifi/include/esp_wifi_types_generic.h @@ -529,7 +529,7 @@ typedef struct { uint8_t channel; /**< Channel of soft-AP. Set to 0 for auto selection (min channel: typically 1 for 2.4G, 36 for 5G). Other invalid values return ESP_ERR_INVALID_ARG. */ wifi_auth_mode_t authmode; /**< Auth mode of soft-AP. Do not support AUTH_WEP, AUTH_WAPI_PSK and AUTH_OWE in soft-AP mode. When the auth mode is set to WPA2_PSK, WPA2_WPA3_PSK or WPA3_PSK, the pairwise cipher will be overwritten with WIFI_CIPHER_TYPE_CCMP by default, unless explicitly set. */ uint8_t ssid_hidden; /**< Broadcast SSID or not, default 0, broadcast the SSID */ - uint8_t max_connection; /**< Max number of stations allowed to connect in */ + uint8_t max_connection; /**< Max number of stations allowed to connect in. Please note that soft-AP and ESP-NOW share the same encryption hardware keys, so the max_connection parameter will be affected by CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM. */ uint16_t beacon_interval; /**< Beacon interval which should be multiples of 100. Unit: TU(time unit, 1 TU = 1024 us). Range: 100 ~ 60000. Default value: 100 */ uint8_t csa_count; /**< Channel Switch Announcement Count. Notify the station that the channel will switch after the csa_count beacon intervals. Default value: 3 */ uint8_t dtim_period; /**< Dtim period of soft-AP. Range: 1 ~ 10. Default value: 1 */ @@ -1488,7 +1488,6 @@ typedef struct { bool dcm; /**< Using dcm rate to send frame */ } wifi_tx_rate_config_t; -#define WIFI_MAX_SUPPORT_COUNTRY_NUM 176 /**< max number of supported countries */ #ifdef CONFIG_SOC_WIFI_SUPPORT_5G #define WIFI_MAX_REGULATORY_RULE_NUM 7 /**< max number of regulatory rules */ #else diff --git a/components/esp_wifi/include/local/esp_wifi_types_native.h b/components/esp_wifi/include/local/esp_wifi_types_native.h index 3efc979daad..bff472e475c 100644 --- a/components/esp_wifi/include/local/esp_wifi_types_native.h +++ b/components/esp_wifi/include/local/esp_wifi_types_native.h @@ -18,10 +18,8 @@ extern "C" { #if CONFIG_IDF_TARGET_ESP32C2 #define ESP_WIFI_MAX_CONN_NUM (4) /**< max number of stations which can connect to ESP32C2 soft-AP */ -#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 -#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32C3/ESP32C6/ESP32C5/ESP32C61 soft-AP */ #else -#define ESP_WIFI_MAX_CONN_NUM (15) /**< max number of stations which can connect to ESP32/ESP32S3/ESP32S2 soft-AP */ +#define ESP_WIFI_MAX_CONN_NUM (15) #endif /** @brief List of stations associated with the Soft-AP */ diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index cdb85041a22..e65c4d335e7 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit cdb85041a22d09dea948a3fe4975778f79c064d0 +Subproject commit e65c4d335e7fafa231047615a6c3e093d4ca90dd diff --git a/components/esp_wifi/regulatory/README.md b/components/esp_wifi/regulatory/README.md index ebb2f6ac2f4..e078582a79b 100644 --- a/components/esp_wifi/regulatory/README.md +++ b/components/esp_wifi/regulatory/README.md @@ -5,8 +5,6 @@ `esp_wifi_regulatory.c` is generated from `esp_wifi_regulatory.txt` by using the `reg2fw.py` script. -The num of all suppported countries in `esp_wifi_regulatory.txt` is `WIFI_MAX_SUPPORT_COUNTRY_NUM` that is defined in `esp_wifi_types_generic.h` - - Generate `esp_wifi_regulatory.c` - `cd ~/esp-idf/components/esp_wifi/regulatory` - `python reg2fw.py` \ No newline at end of file diff --git a/components/esp_wifi/regulatory/esp_wifi_regulatory.c b/components/esp_wifi/regulatory/esp_wifi_regulatory.c index cbcbde1b501..d6028adb14f 100644 --- a/components/esp_wifi/regulatory/esp_wifi_regulatory.c +++ b/components/esp_wifi/regulatory/esp_wifi_regulatory.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -25,7 +25,6 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_NCC, ESP_WIFI_REGULATORY_TYPE_FCC, ESP_WIFI_REGULATORY_TYPE_AF, - ESP_WIFI_REGULATORY_TYPE_AI, ESP_WIFI_REGULATORY_TYPE_AM, ESP_WIFI_REGULATORY_TYPE_AS, ESP_WIFI_REGULATORY_TYPE_AZ, @@ -35,6 +34,7 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_BN, ESP_WIFI_REGULATORY_TYPE_BO, ESP_WIFI_REGULATORY_TYPE_BS, + ESP_WIFI_REGULATORY_TYPE_BW, ESP_WIFI_REGULATORY_TYPE_BZ, ESP_WIFI_REGULATORY_TYPE_CF, ESP_WIFI_REGULATORY_TYPE_CR, @@ -43,13 +43,13 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_DZ, ESP_WIFI_REGULATORY_TYPE_EC, ESP_WIFI_REGULATORY_TYPE_EG, + ESP_WIFI_REGULATORY_TYPE_FO, ESP_WIFI_REGULATORY_TYPE_GB, ESP_WIFI_REGULATORY_TYPE_GD, ESP_WIFI_REGULATORY_TYPE_GT, ESP_WIFI_REGULATORY_TYPE_GU, ESP_WIFI_REGULATORY_TYPE_HR, ESP_WIFI_REGULATORY_TYPE_ID, - ESP_WIFI_REGULATORY_TYPE_IL, ESP_WIFI_REGULATORY_TYPE_IR, ESP_WIFI_REGULATORY_TYPE_JO, ESP_WIFI_REGULATORY_TYPE_KE, @@ -73,11 +73,10 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_RU, ESP_WIFI_REGULATORY_TYPE_SG, ESP_WIFI_REGULATORY_TYPE_SV, + ESP_WIFI_REGULATORY_TYPE_SX, ESP_WIFI_REGULATORY_TYPE_SY, - ESP_WIFI_REGULATORY_TYPE_TC, ESP_WIFI_REGULATORY_TYPE_TG, ESP_WIFI_REGULATORY_TYPE_TR, - ESP_WIFI_REGULATORY_TYPE_TZ, ESP_WIFI_REGULATORY_TYPE_UA, ESP_WIFI_REGULATORY_TYPE_VE, ESP_WIFI_REGULATORY_TYPE_VN, @@ -87,13 +86,17 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_MAX, } esp_wifi_regulatory_type_t; -const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { +/* + * regdomain_table: ISO alpha-2 country codes and their regulatory profile indices. + * Last row is a sentinel (not a real country code). + */ +const wifi_regdomain_t regdomain_table[] = { {"01", ESP_WIFI_REGULATORY_TYPE_DEFAULT}, {"EU", ESP_WIFI_REGULATORY_TYPE_CE}, {"AD", ESP_WIFI_REGULATORY_TYPE_CE}, {"AE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"AF", ESP_WIFI_REGULATORY_TYPE_AF}, - {"AI", ESP_WIFI_REGULATORY_TYPE_AI}, + {"AI", ESP_WIFI_REGULATORY_TYPE_AF}, {"AL", ESP_WIFI_REGULATORY_TYPE_CE}, {"AM", ESP_WIFI_REGULATORY_TYPE_AM}, {"AN", ESP_WIFI_REGULATORY_TYPE_AF}, @@ -117,6 +120,7 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"BR", ESP_WIFI_REGULATORY_TYPE_ANATEL}, {"BS", ESP_WIFI_REGULATORY_TYPE_BS}, {"BT", ESP_WIFI_REGULATORY_TYPE_AF}, + {"BW", ESP_WIFI_REGULATORY_TYPE_BW}, {"BY", ESP_WIFI_REGULATORY_TYPE_AF}, {"BZ", ESP_WIFI_REGULATORY_TYPE_BZ}, {"CA", ESP_WIFI_REGULATORY_TYPE_ISED}, @@ -143,14 +147,16 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"ET", ESP_WIFI_REGULATORY_TYPE_AF}, {"FI", ESP_WIFI_REGULATORY_TYPE_CE}, {"FM", ESP_WIFI_REGULATORY_TYPE_AS}, + {"FO", ESP_WIFI_REGULATORY_TYPE_FO}, {"FR", ESP_WIFI_REGULATORY_TYPE_CE}, {"GB", ESP_WIFI_REGULATORY_TYPE_GB}, {"GD", ESP_WIFI_REGULATORY_TYPE_GD}, {"GE", ESP_WIFI_REGULATORY_TYPE_AZ}, - {"GF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"GF", ESP_WIFI_REGULATORY_TYPE_AF}, {"GH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, - {"GL", ESP_WIFI_REGULATORY_TYPE_AI}, - {"GP", ESP_WIFI_REGULATORY_TYPE_AI}, + {"GI", ESP_WIFI_REGULATORY_TYPE_FO}, + {"GL", ESP_WIFI_REGULATORY_TYPE_AF}, + {"GP", ESP_WIFI_REGULATORY_TYPE_AF}, {"GR", ESP_WIFI_REGULATORY_TYPE_CE}, {"GT", ESP_WIFI_REGULATORY_TYPE_GT}, {"GU", ESP_WIFI_REGULATORY_TYPE_GU}, @@ -162,7 +168,8 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"HU", ESP_WIFI_REGULATORY_TYPE_CE}, {"ID", ESP_WIFI_REGULATORY_TYPE_ID}, {"IE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IL", ESP_WIFI_REGULATORY_TYPE_IL}, + {"IL", ESP_WIFI_REGULATORY_TYPE_CE}, + {"IM", ESP_WIFI_REGULATORY_TYPE_FO}, {"IN", ESP_WIFI_REGULATORY_TYPE_WPC}, {"IR", ESP_WIFI_REGULATORY_TYPE_IR}, {"IS", ESP_WIFI_REGULATORY_TYPE_CE}, @@ -190,13 +197,13 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"MC", ESP_WIFI_REGULATORY_TYPE_CE}, {"MD", ESP_WIFI_REGULATORY_TYPE_CE}, {"ME", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"MF", ESP_WIFI_REGULATORY_TYPE_AF}, {"MH", ESP_WIFI_REGULATORY_TYPE_AS}, {"MK", ESP_WIFI_REGULATORY_TYPE_CE}, {"MN", ESP_WIFI_REGULATORY_TYPE_BS}, {"MO", ESP_WIFI_REGULATORY_TYPE_MO}, {"MP", ESP_WIFI_REGULATORY_TYPE_AS}, - {"MQ", ESP_WIFI_REGULATORY_TYPE_AI}, + {"MQ", ESP_WIFI_REGULATORY_TYPE_AF}, {"MR", ESP_WIFI_REGULATORY_TYPE_AF}, {"MT", ESP_WIFI_REGULATORY_TYPE_CE}, {"MU", ESP_WIFI_REGULATORY_TYPE_BS}, @@ -214,18 +221,18 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"OM", ESP_WIFI_REGULATORY_TYPE_OM}, {"PA", ESP_WIFI_REGULATORY_TYPE_PA}, {"PE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, - {"PF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"PF", ESP_WIFI_REGULATORY_TYPE_AF}, {"PG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"PH", ESP_WIFI_REGULATORY_TYPE_PH}, {"PK", ESP_WIFI_REGULATORY_TYPE_PK}, {"PL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PM", ESP_WIFI_REGULATORY_TYPE_AI}, + {"PM", ESP_WIFI_REGULATORY_TYPE_AF}, {"PR", ESP_WIFI_REGULATORY_TYPE_GD}, {"PT", ESP_WIFI_REGULATORY_TYPE_CE}, {"PW", ESP_WIFI_REGULATORY_TYPE_AS}, {"PY", ESP_WIFI_REGULATORY_TYPE_BS}, {"QA", ESP_WIFI_REGULATORY_TYPE_QA}, - {"RE", ESP_WIFI_REGULATORY_TYPE_AI}, + {"RE", ESP_WIFI_REGULATORY_TYPE_AF}, {"RO", ESP_WIFI_REGULATORY_TYPE_CE}, {"RS", ESP_WIFI_REGULATORY_TYPE_RS}, {"RU", ESP_WIFI_REGULATORY_TYPE_RU}, @@ -235,11 +242,13 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"SG", ESP_WIFI_REGULATORY_TYPE_SG}, {"SI", ESP_WIFI_REGULATORY_TYPE_CE}, {"SK", ESP_WIFI_REGULATORY_TYPE_CE}, + {"SM", ESP_WIFI_REGULATORY_TYPE_FO}, {"SN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"SR", ESP_WIFI_REGULATORY_TYPE_AF}, {"SV", ESP_WIFI_REGULATORY_TYPE_SV}, + {"SX", ESP_WIFI_REGULATORY_TYPE_SX}, {"SY", ESP_WIFI_REGULATORY_TYPE_SY}, - {"TC", ESP_WIFI_REGULATORY_TYPE_TC}, + {"TC", ESP_WIFI_REGULATORY_TYPE_BS}, {"TD", ESP_WIFI_REGULATORY_TYPE_AF}, {"TG", ESP_WIFI_REGULATORY_TYPE_TG}, {"TH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, @@ -247,23 +256,25 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"TR", ESP_WIFI_REGULATORY_TYPE_TR}, {"TT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"TW", ESP_WIFI_REGULATORY_TYPE_NCC}, - {"TZ", ESP_WIFI_REGULATORY_TYPE_TZ}, + {"TZ", ESP_WIFI_REGULATORY_TYPE_BW}, {"UA", ESP_WIFI_REGULATORY_TYPE_UA}, {"UG", ESP_WIFI_REGULATORY_TYPE_BS}, {"US", ESP_WIFI_REGULATORY_TYPE_FCC}, {"UY", ESP_WIFI_REGULATORY_TYPE_BB}, {"UZ", ESP_WIFI_REGULATORY_TYPE_MA}, + {"VA", ESP_WIFI_REGULATORY_TYPE_FO}, {"VC", ESP_WIFI_REGULATORY_TYPE_AF}, {"VE", ESP_WIFI_REGULATORY_TYPE_VE}, {"VI", ESP_WIFI_REGULATORY_TYPE_AS}, {"VN", ESP_WIFI_REGULATORY_TYPE_VN}, {"VU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, - {"WF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"WF", ESP_WIFI_REGULATORY_TYPE_AF}, {"WS", ESP_WIFI_REGULATORY_TYPE_WS}, {"YE", ESP_WIFI_REGULATORY_TYPE_YE}, - {"YT", ESP_WIFI_REGULATORY_TYPE_AI}, + {"YT", ESP_WIFI_REGULATORY_TYPE_AF}, {"ZA", ESP_WIFI_REGULATORY_TYPE_ZA}, {"ZW", ESP_WIFI_REGULATORY_TYPE_AF}, + {"##", ESP_WIFI_REGULATORY_TYPE_MAX}, /* Sentinel: end of table; not a real country code — do not use as wifi_country_t.cc. */ }; const wifi_regulatory_t regulatory_data[] = { @@ -315,12 +326,12 @@ const wifi_regulatory_t regulatory_data[] = { { 6, /* Number of rules */ { - { 1, 11, 2, 30, 0, 0 }, /* chan:1~11, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ + { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 100, 116, 3, 24, 1, 0 }, /* chan:100~116, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 132, 144, 3, 24, 1, 0 }, /* chan:132~144, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 26, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:26(dBm), dfs:1, reserved.*/ + { 100, 144, 4, 26, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ + { 149, 165, 3, 36, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:36(dBm), dfs:0, reserved.*/ + { 173, 177, 2, 27, 0, 0 }, /* chan:173~177, max_bw:40M, max_power:27(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_SRRC */ @@ -419,7 +430,7 @@ const wifi_regulatory_t regulatory_data[] = { { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ { 100, 144, 4, 24, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:24(dBm), dfs:1, reserved.*/ - { 149, 169, 3, 27, 0, 0 }, /* chan:149~169, max_bw:80M, max_power:27(dBm), dfs:0, reserved.*/ + { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ { 173, 177, 2, 27, 0, 0 }, /* chan:173~177, max_bw:40M, max_power:27(dBm), dfs:0, reserved.*/ } }, @@ -433,16 +444,6 @@ const wifi_regulatory_t regulatory_data[] = { { 100, 140, 4, 27, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:27(dBm), dfs:1, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_AI */ - { - 4, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 20, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:20(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ - { 100, 140, 4, 27, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:27(dBm), dfs:1, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_AM */ { 3, /* Number of rules */ @@ -530,6 +531,17 @@ const wifi_regulatory_t regulatory_data[] = { { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ } }, + /* ESP_WIFI_REGULATORY_TYPE_BW */ + { + 5, /* Number of rules */ + { + { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 23, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ + { 149, 165, 3, 24, 1, 0 }, /* chan:149~165, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ + } + }, /* ESP_WIFI_REGULATORY_TYPE_BZ */ { 2, /* Number of rules */ @@ -551,13 +563,14 @@ const wifi_regulatory_t regulatory_data[] = { }, /* ESP_WIFI_REGULATORY_TYPE_CR */ { - 5, /* Number of rules */ + 6, /* Number of rules */ { { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ - { 36, 48, 1, 30, 0, 0 }, /* chan:36~48, max_bw:20M, max_power:30(dBm), dfs:0, reserved.*/ - { 52, 64, 1, 30, 1, 0 }, /* chan:52~64, max_bw:20M, max_power:30(dBm), dfs:1, reserved.*/ - { 100, 144, 1, 30, 1, 0 }, /* chan:100~144, max_bw:20M, max_power:30(dBm), dfs:1, reserved.*/ - { 149, 165, 1, 36, 0, 0 }, /* chan:149~165, max_bw:20M, max_power:36(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 30, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 30, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:30(dBm), dfs:1, reserved.*/ + { 100, 144, 4, 30, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:30(dBm), dfs:1, reserved.*/ + { 149, 165, 3, 36, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:36(dBm), dfs:0, reserved.*/ + { 173, 177, 2, 36, 0, 0 }, /* chan:173~177, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_CU */ @@ -610,6 +623,16 @@ const wifi_regulatory_t regulatory_data[] = { { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ } }, + /* ESP_WIFI_REGULATORY_TYPE_FO */ + { + 4, /* Number of rules */ + { + { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 26, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ + } + }, /* ESP_WIFI_REGULATORY_TYPE_GB */ { 5, /* Number of rules */ @@ -673,17 +696,6 @@ const wifi_regulatory_t regulatory_data[] = { { 149, 161, 3, 23, 0, 0 }, /* chan:149~161, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_IL */ - { - 5, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ - { 100, 140, 4, 26, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ - { 149, 173, 3, 13, 0, 0 }, /* chan:149~173, max_bw:80M, max_power:13(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_IR */ { 4, /* Number of rules */ @@ -815,11 +827,11 @@ const wifi_regulatory_t regulatory_data[] = { { 5, /* Number of rules */ { - { 1, 13, 2, 26, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ + { 1, 14, 2, 26, 0, 0 }, /* chan:1~14, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ { 36, 48, 3, 30, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 30, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:30(dBm), dfs:1, reserved.*/ - { 100, 128, 4, 30, 1, 0 }, /* chan:100~128, max_bw:160M, max_power:30(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 23, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:23(dBm), dfs:1, reserved.*/ + { 100, 128, 4, 23, 1, 0 }, /* chan:100~128, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ + { 149, 173, 3, 30, 0, 0 }, /* chan:149~173, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_NA */ @@ -903,7 +915,7 @@ const wifi_regulatory_t regulatory_data[] = { { { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ { 36, 64, 4, 20, 0, 0 }, /* chan:36~64, max_bw:160M, max_power:20(dBm), dfs:0, reserved.*/ - { 132, 165, 4, 20, 0, 0 }, /* chan:132~165, max_bw:160M, max_power:20(dBm), dfs:0, reserved.*/ + { 132, 165, 4, 23, 0, 0 }, /* chan:132~165, max_bw:160M, max_power:23(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_SG */ @@ -927,6 +939,17 @@ const wifi_regulatory_t regulatory_data[] = { { 149, 165, 1, 30, 0, 0 }, /* chan:149~165, max_bw:20M, max_power:30(dBm), dfs:0, reserved.*/ } }, + /* ESP_WIFI_REGULATORY_TYPE_SX */ + { + 5, /* Number of rules */ + { + { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 16, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:16(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 21, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:21(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 23, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ + { 149, 173, 3, 24, 1, 0 }, /* chan:149~173, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ + } + }, /* ESP_WIFI_REGULATORY_TYPE_SY */ { 6, /* Number of rules */ @@ -939,17 +962,6 @@ const wifi_regulatory_t regulatory_data[] = { { 173, 173, 1, 23, 0, 0 }, /* chan:173~173, max_bw:20M, max_power:23(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_TC */ - { - 5, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 24, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:24(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 100, 144, 4, 24, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:24(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_TG */ { 3, /* Number of rules */ @@ -969,17 +981,6 @@ const wifi_regulatory_t regulatory_data[] = { { 100, 140, 4, 27, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:27(dBm), dfs:1, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_TZ */ - { - 5, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ - { 100, 140, 4, 23, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 24, 1, 0 }, /* chan:149~165, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_UA */ { 5, /* Number of rules */ @@ -1005,10 +1006,10 @@ const wifi_regulatory_t regulatory_data[] = { { 5, /* Number of rules */ { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 17, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:17(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 100, 144, 3, 24, 1, 0 }, /* chan:100~144, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ + { 1, 13, 2, 23, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:23(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 26, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ } }, @@ -1056,194 +1057,204 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_RCM, ESP_WIFI_REGULATORY_TYPE_NCC, ESP_WIFI_REGULATORY_TYPE_FCC, - ESP_WIFI_REGULATORY_TYPE_CU, ESP_WIFI_REGULATORY_TYPE_GT, - ESP_WIFI_REGULATORY_TYPE_ID, ESP_WIFI_REGULATORY_TYPE_KE, ESP_WIFI_REGULATORY_TYPE_KP, - ESP_WIFI_REGULATORY_TYPE_OM, + ESP_WIFI_REGULATORY_TYPE_MY, ESP_WIFI_REGULATORY_TYPE_PK, ESP_WIFI_REGULATORY_TYPE_TG, ESP_WIFI_REGULATORY_TYPE_MAX, } esp_wifi_regulatory_type_t; -const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { +/* + * regdomain_table: ISO alpha-2 country codes and their regulatory profile indices. + * Last row is a sentinel (not a real country code). + */ +const wifi_regdomain_t regdomain_table[] = { {"01", ESP_WIFI_REGULATORY_TYPE_DEFAULT}, - {"EU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AD", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AM", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AS", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"AT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AU", ESP_WIFI_REGULATORY_TYPE_ACMA}, - {"AW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BB", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BD", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BM", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"BN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BR", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"BS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BZ", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"CA", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"CF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CR", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"CU", ESP_WIFI_REGULATORY_TYPE_CU}, - {"CX", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"DE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"DK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"DM", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"DO", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"DZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"EC", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"EE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"EG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ES", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ET", ESP_WIFI_REGULATORY_TYPE_CE}, - {"FI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"FM", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"FR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GB", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GD", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"GE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GP", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GR", ESP_WIFI_REGULATORY_TYPE_CE}, + {"EU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AS", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"AT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AU", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"AW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BB", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BM", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"BN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BR", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"BS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BZ", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"CA", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"CF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CR", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"CU", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"CX", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"DE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"DK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"DM", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"DO", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"DZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"EC", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"EE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"EG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ES", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ET", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"FI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"FM", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"FO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"FR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GB", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GD", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"GE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GP", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"GT", ESP_WIFI_REGULATORY_TYPE_GT}, - {"GU", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"GY", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"HK", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"HN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"HR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"HT", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"HU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ID", ESP_WIFI_REGULATORY_TYPE_ID}, - {"IE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IN", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"IR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"JM", ESP_WIFI_REGULATORY_TYPE_CE}, - {"JO", ESP_WIFI_REGULATORY_TYPE_CE}, + {"GU", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"GY", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"HK", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"HN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"HR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"HT", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"HU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ID", ESP_WIFI_REGULATORY_TYPE_GT}, + {"IE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IN", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"IR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"JM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"JO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"JP", ESP_WIFI_REGULATORY_TYPE_MIC}, {"KE", ESP_WIFI_REGULATORY_TYPE_KE}, - {"KH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"KN", ESP_WIFI_REGULATORY_TYPE_CE}, + {"KH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"KN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"KP", ESP_WIFI_REGULATORY_TYPE_KP}, {"KR", ESP_WIFI_REGULATORY_TYPE_KCC}, - {"KW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"KY", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"KZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LB", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LV", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MD", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ME", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MH", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"MK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MO", ESP_WIFI_REGULATORY_TYPE_CU}, - {"MP", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"MQ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MV", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MX", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MY", ESP_WIFI_REGULATORY_TYPE_GT}, - {"NA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NI", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"NL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NP", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NZ", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"OM", ESP_WIFI_REGULATORY_TYPE_OM}, - {"PA", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"PE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PH", ESP_WIFI_REGULATORY_TYPE_CE}, + {"KW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"KY", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"KZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LB", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LV", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ME", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MH", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"MK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MO", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"MP", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"MQ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MV", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MX", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MY", ESP_WIFI_REGULATORY_TYPE_MY}, + {"NA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NI", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"NL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NP", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NZ", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"OM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PA", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"PE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"PK", ESP_WIFI_REGULATORY_TYPE_PK}, - {"PL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PM", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PR", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"PT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PW", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"PY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"QA", ESP_WIFI_REGULATORY_TYPE_OM}, - {"RE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SG", ESP_WIFI_REGULATORY_TYPE_CU}, - {"SI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SV", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SY", ESP_WIFI_REGULATORY_TYPE_OM}, - {"TC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TD", ESP_WIFI_REGULATORY_TYPE_CE}, + {"PL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PR", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"PT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PW", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"PY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"QA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SG", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"SI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SV", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SX", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"TG", ESP_WIFI_REGULATORY_TYPE_TG}, - {"TH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TW", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"TZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"UA", ESP_WIFI_REGULATORY_TYPE_OM}, - {"UG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"US", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"UY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"UZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"VC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"VE", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"VI", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"VN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"VU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"WF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"WS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"YE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"YT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ZA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ZW", ESP_WIFI_REGULATORY_TYPE_CE}, + {"TH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TW", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"TZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"UA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"UG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"US", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"UY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"UZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"VA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"VC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"VE", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"VI", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"VN", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"VU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"WF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"WS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"YE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"YT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ZA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ZW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"##", ESP_WIFI_REGULATORY_TYPE_MAX}, /* Sentinel: end of table; not a real country code — do not use as wifi_country_t.cc. */ }; const wifi_regulatory_t regulatory_data[] = { @@ -1279,10 +1290,10 @@ const wifi_regulatory_t regulatory_data[] = { { 1, /* Number of rules */ { - { 1, 11, 2, 30, 0, 0 }, /* chan:1~11, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ + { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_CE */ + /* ESP_WIFI_REGULATORY_TYPE_SRRC */ { 1, /* Number of rules */ { @@ -1296,7 +1307,7 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ANATEL */ + /* ESP_WIFI_REGULATORY_TYPE_WPC */ { 1, /* Number of rules */ { @@ -1318,41 +1329,34 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 2, 23, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:23(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_CE */ + /* ESP_WIFI_REGULATORY_TYPE_IFETEL */ { 1, /* Number of rules */ { { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_OFCA */ + /* ESP_WIFI_REGULATORY_TYPE_RCM */ { 1, /* Number of rules */ { { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ANATEL */ + /* ESP_WIFI_REGULATORY_TYPE_NCC */ { 1, /* Number of rules */ { { 1, 13, 2, 30, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ISED */ + /* ESP_WIFI_REGULATORY_TYPE_FCC */ { 1, /* Number of rules */ { { 1, 11, 2, 30, 0, 0 }, /* chan:1~11, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_CU */ - { - 1, /* Number of rules */ - { - { 1, 13, 2, 23, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:23(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_GT */ { 1, /* Number of rules */ @@ -1360,13 +1364,6 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 2, 26, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ID */ - { - 1, /* Number of rules */ - { - { 1, 13, 2, 26, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_KE */ { 1, /* Number of rules */ @@ -1381,11 +1378,11 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 1, 20, 0, 0 }, /* chan:1~13, max_bw:20M, max_power:20(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_OM */ + /* ESP_WIFI_REGULATORY_TYPE_MY */ { 1, /* Number of rules */ { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 1, 14, 2, 26, 0, 0 }, /* chan:1~14, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_PK */ diff --git a/components/esp_wifi/regulatory/esp_wifi_regulatory.txt b/components/esp_wifi/regulatory/esp_wifi_regulatory.txt index ade4bbeaac5..1dd38607ec6 100644 --- a/components/esp_wifi/regulatory/esp_wifi_regulatory.txt +++ b/components/esp_wifi/regulatory/esp_wifi_regulatory.txt @@ -2,7 +2,7 @@ # SPDX-FileCopyrightText: 2008 Johannes Berg # SPDX-FileCopyrightText: 2008 Michael Green # -# SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileContributor: 2025-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # # Copyright (c) 2008, Luis R. Rodriguez @@ -60,6 +60,9 @@ country EU: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries: https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country AD: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -67,6 +70,7 @@ country AD: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -99,6 +103,9 @@ country AI: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country AL: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -106,6 +113,7 @@ country AL: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # Source: # 2.4 GHz https://www.psrc.am/contents/document/4749 @@ -146,6 +154,9 @@ country AS: DFS-FCC # Harmonized CEPT countries (February 2021): https://docdb.cept.org/download/25c41779-cd6e/Rec7003e.pdf # AT: https://www.rtr.at/TKP/was_wir_tun/telekommunikation/spectrum/bands/1997_bmvit-info-052010en.pdf # AT: acceptance https://www.ris.bka.gv.at/Dokumente/BgblAuth/BGBLA_2014_II_63/BGBLA_2014_II_63.pdfsig +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country AT: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -160,43 +171,43 @@ country AT: DFS-ETSI # Source: # 'Item' in the comments below refers to each numbered rule found at: -# https://www.legislation.gov.au/Details/F2023C00524 +# https://www.legislation.gov.au/Details/F2025L01047 within Table 8 +# except for 5850-5875 which is found in Table 1. # Both DFS-ETSI and DFS-FCC are acceptable per AS/NZS 4268 Appendix B. # The EIRP for DFS bands can be increased by 3dB if TPC is implemented. # In order to allow 80MHz operation between 5650-5730MHz the upper boundary # of this more restrictive band has been shifted up by 5MHz from 5725MHz. country AU: DFS-ETSI - # Item 58 - (915 - 920 @ 4), (1000 mW) - (920 - 928 @ 8), (1000 mW) + # Item 1 + (915 - 928 @ 8), (1000 mW) - # Item 59 + # Item 3 and 7 (2400 - 2483.5 @ 40), (4000 mW) - # Item 61 + # Item 10 (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW - # Item 62 (200 mW allowed if TPC is used) + # Item 11 (200 mW allowed if TPC is used) (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW, DFS - # Item 63(a) (1000 mW with TPC) + # Item 12(a) (1000 mW with TPC) (5470 - 5600 @ 80), (500 mW), DFS - # Item 63(b) (1000 mW with TPC) + # Item 12(b) (1000 mW with TPC) # The end is 5725 but we borrow 5 MHz from the following less restrictive band # so we can get an 80 MHz channel. (5650 - 5730 @ 80), (500 mW), DFS - # Item 60 + # Item 9 (5730 - 5850 @ 80), (4000 mW), AUTO-BW - # Item 22 + # Item 22 of Table 1 (5850 - 5875 @ 20), (25 mW), AUTO-BW - # Item 63AA (25 mW if outdoors) - (5925 - 6425 @ 160), (250 mW), NO-OUTDOOR + # Item 13 (25 mW if outdoors) + (5925 - 6585 @ 320), (250 mW), NO-OUTDOOR - # Item 65 + # Item 18 (57000 - 71000 @ 2160), (20000 mW), NO-OUTDOOR country AW: DFS-ETSI @@ -216,6 +227,9 @@ country AZ: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country BA: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -223,6 +237,7 @@ country BA: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -246,6 +261,9 @@ country BD: DFS-JP # BE: https://www.ibpt.be/public/files/en/21761/B03-02_2.1_EN.pdf # BE: https://www.ibpt.be/public/files/en/21762/B03-03_2.1_EN.pdf # BE: https://www.ibpt.be/public/files/en/22165/B01-28_3.1_EN.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country BE: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -348,7 +366,7 @@ country BO: DFS-JP # Source: # https://www.gov.br/anatel/pt-br/regulado/radiofrequencia/radiacao-restrita # https://informacoes.anatel.gov.br/legislacao/resolucoes/2017/936-resolucao-680 -# https://informacoes.anatel.gov.br/legislacao/atos-de-certificacao-de-produtos/2017/1139-ato-14448 +# https://informacoes.anatel.gov.br/legislacao/atos-de-certificacao-de-produtos/2021/1510-ato-1306 country BR: DFS-FCC (2400 - 2483.5 @ 40), (30) # The next three ranges have been reduced by 3dB, could be increased @@ -357,7 +375,7 @@ country BR: DFS-FCC (5250 - 5350 @ 80), (27), NO-OUTDOOR, DFS, AUTO-BW (5470 - 5725 @ 160), (27), DFS, AUTO-BW (5725 - 5850 @ 80), (30), AUTO-BW - (5925 - 7125 @ 320), (12), NO-OUTDOOR, NO-IR + (5925 - 7125 @ 320), (12), NO-OUTDOOR # EIRP=40dBm (43dBm peak) (57000 - 71000 @ 2160), (40) @@ -376,6 +394,15 @@ country BT: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS +# Source: +# https://www.bocra.org.bw/sites/default/files/documents/Annexure_3.3.2A_SRDs_Guidelines_Feb_2022.pdf +country BW: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), AUTO-BW + (5250 - 5350 @ 80), (20), DFS, AUTO-BW + (5470 - 5725 @ 160), (250 mW), DFS + (5725 - 5850 @ 80), (24), DFS + country BY: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW @@ -387,15 +414,20 @@ country BZ: DFS-JP (5735 - 5835 @ 80), (30) # Sources: -# https://www.ic.gc.ca/eic/site/smt-gst.nsf/vwapj/rss-247-i2-e.pdf/$file/rss-247-i2-e.pdf +# RSS-247 Issue 4 +# https://ised-isde.canada.ca/site/spectrum-management-telecommunications/en/devices-and-equipment/radio-equipment-standards/radio-standards-specifications-rss/rss-247-digital-transmission-systems-dtss-frequency-hopping-systems-fhss-and-licence-exempt-local # https://www.ic.gc.ca/eic/site/smt-gst.nsf/eng/sf11750.html (6 GHz operation) country CA: DFS-FCC - (2402 - 2472 @ 40), (30) - (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW - (5250 - 5350 @ 80), (24), DFS, AUTO-BW - (5470 - 5600 @ 80), (24), DFS - (5650 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) + (2400 - 2483.5 @ 40), (4000 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (500 mW), DFS, AUTO-BW + # This range ends at 5725 MHz, but channel 144 extends to 5730 MHz. + # Since 5725 ~ 5730 MHz belongs to the next range which has looser + # requirements, we can extend the range by 5 MHz to make the kernel + # happy and be able to use channel 144. + (5470 - 5730 @ 160), (500 mW), DFS + (5730 - 5850 @ 80), (4000 mW), AUTO-BW + (5850 - 5895 @ 40), (27), AUTO-BW (5925 - 7125 @ 320), (12), NO-OUTDOOR # Source: @@ -417,6 +449,9 @@ country CF: DFS-FCC # CH: https://www.ofcomnet.ch/api/rir/1010/04 # CH: https://www.ofcomnet.ch/api/rir/1008/12 # CH: https://www.ofcomnet.ch/#/fatTable +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country CH: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -473,14 +508,17 @@ country CO: DFS-FCC # Source: # https://storage.googleapis.com/eleoscompliance1.appspot.com/public/PNAF%20modificaci%C3%B3n%20ALCA87_30_04_2021.pdf +# https://pgrweb.go.cr/scij/Busqueda/Normativa/Normas/nrm_texto_completo.aspx?param1=NRTC&nValor1=1&nValor2=99551&nValor3=144158&strTipM=TC country CR: DFS-FCC (2402 - 2482 @ 40), (36) - (5170 - 5250 @ 20), (30) - (5250 - 5330 @ 20), (30), DFS - (5490 - 5730 @ 20), (30), DFS - (5735 - 5835 @ 20), (36) - (5875 - 5925 @ 20), (30) + (5150 - 5250 @ 80), (30), AUTO-BW + (5250 - 5350 @ 80), (30), DFS, AUTO-BW + (5470 - 5730 @ 160), (30), DFS + (5730 - 5850 @ 80), (36), AUTO-BW + (5850 - 5895 @ 40), (36), AUTO-BW + (5895 - 5925 @ 20), (30), AUTO-BW (5925 - 7125 @ 320), (30), NO-OUTDOOR + (57000 - 71000 @ 2160), (43) # Source: # https://www.mincom.gob.cu/es/marco-legal @@ -643,26 +681,31 @@ country EC: DFS-FCC # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # EU decision 2021/1067/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32021D1067&from=EN # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf -# EE: https://www.ttja.ee/et/ettevottele-organisatsioonile/sideteenused/raadioseadmed/wifi-seade +# EE: https://ttja.ee/eraklient/side-ja-meediateenused/raadioside/wifi-seadmete-kasutus +# EE: https://www.riigiteataja.ee/akt/117052024018?leiaKehtiv (Lisa 6) # EE: https://www.itu.int/ITU-D/study_groups/SGP_1998-2002/JGRES09/pdf/estonia.pdf country EE: DFS-ETSI + (863 - 868 @ 1), (25 mW) + (915.8 - 919.4 @ 1), (25 mW) (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI - (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI + (5470 - 5725 @ 160), (500 mW), DFS, AUTO-BW, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) - (5725 - 5875 @ 80), (25 mW) + (5725 - 5875 @ 80), (25 mW), AUTO-BW # 6 GHz band - (5945 - 6425 @ 320), (23), NO-OUTDOOR, wmmrule=ETSI + (5945 - 6425 @ 320), (200 mW), NO-OUTDOOR, wmmrule=ETSI # 60 GHz band channels 1-4 (ETSI EN 302 567) - (57000 - 66000 @ 2160), (40) + (57000 - 71000 @ 8640), (40) # https://www.tra.gov.eg/wp-content/uploads/2022/03/EGY-NTRA-March-2022-SRD_English_Final.pdf +# https://www.tra.gov.eg/wp-content/uploads/2024/11/EGY-NTRA-November-2024-SRD_English-1.pdf country EG: DFS-ETSI - (2402 - 2483.5 @ 40), (20) - (5150 - 5250 @ 80), (23), AUTO-BW, wmmrule=ETSI - (5250 - 5350 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI - (57000 - 66000 @ 2160), (40) + (2402 - 2483.5 @ 40), (100 mW), NO-OUTDOOR + (5150 - 5250 @ 80), (200 mW), AUTO-BW, NO-OUTDOOR, wmmrule=ETSI + (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW, NO-OUTDOOR, wmmrule=ETSI + (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR + (57000 - 66000 @ 2160), (40), NO-OUTDOOR # ES as part of EU/CEPT accepted decisions 2005/513/EC (5GHz RLAN, EN 301 893) # and 2006/771/EC (amended by 2008/432/EC, Short-Range Devices, EN 300 440) @@ -714,6 +757,13 @@ country FM: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +country FO: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # FR as part of EU/CEPT accepted decisions 2005/513/EC (5GHz RLAN, EN 301 893) # and 2006/771/EC (amended by 2008/432/EC, Short-Range Devices, EN 300 440) # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 @@ -748,7 +798,7 @@ country GB: DFS-ETSI (5470 - 5730 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5850 @ 80), (200 mW), NO-OUTDOOR - (5925 - 6425 @ 160), (250 mW), NO-OUTDOOR, wmmrule=ETSI + (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR, wmmrule=ETSI # 60 GHz band channels 1-6 (57000 - 71000 @ 2160), (40) @@ -759,10 +809,15 @@ country GD: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +# Source: +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country GE: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (18), AUTO-BW (5250 - 5330 @ 80), (18), DFS, AUTO-BW + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -779,6 +834,13 @@ country GH: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +country GI: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + country GL: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI @@ -847,7 +909,7 @@ country HK: DFS-ETSI (5250 - 5350 @ 80), (23), DFS, AUTO-BW, NO-OUTDOOR (5470 - 5730 @ 160), (27), DFS (5730 - 5850 @ 80), (36) - (5925 - 6425 @ 160), (14) + (5945 - 6425 @ 160), (24), NO-OUTDOOR # Source: # https://www.conatel.gob.hn/doc/Regulacion/resoluciones/2023/NR05-23.pdf @@ -954,6 +1016,13 @@ country IL: DFS-ETSI (5725 - 5875 @ 80), (25 mW), AUTO-BW (5945 - 6425 @ 320), (200 mW), NO-OUTDOOR +country IM: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # Source: # https://dot.gov.in/spectrummanagement/delicensing-24-24835-ghz-band-gsr-45-e-5150-5350-ghz-gsr-46-e-and-5725-5875-ghz # https://dot.gov.in/spectrummanagement/license-exemption-5-ghz-gsr-1048e-dated-22102018 @@ -963,6 +1032,7 @@ country IN: (5250 - 5350 @ 80), (24), DFS (5470 - 5725 @ 160), (24), DFS (5725 - 5875 @ 80), (30) + (5925 - 6425 @ 320), (24), NO-OUTDOOR # Source: # https://asnad.cra.ir/fa/Public/Documents/Details/73af8590-f065-eb11-968f-0050569b0899 @@ -978,7 +1048,9 @@ country IR: DFS-ETSI # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf # IS: https://www.pfs.is/library/Skrar/Tidnir-og-taekni/MHZ_21022019.pdf -# CEPT ECC Decision (20)01 for 6GHz: https://docdb.cept.org/download/1448 +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country IS: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1089,8 +1161,9 @@ country KR: DFS-JP (5250 - 5350 @ 80), (20), DFS, AUTO-BW (5470 - 5725 @ 160), (20), DFS (5725 - 5850 @ 80), (23) - # 6 GHz band - (5925 - 7125 @ 160), (15), NO-OUTDOOR + # 6 GHz band - per MSIT Notice 2026-10 + (5925 - 6425 @ 320), (18), NO-OUTDOOR, AUTO-BW + (6425 - 7125 @ 320), (15), NO-OUTDOOR, AUTO-BW # 60 GHz band channels 1-4 (57000 - 66000 @ 2160), (43) @@ -1117,11 +1190,12 @@ country KY: DFS-FCC # http://adilet.zan.kz/rus/docs/V1500010730 # http://adilet.zan.kz/rus/docs/V1500010375 country KZ: DFS-ETSI - (2400 - 2483.5 @ 40), (20) - (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW - (5470 - 5725 @ 160), (20), NO-OUTDOOR, DFS - (5725 - 5850 @ 80), (20), NO-OUTDOOR + (5470 - 5725 @ 160), (100 mW), NO-OUTDOOR, DFS + (5725 - 5850 @ 80), (100 mW), NO-OUTDOOR + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR (57000 - 66000 @ 2160), (40) country LB: DFS-FCC @@ -1149,8 +1223,10 @@ country LC: DFS-ETSI # LI: https://www.ofcomnet.ch/api/rir/1010/04 # LI: https://www.ofcomnet.ch/api/rir/1008/12 # LI: https://www.ofcomnet.ch/#/fatTable -# CEPT ECC Decision (20)01 for 6GHz: https://docdb.cept.org/download/1448 # LI: https://www.ofcomnet.ch/api/rir/1010/11 +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country LI: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1248,6 +1324,9 @@ country MA: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country MC: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1255,6 +1334,7 @@ country MC: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # Source: # http://www.cnfr.md/index.php?pag=sec&id=117&l=en @@ -1264,6 +1344,9 @@ country MC: DFS-ETSI # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf # https://www.legis.md/cautare/downloadpdf/134846 +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country MD: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1280,6 +1363,9 @@ country MD: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country ME: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1287,6 +1373,7 @@ country ME: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR country MF: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -1306,6 +1393,9 @@ country MH: DFS-FCC # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country MK: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1313,6 +1403,7 @@ country MK: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -1413,14 +1504,16 @@ country MX: DFS-FCC (5925 - 6425 @ 320), (12), NO-OUTDOOR # Source: -# https://www.mcmc.gov.my/skmmgovmy/media/General/CA-No-1-of-2022_-signed_19012022.pdf +# https://www.mcmc.gov.my/skmmgovmy/media/General/pdf2/Class-Assignment-No-2-of-2025.pdf country MY: DFS-FCC - (2402 - 2482 @ 40), (500 mW) - (5170 - 5250 @ 80), (1000 mW), AUTO-BW - (5250 - 5330 @ 80), (1000 mW), DFS, AUTO-BW - (5490 - 5650 @ 160), (1000 mW), DFS - (5735 - 5835 @ 80), (1000 mW) - (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR + (2400 - 2500 @ 40), (500 mW) + (5150 - 5250 @ 80), (1000 mW), AUTO-BW, NO-OUTDOOR + # 5250 - 5350 MHz regulatory limit is 1000 mW, but 200 mW reaches the PSD limit of 10 mW / MHz at 20 MHz channel width + (5250 - 5350 @ 80), (200 mW), DFS, AUTO-BW, NO-OUTDOOR + # 5470 - 5650 MHz regulatory limit is 1000 mW, but 200 mW reaches the PSD limit of 10 mW / MHz at 20 MHz channel width + (5470 - 5650 @ 160), (200 mW), DFS + (5725 - 5875 @ 80), (1000 mW) + (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR # Source: # https://www.cran.na/yglilidy/2023/04/GG-8060-dated-3-April-2023.pdf @@ -1476,6 +1569,9 @@ country NL: DFS-ETSI # NO: https://eng.nkom.no/technical/temporary-licenses/mobile-videolink/wireless-cameras-mobile-video-links/_attachment/9947 # NO: http://www.lovdata.no/dokument/SF/forskrift/2012-01-19-77 # In addition to EU NO can use 5725–5795 MHz and 5815–5850 bands with limit of 4 W EIRP (with DFS and TPC) +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country NO: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1633,12 +1729,15 @@ country PW: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +# Source: +# https://www.conatel.gov.py/conatel/wp-content/uploads/2025/05/2025-rd-1035-sistema-acceso-inalambrico-baja-potencia-6ghz-norma-tecnica.pdf country PY: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (24), AUTO-BW (5250 - 5330 @ 80), (24), DFS, AUTO-BW (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) + (5925 - 6425 @ 320), (12), NO-OUTDOOR # Source: # https://www.cra.gov.qa/-/media/System/D/2/5/8/D258CF18B83A5613B0D590193CB799CB/Class-License-WIFI-6E-Final-English-032022--V3.ashx @@ -1699,8 +1798,8 @@ country RS: DFS-ETSI country RU: (2400 - 2483.5 @ 40), (100mW) (5150 - 5350 @ 160), (100 mW), NO-OUTDOOR - (5650 - 5850 @ 160), (100 mW), NO-OUTDOOR - (5925 - 6425 @ 160), (100 mW), NO-OUTDOOR + (5650 - 5850 @ 160), (200 mW), NO-OUTDOOR + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Changes to NLA 124_Order №129_22042015.pdf (57000 - 66000 @ 2160), (40), NO-OUTDOOR @@ -1804,6 +1903,13 @@ country SK: DFS-ETSI # 60 GHz band channels 1-4 (ETSI EN 302 567) (57000 - 66000 @ 2160), (40) +country SM: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # Source: # Regulation N° 2004-005 ART/DG/DRC/D.Rég country SN: DFS-FCC @@ -1828,6 +1934,15 @@ country SV: DFS-FCC (5735 - 5835 @ 20), (30) (5925 - 7125 @ 320), (12), NO-OUTDOOR +# Source: +# https://btp.sx/dash/files/Telecommunications/Technical-Requirements/10t98466434723___TGVnYWwgYW5kIGlsbGVnYWwgd2lyZWxlc3MgY29tbXVuaWNhdGlvbiBkZXZpY2Vzb_64.pdf +country SX: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (50 mW), AUTO-BW + (5250 - 5350 @ 80), (21), DFS, AUTO-BW + (5470 - 5725 @ 160), (250 mW), DFS + (5725 - 5875 @ 80), (24), DFS + # Source: # https://sytpra.gov.sy/public/uploads/files/%D8%A7%D9%84%D8%A7%D8%B7%D8%A7%D8%B1%20%D8%A7%D9%84%D9%82%D8%A7%D9%86%D9%88%D9%86%D9%8A/%D9%84%D9%88%D8%A7%D8%A6%D8%AD%20%D8%AA%D9%86%D8%B8%D9%8A%D9%85%D9%8A%D8%A9/%D9%84%D9%88%D8%A7%D8%A6%D8%AD%20%D8%A7%D9%84%D8%B7%D9%8A%D9%81%20%D8%A7%D9%84%D8%AA%D8%B1%D8%AF%D8%AF%D9%8A%20%D8%A7%D9%84%D8%B1%D8%A7%D8%AF%D9%8A%D9%88%D9%8A/L1.pdf country SY: DFS-ETSI @@ -1875,14 +1990,20 @@ country TH: DFS-FCC (5735 - 5835 @ 80), (30) (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR +# Source: +# https://www.anf.tn/sites/default/files/2025-01/Arr%C3%AAt%C3%A92024_4611.pdf country TN: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR # Source: # Technical Criteria for Radio Devices and Systems Excluded from Frequency Allocation, Sept 9, 2022 # https://www.btk.gov.tr/uploads/pages/ftm-teknik-olcutler-ek-5.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country TR: DFS-ETSI (2400 - 2483.5 @ 40), (20) (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1939,14 +2060,18 @@ country TZ: DFS-ETSI # 2.4 GHz band channels can be used outdoors when some requirements are met. # 5 GHz band channels must be used only indoors in some cases. They are neither # permitted nor denied outdoors in others. +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country UA: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW), NO-OUTDOOR (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW, wmmrule=ETSI (5470 - 5725 @ 160), (100 mW), DFS, NO-OUTDOOR, wmmrule=ETSI (5725 - 5850 @ 80), (100 mW), NO-OUTDOOR + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 - (57000 - 66000 @ 2160), (40 mW), NO-OUTDOOR + (57000 - 66000 @ 2160), (40), NO-OUTDOOR country UG: DFS-FCC (2402 - 2482 @ 40), (20) @@ -1977,14 +2102,10 @@ country US: DFS-FCC # requirements, we can extend the range by 5 MHz to make the kernel # happy and be able to use channel 144. (5470 - 5730 @ 160), (24), DFS - # This range ends at 5850 MHz, but channel 169 extends to 5855 MHz. - # Since 5850 ~ 5855 MHz belongs to the next range which has looser - # requirements, we extend the range by 5 MHz to make the driver - # happy and be able to use channel 169. - (5730 - 5855 @ 80), (27), AUTO-BW + (5730 - 5850 @ 80), (30), AUTO-BW # https://www.federalregister.gov/documents/2021/05/03/2021-08802/use-of-the-5850-5925-ghz-band # max. 33 dBm AP @ 20MHz, 36 dBm AP @ 40Mhz+, 6 dB less for clients - (5855 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW, NO-IR + (5850 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW, NO-IR # 6g band # https://www.federalregister.gov/documents/2020/05/26/2020-11236/unlicensed-use-of-the-6ghz-band (5925 - 7125 @ 320), (12), NO-OUTDOOR, NO-IR @@ -2006,6 +2127,13 @@ country UZ: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW +country VA: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # Source: # http://www.ntrc.vc/regulations/Jun_2006_Spectrum_Managment_Regulations.pdf country VC: DFS-ETSI @@ -2031,12 +2159,17 @@ country VI: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +# Source: +# https://datafiles.chinhphu.vn/cpp/files/vbpq/2021/10/08-btttt.signed.pdf +# https://mic.gov.vn/van-ban-phap-luat/25099.htm country VN: DFS-FCC - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (17) - (5250 - 5330 @ 80), (24), DFS - (5490 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) + (2400 - 2483.5 @ 40), (200 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS, AUTO-BW + (5725 - 5850 @ 80), (1000 mW), AUTO-BW + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR, AUTO-BW + (57000 - 66000 @ 2160), (10000 mW), NO-OUTDOOR # Source: # http://www.trr.vu/attachments/category/130/GURL_for_Short-range_Radiocommunication_Devices2.pdf @@ -2074,7 +2207,7 @@ country ZA: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (30) - (5925 - 6425 @ 320), (14) + (5925 - 6425 @ 320), (23), NO-OUTDOOR country ZW: DFS-ETSI (2402 - 2482 @ 40), (20) diff --git a/components/esp_wifi/regulatory/reg2fw.py b/components/esp_wifi/regulatory/reg2fw.py index 1a3eecf94b6..36a4b6bc7b5 100755 --- a/components/esp_wifi/regulatory/reg2fw.py +++ b/components/esp_wifi/regulatory/reg2fw.py @@ -1,15 +1,18 @@ #!/usr/bin/env python -# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import os -from typing import List +from datetime import datetime from typing import TextIO from reg_parse import DBParser from reg_parse import Regdomain +# Not a valid ISO 3166-1 alpha-2 code; marks end of regdomain_table for linear scans (matches wifi_regdomain_t.cn[2]). +REGDOMAIN_TABLE_SENTINEL_CC = '##' -def write_regulatory_rules(cfile: TextIO, perms: List, filter_5g: bool = False) -> None: + +def write_regulatory_rules(cfile: TextIO, perms: list, filter_5g: bool = False) -> None: """Helper function to write regulatory rules to the C file.""" filtered_perms = [perm for perm in perms if not filter_5g or (perm.freqband.start >= 1 and perm.freqband.end <= 14)] rule_count = len(filtered_perms) @@ -39,7 +42,7 @@ def write_regulatory_rules(cfile: TextIO, perms: List, filter_5g: bool = False) def write_regulatory_data( - cfile: TextIO, reg: Regdomain, type_list: List[str], perm_list: List[List], filter_5g: bool + cfile: TextIO, reg: Regdomain, type_list: list[str], perm_list: list[list], filter_5g: bool ) -> None: """Helper function to write regulatory data.""" cfile.write('typedef enum {\n') @@ -48,18 +51,29 @@ def write_regulatory_data( cfile.write(' ESP_WIFI_REGULATORY_TYPE_MAX,\n') cfile.write('} esp_wifi_regulatory_type_t;\n\n') - cfile.write('const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = {\n') - country_map = reg.regdomain_countries if filter_5g else reg.regdomain_countries_2g + + cfile.write( + '/*\n' + ' * regdomain_table: ISO alpha-2 country codes and their regulatory profile indices.\n' + ' * Last row is a sentinel (not a real country code).\n' + ' */\n' + ) + cfile.write('const wifi_regdomain_t regdomain_table[] = {\n') + for cc, reg_type_index in country_map.items(): reg_type = f'ESP_WIFI_REGULATORY_TYPE_{type_list[reg_type_index]}' cfile.write(f' {{"{cc.decode("utf-8")}", {reg_type}}},\n') + cfile.write( + ' {"' + REGDOMAIN_TABLE_SENTINEL_CC + '", ESP_WIFI_REGULATORY_TYPE_MAX}, ' + '/* Sentinel: end of table; not a real country code — ' + 'do not use as wifi_country_t.cc. */\n' + ) cfile.write('};\n\n') cfile.write('const wifi_regulatory_t regulatory_data[] = {\n') - for perms in perm_list: - index = perm_list.index(perms) + for index, perms in enumerate(perm_list): regulatory_type = f'ESP_WIFI_REGULATORY_TYPE_{type_list[index]}' cfile.write(f' /* {regulatory_type} */\n') write_regulatory_rules(cfile, perms, not filter_5g) @@ -75,14 +89,34 @@ def main() -> None: directory = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(directory, filename) try: - with open(file_path, 'r', encoding='utf-8') as file: + with open(file_path, encoding='utf-8') as file: regdomains = p.parse(file) + # Get the modification time of the source file to determine copyright year + mtime = os.path.getmtime(file_path) + copyright_year = datetime.fromtimestamp(mtime).year except FileNotFoundError: raise Exception(f'File {file_path} not found') reg.simplify_countries(regdomains) reg.simplify_countries_2g(regdomains) + total_countries = len(regdomains) + country_rules_count = {} + for country_code, country in regdomains.items(): + country_str = country_code.decode('utf-8') + rules_count = len(country.permissions) + country_rules_count[country_str] = rules_count + + max_rules_country = max(country_rules_count.items(), key=lambda x: x[1]) + max_rules_count = max_rules_country[1] + max_rules_countries = [cc for cc, count in country_rules_count.items() if count == max_rules_count] + + print('\n=== Regulatory Statistics ===') + print(f'Total supported countries: {total_countries}') + print(f'Country(ies) with most rules: {", ".join(max_rules_countries)}') + print(f'Maximum number of rules: {max_rules_count}') + print('=' * 30 + '\n') + type_list = list(reg.typical_regulatory.keys()) perm_list = list(reg.typical_regulatory.values()) @@ -93,7 +127,7 @@ def main() -> None: with open(output_file, 'w') as cfile: cfile.write('/*\n') - cfile.write(' * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD\n') + cfile.write(f' * SPDX-FileCopyrightText: 2025-{copyright_year} Espressif Systems (Shanghai) CO LTD\n') cfile.write(' *\n') cfile.write(' * SPDX-License-Identifier: Apache-2.0\n') cfile.write(' */\n\n') diff --git a/components/esp_wifi/regulatory/reg_parse.py b/components/esp_wifi/regulatory/reg_parse.py index fac1b8f534f..dd092982a24 100755 --- a/components/esp_wifi/regulatory/reg_parse.py +++ b/components/esp_wifi/regulatory/reg_parse.py @@ -3,7 +3,7 @@ # SPDX-FileCopyrightText: 2008 Johannes Berg # SPDX-FileCopyrightText: 2008 Michael Green # -# SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileContributor: 2025-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # # Copyright (c) 2008, Luis R. Rodriguez @@ -707,9 +707,25 @@ class DBParser: class Regdomain: def __init__(self) -> None: self.regdomain_countries: dict[bytes, int] = {} - self.typical_regulatory: dict[str, list] = {} + self.typical_regulatory: dict[str, tuple[Permission, ...]] = {} self.regdomain_countries_2g: dict[bytes, int] = {} - self.typical_regulatory_2g: dict[str, list] = {} + self.typical_regulatory_2g: dict[str, tuple[Permission, ...]] = {} + + @staticmethod + def _permission_cmp_key(permission: Permission) -> tuple[int, int, int, int, int]: + """Return reduced fields aligned with generated C rule granularity.""" + max_eirp = int(permission.power.max_eirp) if permission.power else 0 + return ( + int(permission.freqband.start), + int(permission.freqband.end), + int(permission.freqband.maxbw), + max_eirp, + permission.dfs, + ) + + def _permissions_cmp_key(self, permissions: tuple[Permission, ...]) -> tuple[tuple[int, int, int, int, int], ...]: + """Build a reduced comparison key from a country's permission set.""" + return tuple(self._permission_cmp_key(permission) for permission in permissions) def build_typical_regdomains(self, countries: dict[bytes, Country]) -> None: """Populate typical regulatory domains based on country permissions.""" @@ -731,26 +747,32 @@ class Regdomain: """Simplify country permissions by building typical regdomains.""" self.build_typical_regdomains(countries) perm_list = list(self.typical_regulatory.values()) + perm_key_to_index = {self._permissions_cmp_key(permissions): idx for idx, permissions in enumerate(perm_list)} for cn, country in countries.items(): cn_str = cn.decode('utf-8') permissions = country.permissions - if permissions not in perm_list: + permissions_key = self._permissions_cmp_key(permissions) + if permissions_key not in perm_key_to_index: self.typical_regulatory[cn_str] = permissions perm_list.append(permissions) - self.regdomain_countries[cn] = perm_list.index(permissions) + perm_key_to_index[permissions_key] = len(perm_list) - 1 + self.regdomain_countries[cn] = perm_key_to_index[permissions_key] def simplify_countries_2g(self, countries: dict[bytes, Country]) -> None: """Simplify country permissions by building typical regdomains.""" self.build_typical_regdomains_2g(countries) perm_list = list(self.typical_regulatory_2g.values()) + perm_key_to_index = {self._permissions_cmp_key(permissions): idx for idx, permissions in enumerate(perm_list)} for cn, country in countries.items(): cn_str = cn.decode('utf-8') permissions = country.permissions_2g + permissions_key = self._permissions_cmp_key(permissions) - if permissions not in perm_list: + if permissions_key not in perm_key_to_index: self.typical_regulatory_2g[cn_str] = permissions perm_list.append(permissions) - self.regdomain_countries_2g[cn] = perm_list.index(permissions) + perm_key_to_index[permissions_key] = len(perm_list) - 1 + self.regdomain_countries_2g[cn] = perm_key_to_index[permissions_key] diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 66db189d042..ad3b3049ea6 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -1503,6 +1503,10 @@ config SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY bool default y +config SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND + bool + default y + config SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED bool default y diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 17264727814..7f321774f65 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -608,6 +608,8 @@ #define SOC_PM_PAU_REGDMA_LINK_CONFIGURABLE (1) #define SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC (4) // The range of values for the link index is [0, SOC_PM_PAU_LINK_NUM) #define SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY (1) +/** Workaround: software-triggered modem PHY retention uses dedicated WiFi MAC REGDMA, not entry link_sel */ +#define SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND (1) #define SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED (1) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h index 5d912659f21..e1361ab5f2d 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h @@ -282,7 +282,7 @@ uint16_t esp_wifi_sta_pmf_enabled(void); wifi_cipher_type_t esp_wifi_sta_get_mgmt_group_cipher(void); int esp_wifi_set_igtk_internal(uint8_t if_index, const wifi_wpa_igtk_t *igtk); esp_err_t esp_wifi_internal_issue_disconnect(uint8_t reason_code); -bool esp_wifi_skip_supp_pmkcaching(void); +bool esp_wifi_use_supp_pmk_cache(void); bool esp_wifi_is_rm_enabled_internal(uint8_t if_index); bool esp_wifi_is_btm_enabled_internal(uint8_t if_index); esp_err_t esp_wifi_register_mgmt_frame_internal(uint32_t type, uint32_t subtype); diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wpa3.c b/components/wpa_supplicant/esp_supplicant/src/esp_wpa3.c index baaf31f2a43..d515a90b6c5 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wpa3.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wpa3.c @@ -35,6 +35,12 @@ static esp_err_t wpa3_build_sae_commit(u8 *bssid, size_t *sae_msg_len) const u8 *pw = (const u8 *)esp_wifi_sta_get_prof_password_internal(); char sae_pwd_id[SAE_H2E_IDENTIFIER_LEN + 1] = {0}; bool valid_pwd_id = false; + + if (wpa_sta_cur_pmksa_matches_akm()) { + wpa_printf(MSG_INFO, "wpa3: Skip SAE and use cached PMK instead"); + *sae_msg_len = 0; + return ESP_FAIL; + } #ifdef CONFIG_SAE_H2E uint8_t sae_pwe = esp_wifi_get_config_sae_pwe_h2e_internal(WIFI_IF_STA); const u8 *rsnxe = NULL; @@ -107,12 +113,6 @@ static esp_err_t wpa3_build_sae_commit(u8 *bssid, size_t *sae_msg_len) } #endif /* CONFIG_SAE_H2E */ - if (wpa_sta_cur_pmksa_matches_akm()) { - wpa_printf(MSG_INFO, "wpa3: Skip SAE and use cached PMK instead"); - *sae_msg_len = 0; - return ESP_FAIL; - } - if (g_sae_commit) { wpabuf_free(g_sae_commit); g_sae_commit = NULL; diff --git a/components/wpa_supplicant/src/rsn_supp/wpa.c b/components/wpa_supplicant/src/rsn_supp/wpa.c index a479af6ae97..254c23868fa 100644 --- a/components/wpa_supplicant/src/rsn_supp/wpa.c +++ b/components/wpa_supplicant/src/rsn_supp/wpa.c @@ -2646,7 +2646,7 @@ int wpa_set_bss(uint8_t *macddr, uint8_t *bssid, uint8_t pairwise_cipher, uint8_ { int res = 0; struct wpa_sm *sm = &gWpaSm; - bool use_pmk_cache = !esp_wifi_skip_supp_pmkcaching(); + bool use_pmk_cache = esp_wifi_use_supp_pmk_cache(); uint8_t assoc_ie[128] = {0}; uint16_t assoc_ie_len = sizeof(assoc_ie); bool reassoc_same_ess = false; diff --git a/docs/en/api-guides/wifi-driver/overview.rst b/docs/en/api-guides/wifi-driver/overview.rst index 10544ed5234..bde7f8d228e 100644 --- a/docs/en/api-guides/wifi-driver/overview.rst +++ b/docs/en/api-guides/wifi-driver/overview.rst @@ -387,9 +387,11 @@ The :ref:`wifi-event-connectionless-module-wake-interval-start` will arise at th -{IDF_TARGET_MAX_CONN_STA_NUM:default="15", esp32c2="4", esp32c3="10", esp32c6="10"} +{IDF_TARGET_MAX_CONN_STA_NUM:default="15", esp32c2="4"} -{IDF_TARGET_SUB_MAX_NUM_FROM_KEYS:default="2", esp32c3="7", esp32c6="7"} +{IDF_TARGET_SUB_MAX_NUM_FROM_KEYS:default="2", esp32c2="0"} + +{IDF_TARGET_SUPPORT_ENCRYPT_NUM:default="17", esp32c2="4"} .. _wifi-configuration: @@ -525,56 +527,34 @@ AP Basic Configuration API :cpp:func:`esp_wifi_set_config()` can be used to configure the AP. And the configuration will be stored in NVS. The table below describes the fields in detail. -.. only:: esp32 or esp32s2 or esp32s3 or esp32c3 or esp32c5 or esp32c6 +.. list-table:: + :header-rows: 1 + :widths: 15 55 - .. list-table:: - :header-rows: 1 - :widths: 15 55 + * - Field + - Description + * - ssid + - SSID of AP; if the ssid[0] is 0xFF and ssid[1] is 0xFF, the AP defaults the SSID to ``ESP_aabbcc``, where “aabbcc” is the last three bytes of the AP MAC. + * - password + - Password of AP; if the auth mode is ``WIFI_AUTH_OPEN``, this field will be ignored. + * - ssid_len + - Length of SSID; if ssid_len is 0, check the SSID until there is a termination character. If ssid_len > 32, change it to 32; otherwise, set the SSID length according to ssid_len. + * - channel + - .. only:: SOC_WIFI_SUPPORT_5G - * - Field - - Description - * - ssid - - SSID of AP; if the ssid[0] is 0xFF and ssid[1] is 0xFF, the AP defaults the SSID to ``ESP_aabbcc``, where “aabbcc” is the last three bytes of the AP MAC. - * - password - - Password of AP; if the auth mode is ``WIFI_AUTH_OPEN``, this field will be ignored. - * - ssid_len - - Length of SSID; if ssid_len is 0, check the SSID until there is a termination character. If ssid_len > 32, change it to 32; otherwise, set the SSID length according to ssid_len. - * - channel - - Channel of AP; if the channel is out of range, the Wi-Fi driver will return error. So, please make sure the channel is within the required range. For more details, refer to `Wi-Fi Country Code`_. - * - authmode - - Auth mode of ESP AP; currently, ESP AP does not support AUTH_WEP. If the authmode is an invalid value, AP defaults the value to ``WIFI_AUTH_OPEN``. - * - ssid_hidden - - If ssid_hidden is 1, AP does not broadcast the SSID; otherwise, it does broadcast the SSID. - * - max_connection - - The max number of stations allowed to connect in, the default value is 10. ESP Wi-Fi supports up to {IDF_TARGET_MAX_CONN_STA_NUM} (``ESP_WIFI_MAX_CONN_NUM``) Wi-Fi connections. Please note that ESP AP and ESP-NOW share the same encryption hardware keys, so the max_connection parameter will be affected by the :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`. The total number of encryption hardware keys is 17, if :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` <= {IDF_TARGET_SUB_MAX_NUM_FROM_KEYS}, the max_connection can be set up to {IDF_TARGET_MAX_CONN_STA_NUM}, otherwise the max_connection can be set up to (17 - :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`). - * - beacon_interval - - Beacon interval; the value is 100 ~ 60000 ms, with default value being 100 ms. If the value is out of range, AP defaults it to 100 ms. + Channel of AP; set to 0 for auto selection (min channel: typically 1 for 2.4G, 36 for 5G). Other invalid values return ``ESP_ERR_INVALID_ARG``. So, please make sure the channel is within the required range. For more details, refer to `Wi-Fi Country Code`_. + .. only:: not SOC_WIFI_SUPPORT_5G -.. only:: esp32c2 - - .. list-table:: - :header-rows: 1 - :widths: 15 55 - - * - Field - - Description - * - ssid - - SSID of AP; if the ssid[0] is 0xFF and ssid[1] is 0xFF, the AP defaults the SSID to ``ESP_aabbcc``, where “aabbcc” is the last three bytes of the AP MAC. - * - password - - Password of AP; if the auth mode is ``WIFI_AUTH_OPEN``, this field will be ignored. - * - ssid_len - - Length of SSID; if ssid_len is 0, check the SSID until there is a termination character. If ssid_len > 32, change it to 32; otherwise, set the SSID length according to ssid_len. - * - channel - - Channel of AP; if the channel is out of range, the Wi-Fi driver defaults to channel 1. So, please make sure the channel is within the required range. For more details, refer to `Wi-Fi Country Code`_. - * - authmode - - Auth mode of ESP AP; currently, ESP AP does not support AUTH_WEP. If the authmode is an invalid value, AP defaults the value to ``WIFI_AUTH_OPEN``. - * - ssid_hidden - - If ssid_hidden is 1, AP does not broadcast the SSID; otherwise, it does broadcast the SSID. - * - max_connection - - The max number of stations allowed to connect in, the default value is 2. ESP Wi-Fi supports up to {IDF_TARGET_MAX_CONN_STA_NUM} (``ESP_WIFI_MAX_CONN_NUM``) Wi-Fi connections. Please note that ESP AP and ESP-NOW share the same encryption hardware keys, so the max_connection parameter will be affected by the :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`. The total number of encryption hardware keys is {IDF_TARGET_MAX_CONN_STA_NUM}, the max_connection can be set up to ({IDF_TARGET_MAX_CONN_STA_NUM} - :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`). - * - beacon_interval - - Beacon interval; the value is 100 ~ 60000 ms, with default value being 100 ms. If the value is out of range, AP defaults it to 100 ms. + Channel of AP; set to 0 for auto selection (min channel: typically 1 for 2.4G). Other invalid values return ``ESP_ERR_INVALID_ARG``. So, please make sure the channel is within the required range. For more details, refer to `Wi-Fi Country Code`_. + * - authmode + - Auth mode of ESP AP; currently, ESP AP does not support AUTH_WEP. If the authmode is an invalid value, AP defaults the value to ``WIFI_AUTH_OPEN``. + * - ssid_hidden + - If ssid_hidden is 1, AP does not broadcast the SSID; otherwise, it does broadcast the SSID. + * - max_connection + - The max number of stations allowed to connect in. {IDF_TARGET_NAME} supports up to {IDF_TARGET_MAX_CONN_STA_NUM} (``ESP_WIFI_MAX_CONN_NUM``) Wi-Fi connections. Please note that soft-AP and ESP-NOW share the same encryption hardware keys, so the max_connection parameter will be affected by the :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`. The total number of encryption hardware keys is {IDF_TARGET_SUPPORT_ENCRYPT_NUM}, if :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` <= {IDF_TARGET_SUB_MAX_NUM_FROM_KEYS}, the max_connection can be set up to {IDF_TARGET_MAX_CONN_STA_NUM}, otherwise the max_connection can be set up to ({IDF_TARGET_SUPPORT_ENCRYPT_NUM} - :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`). + * - beacon_interval + - Beacon interval; the value is 100 ~ 60000 ms, with default value being 100 ms. If the value is out of range, AP defaults it to 100 ms. Wi-Fi Protocol Mode diff --git a/docs/zh_CN/api-guides/wifi-driver/overview.rst b/docs/zh_CN/api-guides/wifi-driver/overview.rst index e0bd136d8da..bad98dd0c4d 100644 --- a/docs/zh_CN/api-guides/wifi-driver/overview.rst +++ b/docs/zh_CN/api-guides/wifi-driver/overview.rst @@ -387,9 +387,11 @@ WIFI_EVENT_CONNECTIONLESS_MODULE_WAKE_INTERVAL_START -{IDF_TARGET_MAX_CONN_STA_NUM:default="15", esp32c2="4", esp32c3="10", esp32c6="10"} +{IDF_TARGET_MAX_CONN_STA_NUM:default="15", esp32c2="4"} -{IDF_TARGET_SUB_MAX_NUM_FROM_KEYS:default="2", esp32c3="7", esp32c6="7"} +{IDF_TARGET_SUB_MAX_NUM_FROM_KEYS:default="2", esp32c2="0"} + +{IDF_TARGET_SUPPORT_ENCRYPT_NUM:default="17", esp32c2="4"} .. _wifi-configuration: @@ -525,56 +527,34 @@ AP 基本配置 API :cpp:func:`esp_wifi_set_config()` 可用于配置 AP。配置的参数信息会保存到 NVS 中。下表详细介绍了各个字段。 -.. only:: esp32 or esp32s2 or esp32s3 or esp32c3 or esp32c5 or esp32c6 +.. list-table:: + :header-rows: 1 + :widths: 15 55 - .. list-table:: - :header-rows: 1 - :widths: 15 55 + * - 字段 + - 描述 + * - ssid + - 指 AP 的 SSID。如果 ssid[0] 和 ssid[1] 均为 0xFF,AP 默认 SSID 为 ``ESP_aabbcc``,”aabbcc” 是 AP MAC 的最后三个字节。 + * - password + - AP 的密码。如果身份验证模式为 ``WIFI_AUTH_OPEN``,此字段将被忽略。 + * - ssid_len + - SSID 的长度。如果 ssid_len 为 0,则检查 SSID 直至出现终止字符。如果 ssid_len 大于 32,请更改为 32,或者根据 ssid_len 设置 SSID 长度。 + * - channel + - .. only:: SOC_WIFI_SUPPORT_5G - * - 字段 - - 描述 - * - ssid - - 指 AP 的 SSID。如果 ssid[0] 和 ssid[1] 均为 0xFF,AP 默认 SSID 为 ``ESP_aabbcc``,”aabbcc” 是 AP MAC 的最后三个字节。 - * - password - - AP 的密码。如果身份验证模式为 ``WIFI_AUTH_OPEN``,此字段将被忽略。 - * - ssid_len - - SSID 的长度。如果 ssid_len 为 0,则检查 SSID 直至出现终止字符。如果 ssid_len 大于 32,请更改为 32,或者根据 ssid_len 设置 SSID 长度。 - * - channel - - AP 的信道。如果信道超出范围,Wi-Fi 驱动程序将返回 error。所以,请确保信道在要求的范围内。有关详细信息,请参阅 `Wi-Fi 国家/地区代码`_。 - * - authmode - - ESP AP 的身份验证模式。目前,ESP AP 不支持 AUTH_WEP。如果 authmode 是一个无效值,AP 默认该值为 ``WIFI_AUTH_OPEN``。 - * - ssid_hidden - - 如果 ssid_hidden 为 1,AP 不广播 SSID。若为其他值,则广播。 - * - max_connection - - 允许连接 station 的最大数目,默认值是 10。ESP Wi-Fi 支持 {IDF_TARGET_MAX_CONN_STA_NUM} (``ESP_WIFI_MAX_CONN_NUM``) 个 Wi-Fi 连接。请注意, ESP AP 和 ESP-NOW 共享同一块加密硬件 keys,因此 max_connection 参数将受到 :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` 的影响。加密硬件 keys 的总数是 17,如果 :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` 小于等于 {IDF_TARGET_SUB_MAX_NUM_FROM_KEYS},那么 max_connection 最大可以设置为 {IDF_TARGET_MAX_CONN_STA_NUM},否则 max_connection 最大可以设置为 (17 - :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`)。 - * - beacon_interval - - beacon 间隔。值为 100 ~ 60000 ms,默认值为 100 ms。如果该值不在上述范围,AP 默认取 100 ms。 + AP 的信道。设为 0 表示自动选择(最小信道:2.4 GHz 通常为 1,5 GHz 通常为 36)。其它非法值将返回 ``ESP_ERR_INVALID_ARG``。请确保信道在允许范围内。更多说明请参阅 `Wi-Fi 国家/地区代码`_。 + .. only:: not SOC_WIFI_SUPPORT_5G -.. only:: esp32c2 - - .. list-table:: - :header-rows: 1 - :widths: 15 55 - - * - 字段 - - 描述 - * - ssid - - 指 AP 的 SSID。如果 ssid[0] 和 ssid[1] 均为 0xFF,AP 默认 SSID 为 ``ESP_aabbcc``,”aabbcc” 是 AP MAC 的最后三个字节。 - * - password - - AP 的密码。如果身份验证模式为 ``WIFI_AUTH_OPEN``,此字段将被忽略。 - * - ssid_len - - SSID 的长度。如果 ssid_len 为 0,则检查 SSID 直至出现终止字符。如果 ssid_len 大于 32,请更改为 32,或者根据 ssid_len 设置 SSID 长度。 - * - channel - - AP 的信道。如果信道超出范围,Wi-Fi 驱动程序将默认为信道 1。所以,请确保信道在要求的范围内。有关详细信息,请参阅 `Wi-Fi 国家/地区代码`_。 - * - authmode - - ESP AP 的身份验证模式。目前,ESP AP 不支持 AUTH_WEP。如果 authmode 是一个无效值,AP 默认该值为 ``WIFI_AUTH_OPEN``。 - * - ssid_hidden - - 如果 ssid_hidden 为 1,AP 不广播 SSID。若为其他值,则广播。 - * - max_connection - - 允许连接 station 的最大数目,默认值是 2。ESP Wi-Fi 支持 {IDF_TARGET_MAX_CONN_STA_NUM} (``ESP_WIFI_MAX_CONN_NUM``) 个 Wi-Fi 连接。请注意, ESP AP 和 ESP-NOW 共享同一块加密硬件 keys,因此 max_connection 参数将受到 :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` 的影响。加密硬件 keys 的总数是 {IDF_TARGET_MAX_CONN_STA_NUM}, max_connection 最大可以设置为 ({IDF_TARGET_MAX_CONN_STA_NUM} - :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`)。 - * - beacon_interval - - beacon 间隔。值为 100 ~ 60000 ms,默认值为 100 ms。如果该值不在上述范围,AP 默认取 100 ms。 + AP 的信道。设为 0 表示自动选择(最小信道:2.4 GHz 通常为 1)。其它非法值将返回 ``ESP_ERR_INVALID_ARG``。请确保信道在允许范围内。更多说明请参阅 `Wi-Fi 国家/地区代码`_。 + * - authmode + - ESP AP 的身份验证模式。目前,ESP AP 不支持 AUTH_WEP。如果 authmode 是一个无效值,AP 默认该值为 ``WIFI_AUTH_OPEN``。 + * - ssid_hidden + - 如果 ssid_hidden 为 1,AP 不广播 SSID。若为其他值,则广播。 + * - max_connection + - 允许接入的 station 最大数量。{IDF_TARGET_NAME} 最多支持 {IDF_TARGET_MAX_CONN_STA_NUM}(``ESP_WIFI_MAX_CONN_NUM``) 个 Wi-Fi 连接。请注意,soft-AP 与 ESP-NOW 共享同一套加密硬件 keys,因此 max_connection 会受到 :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` 的影响。加密硬件 keys 总数为 {IDF_TARGET_SUPPORT_ENCRYPT_NUM}:若 :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM` <= {IDF_TARGET_SUB_MAX_NUM_FROM_KEYS},则 max_connection 最大可设为 {IDF_TARGET_MAX_CONN_STA_NUM};否则最大可设为 ({IDF_TARGET_SUPPORT_ENCRYPT_NUM} - :ref:`CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM`)。 + * - beacon_interval + - beacon 间隔。值为 100 ~ 60000 ms,默认值为 100 ms。如果该值不在上述范围,AP 默认取 100 ms。 Wi-Fi 协议模式 diff --git a/examples/network/bridge/main/Kconfig.projbuild b/examples/network/bridge/main/Kconfig.projbuild index eb3bf58a468..d7abd9d84c2 100644 --- a/examples/network/bridge/main/Kconfig.projbuild +++ b/examples/network/bridge/main/Kconfig.projbuild @@ -40,6 +40,12 @@ menu "Example AP Wifi Configuration" depends on EXAMPLE_BR_WIFI int "Maximal STA connections" default 4 + range 1 4 if IDF_TARGET_ESP32C2 + range 1 15 help - Max number of the STA connects to AP. + Maximum number of STAs allowed to connect to the bridged soft-AP (wifi_config_t.ap.max_connection). + Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h: + 1-4 on ESP32-C2, 1-15 on other Wi-Fi chips. + Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation + if ESP-NOW is enabled. endmenu diff --git a/examples/network/eth2ap/main/Kconfig.projbuild b/examples/network/eth2ap/main/Kconfig.projbuild index 885ccf6dbbb..affe95436ee 100644 --- a/examples/network/eth2ap/main/Kconfig.projbuild +++ b/examples/network/eth2ap/main/Kconfig.projbuild @@ -22,7 +22,13 @@ menu "Example Configuration" config EXAMPLE_MAX_STA_CONN int "Maximum STA connections" default 4 + range 1 4 if IDF_TARGET_ESP32C2 + range 1 15 help - Maximum number of the station that allowed to connect to current Wi-Fi hotspot. + Maximum number of STAs allowed to connect to the soft-AP (wifi_config_t.ap.max_connection). + Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h: + 1-4 on ESP32-C2, 1-15 on other Wi-Fi chips. + Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation + if ESP-NOW is enabled. endmenu diff --git a/examples/protocols/http_server/captive_portal/main/Kconfig.projbuild b/examples/protocols/http_server/captive_portal/main/Kconfig.projbuild index 9f2a7f1be5b..f2df8400512 100644 --- a/examples/protocols/http_server/captive_portal/main/Kconfig.projbuild +++ b/examples/protocols/http_server/captive_portal/main/Kconfig.projbuild @@ -15,8 +15,14 @@ menu "Example Configuration" config ESP_MAX_STA_CONN int "Maximal STA connections" default 4 + range 1 4 if IDF_TARGET_ESP32C2 + range 1 15 help - Max number of the STA connects to AP. + Maximum number of STAs allowed to connect to the soft-AP (wifi_config_t.ap.max_connection). + Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h: + 1-4 on ESP32-C2, 1-15 on other Wi-Fi chips. + Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation + if ESP-NOW is enabled. config ESP_ENABLE_DHCP_CAPTIVEPORTAL bool "DHCP Captive portal" diff --git a/examples/wifi/getting_started/softAP/main/Kconfig.projbuild b/examples/wifi/getting_started/softAP/main/Kconfig.projbuild index 5dcaa97c15b..2f5c38d3985 100644 --- a/examples/wifi/getting_started/softAP/main/Kconfig.projbuild +++ b/examples/wifi/getting_started/softAP/main/Kconfig.projbuild @@ -21,8 +21,14 @@ menu "Example Configuration" config ESP_MAX_STA_CONN int "Maximal STA connections" default 4 + range 1 4 if IDF_TARGET_ESP32C2 + range 1 15 help - Max number of the STA connects to AP. + Maximum number of STAs allowed to connect to the soft-AP (wifi_config_t.ap.max_connection). + Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h: + 1-4 on ESP32-C2, 1-15 on other Wi-Fi chips. + Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation + if ESP-NOW is enabled. config ESP_GTK_REKEYING_ENABLE bool "Enable GTK Rekeying" diff --git a/examples/wifi/power_save/pytest_wifi_power_save.py b/examples/wifi/power_save/pytest_wifi_power_save.py index 04c030a15d5..0e811d8511f 100644 --- a/examples/wifi/power_save/pytest_wifi_power_save.py +++ b/examples/wifi/power_save/pytest_wifi_power_save.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import logging @@ -64,6 +64,19 @@ def test_wifi_power_save_pd_top(dut: Dut) -> None: _run_test(dut) +@pytest.mark.wifi_ap +@pytest.mark.parametrize( + 'config', + [ + 'pd_modem', + ], + indirect=True, +) +@idf_parametrize('target', ['esp32c6', 'esp32c5', 'esp32c61'], indirect=['target']) +def test_wifi_power_save_pd_modem(dut: Dut) -> None: + _run_test(dut) + + @pytest.mark.wifi_ap @pytest.mark.xtal_26mhz @pytest.mark.parametrize( diff --git a/examples/wifi/power_save/sdkconfig.ci.c2_xtal26m b/examples/wifi/power_save/sdkconfig.ci.c2_xtal26m index 065020b06fb..68a9d5efcdf 100644 --- a/examples/wifi/power_save/sdkconfig.ci.c2_xtal26m +++ b/examples/wifi/power_save/sdkconfig.ci.c2_xtal26m @@ -1,3 +1,4 @@ CONFIG_IDF_TARGET="esp32c2" CONFIG_XTAL_FREQ_26=y CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y +CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y diff --git a/examples/wifi/power_save/sdkconfig.ci.esp32c2_rev2_xtal26m b/examples/wifi/power_save/sdkconfig.ci.esp32c2_rev2_xtal26m index a302168187a..296928320fd 100644 --- a/examples/wifi/power_save/sdkconfig.ci.esp32c2_rev2_xtal26m +++ b/examples/wifi/power_save/sdkconfig.ci.esp32c2_rev2_xtal26m @@ -2,3 +2,4 @@ CONFIG_IDF_TARGET="esp32c2" CONFIG_XTAL_FREQ_26=y CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y CONFIG_ESP32C2_REV_MIN_200=y +CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y diff --git a/examples/wifi/power_save/sdkconfig.ci.esp32c3_rev1 b/examples/wifi/power_save/sdkconfig.ci.esp32c3_rev1 index 6b253290433..05ef4a47428 100644 --- a/examples/wifi/power_save/sdkconfig.ci.esp32c3_rev1 +++ b/examples/wifi/power_save/sdkconfig.ci.esp32c3_rev1 @@ -1,3 +1,4 @@ CONFIG_IDF_TARGET="esp32c3" CONFIG_ESP32C3_REV_MIN_101=y CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y +CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y diff --git a/examples/wifi/power_save/sdkconfig.ci.pd_modem b/examples/wifi/power_save/sdkconfig.ci.pd_modem new file mode 100644 index 00000000000..604a4ddeb80 --- /dev/null +++ b/examples/wifi/power_save/sdkconfig.ci.pd_modem @@ -0,0 +1,4 @@ +CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y +CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y +CONFIG_ESP_PHY_MAC_BB_PD=y +CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP=y diff --git a/examples/wifi/power_save/sdkconfig.ci.pd_top b/examples/wifi/power_save/sdkconfig.ci.pd_top index c758a33bcd3..4948d7b497b 100644 --- a/examples/wifi/power_save/sdkconfig.ci.pd_top +++ b/examples/wifi/power_save/sdkconfig.ci.pd_top @@ -2,3 +2,4 @@ CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP=y CONFIG_ESP_PHY_MAC_BB_PD=y CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING=y +CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y diff --git a/examples/wifi/softap_sta/main/Kconfig.projbuild b/examples/wifi/softap_sta/main/Kconfig.projbuild index c7af1590148..32e5377d2e7 100644 --- a/examples/wifi/softap_sta/main/Kconfig.projbuild +++ b/examples/wifi/softap_sta/main/Kconfig.projbuild @@ -25,8 +25,14 @@ menu "Example Configuration" config ESP_MAX_STA_CONN_AP int "Maximal STA connections" default 4 + range 1 4 if IDF_TARGET_ESP32C2 + range 1 15 help - Max number of the STA connects to AP. + Maximum number of STAs allowed to connect to the soft-AP (wifi_config_t.ap.max_connection). + Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h: + 1-4 on ESP32-C2, 1-15 on other Wi-Fi chips. + Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation + if ESP-NOW is enabled. endmenu menu "STA Configuration" diff --git a/examples/wifi/wps_softap_registrar/main/Kconfig.projbuild b/examples/wifi/wps_softap_registrar/main/Kconfig.projbuild index 4f173a0cabe..a1cb700bddc 100644 --- a/examples/wifi/wps_softap_registrar/main/Kconfig.projbuild +++ b/examples/wifi/wps_softap_registrar/main/Kconfig.projbuild @@ -22,8 +22,14 @@ menu "Example Configuration" config EXAMPLE_MAX_STA_CONN int "Maximal STA connections" default 4 + range 1 4 if IDF_TARGET_ESP32C2 + range 1 15 help - Max number of the STA connects to AP. + Maximum number of STAs allowed to connect to the soft-AP (wifi_config_t.ap.max_connection). + Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h: + 1-4 on ESP32-C2, 1-15 on other Wi-Fi chips. + Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation + if ESP-NOW is enabled. choice EXAMPLE_WPS_TYPE prompt "WPS mode" @@ -44,7 +50,7 @@ menu "Example Configuration" int "WPS PIN" default 0 help - WPS PIN to be used for the connection, incase its not give, AP will derive a new one. + WPS PIN to be used for the connection, in case its not give, AP will derive a new one. endif endmenu