ソースを参照

qcacmn: Combine MLO VDEV and MLO LINK VDEV flags

If MLO link VDEV flag is set but MLO VDEV flag is not set
the APIs only checking for MLO link VDEV will assume VDEV
as ML but the APIs checking MLO VDEV will assume VDEV as
non-ML, this is not valid.

As per definition of MLO VDEV and MLO link VDEV:
 -If any VDEV is MLO link VDEV then it has to be MLO VDEV.
 -If any VDEV is not MLO VDEV then it shall not be MLO link VDEV.

Change contains following:
 -On clearing MLO VDEV flag, clear MLO link VDEV flag.
 -On setting MLO link VDEV flag, set MLO VDEV flag if not
  already set.

Change-Id: I8efeaa1cb75b37e5f7f2cc5c16067df677000c45
CRs-Fixed: 3657212
Vinod Kumar Pirla 1 年間 前
コミット
c3051ec402
1 ファイル変更18 行追加2 行削除
  1. 18 2
      umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

+ 18 - 2
umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

@@ -1706,6 +1706,7 @@ void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
 {
 	struct wlan_objmgr_pdev *pdev;
+	uint32_t mlo_vdev_cap;
 
 	if (!vdev) {
 		obj_mgr_err("vdev is NULL");
@@ -1724,7 +1725,9 @@ void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
 		wlan_release_vdev_mlo_lock(vdev);
 		return;
 	}
-	wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO);
+
+	mlo_vdev_cap = WLAN_VDEV_FEXT2_MLO | WLAN_VDEV_FEXT2_MLO_STA_LINK;
+	wlan_vdev_mlme_feat_ext2_cap_clear(vdev, mlo_vdev_cap);
 
 	wlan_pdev_dec_mlo_vdev_count(pdev);
 
@@ -1734,19 +1737,32 @@ void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
 
 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
 {
+	uint32_t mlo_vdev_cap;
+	struct wlan_objmgr_pdev *pdev;
+
 	if (!vdev) {
 		obj_mgr_err("vdev is NULL");
 		return;
 	}
 
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		obj_mgr_err("pdev is NULL");
+		return;
+	}
+
 	wlan_acquire_vdev_mlo_lock(vdev);
 
 	if (wlan_vdev_mlme_feat_ext2_cap_get(vdev,
 					     WLAN_VDEV_FEXT2_MLO_STA_LINK)) {
 		wlan_release_vdev_mlo_lock(vdev);
 		return;
+	} else if (!wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO)) {
+		wlan_pdev_inc_mlo_vdev_count(pdev);
 	}
-	wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
+
+	mlo_vdev_cap = WLAN_VDEV_FEXT2_MLO | WLAN_VDEV_FEXT2_MLO_STA_LINK;
+	wlan_vdev_mlme_feat_ext2_cap_set(vdev, mlo_vdev_cap);
 
 	wlan_release_vdev_mlo_lock(vdev);
 	obj_mgr_debug("Set MLO link flag: vdev_id: %d", wlan_vdev_get_id(vdev));