diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 28c39e611f..6a41e0c2f5 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -807,6 +807,7 @@ struct hdd_fw_txrx_stats { * @vendor_acs_timer_initialized: Is @vendor_acs_timer initialized? * @bss_stop_reason: Reason why the BSS was stopped * @acs_in_progress: In progress acs flag for an adapter + * @ch_switch_in_progress: channel change in progress or not * @client_count: client count per dot11_mode * @country_ie_updated: country ie is updated or not by hdd hostapd * @during_auth_offload: auth mgmt frame is offloading to hostapd @@ -828,6 +829,7 @@ struct hdd_ap_ctx { bool vendor_acs_timer_initialized; enum bss_stop_reason bss_stop_reason; qdf_atomic_t acs_in_progress; + qdf_atomic_t ch_switch_in_progress; uint16_t client_count[QCA_WLAN_802_11_MODE_INVALID]; bool country_ie_updated; bool during_auth_offload; @@ -1092,7 +1094,6 @@ struct wlan_hdd_tx_power { * @cache_sta_count: number of currently cached stations * @wapi_info: * @sap_stop_bss_work: - * @ch_switch_in_progress: * @tsf: structure containing tsf related information * @mc_addr_list: * @addr_filter_pattern: @@ -1241,8 +1242,6 @@ struct hdd_adapter { struct work_struct sap_stop_bss_work; - qdf_atomic_t ch_switch_in_progress; - #ifdef WLAN_FEATURE_TSF struct hdd_vdev_tsf tsf; #endif diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 1b4b8eeb82..bfdd4b5742 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2159,7 +2159,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, hostapd_state->qdf_status = sap_event->sapevt.sapStartBssCompleteEvent.status; - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); wlansap_get_dfs_ignore_cac(mac_handle, &ignoreCAC); if (!policy_mgr_get_dfs_master_dynamic_enabled( hdd_ctx->psoc, adapter->deflink->vdev_id)) @@ -2394,7 +2394,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, hdd_debug("Sent CAC start to user space"); } - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); hdd_stop_tsf_sync(adapter); break; case eSAP_DFS_CAC_INTERRUPTED: @@ -3057,7 +3057,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, * roaming once channel change process (success/failure) * is completed */ - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); policy_mgr_set_chan_switch_complete_evt(hdd_ctx->psoc); wlan_hdd_enable_roaming(adapter, RSO_SAP_CHANNEL_CHANGE); @@ -3380,6 +3380,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, struct hdd_adapter *sta_adapter; struct hdd_station_ctx *sta_ctx; struct sap_context *sap_ctx; + struct hdd_ap_ctx *ap_ctx; uint8_t conc_rule1 = 0; uint8_t sta_sap_scc_on_dfs_chnl; bool is_p2p_go_session = false; @@ -3403,6 +3404,8 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter->deflink); if (!sap_ctx) return -EINVAL; + + ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter->deflink); /* * If sta connection is in progress do not allow SAP channel change from * user space as it may change the HW mode requirement, for which sta is @@ -3509,7 +3512,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, * once the channel change is completed and SAP will * post eSAP_START_BSS_EVENT success event to HDD. */ - if (qdf_atomic_inc_return(&adapter->ch_switch_in_progress) > 1) { + if (qdf_atomic_inc_return(&ap_ctx->ch_switch_in_progress) > 1) { hdd_err("Channel switch in progress!!"); return -EBUSY; } @@ -3537,7 +3540,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, forced, sap_ctx->csa_reason)) { hdd_err("Channel switch failed due to concurrency check failure"); - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); return -EINVAL; } @@ -3549,7 +3552,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, if (sme_is_any_session_in_middle_of_roaming(hdd_ctx->mac_handle) || hdd_is_roaming_in_progress(hdd_ctx)) { hdd_info("Channel switch not allowed as reassoc in progress"); - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); return -EINVAL; } /* Disable Roaming on all adapters before doing channel change */ @@ -3561,7 +3564,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, vdev = hdd_objmgr_get_vdev_by_user(adapter->deflink, WLAN_OSIF_ID); if (!vdev) { - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); wlan_hdd_enable_roaming(adapter, RSO_SAP_CHANNEL_CHANGE); return -EINVAL; } @@ -3590,7 +3593,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq, * radar found flag and also restart the netif * queues. */ - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); /* * If Posting of the Channel Change request fails @@ -4393,15 +4396,18 @@ void hdd_deinit_ap_mode(struct hdd_context *hdd_ctx, struct hdd_adapter *adapter, bool rtnl_held) { + struct hdd_ap_ctx *ap_ctx; + hdd_enter_dev(adapter->dev); + ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter->deflink); if (test_bit(WMM_INIT_DONE, &adapter->event_flags)) { hdd_wmm_adapter_close(adapter); clear_bit(WMM_INIT_DONE, &adapter->event_flags); } - qdf_atomic_set(&adapter->deflink->session.ap.acs_in_progress, 0); - if (qdf_atomic_read(&adapter->ch_switch_in_progress)) { - qdf_atomic_set(&adapter->ch_switch_in_progress, 0); + qdf_atomic_set(&ap_ctx->acs_in_progress, 0); + if (qdf_atomic_read(&ap_ctx->ch_switch_in_progress)) { + qdf_atomic_set(&ap_ctx->ch_switch_in_progress, 0); policy_mgr_set_chan_switch_complete_evt(hdd_ctx->psoc); /* Re-enable roaming on all connected STA vdev */ @@ -4487,7 +4493,7 @@ struct hdd_adapter *hdd_wlan_create_ap_dev(struct hdd_context *hdd_ctx, spin_lock_init(&adapter->pause_map_lock); adapter->start_time = adapter->last_time = qdf_system_ticks(); - qdf_atomic_init(&adapter->ch_switch_in_progress); + qdf_atomic_init(&adapter->deflink->session.ap.ch_switch_in_progress); return adapter; } diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index d37f52dbd7..db3280558d 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -3812,20 +3812,25 @@ static bool hdd_is_chan_switch_in_progress(void) struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); wlan_net_dev_ref_dbgid dbgid = NET_DEV_HOLD_IS_CHAN_SWITCH_IN_PROGRESS; + struct hdd_ap_ctx *ap_ctx; hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter, dbgid) { - if ((adapter->device_mode == QDF_SAP_MODE || - adapter->device_mode == QDF_P2P_GO_MODE) && - qdf_atomic_read(&adapter->ch_switch_in_progress)) { + if (!(adapter->device_mode == QDF_SAP_MODE || + adapter->device_mode == QDF_P2P_GO_MODE)) + goto next_adapter; + + ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter->deflink); + if (qdf_atomic_read(&ap_ctx->ch_switch_in_progress)) { hdd_debug("channel switch progress for vdev_id %d", adapter->deflink->vdev_id); hdd_adapter_dev_put_debug(adapter, dbgid); if (next_adapter) - hdd_adapter_dev_put_debug(next_adapter, - dbgid); + hdd_adapter_dev_put_debug(next_adapter, dbgid); + return true; } +next_adapter: hdd_adapter_dev_put_debug(adapter, dbgid); } diff --git a/core/hdd/src/wlan_hdd_pre_cac.c b/core/hdd/src/wlan_hdd_pre_cac.c index 9e94e08ea6..565e7daee6 100644 --- a/core/hdd/src/wlan_hdd_pre_cac.c +++ b/core/hdd/src/wlan_hdd_pre_cac.c @@ -245,19 +245,15 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx, return -EINVAL; } - if (qdf_atomic_read(&ap_adapter->ch_switch_in_progress)) { + hdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(ap_adapter->deflink); + + if (qdf_atomic_read(&hdd_ap_ctx->ch_switch_in_progress)) { hdd_err("pre cac not allowed during CSA"); return -EINVAL; } mac_handle = hdd_ctx->mac_handle; - hdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(ap_adapter->deflink); - if (!hdd_ap_ctx) { - hdd_err("SAP context is NULL"); - return -EINVAL; - } - if (wlan_reg_is_dfs_for_freq(hdd_ctx->pdev, hdd_ap_ctx->operating_chan_freq)) { hdd_err("SAP is already on DFS channel:%d",