Эх сурвалжийг харах

qcacmn: Drop multiple teardown if already in teardown

Drop multiple teardown requests if mlo group is already in
teardwown phase

Change-Id: Id07ed50c2845b69c79bf6ccc4a6436eab8898532
CRs-Fixed: 3458369
Surya Prakash Raajen 2 жил өмнө
parent
commit
0fcbe55b8d

+ 31 - 1
umac/mlo_mgr/src/wlan_mlo_mgr_setup.c

@@ -1013,6 +1013,33 @@ static void mlo_send_teardown_req(struct wlan_objmgr_psoc *psoc,
 	}
 }
 
+static bool mlo_grp_in_teardown(uint8_t grp_id)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+	struct mlo_setup_info *setup_info;
+	uint8_t link_idx;
+
+	if (!mlo_ctx) {
+		mlo_err("MLO ctx null, teardown failed");
+		return true;
+	}
+
+	if (grp_id >= mlo_ctx->total_grp) {
+		mlo_err("Invalid grp id %d, total no of groups %d",
+			grp_id, mlo_ctx->total_grp);
+		return true;
+	}
+
+	setup_info = &mlo_ctx->setup_info[grp_id];
+
+	for (link_idx = 0; link_idx < setup_info->tot_links; link_idx++)
+		if (setup_info->pdev_list[link_idx] &&
+		    (setup_info->state[link_idx] == MLO_LINK_TEARDOWN))
+			return true;
+
+	return false;
+}
+
 #define MLO_MGR_TEARDOWN_TIMEOUT 3000
 QDF_STATUS mlo_link_teardown_link(struct wlan_objmgr_psoc *psoc,
 				  uint8_t grp_id,
@@ -1042,8 +1069,11 @@ QDF_STATUS mlo_link_teardown_link(struct wlan_objmgr_psoc *psoc,
 	if (!setup_info->num_soc)
 		return QDF_STATUS_SUCCESS;
 
-	if (!mlo_check_all_pdev_state(psoc, grp_id, MLO_LINK_TEARDOWN))
+	if (mlo_grp_in_teardown(grp_id)) {
+		mlo_debug("Skip teardown: as teardown sent already, grp_id %d num_soc %d num_link %d",
+			  grp_id, setup_info->num_soc, setup_info->num_links);
 		return QDF_STATUS_SUCCESS;
+	}
 
 	/* Trigger MLO teardown */
 	mlo_send_teardown_req(psoc, grp_id, reason);