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

qcacmn: Add/Remove VDEV from MLD

This change adds APIs
1) remove VDEV from MLD
2) add VDEV to MLD

CRs-Fixed: 3579048
Change-Id: I5a81d7a50b0c3865c3ab914a3e10906e3010cb91
Srinivas Pitla 1 жил өмнө
parent
commit
4251e4ac67

+ 18 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -245,6 +245,8 @@
   * from non-DFS channel
   */
 #define WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG 0x02000000
+  /* for mlo reconfig link removal functionality */
+#define WLAN_VDEV_OP_MLO_REMOVE_LINK_VDEV      0x04000000
 
  /* CAPABILITY: IBSS available */
 #define WLAN_VDEV_C_IBSS                    0x00000001
@@ -895,6 +897,22 @@ static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev,
 	WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr);
 }
 
+/**
+ * wlan_vdev_mlme_reset_mldaddr() - clear vdev mldaddr
+ * @vdev: VDEV object
+ *
+ * API to clear MLD addr in vdev object
+ *
+ * Caller need to acquire lock with wlan_vdev_obj_lock()
+ *
+ * Return: void
+ */
+static inline void wlan_vdev_mlme_reset_mldaddr(struct wlan_objmgr_vdev *vdev)
+{
+	/* This API is invoked with lock acquired, do not add log prints */
+	qdf_zero_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.mldaddr);
+}
+
 /**
  * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr
  * @vdev: VDEV object

+ 36 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_main.h

@@ -978,6 +978,28 @@ void wlan_mlo_update_action_frame_from_user(struct wlan_objmgr_vdev *vdev,
 void wlan_mlo_update_action_frame_to_user(struct wlan_objmgr_vdev *vdev,
 					  uint8_t *frame,
 					  uint32_t frame_len);
+
+/**
+ * wlan_mlo_mgr_mld_vdev_attach() - Attach VDEV to MLD
+ * @vdev: VDEV object
+ * @mld_addr: MLD address of MLD, where this VDEV should be attached
+ *
+ * API to set MLD MAC address and  Attaches VDEV to existing MLD.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_mlo_mgr_mld_vdev_attach(struct wlan_objmgr_vdev *vdev,
+					struct qdf_mac_addr *mld_addr);
+
+/**
+ * wlan_mlo_mgr_mld_vdev_detach() - Detach VDEV from MLD
+ * @vdev: VDEV object
+ *
+ * API to reset MLD MAC address and  Detaches VDEV from its MLD.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_mlo_mgr_mld_vdev_detach(struct wlan_objmgr_vdev *vdev);
 #else
 static inline QDF_STATUS wlan_mlo_mgr_init(void)
 {
@@ -1022,5 +1044,19 @@ uint8_t wlan_mlo_get_sta_mld_ctx_count(void)
 {
 	return 0;
 }
+
+static inline
+QDF_STATUS wlan_mlo_mgr_mld_vdev_attach(struct wlan_objmgr_vdev *vdev,
+					struct qdf_mac_addr *mld_addr)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS wlan_mlo_mgr_mld_vdev_detach(struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 #endif
 #endif

+ 37 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_main.c

@@ -1167,3 +1167,40 @@ QDF_STATUS wlan_mlo_mgr_update_mld_addr(struct qdf_mac_addr *old_mac,
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS wlan_mlo_mgr_mld_vdev_attach(struct wlan_objmgr_vdev *vdev,
+					struct qdf_mac_addr *mld_addr)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	wlan_vdev_obj_lock(vdev);
+	wlan_vdev_mlme_set_mldaddr(vdev, (uint8_t *)&mld_addr->bytes[0]);
+	wlan_vdev_obj_unlock(vdev);
+
+	status = mlo_dev_ctx_init(vdev);
+
+	return status;
+}
+
+QDF_STATUS wlan_mlo_mgr_mld_vdev_detach(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_mlo_dev_context *ml_dev;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	ml_dev = vdev->mlo_dev_ctx;
+	/*
+	 * Atleast one VAP should be part of MLD for dynamic link vap
+	 * addition and deletion, so rejecting VDEV detach
+	 */
+	if (ml_dev->wlan_vdev_count <= 1)
+		return QDF_STATUS_E_FAILURE;
+
+	status = mlo_dev_ctx_deinit(vdev);
+
+	wlan_vdev_obj_lock(vdev);
+	wlan_vdev_mlme_reset_mldaddr(vdev);
+	wlan_vdev_mlme_op_flags_clear(vdev, WLAN_VDEV_OP_MLO_REMOVE_LINK_VDEV);
+	wlan_vdev_obj_unlock(vdev);
+
+	return status;
+}