Explorar el Código

qcacld-3.0: Remove Vdev_up from WMA iface node instead use objmgr vdev

Currently, WMA maintains vdev up flag but other component
also need this flag to check vdev up status. Hence as part of
this fix removing this flag instead using Objmgr Vdev mlme state
for same purpose.

Change-Id: If1922791e71c07621708755de67fbcc2f7a469cd
CRs-Fixed: 2014026
Mukul Sharma hace 8 años
padre
commit
f904723e33

+ 29 - 1
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

+ 23 - 17
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,

+ 2 - 2
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;

+ 2 - 2
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->

+ 2 - 2
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);
 		}

+ 1 - 1
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,

+ 4 - 4
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;
 	}

+ 2 - 2
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);

+ 30 - 21
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;
+}
+