1 /*
2  * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <esp_event.h>
8 #include <esp_wifi.h>
9 #include "esp_log.h"
10 #include "esp_private/wifi.h"
11 #include "esp_private/adc_share_hw_ctrl.h"
12 #include "esp_private/sleep_modem.h"
13 #include "esp_pm.h"
14 #include "esp_sleep.h"
15 #include "esp_check.h"
16 #include "esp_private/pm_impl.h"
17 #include "esp_private/esp_clk.h"
18 #include "esp_wpa.h"
19 #include "esp_netif.h"
20 #include "private/esp_coexist_internal.h"
21 #include "esp_phy_init.h"
22 #include "esp_private/phy.h"
23 #if __has_include("esp_psram.h")
24 #include "esp_psram.h"
25 #endif
26 #ifdef CONFIG_ESP_WIFI_NAN_ENABLE
27 #include "apps_private/wifi_apps_private.h"
28 #endif
29 #ifdef CONFIG_ESP_WIFI_FTM_ENABLE
30 #include "esp_chip_info.h"
31 #endif
32 
33 #if SOC_PM_MODEM_RETENTION_BY_REGDMA
34 #include "esp_private/sleep_retention.h"
35 #endif
36 
37 static bool s_wifi_inited = false;
38 
39 #if (CONFIG_ESP_WIFI_RX_BA_WIN > CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM)
40 #error "WiFi configuration check: WARNING, WIFI_RX_BA_WIN should not be larger than WIFI_DYNAMIC_RX_BUFFER_NUM!"
41 #endif
42 
43 #if (CONFIG_ESP_WIFI_RX_BA_WIN > (CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM << 1))
44 #error "WiFi configuration check: WARNING, WIFI_RX_BA_WIN should not be larger than double of the WIFI_STATIC_RX_BUFFER_NUM!"
45 #endif
46 
47 ESP_EVENT_DEFINE_BASE(WIFI_EVENT);
48 
49 extern uint8_t esp_wifi_get_user_init_flag_internal(void);
50 #ifdef CONFIG_PM_ENABLE
51 static esp_pm_lock_handle_t s_wifi_modem_sleep_lock;
52 #endif
53 
54 #if CONFIG_IDF_TARGET_ESP32
55 /* Callback function to update WiFi MAC time */
56 wifi_mac_time_update_cb_t s_wifi_mac_time_update_cb = NULL;
57 #endif
58 
59 #if SOC_PM_SUPPORT_PMU_MODEM_STATE
60 # define WIFI_BEACON_MONITOR_CONFIG_DEFAULT(ena)   { \
61     .enable = (ena), \
62     .loss_timeout = CONFIG_ESP_WIFI_SLP_BEACON_LOST_TIMEOUT, \
63     .loss_threshold = CONFIG_ESP_WIFI_SLP_BEACON_LOST_THRESHOLD, \
64     .delta_intr_early = 0, \
65     .delta_loss_timeout = 0, \
66     .beacon_abort = 1, \
67     .broadcast_wakeup = 1, \
68     .tsf_time_sync_deviation = 5, \
69     .modem_state_consecutive = 10, \
70     .rf_ctrl_wait_cycle = 20 \
71 }
72 #else
73 # define WIFI_BEACON_MONITOR_CONFIG_DEFAULT(ena)   { \
74     .enable = (ena), \
75     .loss_timeout = CONFIG_ESP_WIFI_SLP_BEACON_LOST_TIMEOUT, \
76     .loss_threshold = CONFIG_ESP_WIFI_SLP_BEACON_LOST_THRESHOLD, \
77     .delta_intr_early = CONFIG_ESP_WIFI_SLP_PHY_ON_DELTA_EARLY_TIME, \
78     .delta_loss_timeout = CONFIG_ESP_WIFI_SLP_PHY_OFF_DELTA_TIMEOUT_TIME \
79 }
80 #endif
81 
82 static const char* TAG = "wifi_init";
83 
s_set_default_wifi_log_level(void)84 static void __attribute__((constructor)) s_set_default_wifi_log_level(void)
85 {
86     /* WiFi libraries aren't compiled to know CONFIG_LOG_DEFAULT_LEVEL,
87        so set it at runtime startup. Done here not in esp_wifi_init() to allow
88        the user to set the level again before esp_wifi_init() is called.
89     */
90     esp_log_level_set("wifi", CONFIG_LOG_DEFAULT_LEVEL);
91     esp_log_level_set("mesh", CONFIG_LOG_DEFAULT_LEVEL);
92     esp_log_level_set("smartconfig", CONFIG_LOG_DEFAULT_LEVEL);
93     esp_log_level_set("ESPNOW", CONFIG_LOG_DEFAULT_LEVEL);
94 }
95 
esp_wifi_set_log_level(void)96 static void esp_wifi_set_log_level(void)
97 {
98     wifi_log_level_t wifi_log_level = WIFI_LOG_INFO;
99     /* set WiFi log level */
100 #if CONFIG_LOG_MAXIMUM_LEVEL == 0
101     wifi_log_level = WIFI_LOG_NONE;
102 #elif CONFIG_LOG_MAXIMUM_LEVEL == 1
103     wifi_log_level = WIFI_LOG_ERROR;
104 #elif CONFIG_LOG_MAXIMUM_LEVEL == 2
105     wifi_log_level = WIFI_LOG_WARNING;
106 #elif CONFIG_LOG_MAXIMUM_LEVEL == 3
107     wifi_log_level = WIFI_LOG_INFO;
108 #elif CONFIG_LOG_MAXIMUM_LEVEL == 4
109     wifi_log_level = WIFI_LOG_DEBUG;
110 #elif CONFIG_LOG_MAXIMUM_LEVEL == 5
111     wifi_log_level = WIFI_LOG_VERBOSE;
112 #endif
113     esp_wifi_internal_set_log_level(wifi_log_level);
114 }
115 
116 #if (CONFIG_FREERTOS_USE_TICKLESS_IDLE && SOC_PM_MODEM_RETENTION_BY_REGDMA)
init_wifi_mac_sleep_retention(void * arg)117 static esp_err_t init_wifi_mac_sleep_retention(void *arg)
118 {
119     int config_size;
120     sleep_retention_entries_config_t *config = esp_wifi_internal_mac_retention_context_get(&config_size);
121     esp_err_t err = sleep_retention_entries_create(config, config_size, 3, SLEEP_RETENTION_MODULE_WIFI_MAC);
122     ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for modem (%s) retention", "WiFi MAC");
123     ESP_LOGD(TAG, "WiFi MAC sleep retention initialization");
124     return ESP_OK;
125 }
126 #endif
127 
128 #if CONFIG_MAC_BB_PD
esp_wifi_mac_pd_mem_init(void)129 static void esp_wifi_mac_pd_mem_init(void)
130 {
131 #if SOC_PM_MODEM_RETENTION_BY_REGDMA
132     esp_err_t err = sleep_retention_module_allocate(SLEEP_RETENTION_MODULE_WIFI_MAC);
133     if (err != ESP_OK) {
134         ESP_LOGW(TAG, "failed to allocate sleep retention linked list for wifi mac retention");
135     }
136 #endif
137     esp_wifi_internal_set_mac_sleep(true);
138 }
esp_wifi_mac_pd_mem_deinit(void)139 static void esp_wifi_mac_pd_mem_deinit(void)
140 {
141     esp_wifi_internal_set_mac_sleep(false);
142 #if SOC_PM_MODEM_RETENTION_BY_REGDMA
143     esp_err_t err = sleep_retention_module_free(SLEEP_RETENTION_MODULE_WIFI_MAC);
144     if (err != ESP_OK) {
145         ESP_LOGW(TAG, "failed to free sleep retention linked list for wifi mac retention");
146     }
147 #endif
148 }
149 #endif
150 
wifi_deinit_internal(void)151 static esp_err_t wifi_deinit_internal(void)
152 {
153     esp_err_t err = ESP_OK;
154 
155     if (esp_wifi_get_user_init_flag_internal()) {
156         ESP_LOGE(TAG, "Wi-Fi not stop");
157         return ESP_ERR_WIFI_NOT_STOPPED;
158     }
159 
160     if (esp_wifi_internal_reg_rxcb(WIFI_IF_STA,  NULL) != ESP_OK ||
161         esp_wifi_internal_reg_rxcb(WIFI_IF_AP,  NULL) != ESP_OK) {
162         ESP_LOGW(TAG, "Failed to unregister Rx callbacks");
163     }
164 
165 #ifdef CONFIG_ESP_WIFI_NAN_ENABLE
166     esp_nan_app_deinit();
167 #endif
168 
169 #if CONFIG_MAC_BB_PD
170     esp_wifi_mac_pd_mem_deinit();
171     esp_mac_bb_pd_mem_deinit();
172 #endif
173 
174     esp_supplicant_deinit();
175     err = esp_wifi_deinit_internal();
176     if (err != ESP_OK) {
177         ESP_LOGE(TAG, "Failed to deinit Wi-Fi driver (0x%x)", err);
178         return err;
179     }
180 #ifdef CONFIG_PM_ENABLE
181     if (s_wifi_modem_sleep_lock) {
182         esp_pm_lock_delete(s_wifi_modem_sleep_lock);
183         s_wifi_modem_sleep_lock = NULL;
184     }
185 #endif
186     esp_wifi_power_domain_off();
187 
188 #if CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT
189     wifi_beacon_monitor_config_t monitor_config = WIFI_BEACON_MONITOR_CONFIG_DEFAULT(false);
190     esp_wifi_beacon_monitor_configure(&monitor_config);
191 #endif
192 
193 #if CONFIG_ESP_WIFI_SLP_IRAM_OPT
194     esp_pm_unregister_light_sleep_default_params_config_callback();
195 #endif
196 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
197 #if SOC_WIFI_HW_TSF
198     esp_pm_unregister_skip_light_sleep_callback(esp_wifi_internal_is_tsf_active);
199     esp_pm_unregister_inform_out_light_sleep_overhead_callback(esp_wifi_internal_update_light_sleep_wake_ahead_time);
200     esp_sleep_disable_wifi_wakeup();
201 # if CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
202     esp_sleep_disable_wifi_beacon_wakeup();
203 # endif
204 #endif /* SOC_WIFI_HW_TSF */
205 #if SOC_PM_MODEM_RETENTION_BY_REGDMA
206     err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_WIFI_MAC);
207     if (err != ESP_OK) {
208         ESP_LOGW(TAG, "WiFi MAC sleep retention deinit failed");
209     }
210 #endif /* SOC_PM_MODEM_RETENTION_BY_REGDMA */
211 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
212 #if CONFIG_MAC_BB_PD
213     esp_unregister_mac_bb_pd_callback(pm_mac_sleep);
214     esp_unregister_mac_bb_pu_callback(pm_mac_wakeup);
215 #endif
216 #if CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
217     esp_wifi_internal_modem_state_configure(false);
218     esp_pm_unregister_skip_light_sleep_callback(sleep_modem_wifi_modem_state_skip_light_sleep);
219 #endif
220     esp_phy_modem_deinit();
221 
222     s_wifi_inited = false;
223 
224     return err;
225 }
226 
esp_wifi_deinit(void)227 esp_err_t esp_wifi_deinit(void)
228 {
229     if (s_wifi_inited == false) {
230         return ESP_ERR_WIFI_NOT_INIT;
231     }
232 
233     return wifi_deinit_internal();
234 }
235 
esp_wifi_config_info(void)236 static void esp_wifi_config_info(void)
237 {
238 #ifdef CONFIG_ESP_WIFI_RX_BA_WIN
239     ESP_LOGI(TAG, "rx ba win: %d", CONFIG_ESP_WIFI_RX_BA_WIN);
240 #endif
241 
242 #ifdef CONFIG_ESP_NETIF_TCPIP_LWIP
243     ESP_LOGI(TAG, "tcpip mbox: %d", CONFIG_LWIP_TCPIP_RECVMBOX_SIZE);
244     ESP_LOGI(TAG, "udp mbox: %d", CONFIG_LWIP_UDP_RECVMBOX_SIZE);
245     ESP_LOGI(TAG, "tcp mbox: %d", CONFIG_LWIP_TCP_RECVMBOX_SIZE);
246     ESP_LOGI(TAG, "tcp tx win: %d", CONFIG_LWIP_TCP_SND_BUF_DEFAULT);
247     ESP_LOGI(TAG, "tcp rx win: %d", CONFIG_LWIP_TCP_WND_DEFAULT);
248     ESP_LOGI(TAG, "tcp mss: %d", CONFIG_LWIP_TCP_MSS);
249 
250 #ifdef CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP
251     ESP_LOGI(TAG, "WiFi/LWIP prefer SPIRAM");
252 #endif
253 
254 #ifdef CONFIG_ESP_WIFI_IRAM_OPT
255     ESP_LOGI(TAG, "WiFi IRAM OP enabled");
256 #endif
257 
258 #ifdef CONFIG_ESP_WIFI_RX_IRAM_OPT
259     ESP_LOGI(TAG, "WiFi RX IRAM OP enabled");
260 #endif
261 
262 #ifdef CONFIG_ESP_WIFI_SLP_IRAM_OPT
263     ESP_LOGI(TAG, "WiFi SLP IRAM OP enabled");
264 #endif
265 
266 #ifdef CONFIG_LWIP_IRAM_OPTIMIZATION
267     ESP_LOGI(TAG, "LWIP IRAM OP enabled");
268 #endif
269 
270 #else
271     ESP_LOGI(TAG, "LWIP disabled");
272 #endif
273 }
274 
275 #if CONFIG_SPIRAM
esp_wifi_psram_check(const wifi_init_config_t * config)276 static esp_err_t esp_wifi_psram_check(const wifi_init_config_t *config)
277 {
278 #if CONFIG_SPIRAM_IGNORE_NOTFOUND
279     if (!esp_psram_is_initialized()) {
280         if (config->feature_caps & CONFIG_FEATURE_CACHE_TX_BUF_BIT) {
281             ESP_LOGW(TAG, "WiFi cache TX buffers should be disabled when initialize SPIRAM failed");
282         }
283         if (config->tx_buf_type == 0) {
284             ESP_LOGW(TAG, "TX buffers type should be changed from static to dynamic when initialize SPIRAM failed");
285         }
286 #ifdef CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP
287         ESP_LOGW(TAG, "WiFi/LWIP prefer SPIRAM should be disabled when initialize SPIRAM failed");
288 #endif
289         if (config->amsdu_tx_enable) {
290             ESP_LOGW(TAG, "WiFi AMSDU TX should be disabled when initialize SPIRAM failed");
291         }
292     }
293 #endif
294     if ((config->feature_caps & CONFIG_FEATURE_CACHE_TX_BUF_BIT) && (WIFI_CACHE_TX_BUFFER_NUM == 0)) {
295         ESP_LOGE(TAG, "Number of WiFi cache TX buffers should not equal 0 when enable SPIRAM");
296         return ESP_ERR_NOT_SUPPORTED;
297     }
298     return ESP_OK;
299 }
300 #endif
301 
esp_wifi_init(const wifi_init_config_t * config)302 esp_err_t esp_wifi_init(const wifi_init_config_t *config)
303 {
304     if (s_wifi_inited) {
305         return ESP_OK;
306     }
307 
308     esp_err_t result = ESP_OK;
309 #ifdef CONFIG_SPIRAM
310     result = esp_wifi_psram_check(config);
311     if (result != ESP_OK) {
312         return result;
313     }
314 #endif
315 
316 #if CONFIG_ESP_WIFI_SLP_IRAM_OPT
317     int min_freq_mhz = esp_pm_impl_get_cpu_freq(PM_MODE_LIGHT_SLEEP);
318     int max_freq_mhz = esp_pm_impl_get_cpu_freq(PM_MODE_CPU_MAX);
319     esp_wifi_internal_update_light_sleep_default_params(min_freq_mhz, max_freq_mhz);
320 
321     esp_pm_register_light_sleep_default_params_config_callback(esp_wifi_internal_update_light_sleep_default_params);
322 
323 #endif
324 
325     uint32_t min_active_time_us = CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME * 1000;
326     esp_wifi_set_sleep_min_active_time(min_active_time_us);
327 
328     uint32_t keep_alive_time_us = CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME * 1000 * 1000;
329     esp_wifi_set_keep_alive_time(keep_alive_time_us);
330 
331     uint32_t wait_broadcast_data_time_us = CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME * 1000;
332     esp_wifi_set_sleep_wait_broadcast_data_time(wait_broadcast_data_time_us);
333 
334 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
335 #if SOC_PM_MODEM_RETENTION_BY_REGDMA
336     sleep_retention_module_init_param_t init_param = {
337         .cbs     = { .create = { .handle = init_wifi_mac_sleep_retention, .arg = NULL } },
338         .depends = BIT(SLEEP_RETENTION_MODULE_WIFI_BB) | BIT(SLEEP_RETENTION_MODULE_CLOCK_MODEM)
339     };
340     esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_WIFI_MAC, &init_param);
341     if (err != ESP_OK) {
342         ESP_LOGW(TAG, "WiFi MAC sleep retention init failed");
343     }
344 #endif
345 
346 #if CONFIG_MAC_BB_PD
347     if (esp_register_mac_bb_pd_callback(pm_mac_sleep) != ESP_OK
348         || esp_register_mac_bb_pu_callback(pm_mac_wakeup) != ESP_OK) {
349 
350         esp_unregister_mac_bb_pd_callback(pm_mac_sleep);
351         esp_unregister_mac_bb_pu_callback(pm_mac_wakeup);
352         return ESP_ERR_INVALID_ARG;
353     }
354 #endif
355 
356 #if SOC_WIFI_HW_TSF
357     esp_err_t ret = esp_pm_register_skip_light_sleep_callback(esp_wifi_internal_is_tsf_active);
358     if (ret != ESP_OK) {
359         ESP_LOGE(TAG, "Failed to register skip light sleep callback (0x%x)", ret);
360 #if CONFIG_MAC_BB_PD
361         esp_unregister_mac_bb_pd_callback(pm_mac_sleep);
362         esp_unregister_mac_bb_pu_callback(pm_mac_wakeup);
363 #endif
364         return ret;
365     }
366     ret = esp_pm_register_inform_out_light_sleep_overhead_callback(esp_wifi_internal_update_light_sleep_wake_ahead_time);
367     if (ret != ESP_OK) {
368         ESP_LOGE(TAG, "Failed to register inform light sleep overhead callback (0x%x)", ret);
369         return ret;
370     }
371     esp_sleep_enable_wifi_wakeup();
372 # if CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
373     esp_sleep_enable_wifi_beacon_wakeup();
374 # endif
375 #if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE
376     coex_wifi_register_update_lpclk_callback(esp_wifi_update_tsf_tick_interval);
377 #endif
378 #endif /* SOC_WIFI_HW_TSF */
379 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
380 
381 #if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE
382     coex_init();
383 #endif
384     esp_wifi_set_log_level();
385     esp_wifi_power_domain_on();
386 #ifdef CONFIG_ESP_WIFI_FTM_ENABLE
387     esp_chip_info_t info = {0};
388     esp_chip_info(&info);
389     if (info.model == CHIP_ESP32C6 && info.revision <= 1) {
390         ((wifi_init_config_t *)config)->feature_caps &= ~(CONFIG_FEATURE_FTM_INITIATOR_BIT);
391     }
392 #endif
393     result = esp_wifi_init_internal(config);
394     if (result == ESP_OK) {
395 #if CONFIG_MAC_BB_PD
396         esp_mac_bb_pd_mem_init();
397         esp_wifi_mac_pd_mem_init();
398 #endif
399         esp_phy_modem_init();
400 #if CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
401         if (sleep_modem_wifi_modem_state_enabled()) {
402             esp_pm_register_skip_light_sleep_callback(sleep_modem_wifi_modem_state_skip_light_sleep);
403             esp_wifi_internal_modem_state_configure(true); /* require WiFi to enable automatically receives the beacon */
404         }
405 #endif
406 #if CONFIG_IDF_TARGET_ESP32
407         s_wifi_mac_time_update_cb = esp_wifi_internal_update_mac_time;
408 #endif
409 
410 #ifdef CONFIG_PM_ENABLE
411         if (s_wifi_modem_sleep_lock == NULL) {
412             result = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "wifi",
413                     &s_wifi_modem_sleep_lock);
414             if (result != ESP_OK) {
415                 ESP_LOGE(TAG, "Failed to create pm lock (0x%x)", result);
416                 goto _deinit;
417             }
418         }
419 #endif
420 
421         result = esp_supplicant_init();
422         if (result != ESP_OK) {
423             ESP_LOGE(TAG, "Failed to init supplicant (0x%x)", result);
424             goto _deinit;
425         }
426     } else {
427         goto _deinit;
428     }
429 #if CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT
430     wifi_beacon_monitor_config_t monitor_config = WIFI_BEACON_MONITOR_CONFIG_DEFAULT(true);
431     esp_wifi_beacon_monitor_configure(&monitor_config);
432 #endif
433     adc2_cal_include(); //This enables the ADC2 calibration constructor at start up.
434 
435     esp_wifi_config_info();
436 
437 #ifdef CONFIG_ESP_WIFI_NAN_ENABLE
438     esp_nan_app_init();
439 #endif
440 
441     s_wifi_inited = true;
442 
443     return result;
444 
445 _deinit:
446     ;
447     esp_err_t deinit_ret = wifi_deinit_internal();
448     if (deinit_ret != ESP_OK) {
449         ESP_LOGE(TAG, "Failed to deinit Wi-Fi (0x%x)", deinit_ret);
450     }
451 
452     return result;
453 }
454 
455 #ifdef CONFIG_PM_ENABLE
wifi_apb80m_request(void)456 void wifi_apb80m_request(void)
457 {
458     assert(s_wifi_modem_sleep_lock);
459     esp_pm_lock_acquire(s_wifi_modem_sleep_lock);
460     if (esp_clk_apb_freq() != APB_CLK_FREQ) {
461         ESP_LOGE(__func__, "WiFi needs 80MHz APB frequency to work, but got %dHz", esp_clk_apb_freq());
462     }
463 }
464 
wifi_apb80m_release(void)465 void wifi_apb80m_release(void)
466 {
467     assert(s_wifi_modem_sleep_lock);
468     esp_pm_lock_release(s_wifi_modem_sleep_lock);
469 }
470 #endif //CONFIG_PM_ENABLE
471 
472 #ifndef CONFIG_ESP_WIFI_FTM_ENABLE
ieee80211_ftm_attach(void)473 esp_err_t ieee80211_ftm_attach(void)
474 {
475     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
476     return ESP_OK;
477 }
478 #endif
479 
480 #ifndef CONFIG_ESP_WIFI_SOFTAP_SUPPORT
net80211_softap_funcs_init(void)481 void net80211_softap_funcs_init(void)
482 {
483     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
484 }
485 
ieee80211_ap_try_sa_query(void * p)486 bool ieee80211_ap_try_sa_query(void *p)
487 {
488     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
489     return false;
490 }
491 
ieee80211_ap_sa_query_timeout(void * p)492 bool ieee80211_ap_sa_query_timeout(void *p)
493 {
494     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
495     return false;
496 }
497 
add_mic_ie_bip(void * p)498 int add_mic_ie_bip(void *p)
499 {
500     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
501     return 0;
502 }
503 
ieee80211_free_beacon_eb(void)504 void ieee80211_free_beacon_eb(void)
505 {
506     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
507 }
508 
ieee80211_pwrsave(void * p1,void * p2)509 int ieee80211_pwrsave(void *p1, void *p2)
510 {
511     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
512     return 0;
513 }
514 
cnx_node_remove(void * p)515 void cnx_node_remove(void *p)
516 {
517     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
518 }
519 
ieee80211_set_tim(void * p,int arg)520 int ieee80211_set_tim(void *p, int arg)
521 {
522     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
523     return 0;
524 }
525 
ieee80211_is_bufferable_mmpdu(void * p)526 bool ieee80211_is_bufferable_mmpdu(void *p)
527 {
528     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
529     return false;
530 }
531 
cnx_node_leave(void * p,uint8_t arg)532 void cnx_node_leave(void *p, uint8_t arg)
533 {
534     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
535 }
536 
ieee80211_beacon_construct(void * p1,void * p2,void * p3,void * p4)537 void ieee80211_beacon_construct(void *p1, void *p2, void *p3, void *p4)
538 {
539     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
540 }
541 
ieee80211_assoc_resp_construct(void * p,int arg)542 void * ieee80211_assoc_resp_construct(void *p, int arg)
543 {
544     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
545     return NULL;
546 }
547 
ieee80211_alloc_proberesp(void * p,int arg)548 void * ieee80211_alloc_proberesp(void *p, int arg)
549 {
550     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
551     return NULL;
552 }
553 
554 #endif
555 
556 #ifndef CONFIG_ESP_WIFI_NAN_ENABLE
557 
nan_start(void)558 esp_err_t nan_start(void)
559 {
560     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
561     return ESP_OK;
562 }
563 
nan_stop(void)564 esp_err_t nan_stop(void)
565 {
566     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
567     return ESP_OK;
568 }
569 
nan_input(void * p1,int p2,int p3)570 int nan_input(void *p1, int p2, int p3)
571 {
572     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
573     return 0;
574 }
575 
nan_sm_handle_event(void * p1,int p2)576 void nan_sm_handle_event(void *p1, int p2)
577 {
578     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
579 }
580 
581 #endif
582 
583 #if CONFIG_IDF_TARGET_ESP32C2
584 #if CONFIG_ESP32C2_REV_MIN_FULL < 200
esp32c2_eco4_rom_ptr_init(void)585 void esp32c2_eco4_rom_ptr_init(void)
586 {
587     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
588 }
589 #endif
590 #endif
591 
592 #ifndef CONFIG_ESP_WIFI_SLP_SAMPLE_BEACON_FEATURE
pm_beacon_offset_funcs_init(void)593 void pm_beacon_offset_funcs_init(void)
594 {
595     /* Do not remove, stub to overwrite weak link in Wi-Fi Lib */
596 }
597 #endif
598