Browse Source

qcacld-3.0: Add handling to disable vdev for miracast

Add handling to disable second vdev of mac if miracast
is set for one vdev. In case high throughput or low latency
is required for particular vdev then another vdev on same
mac should be disabled, if present in MCC.

Change-Id: I36cc19f442130b098c4a02ec0ebcf69b89dd2a3c
CRs-Fixed: 3219512
Sheenam Monga 2 years ago
parent
commit
56cde67530

+ 22 - 13
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -1027,19 +1027,6 @@ void policy_mgr_move_vdev_from_connection_to_disabled_tbl(
 bool
 policy_mgr_ml_link_vdev_need_to_be_disabled(struct wlan_objmgr_psoc *psoc,
 					    struct wlan_objmgr_vdev *vdev);
-
-/**
- * policy_mgr_handle_link_enable_disable_resp() - enable/disable a ml link
- * @vdev: vdev
- * @arg: req structure
- * evt: response event
- *
- * Return: None
- */
-void
-policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
-					  void *arg,
-					  struct mlo_link_set_active_resp *evt);
 #else
 static inline bool
 policy_mgr_is_ml_vdev_id(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
@@ -4300,6 +4287,21 @@ policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
 					      enum QDF_OPMODE mode,
 					      uint8_t vdev_id);
 
+/*
+ * policy_mgr_handle_ml_sta_link_on_traffic_type_change() - Handle
+ * enable/disable link on vdev traffic type change on SAP/P2P vdev
+ * @psoc: objmgr psoc
+ * @vdev: vdev on which traffic type change
+ *
+ * Context: Should be called only from north bound context and never from
+ * schedular thread as it has wait for completed.
+ *
+ * Return: void
+ */
+void policy_mgr_handle_ml_sta_link_on_traffic_type_change(
+						struct wlan_objmgr_psoc *psoc,
+						struct wlan_objmgr_vdev *vdev);
+
 /*
  * policy_mgr_handle_ml_sta_links_on_vdev_down() - Handle enable
  * link on any vdev down
@@ -4347,6 +4349,13 @@ policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
 {
 }
 
+static inline void
+policy_mgr_handle_ml_sta_link_on_traffic_type_change(
+						struct wlan_objmgr_psoc *psoc,
+						struct wlan_objmgr_vdev *vdev)
+{
+}
+
 static inline
 void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,
 						 enum QDF_OPMODE mode,

+ 3 - 3
components/cmn_services/policy_mgr/src/wlan_policy_mgr_core.c

@@ -648,7 +648,6 @@ void policy_mgr_update_conc_list(struct wlan_objmgr_psoc *psoc,
 	if (pm_ctx->mode_change_cb && update_conn)
 		pm_ctx->mode_change_cb();
 
-	policy_mgr_dump_connection_status_info(psoc);
 	if (pm_ctx->cdp_cbacks.cdp_update_mac_id)
 		pm_ctx->cdp_cbacks.cdp_update_mac_id(psoc, vdev_id, mac);
 
@@ -1093,7 +1092,6 @@ void policy_mgr_update_hw_mode_conn_info(struct wlan_objmgr_psoc *psoc,
 	}
 	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
 
-	policy_mgr_dump_connection_status_info(psoc);
 	policy_mgr_dump_current_concurrency(psoc);
 }
 
@@ -1552,7 +1550,8 @@ policy_mgr_dump_disabled_ml_links(struct policy_mgr_psoc_priv_obj *pm_ctx)
 		}
 	}
 	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
-	policy_mgr_debug("Disabled links(%d): %s", count, buf);
+	if (count)
+		policy_mgr_debug("Disabled links(%d): %s", count, buf);
 }
 #endif
 
@@ -1689,6 +1688,7 @@ void policy_mgr_dump_current_concurrency(struct wlan_objmgr_psoc *psoc)
 	if (!cc_mode)
 		return;
 
+	policy_mgr_dump_connection_status_info(psoc);
 	switch (num_connections) {
 	case 1:
 		policy_mgr_dump_current_concurrency_one_connection(cc_mode,

+ 204 - 23
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -3331,7 +3331,36 @@ policy_mgr_enable_disable_link_from_vdev_bitmask(struct wlan_objmgr_psoc *psoc,
 	}
 }
 
-void
+static void
+policy_mgr_set_link_in_progress(struct policy_mgr_psoc_priv_obj *pm_ctx,
+				bool value)
+{
+	qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
+	pm_ctx->set_link_in_progress = value;
+	/* if set link has started reset the event, else complete the event */
+	if (pm_ctx->set_link_in_progress)
+		qdf_event_reset(&pm_ctx->set_link_update_done_evt);
+	else
+		qdf_event_set(&pm_ctx->set_link_update_done_evt);
+	policy_mgr_debug("set_link_in_progress %d",
+			 pm_ctx->set_link_in_progress);
+	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
+}
+
+static bool
+policy_mgr_get_link_in_progress(struct policy_mgr_psoc_priv_obj *pm_ctx)
+{
+	bool value;
+
+	qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
+	value = pm_ctx->set_link_in_progress;
+	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
+
+	policy_mgr_debug("set_link_in_progress %d", value);
+	return value;
+}
+
+static void
 policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
 					  void *arg,
 					  struct mlo_link_set_active_resp *resp)
@@ -3339,23 +3368,31 @@ policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
 	struct mlo_link_set_active_req *req = arg;
 	uint8_t i;
 	struct wlan_objmgr_psoc *psoc;
+	struct policy_mgr_psoc_priv_obj *pm_ctx;
 
 	psoc = wlan_vdev_get_psoc(vdev);
 	if (!psoc) {
 		policy_mgr_err("Psoc is Null");
 		return;
 	}
+	pm_ctx = policy_mgr_get_context(psoc);
+	if (!pm_ctx) {
+		policy_mgr_err("Invalid Context");
+		return;
+	}
+
+	qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
 	if (!req || !resp) {
 		policy_mgr_err("arguments or event empty for vdev %d",
 			       wlan_vdev_get_id(vdev));
-		return;
+		goto complete_evnt;
 	}
 
 	if (resp->status) {
 		policy_mgr_err("Set link status %d, for mode %d reason %d vdev bitmask 0x%x",
 			       resp->status, req->param.force_mode,
 			       req->param.reason, req->param.vdev_bitmap[0]);
-		return;
+		goto complete_evnt;
 	}
 
 	policy_mgr_debug("Req mode %d reason %d, bitmask[0] = 0x%x, resp: active %d inactive %d, active[0] 0x%x inactive[0] 0x%x",
@@ -3408,6 +3445,10 @@ policy_mgr_handle_link_enable_disable_resp(struct wlan_objmgr_vdev *vdev,
 			       req->param.force_mode);
 		break;
 	}
+
+complete_evnt:
+	policy_mgr_set_link_in_progress(pm_ctx, false);
+	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
 }
 
 #else
@@ -4274,6 +4315,106 @@ static bool policy_mgr_is_6g_channel_allowed(
 }
 
 #ifdef WLAN_FEATURE_11BE_MLO
+static void
+policy_mgr_fill_ml_active_link_vdev_bitmap(struct mlo_link_set_active_req *req,
+					   uint8_t *mlo_vdev_lst,
+					   uint32_t num_mlo_vdev)
+{
+	uint32_t entry_idx, entry_offset, vdev_idx;
+	uint8_t vdev_id;
+
+	for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
+		vdev_id = mlo_vdev_lst[vdev_idx];
+		entry_idx = vdev_id / 32;
+		entry_offset = vdev_id % 32;
+		if (entry_idx >= MLO_LINK_NUM_SZ) {
+			policy_mgr_err("Invalid entry_idx %d num_mlo_vdev %d vdev %d",
+				       entry_idx, num_mlo_vdev, vdev_id);
+			continue;
+		}
+		req->param.vdev_bitmap[entry_idx] |= (1 << entry_offset);
+		/* update entry number if entry index changed */
+		if (req->param.num_vdev_bitmap < entry_idx + 1)
+			req->param.num_vdev_bitmap = entry_idx + 1;
+	}
+
+	policy_mgr_debug("num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
+			 req->param.num_vdev_bitmap, req->param.vdev_bitmap[0],
+			 req->param.vdev_bitmap[1]);
+}
+
+/**
+ * policy_mgr_mlo_sta_set_link() - Set links for MLO STA
+ *
+ * @vdev: vdev object
+ * @reason: Reason for which link is forced
+ * @mode: Force reason
+ * @num_mlo_vdev: number of mlo vdev
+ * @mlo_vdev_lst: MLO STA vdev list
+
+ * Interface manager Set links for MLO STA
+ *
+ * Return: void
+ */
+static void
+policy_mgr_mlo_sta_set_link(struct wlan_objmgr_vdev *vdev,
+			    enum mlo_link_force_reason reason,
+			    enum mlo_link_force_mode mode,
+			    uint8_t num_mlo_vdev, uint8_t *mlo_vdev_lst)
+{
+	struct mlo_link_set_active_req *req;
+	QDF_STATUS status;
+	struct wlan_objmgr_psoc *psoc;
+	struct policy_mgr_psoc_priv_obj *pm_ctx;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc) {
+		policy_mgr_err("Psoc is Null");
+		return;
+	}
+
+	pm_ctx = policy_mgr_get_context(psoc);
+	if (!pm_ctx) {
+		policy_mgr_err("Invalid Context");
+		return;
+	}
+
+	req = qdf_mem_malloc(sizeof(*req));
+	if (!req)
+		return;
+
+	policy_mgr_set_link_in_progress(pm_ctx, true);
+
+	policy_mgr_debug("vdev %d: mode %d num_mlo_vdev %d reason %d",
+			 wlan_vdev_get_id(vdev), mode, num_mlo_vdev, reason);
+
+	req->ctx.vdev = vdev;
+	req->param.reason = reason;
+	req->param.force_mode = mode;
+	req->ctx.set_mlo_link_cb = policy_mgr_handle_link_enable_disable_resp;
+	req->ctx.cb_arg = req;
+
+	/* set MLO vdev bit mask for all case */
+	policy_mgr_fill_ml_active_link_vdev_bitmap(req, mlo_vdev_lst,
+						   num_mlo_vdev);
+
+	/* fill num of links for MLO_LINK_FORCE_MODE_ACTIVE_NUM */
+	if (mode == MLO_LINK_FORCE_MODE_ACTIVE_NUM) {
+		req->param.force_mode = MLO_LINK_FORCE_MODE_ACTIVE_NUM;
+		req->param.num_link_entry = 1;
+		req->param.link_num[0].num_of_link = num_mlo_vdev - 1;
+	}
+
+	status = mlo_ser_set_link_req(req);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		policy_mgr_err("vdev %d: Failed to set link mode %d num_mlo_vdev %d reason %d",
+			       wlan_vdev_get_id(vdev), mode, num_mlo_vdev,
+			       reason);
+		qdf_mem_free(req);
+		policy_mgr_set_link_in_progress(pm_ctx, false);
+	}
+}
+
 uint32_t
 policy_mgr_get_conc_ext_flags(struct wlan_objmgr_vdev *vdev, bool force_mlo)
 {
@@ -4775,10 +4916,8 @@ policy_mgr_ml_sta_concurency_on_connect(struct wlan_objmgr_psoc *psoc,
 		}
 	}
 
-	wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					     MLO_LINK_FORCE_REASON_CONNECT,
-					     mode, affected_links,
-					     ml_vdev_lst);
+	policy_mgr_mlo_sta_set_link(vdev, MLO_LINK_FORCE_REASON_CONNECT,
+				    mode, affected_links, ml_vdev_lst);
 }
 
 static void
@@ -4808,10 +4947,9 @@ policy_mgr_ml_sta_concurency_on_disconnect(struct wlan_objmgr_vdev *vdev,
 		i++;
 	}
 
-	wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					     MLO_LINK_FORCE_REASON_DISCONNECT,
-					     MLO_LINK_FORCE_MODE_NO_FORCE,
-					     num_ml, ml_vdev_list);
+	policy_mgr_mlo_sta_set_link(vdev, MLO_LINK_FORCE_REASON_DISCONNECT,
+				    MLO_LINK_FORCE_MODE_NO_FORCE,
+				    num_ml, ml_vdev_list);
 }
 
 /**
@@ -5146,10 +5284,9 @@ policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
 		return;
 	}
 
-	wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					     MLO_LINK_FORCE_REASON_CONNECT,
-					     MLO_LINK_FORCE_MODE_ACTIVE_NUM,
-					     num_ml_sta, ml_sta_vdev_lst);
+	policy_mgr_mlo_sta_set_link(vdev, MLO_LINK_FORCE_REASON_CONNECT,
+				    MLO_LINK_FORCE_MODE_ACTIVE_NUM,
+				    num_ml_sta, ml_sta_vdev_lst);
 
 	return;
 enable_link:
@@ -5161,10 +5298,10 @@ enable_link:
 	if (policy_mgr_sta_ml_link_enable_allowed(psoc, num_disabled_ml_sta,
 						  num_ml_sta, ml_freq_lst,
 						  ml_sta_vdev_lst))
-		wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					MLO_LINK_FORCE_REASON_DISCONNECT,
-					MLO_LINK_FORCE_MODE_NO_FORCE,
-					num_ml_sta, ml_sta_vdev_lst);
+		policy_mgr_mlo_sta_set_link(vdev,
+					    MLO_LINK_FORCE_REASON_DISCONNECT,
+					    MLO_LINK_FORCE_MODE_NO_FORCE,
+					    num_ml_sta, ml_sta_vdev_lst);
 }
 
 void
@@ -5190,6 +5327,50 @@ policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID);
 }
 
+#define SET_LINK_TIMEOUT 6000
+static void
+policy_mgr_wait_for_set_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
+{
+	QDF_STATUS status;
+
+	if (!policy_mgr_get_link_in_progress(pm_ctx))
+		return;
+
+	status =
+		qdf_wait_for_event_completion(&pm_ctx->set_link_update_done_evt,
+					      SET_LINK_TIMEOUT);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		policy_mgr_set_link_in_progress(pm_ctx, false);
+		policy_mgr_err("wait for set_link_in_progress failed");
+		return;
+	}
+}
+
+void policy_mgr_handle_ml_sta_link_on_traffic_type_change(
+						struct wlan_objmgr_psoc *psoc,
+						struct wlan_objmgr_vdev *vdev)
+{
+	struct policy_mgr_psoc_priv_obj *pm_ctx;
+
+	pm_ctx = policy_mgr_get_context(psoc);
+	if (!pm_ctx) {
+		policy_mgr_err("Invalid Context");
+		return;
+	}
+
+	/* Check if any set link is already progress and thus wait */
+	policy_mgr_wait_for_set_link_update(pm_ctx);
+
+	policy_mgr_handle_sap_cli_go_ml_sta_up_csa(psoc, vdev);
+
+	/*
+	 * Check if traffic type change lead to set link is progress and
+	 * thus wait for it to complete.
+	 */
+	policy_mgr_wait_for_set_link_update(pm_ctx);
+}
+
 /*
  * policy_mgr_re_enable_ml_sta_on_p2p_sap_down() - Handle enable
  * link on P2P/SAP/ML_STA vdev down
@@ -5255,10 +5436,10 @@ void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
 		policy_mgr_debug("vdev %d: Affected link present, dont reanabe ML link",
 				 vdev_id);
 	else
-		wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					MLO_LINK_FORCE_REASON_DISCONNECT,
-					MLO_LINK_FORCE_MODE_NO_FORCE,
-					num_ml_sta, ml_sta_vdev_lst);
+		policy_mgr_mlo_sta_set_link(vdev,
+					    MLO_LINK_FORCE_REASON_DISCONNECT,
+					    MLO_LINK_FORCE_MODE_NO_FORCE,
+					    num_ml_sta, ml_sta_vdev_lst);
 }
 
 void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,

+ 6 - 0
components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h

@@ -353,6 +353,8 @@ struct policy_mgr_cfg {
  * @cfg: Policy manager config data
  * @dynamic_mcc_adaptive_sched: disable/enable mcc adaptive scheduler feature
  * @dynamic_dfs_master_disabled: current state of dynamic dfs master
+ * @set_link_in_progress: To track if set link is in progress
+ * @set_link_update_done_evt: qdf event to synchronize set link
  */
 struct policy_mgr_psoc_priv_obj {
 	struct wlan_objmgr_psoc *psoc;
@@ -395,6 +397,10 @@ struct policy_mgr_psoc_priv_obj {
 	uint32_t valid_ch_freq_list_count;
 	bool dynamic_mcc_adaptive_sched;
 	bool dynamic_dfs_master_disabled;
+#ifdef WLAN_FEATURE_11BE_MLO
+	bool set_link_in_progress;
+	qdf_event_t set_link_update_done_evt;
+#endif
 };
 
 /**

+ 52 - 0
components/cmn_services/policy_mgr/src/wlan_policy_mgr_init_deinit.c

@@ -429,8 +429,51 @@ static inline void policy_mgr_memzero_disabled_ml_list(void)
 {
 	qdf_mem_zero(pm_disabled_ml_links, sizeof(pm_disabled_ml_links));
 }
+
+static QDF_STATUS
+policy_mgr_init_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
+{
+	QDF_STATUS qdf_status;
+
+	pm_ctx->set_link_in_progress = false;
+	qdf_status = qdf_event_create(&pm_ctx->set_link_update_done_evt);
+	if (QDF_IS_STATUS_ERROR(qdf_status)) {
+		policy_mgr_err("init event failed for for set_link_update_done_evt");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS
+policy_mgr_deinit_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
+{
+	QDF_STATUS qdf_status;
+
+	pm_ctx->set_link_in_progress = false;
+	qdf_status = qdf_event_destroy(&pm_ctx->set_link_update_done_evt);
+	if (QDF_IS_STATUS_ERROR(qdf_status)) {
+		policy_mgr_err("deinit event failed for set_link_update_done_evt");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 #else
 static inline void policy_mgr_memzero_disabled_ml_list(void) {}
+
+static inline QDF_STATUS
+policy_mgr_init_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+policy_mgr_deinit_ml_link_update(struct policy_mgr_psoc_priv_obj *pm_ctx)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 QDF_STATUS policy_mgr_psoc_enable(struct wlan_objmgr_psoc *psoc)
@@ -461,6 +504,10 @@ QDF_STATUS policy_mgr_psoc_enable(struct wlan_objmgr_psoc *psoc)
 		return status;
 	}
 
+	status = policy_mgr_init_ml_link_update(pm_ctx);
+	if (QDF_IS_STATUS_ERROR(status))
+		return status;
+
 	/* init connection_update_done_evt */
 	status = policy_mgr_init_connection_update(pm_ctx);
 	if (!QDF_IS_STATUS_SUCCESS(status)) {
@@ -615,6 +662,11 @@ QDF_STATUS policy_mgr_psoc_disable(struct wlan_objmgr_psoc *psoc)
 		QDF_ASSERT(0);
 	}
 
+	if (QDF_IS_STATUS_ERROR(policy_mgr_deinit_ml_link_update(pm_ctx))) {
+		status = QDF_STATUS_E_FAILURE;
+		QDF_ASSERT(0);
+	}
+
 	/* deallocate dbs_opportunistic_timer */
 	if (QDF_TIMER_STATE_RUNNING ==
 			qdf_mc_timer_get_current_state(

+ 0 - 22
components/mlme/core/inc/wlan_mlme_main.h

@@ -1113,28 +1113,6 @@ QDF_STATUS mlme_get_cfg_wlm_reset(struct wlan_objmgr_psoc *psoc,
 void mlme_reinit_control_config_lfr_params(struct wlan_objmgr_psoc *psoc,
 					   struct wlan_mlme_lfr_cfg *lfr);
 
-/**
- * wlan_mlme_mlo_sta_mlo_concurency_set_link() - Set links for MLO STA
- *
- * @vdev: vdev object
- * @reason: Reason for which link is forced
- * @mode: Force reason
- * @num_mlo_vdev: number of mlo vdev
- * @mlo_vdev_lst: MLO STA vdev list
-
- * Interface manager Set links for MLO STA
- *
- * Return: void
- */
-#ifdef WLAN_FEATURE_11BE_MLO
-void
-wlan_mlo_sta_mlo_concurency_set_link(struct wlan_objmgr_vdev *vdev,
-				     enum mlo_link_force_reason reason,
-				     enum mlo_link_force_mode mode,
-				     uint8_t num_mlo_vdev,
-				     uint8_t *mlo_vdev_lst);
-#endif
-
 /**
  * wlan_mlme_get_mac_vdev_id() - get vdev self mac address using vdev id
  * @pdev: pdev

+ 0 - 73
components/mlme/core/src/wlan_mlme_main.c

@@ -3943,79 +3943,6 @@ QDF_STATUS mlme_get_fw_scan_channels(struct wlan_objmgr_psoc *psoc,
 }
 #endif
 
-#ifdef WLAN_FEATURE_11BE_MLO
-static void
-wlan_mlo_fill_active_link_vdev_bitmap(struct mlo_link_set_active_req *req,
-				      uint8_t *mlo_vdev_lst,
-				      uint32_t num_mlo_vdev)
-{
-	uint32_t entry_idx, entry_offset, vdev_idx;
-	uint8_t vdev_id;
-
-	for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
-		vdev_id = mlo_vdev_lst[vdev_idx];
-		entry_idx = vdev_id / 32;
-		entry_offset = vdev_id % 32;
-		if (entry_idx >= MLO_LINK_NUM_SZ) {
-			mlme_err("Invalid entry_idx %d num_mlo_vdev %d vdev %d",
-				 entry_idx, num_mlo_vdev, vdev_id);
-			continue;
-		}
-		req->param.vdev_bitmap[entry_idx] |= (1 << entry_offset);
-		/* update entry number if entry index changed */
-		if (req->param.num_vdev_bitmap < entry_idx + 1)
-			req->param.num_vdev_bitmap = entry_idx + 1;
-	}
-
-	mlme_debug("num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
-		   req->param.num_vdev_bitmap, req->param.vdev_bitmap[0],
-		   req->param.vdev_bitmap[1]);
-}
-
-void
-wlan_mlo_sta_mlo_concurency_set_link(struct wlan_objmgr_vdev *vdev,
-				     enum mlo_link_force_reason reason,
-				     enum mlo_link_force_mode mode,
-				     uint8_t num_mlo_vdev,
-				     uint8_t *mlo_vdev_lst)
-{
-	struct mlo_link_set_active_req *req;
-	QDF_STATUS status;
-
-	req = qdf_mem_malloc(sizeof(*req));
-	if (!req)
-		return;
-
-	mlme_debug("vdev %d: mode %d num_mlo_vdev %d reason %d",
-		   wlan_vdev_get_id(vdev), mode, num_mlo_vdev, reason);
-
-	req->ctx.vdev = vdev;
-	req->param.reason = reason;
-	req->param.force_mode = mode;
-	req->ctx.set_mlo_link_cb = policy_mgr_handle_link_enable_disable_resp;
-	req->ctx.cb_arg = req;
-
-	/* set MLO vdev bit mask for all case */
-	wlan_mlo_fill_active_link_vdev_bitmap(req, mlo_vdev_lst, num_mlo_vdev);
-
-	/* fill num of links for MLO_LINK_FORCE_MODE_ACTIVE_NUM */
-	if (mode == MLO_LINK_FORCE_MODE_ACTIVE_NUM) {
-		req->param.force_mode = MLO_LINK_FORCE_MODE_ACTIVE_NUM;
-		req->param.num_link_entry = 1;
-		req->param.link_num[0].num_of_link = num_mlo_vdev - 1;
-	}
-
-	status = mlo_ser_set_link_req(req);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		mlme_err("vdev %d: Failed to set link mode %d num_mlo_vdev %d reason %d",
-			 wlan_vdev_get_id(vdev), mode, num_mlo_vdev,
-			 reason);
-		qdf_mem_free(req);
-	}
-
-}
-#endif
-
 QDF_STATUS wlan_mlme_get_mac_vdev_id(struct wlan_objmgr_pdev *pdev,
 				     uint8_t vdev_id,
 				     struct qdf_mac_addr *self_mac)

+ 51 - 49
components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c

@@ -310,49 +310,78 @@ ucfg_mlme_set_fine_time_meas_cap(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS
-ucfg_mlme_set_vdev_traffic_low_latency(struct wlan_objmgr_psoc *psoc,
-				       uint8_t vdev_id, bool set)
+static QDF_STATUS
+ucfg_mlme_set_vdev_traffic_type(struct wlan_objmgr_psoc *psoc,
+				struct wlan_objmgr_vdev *vdev, bool set,
+				uint8_t bit_mask)
 {
-	struct wlan_objmgr_vdev *vdev;
 	struct mlme_legacy_priv *mlme_priv;
 	struct vdev_mlme_obj *vdev_mlme;
 	struct vdev_set_params param = {0};
+	enum QDF_OPMODE mode;
 	QDF_STATUS status;
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+	uint8_t prev_traffic_type;
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
-						    WLAN_MLME_OBJMGR_ID);
-	if (!vdev) {
-		mlme_legacy_err("vdev object is NULL for vdev %d",
-				vdev_id);
-		return QDF_STATUS_E_FAILURE;
+	mode = wlan_vdev_mlme_get_opmode(vdev);
+	if (mode != QDF_SAP_MODE && mode != QDF_P2P_CLIENT_MODE &&
+	    mode != QDF_P2P_GO_MODE) {
+		mlme_legacy_debug("vdev %d: not supported for opmode %d",
+				  vdev_id, mode);
+		return QDF_STATUS_E_NOSUPPORT;
 	}
 
 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	if (!vdev_mlme) {
-		mlme_legacy_err("vdev vdev_mlme object is NULL");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
+		mlme_legacy_err("vdev %d: bit_mask 0x%x, set %d, vdev mlme is null",
+				vdev_id, bit_mask, set);
 		return QDF_STATUS_E_FAILURE;
 	}
 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
 	if (!mlme_priv) {
-		mlme_legacy_err("vdev legacy private object is NULL");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
+		mlme_legacy_err("vdev %d: bit_mask 0x%x, set %d, vmlme_priv is null",
+				vdev_id, bit_mask, set);
 		return QDF_STATUS_E_FAILURE;
 	}
-
+	prev_traffic_type = mlme_priv->vdev_traffic_type;
 	if (set)
-		mlme_priv->vdev_traffic_type |= PM_VDEV_TRAFFIC_LOW_LATENCY;
+		mlme_priv->vdev_traffic_type |= bit_mask;
 	else
-		mlme_priv->vdev_traffic_type &= ~PM_VDEV_TRAFFIC_LOW_LATENCY;
+		mlme_priv->vdev_traffic_type &= ~bit_mask;
 
-	mlme_legacy_debug("low_latency flag 0x%x set %d on vdev %d",
-			  mlme_priv->vdev_traffic_type, set, vdev_id);
+	if (prev_traffic_type == mlme_priv->vdev_traffic_type) {
+		mlme_legacy_debug("vdev %d: No change in value 0x%x, set %d mask 0x%x",
+				  vdev_id, mlme_priv->vdev_traffic_type, set,
+				  bit_mask);
+		return QDF_STATUS_SUCCESS;
+	}
+	mlme_legacy_debug("vdev %d: vdev_traffic_type 0x%x (set %d with bit_mask 0x%x)",
+			  vdev_id, mlme_priv->vdev_traffic_type, set, bit_mask);
 	param.param_id = WMI_VDEV_PARAM_VDEV_TRAFFIC_CONFIG;
 	param.vdev_id = vdev_id;
 	param.param_value = mlme_priv->vdev_traffic_type;
 	status = tgt_vdev_mgr_set_param_send(vdev_mlme, &param);
+	policy_mgr_handle_ml_sta_link_on_traffic_type_change(psoc, vdev);
 
+	return status;
+}
+
+QDF_STATUS
+ucfg_mlme_set_vdev_traffic_low_latency(struct wlan_objmgr_psoc *psoc,
+				       uint8_t vdev_id, bool set)
+{
+	struct wlan_objmgr_vdev *vdev;
+	QDF_STATUS status;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_MLME_OBJMGR_ID);
+	if (!vdev) {
+		mlme_legacy_err("vdev %d: vdev not found",
+				vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+	status = ucfg_mlme_set_vdev_traffic_type(psoc, vdev, set,
+						 PM_VDEV_TRAFFIC_LOW_LATENCY);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
 
 	return status;
@@ -363,44 +392,17 @@ ucfg_mlme_set_vdev_traffic_high_throughput(struct wlan_objmgr_psoc *psoc,
 					   uint8_t vdev_id, bool set)
 {
 	struct wlan_objmgr_vdev *vdev;
-	struct mlme_legacy_priv *mlme_priv;
-	struct vdev_mlme_obj *vdev_mlme;
-	struct vdev_set_params param = {0};
 	QDF_STATUS status;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
 						    WLAN_MLME_OBJMGR_ID);
 	if (!vdev) {
-		mlme_legacy_err("vdev object is NULL for vdev %d",
+		mlme_legacy_err("vdev %d: vdev not found",
 				vdev_id);
 		return QDF_STATUS_E_FAILURE;
 	}
-
-	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
-	if (!vdev_mlme) {
-		mlme_legacy_err("vdev vdev_mlme object is NULL");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
-		return QDF_STATUS_E_FAILURE;
-	}
-	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
-	if (!mlme_priv) {
-		mlme_legacy_err("vdev legacy private object is NULL");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	if (set)
-		mlme_priv->vdev_traffic_type |= PM_VDEV_TRAFFIC_HIGH_TPUT;
-	else
-		mlme_priv->vdev_traffic_type &= ~PM_VDEV_TRAFFIC_HIGH_TPUT;
-
-	mlme_legacy_debug("high_throughput flag 0x%x set %d on vdev %d",
-			  mlme_priv->vdev_traffic_type, set, vdev_id);
-	param.param_id = WMI_VDEV_PARAM_VDEV_TRAFFIC_CONFIG;
-	param.vdev_id = vdev_id;
-	param.param_value = mlme_priv->vdev_traffic_type;
-	status = tgt_vdev_mgr_set_param_send(vdev_mlme, &param);
-
+	status = ucfg_mlme_set_vdev_traffic_type(psoc, vdev, set,
+						 PM_VDEV_TRAFFIC_HIGH_TPUT);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
 
 	return status;