Переглянути джерело

qcacmn: Select best ML partner link info based on DBS or SBS mode

Select the best ML partner link based on DBS or SBS mode.

Change-Id: I5d7d9242b32fa4143e7bec5b9692689ac257ca4d
CRs-Fixed: 3530717
Deeksha Gupta 1 рік тому
батько
коміт
a2ccbeff4e
1 змінених файлів з 69 додано та 1 видалено
  1. 69 1
      umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

+ 69 - 1
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -1829,6 +1829,69 @@ connect_err:
 }
 
 #if defined(CONN_MGR_ADV_FEATURE) && defined(WLAN_FEATURE_11BE_MLO)
+static void
+cm_modify_partner_info_based_on_dbs_or_sbs_mode(struct wlan_objmgr_vdev *vdev,
+						wlan_cm_id cm_id,
+						struct scan_cache_entry *scan_entry,
+						struct mlo_partner_info *partner_info)
+{
+	struct wlan_objmgr_psoc *psoc = NULL;
+	uint16_t i;
+	qdf_freq_t assoc_freq, partner_freq;
+	struct mlo_link_info tmp_link_info;
+	uint8_t best_partner_idx, best_partner_idx_2g, best_partner_idx_5g;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc)
+		return;
+
+	assoc_freq = scan_entry->channel.chan_freq;
+	best_partner_idx_2g = partner_info->num_partner_links;
+	best_partner_idx_5g = partner_info->num_partner_links;
+
+	for (i = 0; i < partner_info->num_partner_links; i++) {
+		partner_freq = partner_info->partner_link_info[i].chan_freq;
+		if (!policy_mgr_2_freq_always_on_same_mac(psoc, assoc_freq,
+							  partner_freq)) {
+			if (wlan_reg_is_24ghz_ch_freq(partner_freq))
+				best_partner_idx_2g = i;
+			else
+				best_partner_idx_5g = i;
+		}
+	}
+
+	if (best_partner_idx_5g == partner_info->num_partner_links &&
+	    best_partner_idx_2g == partner_info->num_partner_links)
+		return;
+
+	if (best_partner_idx_5g != partner_info->num_partner_links)
+		best_partner_idx = best_partner_idx_5g;
+	else if (best_partner_idx_2g != partner_info->num_partner_links)
+		best_partner_idx = best_partner_idx_2g;
+	else
+		return;
+
+	if (best_partner_idx == 0)
+		return;
+
+	/* Based on DBS or SBS mode, reorder the partner_link_info */
+	tmp_link_info = partner_info->partner_link_info[0];
+	partner_info->partner_link_info[0] =
+		partner_info->partner_link_info[best_partner_idx];
+	partner_info->partner_link_info[best_partner_idx] = tmp_link_info;
+
+	mlme_debug(CM_PREFIX_FMT "Updated no. of partner links: %d",
+		   CM_PREFIX_REF(wlan_vdev_get_id(vdev), cm_id),
+		   partner_info->num_partner_links);
+
+	for (i = 0; i < partner_info->num_partner_links; i++)
+		mlme_debug(CM_PREFIX_FMT "Partner link id: %d mac:" QDF_MAC_ADDR_FMT " freq: %d",
+			   CM_PREFIX_REF(wlan_vdev_get_id(vdev), cm_id),
+			   partner_info->partner_link_info[i].link_id,
+			   QDF_MAC_ADDR_REF(partner_info->partner_link_info[i].link_addr.bytes),
+			   partner_info->partner_link_info[i].chan_freq);
+}
+
 static void
 cm_connect_req_update_ml_partner_info(struct cnx_mgr *cm_ctx,
 				      struct cm_req *cm_req,
@@ -1840,9 +1903,14 @@ cm_connect_req_update_ml_partner_info(struct cnx_mgr *cm_ctx,
 	wlan_psoc_mlme_get_11be_capab(wlan_vdev_get_psoc(cm_ctx->vdev),
 				      &eht_capable);
 	if (!same_candidate_used && eht_capable &&
-	    cm_bss_peer_is_assoc_peer(conn_req))
+	    cm_bss_peer_is_assoc_peer(conn_req)) {
 		cm_get_ml_partner_info(conn_req->cur_candidate->entry,
 				       &conn_req->req.ml_parnter_info);
+		cm_modify_partner_info_based_on_dbs_or_sbs_mode(
+						cm_ctx->vdev, cm_req->cm_id,
+						conn_req->cur_candidate->entry,
+						&conn_req->req.ml_parnter_info);
+	}
 }
 #else
 static void