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