diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 8e31f4da6675..8bf1f5c944eb 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -3016,6 +3016,70 @@ static inline void hdd_check_for_leaks(struct hdd_context *hdd_ctx, bool is_ssr) #define hdd_debug_domain_set(domain) #endif /* CONFIG_LEAK_DETECTION */ +#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE +/** + * hdd_skip_acs_scan_timer_handler() - skip ACS scan timer timeout handler + * @data: pointer to struct hdd_context + * + * This function will reset acs_scan_status to eSAP_DO_NEW_ACS_SCAN. + * Then new ACS request will do a fresh scan without reusing the cached + * scan information. + * + * Return: void + */ +static void hdd_skip_acs_scan_timer_handler(void *data) +{ + struct hdd_context *hdd_ctx = data; + mac_handle_t mac_handle; + + hdd_debug("ACS Scan result expired. Reset ACS scan skip"); + hdd_ctx->skip_acs_scan_status = eSAP_DO_NEW_ACS_SCAN; + qdf_spin_lock(&hdd_ctx->acs_skip_lock); + qdf_mem_free(hdd_ctx->last_acs_channel_list); + hdd_ctx->last_acs_channel_list = NULL; + hdd_ctx->num_of_channels = 0; + qdf_spin_unlock(&hdd_ctx->acs_skip_lock); + + mac_handle = hdd_ctx->mac_handle; + if (!mac_handle) + return; +} + +static void hdd_skip_acs_scan_timer_init(struct hdd_context *hdd_ctx) +{ + QDF_STATUS status; + + status = qdf_mc_timer_init(&hdd_ctx->skip_acs_scan_timer, + QDF_TIMER_TYPE_SW, + hdd_skip_acs_scan_timer_handler, + hdd_ctx); + if (QDF_IS_STATUS_ERROR(status)) + hdd_err("Failed to init ACS Skip timer"); + qdf_spinlock_create(&hdd_ctx->acs_skip_lock); +} + +static void hdd_skip_acs_scan_timer_deinit(struct hdd_context *hdd_ctx) +{ + if (QDF_TIMER_STATE_RUNNING == + qdf_mc_timer_get_current_state(&hdd_ctx->skip_acs_scan_timer)) { + qdf_mc_timer_stop(&hdd_ctx->skip_acs_scan_timer); + } + + if (!QDF_IS_STATUS_SUCCESS + (qdf_mc_timer_destroy(&hdd_ctx->skip_acs_scan_timer))) { + hdd_err("Cannot deallocate ACS Skip timer"); + } + qdf_spin_lock(&hdd_ctx->acs_skip_lock); + qdf_mem_free(hdd_ctx->last_acs_channel_list); + hdd_ctx->last_acs_channel_list = NULL; + hdd_ctx->num_of_channels = 0; + qdf_spin_unlock(&hdd_ctx->acs_skip_lock); +} +#else +static void hdd_skip_acs_scan_timer_init(struct hdd_context *hdd_ctx) {} +static void hdd_skip_acs_scan_timer_deinit(struct hdd_context *hdd_ctx) {} +#endif + /** * hdd_update_country_code - Update country code * @hdd_ctx: HDD context @@ -3216,6 +3280,8 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx, bool reinit) hdd_enable_power_management(); + hdd_skip_acs_scan_timer_init(hdd_ctx); + break; default: @@ -7669,23 +7735,6 @@ void hdd_wlan_exit(struct hdd_context *hdd_ctx) hdd_unregister_notifiers(hdd_ctx); -#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE - if (QDF_TIMER_STATE_RUNNING == - qdf_mc_timer_get_current_state(&hdd_ctx->skip_acs_scan_timer)) { - qdf_mc_timer_stop(&hdd_ctx->skip_acs_scan_timer); - } - - if (!QDF_IS_STATUS_SUCCESS - (qdf_mc_timer_destroy(&hdd_ctx->skip_acs_scan_timer))) { - hdd_err("Cannot deallocate ACS Skip timer"); - } - qdf_spin_lock(&hdd_ctx->acs_skip_lock); - qdf_mem_free(hdd_ctx->last_acs_freq_list); - hdd_ctx->last_acs_freq_list = NULL; - hdd_ctx->num_of_channels = 0; - qdf_spin_unlock(&hdd_ctx->acs_skip_lock); -#endif - /* * Powersave Offload Case * Disable Idle Power Save Mode @@ -7762,36 +7811,6 @@ void hdd_wlan_exit(struct hdd_context *hdd_ctx) #endif } -#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE -/** - * hdd_skip_acs_scan_timer_handler() - skip ACS scan timer timeout handler - * @data: pointer to struct hdd_context - * - * This function will reset acs_scan_status to eSAP_DO_NEW_ACS_SCAN. - * Then new ACS request will do a fresh scan without reusing the cached - * scan information. - * - * Return: void - */ -static void hdd_skip_acs_scan_timer_handler(void *data) -{ - struct hdd_context *hdd_ctx = (struct hdd_context *) data; - mac_handle_t mac_handle; - - hdd_debug("ACS Scan result expired. Reset ACS scan skip"); - hdd_ctx->skip_acs_scan_status = eSAP_DO_NEW_ACS_SCAN; - qdf_spin_lock(&hdd_ctx->acs_skip_lock); - qdf_mem_free(hdd_ctx->last_acs_freq_list); - hdd_ctx->last_acs_freq_list = NULL; - hdd_ctx->num_of_channels = 0; - qdf_spin_unlock(&hdd_ctx->acs_skip_lock); - - mac_handle = hdd_ctx->mac_handle; - if (!mac_handle) - return; -} -#endif - /** * hdd_wlan_notify_modem_power_state() - notify FW with modem power status * @state: state @@ -11792,6 +11811,8 @@ int hdd_wlan_stop_modules(struct hdd_context *hdd_ctx, bool ftm_mode) hdd_get_conparam() == QDF_GLOBAL_EPPING_MODE) break; + hdd_skip_acs_scan_timer_deinit(hdd_ctx); + hdd_disable_power_management(); if (hdd_deconfigure_cds(hdd_ctx)) { hdd_err("Failed to de-configure CDS"); @@ -12339,16 +12360,6 @@ int hdd_wlan_startup(struct hdd_context *hdd_ctx) hdd_driver_memdump_init(); hdd_bus_bandwidth_init(hdd_ctx); -#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE - status = qdf_mc_timer_init(&hdd_ctx->skip_acs_scan_timer, - QDF_TIMER_TYPE_SW, - hdd_skip_acs_scan_timer_handler, - hdd_ctx); - if (QDF_IS_STATUS_ERROR(status)) - hdd_err("Failed to init ACS Skip timer"); - qdf_spinlock_create(&hdd_ctx->acs_skip_lock); -#endif - errno = hdd_wlan_start_modules(hdd_ctx, false); if (errno) { hdd_err("Failed to start modules; errno:%d", errno);