Selaa lähdekoodia

qcacmn: Add bridge vdev count under mlo dev

Add bridge vdev count under MLO dev context and
free dev context when all vdevs in mlo dev context
are freed

Change-Id: I861ec17f0143df8e063cc245aa71195f0349b4a7
CRs-Fixed: 3598970
Balaganapathy Palanisamy 1 vuosi sitten
vanhempi
sitoutus
0761c3f248

+ 2 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h

@@ -692,6 +692,7 @@ struct wlan_mlo_link_mac_update {
  * @mld_addr: MLO device MAC address
  * @wlan_vdev_list: list of vdevs associated with this MLO connection
  * @wlan_bridge_vdev_list: list of bridge vdevs associated with this MLO
+ * @wlan_bridge_vdev_count: number of elements in the bridge vdev list
  * @bridge_sta_ctx: bridge sta context
  * @wlan_vdev_count: number of elements in the vdev list
  * @mlo_peer_list: list peers in this MLO connection
@@ -718,6 +719,7 @@ struct wlan_mlo_dev_context {
 	struct wlan_mlo_bridge_sta *bridge_sta_ctx;
 #endif
 	uint16_t wlan_vdev_count;
+	uint16_t wlan_bridge_vdev_count;
 	struct wlan_mlo_peer_list mlo_peer_list;
 	uint16_t wlan_max_mlo_peer_count;
 #ifdef WLAN_MLO_USE_SPINLOCK

+ 9 - 8
umac/mlo_mgr/src/wlan_mlo_mgr_main.c

@@ -835,6 +835,7 @@ mlo_add_to_bridge_vdev_list(struct wlan_objmgr_vdev *vdev)
 			}
 
 			ml_dev->wlan_bridge_vdev_list[id] = vdev;
+			ml_dev->wlan_bridge_vdev_count++;
 			vdev->mlo_dev_ctx = ml_dev;
 			break;
 		}
@@ -868,6 +869,7 @@ mld_delete_from_bridge_vdev_list(struct wlan_objmgr_vdev *vdev)
 			if (ml_dev->wlan_bridge_vdev_list[id] == vdev) {
 				vdev->mlo_dev_ctx = NULL;
 				ml_dev->wlan_bridge_vdev_list[id] = NULL;
+				ml_dev->wlan_bridge_vdev_count--;
 				break;
 			}
 			id++;
@@ -1104,13 +1106,6 @@ static QDF_STATUS mlo_dev_ctx_deinit(struct wlan_objmgr_vdev *vdev)
 	mlo_debug("deleting vdev from MLD device ctx "QDF_MAC_ADDR_FMT,
 		  QDF_MAC_ADDR_REF(mld_addr->bytes));
 
-	if (wlan_vdev_mlme_is_mlo_bridge_vdev(vdev)) {
-		status = mld_delete_from_bridge_vdev_list(vdev);
-		if (!QDF_IS_STATUS_SUCCESS(status))
-			mlo_err("Failed to deinit bridge vap ctx");
-		return status;
-	}
-
 	mlo_dev_lock_acquire(ml_dev);
 	while (id < WLAN_UMAC_MLO_MAX_VDEVS) {
 		if (ml_dev->wlan_vdev_list[id] == vdev) {
@@ -1127,8 +1122,14 @@ static QDF_STATUS mlo_dev_ctx_deinit(struct wlan_objmgr_vdev *vdev)
 	}
 	mlo_dev_lock_release(ml_dev);
 
+	if (wlan_vdev_mlme_is_mlo_bridge_vdev(vdev)) {
+		status = mld_delete_from_bridge_vdev_list(vdev);
+		if (!QDF_IS_STATUS_SUCCESS(status))
+			mlo_err("Failed to deinit bridge vap ctx");
+	}
+
 	ml_link_lock_acquire(g_mlo_ctx);
-	if (!ml_dev->wlan_vdev_count) {
+	if (!ml_dev->wlan_vdev_count && !ml_dev->wlan_bridge_vdev_count) {
 		if (ml_dev->ap_ctx)
 			mlo_ap_ctx_deinit(ml_dev);