Prechádzať zdrojové kódy

qcacld-3.0: Add logic to disable a link during STA connect/roam

Add logic to disable a link vdev if concurrency doesn't allow it.
Send mlo_force_link_inactive in peer assoc for this and add
it in deleted table on connection complete.

Also disable the link if roam sync indication indicate
that link is disabled.

Change-Id: Ib0615308a669a5fd9d2b8ef6f8ab3f50953f658d
CRs-Fixed: 3192728
Abhishek Singh 2 rokov pred
rodič
commit
2b4bc8d5df

+ 8 - 3
components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c

@@ -812,9 +812,14 @@ QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev,
 
 	/* If concurrency is not allowed select next bss */
 	conc_ext_flags = if_mgr_get_conc_ext_flags(vdev, candidate_info);
-	if (!policy_mgr_is_concurrency_allowed(psoc, mode, chan_freq,
-					       HW_MODE_20_MHZ,
-					       conc_ext_flags)) {
+	/*
+	 * Apply concurrency check only for non ML and ML assoc links only
+	 * For non-assoc ML link if concurrency check fails its will be forced
+	 * disabled in peer assoc.
+	 */
+	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev) &&
+	    !policy_mgr_allow_concurrency(psoc, mode, chan_freq,
+					  HW_MODE_20_MHZ, conc_ext_flags)) {
 		ifmgr_info("Concurrency not allowed for this channel freq %d bssid "QDF_MAC_ADDR_FMT", selecting next",
 			   chan_freq,
 			   QDF_MAC_ADDR_REF(bssid_arg.peer_addr.bytes));

+ 19 - 0
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -1039,6 +1039,18 @@ void policy_mgr_move_vdev_from_connection_to_disabled_tbl(
 						struct wlan_objmgr_psoc *psoc,
 						uint8_t vdev_id);
 
+/**
+ * policy_mgr_ml_link_vdev_need_to_be_disabled() - check if ml link need to be
+ * disabled during connection.
+ * @psoc: psoc
+ * @vdev: vdev
+ *
+ * Return: true if STA link is need to be disabled else false.
+ */
+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
@@ -1069,6 +1081,13 @@ policy_mgr_move_vdev_from_disabled_to_connection_tbl(
 						struct wlan_objmgr_psoc *psoc,
 						uint8_t vdev_id) {}
 
+static inline bool
+policy_mgr_ml_link_vdev_need_to_be_disabled(struct wlan_objmgr_psoc *psoc,
+					    struct wlan_objmgr_vdev *vdev)
+{
+	return false;
+}
+
 static inline void
 policy_mgr_move_vdev_from_connection_to_disabled_tbl(
 						struct wlan_objmgr_psoc *psoc,

+ 25 - 0
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -3225,6 +3225,31 @@ void policy_mgr_move_vdev_from_connection_to_disabled_tbl(
 	policy_mgr_add_to_disabled_links(pm_ctx, freq, mode, vdev_id);
 }
 
+bool
+policy_mgr_ml_link_vdev_need_to_be_disabled(struct wlan_objmgr_psoc *psoc,
+					    struct wlan_objmgr_vdev *vdev)
+{
+	union conc_ext_flag conc_ext_flags;
+
+	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
+		return false;
+
+	/* Check only for link vdev */
+	if (!wlan_vdev_mlme_is_mlo_vdev(vdev) ||
+	    !wlan_vdev_mlme_is_mlo_link_vdev(vdev))
+		return false;
+
+	conc_ext_flags.value = policy_mgr_get_conc_ext_flags(vdev, false);
+	/*
+	 * For non-assoc link vdev set link as disabled if concurency is
+	 * not allowed
+	 */
+	return !policy_mgr_allow_concurrency(psoc, PM_STA_MODE,
+					     wlan_get_operation_chan_freq(vdev),
+					     HW_MODE_20_MHZ,
+					     conc_ext_flags.value);
+}
+
 static void
 policy_mgr_enable_disable_link_from_vdev_bitmask(struct wlan_objmgr_psoc *psoc,
 						 unsigned long enable_vdev_mask,

+ 28 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_fw_sync.c

@@ -902,6 +902,32 @@ rel_ref:
 	return status;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static void
+cm_get_and_disable_link_from_roam_ind(struct wlan_objmgr_psoc *psoc,
+				      uint8_t vdev_id,
+				      struct roam_offload_synch_ind *synch_data)
+{
+	uint8_t i;
+
+	for (i = 0; i < synch_data->num_setup_links; i++) {
+		if (synch_data->ml_link[i].vdev_id == vdev_id &&
+		    synch_data->ml_link[i].flags & CM_ROAM_LINK_FLAG_DISABLE) {
+			mlme_info("Vdev %d: link flags 0x%x, indicate link disable",
+				  vdev_id, synch_data->ml_link[i].flags);
+			policy_mgr_move_vdev_from_connection_to_disabled_tbl(
+								psoc, vdev_id);
+			break;
+		}
+	}
+}
+#else
+static inline void
+cm_get_and_disable_link_from_roam_ind(struct wlan_objmgr_psoc *psoc,
+				      uint8_t vdev_id,
+				      struct roam_offload_synch_ind *synch_data)
+{}
+#endif
 QDF_STATUS cm_fw_roam_complete(struct cnx_mgr *cm_ctx, void *data)
 {
 	struct roam_offload_synch_ind *roam_synch_data;
@@ -941,6 +967,8 @@ QDF_STATUS cm_fw_roam_complete(struct cnx_mgr *cm_ctx, void *data)
 		goto end;
 	}
 
+	/* Check if FW as indicated this link as disabled */
+	cm_get_and_disable_link_from_roam_ind(psoc, vdev_id, roam_synch_data);
 	/*
 	 * Following operations need to be done once roam sync
 	 * completion is sent to FW, hence called here:

+ 5 - 1
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -1437,7 +1437,11 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 			rsp->freq);
 
 	if (QDF_IS_STATUS_SUCCESS(rsp->connect_status)) {
-		policy_mgr_incr_active_session(psoc, op_mode, vdev_id);
+		if (policy_mgr_ml_link_vdev_need_to_be_disabled(psoc, vdev))
+			policy_mgr_move_vdev_from_connection_to_disabled_tbl(
+								psoc, vdev_id);
+		else
+			policy_mgr_incr_active_session(psoc, op_mode, vdev_id);
 		cm_process_connect_complete(psoc, pdev, vdev, rsp);
 		wlan_tdls_notify_sta_connect(vdev_id,
 					     mlme_get_tdls_chan_switch_prohibited(vdev),

+ 3 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h

@@ -2399,6 +2399,9 @@ struct cm_hw_mode_trans_ind {
 	struct policy_mgr_pdev_mac_freq_map mac_freq_map[MAX_FREQ_RANGE_NUM];
 };
 
+/* If link is disabled, during roam sync */
+#define CM_ROAM_LINK_FLAG_DISABLE    0x1
+
 /*
  * struct ml_setup_link_param - MLO setup link param
  * @vdev_id: vdev id of the link

+ 5 - 2
core/wma/src/wma_mgmt.c

@@ -1371,9 +1371,12 @@ static void wma_set_mlo_capability(tp_wma_handle wma,
 		req->mlo_params.mlo_assoc_link =
 					wlan_peer_mlme_is_assoc_peer(peer);
 		WLAN_ADDR_COPY(req->mlo_params.mld_mac, peer->mldaddr);
-		wma_debug("assoc_link %d " QDF_MAC_ADDR_FMT,
+		if (policy_mgr_ml_link_vdev_need_to_be_disabled(psoc, vdev))
+			req->mlo_params.mlo_force_link_inactive = 1;
+		wma_debug("assoc_link %d" QDF_MAC_ADDR_FMT ", force inactive %d",
 			  req->mlo_params.mlo_assoc_link,
-			  QDF_MAC_ADDR_REF(peer->mldaddr));
+			  QDF_MAC_ADDR_REF(peer->mldaddr),
+			  req->mlo_params.mlo_force_link_inactive);
 	} else {
 		wma_debug("Peer MLO context is NULL");
 		req->mlo_params.mlo_enabled = false;