Browse Source

qcacmn: MLO quiet vdev bitmap support for AP

Add change to support indication of quiet vdev for MLO AP context.

Change-Id: I7368e023976c29ae98fef2b86ef6aee0b7621390
CRs-Fixed: 2924329
Santosh Anbu 3 years ago
parent
commit
d445d62fd9

+ 25 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_ap.h

@@ -304,4 +304,29 @@ QDF_STATUS mlo_peer_allocate_primary_umac(
 QDF_STATUS mlo_peer_free_primary_umac(
 		struct wlan_mlo_dev_context *ml_dev,
 		struct wlan_mlo_peer_context *ml_peer);
+
+/**
+ * mlo_ap_vdev_quiet_set() - Set quiet bitmap for requested vdev
+ * @vdev: Pointer to object manager vdev
+ *
+ * Return: void
+ */
+void mlo_ap_vdev_quiet_set(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * mlo_ap_vdev_quiet_clear() - Clear quiet bitmap for requested vdev
+ * @vdev: Pointer to object manager vdev
+ *
+ * Return: void
+ */
+void mlo_ap_vdev_quiet_clear(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * mlo_ap_vdev_quiet_is_any_idx_set() - Check if any index is set in
+ * quiet bitmap
+ * @vdev: Pointer to object manager vdev
+ *
+ * Return: true, if any index is set, else false
+ */
+bool mlo_ap_vdev_quiet_is_any_idx_set(struct wlan_objmgr_vdev *vdev);
 #endif

+ 1 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h

@@ -84,6 +84,7 @@
 #define mlo_nofl_debug_rl(format, args...) \
 		QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
 
+#define MLO_INVALID_LINK_IDX 0xFF
 /**
  * mlo_get_link_information() - get partner link information
  * @mld_addr : MLD address

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

@@ -141,10 +141,12 @@ struct wlan_mlo_sta {
  * struct wlan_mlo_ap - MLO AP related info
  * @num_ml_vdevs: number of vdevs to form MLD
  * @ml_aid_mgr: ML AID mgr
+ * @mlo_vdev_quiet_bmap: Bitmap of vdevs for which quiet ie needs to enabled
  */
 struct wlan_mlo_ap {
 	uint8_t num_ml_vdevs;
 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
+	qdf_bitmap(mlo_vdev_quiet_bmap, WLAN_UMAC_MLO_MAX_VDEVS);
 };
 
 /*

+ 1 - 1
umac/mlo_mgr/src/wlan_mlo_mgr_aid.c

@@ -49,7 +49,7 @@ static uint16_t wlan_mlo_peer_alloc_aid(
 	if (!mlo_mgr_ctx)
 		return assoc_id;
 
-	if (!is_mlo_peer && link_ix == 0xff)
+	if (!is_mlo_peer && link_ix == MLO_INVALID_LINK_IDX)
 		return assoc_id;
 	/* TODO check locking strategy */
 	ml_aid_lock_acquire(mlo_mgr_ctx);

+ 53 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_ap.c

@@ -21,6 +21,7 @@
 #include "wlan_mlo_mgr_ap.h"
 #include <wlan_mlo_mgr_cmn.h>
 #include <wlan_mlo_mgr_main.h>
+#include <wlan_utility.h>
 
 bool mlo_ap_vdev_attach(struct wlan_objmgr_vdev *vdev,
 			uint8_t link_id,
@@ -239,3 +240,55 @@ void mlo_ap_ml_peerid_free(uint16_t mlo_peer_id)
 
 	ml_peerid_lock_release(mlo_ctx);
 }
+
+void mlo_ap_vdev_quiet_set(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_mlo_dev_context *mld_ctx = vdev->mlo_dev_ctx;
+	uint8_t idx;
+
+	if (!mld_ctx || !wlan_vdev_mlme_is_mlo_ap(vdev))
+		return;
+
+	idx = mlo_get_link_vdev_ix(mld_ctx, vdev);
+	if (idx == MLO_INVALID_LINK_IDX)
+		return;
+
+	mlo_debug("Quiet set for PSOC:%d vdev:%d",
+		  wlan_psoc_get_id(wlan_vdev_get_psoc(vdev)),
+		  wlan_vdev_get_id(vdev));
+
+	wlan_util_change_map_index(mld_ctx->ap_ctx->mlo_vdev_quiet_bmap,
+				   idx, 1);
+}
+
+void mlo_ap_vdev_quiet_clear(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_mlo_dev_context *mld_ctx = vdev->mlo_dev_ctx;
+	uint8_t idx;
+
+	if (!mld_ctx || !wlan_vdev_mlme_is_mlo_ap(vdev))
+		return;
+
+	idx = mlo_get_link_vdev_ix(mld_ctx, vdev);
+	if (idx == MLO_INVALID_LINK_IDX)
+		return;
+
+	mlo_debug("Quiet clear for PSOC:%d vdev:%d",
+		  wlan_psoc_get_id(wlan_vdev_get_psoc(vdev)),
+		  wlan_vdev_get_id(vdev));
+
+	wlan_util_change_map_index(mld_ctx->ap_ctx->mlo_vdev_quiet_bmap,
+				   idx, 0);
+}
+
+bool mlo_ap_vdev_quiet_is_any_idx_set(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_mlo_dev_context *mld_ctx = vdev->mlo_dev_ctx;
+
+	if (!mld_ctx || !wlan_vdev_mlme_is_mlo_ap(vdev))
+		return false;
+
+	return wlan_util_map_is_any_index_set(
+			mld_ctx->ap_ctx->mlo_vdev_quiet_bmap,
+			sizeof(mld_ctx->ap_ctx->mlo_vdev_quiet_bmap));
+}