diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 6958b66db231..0cf67abc407c 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1039,7 +1039,6 @@ struct wma_txrx_node { A_UINT32 mhz; enum phy_ch_width chan_width; bool vdev_active; - bool vdev_up; uint64_t tsfadjust; void *addBssStaContext; uint8_t aid; @@ -2330,4 +2329,33 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev, */ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf, uint32_t len); + +/** + * wma_vdev_set_mlme_state() - Set vdev mlme state + * @wma: wma handle + * @vdev_id: the Id of the vdev to configure + * @state: vdev state + * + * Return: None + */ +static inline +void wma_vdev_set_mlme_state(tp_wma_handle wma, uint8_t vdev_id, + enum wlan_vdev_state state) +{ + struct wlan_objmgr_vdev *vdev; + + if (!wma) { + WMA_LOGE("%s: WMA context is invald!", __func__); + return; + } + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id, + WLAN_LEGACY_WMA_ID); + if (vdev) { + wlan_vdev_obj_lock(vdev); + wlan_vdev_mlme_set_state(vdev, state); + wlan_vdev_obj_unlock(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); + } +} #endif diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index fc57bdb35b2e..b507186e2020 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -773,7 +773,7 @@ static void wma_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id, bool add) if (add == false && i == vdev_id) continue; - if (wma->interfaces[i].vdev_up || (i == vdev_id && add)) { + if (wma_is_vdev_up(vdev_id) || (i == vdev_id && add)) { if (wma->interfaces[i].type == WMI_VDEV_TYPE_AP) { is_ap = true; ap_vdev_ids[i] = i; @@ -896,7 +896,8 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, qdf_atomic_set(&wma->interfaces[resp_event->vdev_id]. vdev_restart_params. hidden_ssid_restart_in_progress, 0); - wma->interfaces[resp_event->vdev_id].vdev_up = true; + wma_vdev_set_mlme_state(wma, resp_event->vdev_id, + WLAN_VDEV_S_RUN); /* * Unpause TX queue in SAP case while configuring hidden ssid * enable or disable, else the data path is paused forever @@ -961,12 +962,12 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, if (QDF_IS_STATUS_ERROR(status)) { WMA_LOGE("%s:vdev_up failed vdev_id %d", __func__, resp_event->vdev_id); - wma->interfaces[resp_event->vdev_id].vdev_up = - false; + wma_vdev_set_mlme_state(wma, + resp_event->vdev_id, WLAN_VDEV_S_STOP); cds_set_do_hw_mode_change_flag(false); } else { - wma->interfaces[resp_event->vdev_id].vdev_up = - true; + wma_vdev_set_mlme_state(wma, + resp_event->vdev_id, WLAN_VDEV_S_RUN); } } @@ -986,13 +987,13 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, cds_set_do_hw_mode_change_flag(false); return -EEXIST; } - iface->vdev_up = true; - + wma_vdev_set_mlme_state(wma, resp_event->vdev_id, + WLAN_VDEV_S_RUN); wma_ocb_start_resp_ind_cont(wma); } if ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP) && - wma->interfaces[resp_event->vdev_id].vdev_up) + wma_is_vdev_up(resp_event->vdev_id)) wma_set_sap_keepalive(wma, resp_event->vdev_id); qdf_mc_timer_destroy(&req_msg->event_timeout); @@ -1465,7 +1466,8 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, WMA_LOGE("Failed to send vdev down cmd: vdev %d", resp_event->vdev_id); } else { - wma->interfaces[resp_event->vdev_id].vdev_up = false; + wma_vdev_set_mlme_state(wma, resp_event->vdev_id, + WLAN_VDEV_S_STOP); #ifdef FEATURE_AP_MCC_CH_AVOIDANCE if (mac_ctx->sap.sap_channel_avoidance) wma_find_mcc_ap(wma, resp_event->vdev_id, false); @@ -2033,7 +2035,7 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma, * since, VDEV RESTART will do a VDEV DOWN * in the firmware. */ - intr[params.vdev_id].vdev_up = false; + wma_vdev_set_mlme_state(wma, params.vdev_id, WLAN_VDEV_S_STOP); } else { WMA_LOGD("%s, vdev_id: %d, unpausing tx_ll_queue at VDEV_START", __func__, params.vdev_id); @@ -2522,7 +2524,8 @@ void wma_vdev_resp_timer(void *data) WMA_LOGE("Failed to send vdev down cmd: vdev %d", tgt_req->vdev_id); } else { - wma->interfaces[tgt_req->vdev_id].vdev_up = false; + wma_vdev_set_mlme_state(wma, tgt_req->vdev_id, + WLAN_VDEV_S_STOP); #ifdef FEATURE_AP_MCC_CH_AVOIDANCE if (mac_ctx->sap.sap_channel_avoidance) wma_find_mcc_ap(wma, tgt_req->vdev_id, false); @@ -2614,7 +2617,8 @@ void wma_vdev_resp_timer(void *data) WMA_LOGE(FL("Failed to send OCB set config cmd")); iface = &wma->interfaces[tgt_req->vdev_id]; - iface->vdev_up = false; + wma_vdev_set_mlme_state(wma, tgt_req->vdev_id, + WLAN_VDEV_S_STOP); wma_ocb_set_config_resp(wma, QDF_STATUS_E_TIMEOUT); } else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) { WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d", @@ -3851,7 +3855,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) goto out; } - if (wma->interfaces[params->smesessionId].vdev_up == true) { + if (wma_is_vdev_up(params->smesessionId)) { WMA_LOGE("%s: vdev id %d is already UP for %pM", __func__, params->smesessionId, params->bssId); status = QDF_STATUS_E_FAILURE; @@ -3989,8 +3993,9 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) cds_set_do_hw_mode_change_flag(false); status = QDF_STATUS_E_FAILURE; } else { - wma->interfaces[params->smesessionId].vdev_up = true; wma_set_vdev_mgmt_rate(wma, params->smesessionId); + wma_vdev_set_mlme_state(wma, params->smesessionId, + WLAN_VDEV_S_RUN); } qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED); @@ -4386,7 +4391,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params) qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED); WMA_LOGD("%s: (type %d subtype %d) BSS is stopped", __func__, iface->type, iface->sub_type); - iface->vdev_up = false; + wma_vdev_set_mlme_state(wma, params->smesessionId, WLAN_VDEV_S_STOP); params->status = QDF_STATUS_SUCCESS; if (!iface->peer_count) { WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d", @@ -4490,7 +4495,8 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params) roam_synch_in_progress = true; WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d", __func__, params->smesessionId); - iface->vdev_up = false; + wma_vdev_set_mlme_state(wma, params->smesessionId, + WLAN_VDEV_S_STOP); goto detach_peer; } msg = wma_fill_vdev_req(wma, params->smesessionId, WMA_DELETE_BSS_REQ, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 83c81f6aee93..09cf3e26c593 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -3698,7 +3698,7 @@ void wma_calculate_and_update_conn_state(tp_wma_handle wma) int i; for (i = 0; i < wma->max_bssid; i++) { wma->interfaces[i].conn_state = - !!(wma->interfaces[i].vdev_up && + !!(wma_is_vdev_up(i) && !wma_is_vdev_in_ap_mode(wma, i)); } } @@ -3743,7 +3743,7 @@ bool wma_is_beaconning_vdev_up(tp_wma_handle wma) int i; for (i = 0; i < wma->max_bssid; i++) { if (wma_is_vdev_in_beaconning_mode(wma, i) - && wma->interfaces[i].vdev_up) + && wma_is_vdev_up(i)) return true; } return false; diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index b5599b9fe53b..d623a2252892 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -1798,7 +1798,7 @@ static void wma_state_info_dump(char **buf_ptr, uint16_t *size) iface->ht_capable, iface->chan_width, iface->vdev_active, - iface->vdev_up, + wma_is_vdev_up(vdev_id), iface->aid, iface->rate_flags, iface->nss, @@ -3277,7 +3277,7 @@ QDF_STATUS wma_stop(void *cds_ctx, uint8_t reason) /* clean up ll-queue for all vdev */ for (i = 0; i < wma_handle->max_bssid; i++) { if (wma_handle->interfaces[i].handle && - wma_handle->interfaces[i].vdev_up) { + wma_is_vdev_up(i)) { cdp_fc_vdev_flush( cds_get_context(QDF_MODULE_ID_SOC), wma_handle-> diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 9372d67dcdcf..ba0cb7777d90 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2521,7 +2521,7 @@ void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info) &wma->interfaces[vdev_id].vdev_restart_params. hidden_ssid_restart_in_progress)) || (wma->interfaces[vdev_id].is_channel_switch))) { - if (!wma->interfaces[vdev_id].vdev_up) { + if (!wma_is_vdev_up(vdev_id)) { param.vdev_id = vdev_id; param.assoc_id = 0; status = wmi_unified_vdev_up_send(wma->wmi_handle, @@ -2532,7 +2532,7 @@ void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info) cds_set_do_hw_mode_change_flag(false); return; } - wma->interfaces[vdev_id].vdev_up = true; + wma_vdev_set_mlme_state(wma, vdev_id, WLAN_VDEV_S_RUN); wma_set_sap_keepalive(wma, vdev_id); wma_set_vdev_mgmt_rate(wma, vdev_id); } diff --git a/core/wma/src/wma_ocb.c b/core/wma/src/wma_ocb.c index eeafb9af3c0e..c9ad0fc9e44e 100644 --- a/core/wma/src/wma_ocb.c +++ b/core/wma/src/wma_ocb.c @@ -175,7 +175,7 @@ int wma_ocb_set_config_req(tp_wma_handle wma_handle, * OCB set_config request should be sent on receiving * vdev start response message */ - if (!wma_handle->interfaces[config_req->session_id].vdev_up) { + if (!wma_is_vdev_up(config_req->session_id)) { qdf_mem_zero(&req, sizeof(req)); /* Enqueue OCB Set Schedule request message */ msg = wma_fill_vdev_req(wma_handle, config_req->session_id, diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c index 8ea484941859..444016de0f8e 100644 --- a/core/wma/src/wma_power.c +++ b/core/wma/src/wma_power.c @@ -368,7 +368,7 @@ void wma_set_tx_power(WMA_HANDLE handle, return; } - if (!(wma_handle->interfaces[vdev_id].vdev_up)) { + if (!wma_is_vdev_up(vdev_id)) { WMA_LOGE("%s: vdev id %d is not up for %pM", __func__, vdev_id, tx_pwr_params->bssId.bytes); qdf_mem_free(tx_pwr_params); @@ -443,7 +443,7 @@ void wma_set_max_tx_power(WMA_HANDLE handle, return; } - if (!(wma_handle->interfaces[vdev_id].vdev_up)) { + if (!wma_is_vdev_up(vdev_id)) { WMA_LOGE("%s: vdev id %d is not up", __func__, vdev_id); qdf_mem_free(tx_pwr_params); return; @@ -1947,7 +1947,7 @@ QDF_STATUS wma_set_tx_power_scale(uint8_t vdev_id, int value) return QDF_STATUS_E_FAILURE; } - if (!(wma_handle->interfaces[vdev_id].vdev_up)) { + if (!wma_is_vdev_up(vdev_id)) { WMA_LOGE("%s: vdev id %d is not up", __func__, vdev_id); return QDF_STATUS_E_FAILURE; } @@ -1978,7 +1978,7 @@ QDF_STATUS wma_set_tx_power_scale_decr_db(uint8_t vdev_id, int value) return QDF_STATUS_E_FAILURE; } - if (!(wma_handle->interfaces[vdev_id].vdev_up)) { + if (!wma_is_vdev_up(vdev_id)) { WMA_LOGE("%s: vdev id %d is not up", __func__, vdev_id); return QDF_STATUS_E_FAILURE; } diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index fcaecc3b8066..64c06354c16c 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -149,7 +149,7 @@ static bool wma_is_mcc_24G(WMA_HANDLE handle) } for (i = 0; i < wma_handle->max_bssid; i++) { if (wma_handle->interfaces[i].handle && - wma_handle->interfaces[i].vdev_up) { + wma_is_vdev_up(i)) { if ((prev_chan != 0 && prev_chan != wma_handle->interfaces[i].mhz) && (wma_handle->interfaces[i].mhz <= @@ -2257,7 +2257,7 @@ static void wma_roam_update_vdev(tp_wma_handle wma, wma_set_linkstate(wma, set_link_params); wma_add_bss(wma, (tpAddBssParams)roam_synch_ind_ptr->add_bss_params); wma_add_sta(wma, add_sta_params); - wma->interfaces[vdev_id].vdev_up = true; + wma_vdev_set_mlme_state(wma, vdev_id, WLAN_VDEV_S_RUN); qdf_mem_copy(wma->interfaces[vdev_id].bssid, roam_synch_ind_ptr->bssid.bytes, IEEE80211_ADDR_LEN); qdf_mem_free(del_bss_params); diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 31041931e811..c7fe7ab33a06 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -344,7 +344,7 @@ void wma_lost_link_info_handler(tp_wma_handle wma, uint32_t vdev_id, struct scheduler_msg sme_msg = {0}; /* report lost link information only for STA mode */ - if (wma->interfaces[vdev_id].vdev_up && + if (wma_is_vdev_up(vdev_id) && (WMI_VDEV_TYPE_STA == wma->interfaces[vdev_id].type) && (0 == wma->interfaces[vdev_id].sub_type)) { lost_link_info = qdf_mem_malloc(sizeof(*lost_link_info)); @@ -1334,7 +1334,7 @@ static void wma_vdev_stats_lost_link_helper(tp_wma_handle wma, static const uint8_t zero_mac[QDF_MAC_ADDR_SIZE] = {0}; node = &wma->interfaces[vdev_stats->vdev_id]; - if (node->vdev_up && + if (wma_is_vdev_up(vdev_stats->vdev_id) && qdf_mem_cmp(node->bssid, zero_mac, QDF_MAC_ADDR_SIZE)) { req_msg = wma_peek_vdev_req(wma, vdev_stats->vdev_id, WMA_TARGET_REQ_TYPE_VDEV_STOP); @@ -1998,7 +1998,7 @@ bool wma_is_sap_active(tp_wma_handle wma_handle) int i; for (i = 0; i < wma_handle->max_bssid; i++) { - if (!wma_handle->interfaces[i].vdev_up) + if (!wma_is_vdev_up(i)) continue; if (wma_handle->interfaces[i].type == WMI_VDEV_TYPE_AP && wma_handle->interfaces[i].sub_type == 0) @@ -2018,7 +2018,7 @@ bool wma_is_p2p_go_active(tp_wma_handle wma_handle) int i; for (i = 0; i < wma_handle->max_bssid; i++) { - if (!wma_handle->interfaces[i].vdev_up) + if (!wma_is_vdev_up(i)) continue; if (wma_handle->interfaces[i].type == WMI_VDEV_TYPE_AP && wma_handle->interfaces[i].sub_type == @@ -2039,7 +2039,7 @@ bool wma_is_p2p_cli_active(tp_wma_handle wma_handle) int i; for (i = 0; i < wma_handle->max_bssid; i++) { - if (!wma_handle->interfaces[i].vdev_up) + if (!wma_is_vdev_up(i)) continue; if (wma_handle->interfaces[i].type == WMI_VDEV_TYPE_STA && wma_handle->interfaces[i].sub_type == @@ -2060,7 +2060,7 @@ bool wma_is_sta_active(tp_wma_handle wma_handle) int i; for (i = 0; i < wma_handle->max_bssid; i++) { - if (!wma_handle->interfaces[i].vdev_up) + if (!wma_is_vdev_up(i)) continue; if (wma_handle->interfaces[i].type == WMI_VDEV_TYPE_STA && wma_handle->interfaces[i].sub_type == 0) @@ -2478,21 +2478,6 @@ struct wma_txrx_node *wma_get_interface_by_vdev_id(uint8_t vdev_id) return &wma->interfaces[vdev_id]; } -/** - * wma_is_vdev_up() - return whether a vdev is up - * @vdev_id: vdev id - * - * Return: true if the vdev is up, false otherwise - */ -bool wma_is_vdev_up(uint8_t vdev_id) -{ - struct wma_txrx_node *vdev = wma_get_interface_by_vdev_id(vdev_id); - if (vdev) - return vdev->vdev_up; - else - return false; -} - #if defined(QCA_WIFI_FTM) /** * wma_utf_rsp() - utf response @@ -3950,3 +3935,27 @@ bool wma_is_hw_dbs_2x2_capable(void) return (final_min_rf_chains == 2) ? true : false; } + +bool wma_is_vdev_up(uint8_t vdev_id) +{ + struct wlan_objmgr_vdev *vdev; + tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA); + enum wlan_vdev_state state = WLAN_VDEV_S_INIT; + + if (!wma) { + WMA_LOGE("%s: WMA context is invald!", __func__); + return false; + } + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id, + WLAN_LEGACY_WMA_ID); + if (vdev) { + wlan_vdev_obj_lock(vdev); + state = wlan_vdev_mlme_get_state(vdev); + wlan_vdev_obj_unlock(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); + } + + return (state == WLAN_VDEV_S_RUN) ? true : false; +} +