Przeglądaj źródła

qcacmn: Add mld config checks in vap create

Add mld config checks in osif_vap_create_check and fail
once the config is invalid.

Change-Id: I26c3b4719fa9b18be0a4590861c654504fb3e6bf
CRs-Fixed: 3200923
Surya Prakash Raajen 3 lat temu
rodzic
commit
d8c841f63b

+ 23 - 15
umac/mlo_mgr/inc/wlan_mlo_mgr_main.h

@@ -672,26 +672,34 @@ QDF_STATUS wlan_mlo_mgr_update_mld_addr(struct qdf_mac_addr *old_mac,
  */
 bool wlan_mlo_is_mld_ctx_exist(struct qdf_mac_addr *mldaddr);
 
-#ifdef CONFIG_AP_PLATFORM
 /**
- * wlan_mlo_vdev_cmp_same_pdev() - Compare pdev of the given vdevs
- * @vdev: Objmgr vdev of existing MLD vdev
- * @tmp_vdev: Objmgr vdev of newly added vdev
+ * wlan_mlo_get_mld_ctx_by_mldaddr() - Get mld device context using mld
+ *                                     MAC address
  *
- * API to compare pdev of the vdevs forming MLD.
+ * @mldaddr: MAC address of the MLD device
+ *
+ * API to get mld device context using the mld mac address
+ *
+ * Return: Pointer to mlo device context
+ */
+struct wlan_mlo_dev_context
+*wlan_mlo_get_mld_ctx_by_mldaddr(struct qdf_mac_addr *mldaddr);
+
+/**
+ * wlan_mlo_check_valid_config() - Check vap config is valid for mld
+ *
+ * @ml_dev: Pointer to structure of mlo device context
+ * @pdev: Reference pdev to check against MLD list
+ * @opmode: Operating mode of vdev (SAP/STA etc..)
+ *
+ * API to check if vaps config is valid
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS wlan_mlo_vdev_cmp_same_pdev(struct wlan_objmgr_vdev *vdev,
-				       struct wlan_objmgr_vdev *tmp_vdev);
-#else
-static inline
-QDF_STATUS wlan_mlo_vdev_cmp_same_pdev(struct wlan_objmgr_vdev *vdev,
-				       struct wlan_objmgr_vdev *tmp_vdev)
-{
-	return QDF_STATUS_E_FAILURE;
-}
-#endif /* CONFIG_AP_PLATFORM */
+QDF_STATUS wlan_mlo_check_valid_config(struct wlan_mlo_dev_context *ml_dev,
+				       struct wlan_objmgr_pdev *pdev,
+				       enum QDF_OPMODE opmode);
+
 #else
 static inline QDF_STATUS wlan_mlo_mgr_init(void)
 {

+ 19 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_setup.h

@@ -139,6 +139,18 @@ QDF_STATUS mlo_link_teardown_link(struct wlan_objmgr_psoc *psoc,
  */
 bool mlo_vdevs_check_single_soc(struct wlan_objmgr_vdev **wlan_vdev_list,
 				uint8_t vdev_count);
+
+/**
+ * mlo_check_all_pdev_state() - API to check all the pdev of the soc
+ *                              are on the same expected state.
+ *
+ * @psoc: Pointer to psoc object
+ * @state: Expected link state to be verified
+ *
+ * Return: QDF_STATUS: QDF_STATUS_SUCCESS if all belongs to same state
+ */
+QDF_STATUS mlo_check_all_pdev_state(struct wlan_objmgr_psoc *psoc,
+				    enum MLO_LINK_STATE state);
 #else
 static inline void mlo_setup_init(void)
 {
@@ -154,5 +166,12 @@ mlo_vdevs_check_single_soc(struct wlan_objmgr_vdev **wlan_vdev_list,
 {
 	return true;
 }
+
+static inline
+QDF_STATUS mlo_check_all_pdev_state(struct wlan_objmgr_psoc *psoc,
+				    uint32_t state)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif /* WLAN_MLO_MULTI_CHIP */
 #endif /* _WLAN_MLO_MGR_SETUP_H_ */

+ 90 - 23
umac/mlo_mgr/src/wlan_mlo_mgr_main.c

@@ -215,7 +215,7 @@ struct wlan_mlo_dev_context *mlo_get_next_mld_ctx(qdf_list_t *ml_list,
 	return mld_next;
 }
 
-static inline struct wlan_mlo_dev_context
+struct wlan_mlo_dev_context
 *wlan_mlo_get_mld_ctx_by_mldaddr(struct qdf_mac_addr *mldaddr)
 {
 	struct wlan_mlo_dev_context *mld_cur;
@@ -289,17 +289,95 @@ static QDF_STATUS mlo_ap_ctx_init(struct wlan_mlo_dev_context *ml_dev)
 }
 
 #ifdef CONFIG_AP_PLATFORM
-QDF_STATUS wlan_mlo_vdev_cmp_same_pdev(struct wlan_objmgr_vdev *vdev,
-				       struct wlan_objmgr_vdev *tmp_vdev)
+static inline
+QDF_STATUS wlan_mlo_pdev_check(struct wlan_objmgr_pdev *ref_pdev,
+			       struct wlan_objmgr_vdev *vdev)
 {
-	if (wlan_vdev_get_pdev(vdev) ==
-			wlan_vdev_get_pdev(tmp_vdev))
-		return QDF_STATUS_SUCCESS;
+	struct wlan_objmgr_pdev *pdev = NULL;
+	struct wlan_objmgr_psoc *psoc = NULL;
+
+	pdev = wlan_vdev_get_pdev(vdev);
+
+	psoc = wlan_pdev_get_psoc(ref_pdev);
+	if (mlo_check_all_pdev_state(psoc, MLO_LINK_SETUP_DONE)) {
+		mlo_err("Pdev link is not in ready state, initial link setup failed");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (ref_pdev == pdev) {
+		mlo_err("MLD vdev for this pdev already found, investigate config");
+		return QDF_STATUS_E_FAILURE;
+	}
 
-	return QDF_STATUS_E_FAILURE;
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS mlo_dev_config_check(struct wlan_mlo_dev_context *ml_dev,
+				struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+#else
+static inline
+QDF_STATUS mlo_dev_config_check(struct wlan_mlo_dev_context *ml_dev,
+				struct wlan_objmgr_vdev *vdev)
+{
+	enum QDF_OPMODE opmode = wlan_vdev_mlme_get_opmode(vdev);
+
+	if (wlan_mlo_check_valid_config(ml_dev, wlan_vdev_get_pdev(vdev),
+					opmode) != QDF_STATUS_SUCCESS)
+		return QDF_STATUS_E_FAILURE;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS wlan_mlo_pdev_check(struct wlan_objmgr_pdev *ref_pdev,
+			       struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 
+QDF_STATUS wlan_mlo_check_valid_config(struct wlan_mlo_dev_context *ml_dev,
+				       struct wlan_objmgr_pdev *pdev,
+				       enum QDF_OPMODE opmode)
+{
+	uint32_t id = 0;
+	struct wlan_objmgr_vdev *vdev = NULL;
+
+	if (!ml_dev)
+		return QDF_STATUS_E_FAILURE;
+
+	if (!pdev)
+		return QDF_STATUS_E_FAILURE;
+
+	mlo_dev_lock_acquire(ml_dev);
+	while (id < WLAN_UMAC_MLO_MAX_VDEVS) {
+		vdev = ml_dev->wlan_vdev_list[id];
+		if (vdev) {
+			if (wlan_mlo_pdev_check(pdev, vdev)) {
+				mlo_dev_lock_release(ml_dev);
+				return QDF_STATUS_E_FAILURE;
+			}
+
+			if (wlan_vdev_mlme_get_opmode(vdev) != opmode) {
+				mlo_err("Invalid opmode %d type found expected %d, investigate config",
+					wlan_vdev_mlme_get_opmode(vdev),
+					opmode);
+				mlo_dev_lock_release(ml_dev);
+				return QDF_STATUS_E_FAILURE;
+			}
+		}
+		id++;
+	}
+
+	mlo_dev_lock_release(ml_dev);
+	return QDF_STATUS_SUCCESS;
+}
+
 static QDF_STATUS mlo_dev_ctx_init(struct wlan_objmgr_vdev *vdev)
 {
 	struct wlan_mlo_dev_context *ml_dev;
@@ -307,32 +385,21 @@ static QDF_STATUS mlo_dev_ctx_init(struct wlan_objmgr_vdev *vdev)
 	struct qdf_mac_addr *mld_addr;
 	struct mlo_mgr_context *g_mlo_ctx = wlan_objmgr_get_mlo_ctx();
 	uint8_t id = 0;
-	enum QDF_OPMODE opmode = wlan_vdev_mlme_get_opmode(vdev);
 
 	mld_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_mldaddr(vdev);
 	ml_dev = wlan_mlo_get_mld_ctx_by_mldaddr(mld_addr);
+
 	if (ml_dev) {
+		if (mlo_dev_config_check(ml_dev, vdev) != QDF_STATUS_SUCCESS)
+			return QDF_STATUS_E_FAILURE;
+
 		mlo_dev_lock_acquire(ml_dev);
 		while (id < WLAN_UMAC_MLO_MAX_VDEVS) {
 			if (ml_dev->wlan_vdev_list[id]) {
-				if (wlan_vdev_mlme_get_opmode(
-					ml_dev->wlan_vdev_list[id]) !=
-						opmode) {
-					mlo_err("Invalid opmode type found, investigate config");
-					mlo_dev_lock_release(ml_dev);
-					return QDF_STATUS_E_FAILURE;
-				}
-
-				if (wlan_mlo_vdev_cmp_same_pdev(
-						ml_dev->wlan_vdev_list[id],
-						vdev) == QDF_STATUS_SUCCESS) {
-					mlo_err("Invalid pdev type found, investigate config");
-					mlo_dev_lock_release(ml_dev);
-					return QDF_STATUS_E_FAILURE;
-				}
 				id++;
 				continue;
 			}
+
 			ml_dev->wlan_vdev_list[id] = vdev;
 			ml_dev->wlan_vdev_count++;
 			vdev->mlo_dev_ctx = ml_dev;

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

@@ -457,7 +457,6 @@ static void mlo_force_teardown(void)
 		mlo_ctx->setup_info.state[link_idx] = MLO_LINK_TEARDOWN;
 }
 
-static
 QDF_STATUS mlo_check_all_pdev_state(struct wlan_objmgr_psoc *psoc,
 				    enum MLO_LINK_STATE state)
 {