浏览代码

qcacmn: Add API get vdevs of peer

Add API to get vdevs per link of MLO peer.

Change-Id: I02aab17424b1f6b98868347291de98f082b267a5
CRs-Fixed: 3560163
Venkateswara Swamy Bandaru 2 年之前
父节点
当前提交
ba8e167b7a
共有 2 个文件被更改,包括 57 次插入0 次删除
  1. 19 0
      umac/mlo_mgr/inc/wlan_mlo_mgr_ap.h
  2. 38 0
      umac/mlo_mgr/src/wlan_mlo_mgr_ap.c

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

@@ -59,6 +59,25 @@ void mlo_ap_get_vdev_list(struct wlan_objmgr_vdev *vdev,
 			  uint16_t *vdev_count,
 			  struct wlan_objmgr_vdev **wlan_vdev_list);
 
+/**
+ * mlo_peer_get_vdev_list() - get mlo peer vdev list
+ * @peer: peer pointer
+ * @vdev_count: vdev count
+ * @wlan_vdev_list: vdev list
+ *
+ * This API gets all partner vdev's which have WLAN_VDEV_FEXT2_MLO bit
+ * set.
+ *
+ * It takes references for all vdev's with bit set in the list. Callers
+ * of this API should properly release references before destroying the
+ * list.
+ *
+ * Return: None
+ */
+void mlo_peer_get_vdev_list(struct wlan_objmgr_peer *peer,
+			    uint16_t *vdev_count,
+			    struct wlan_objmgr_vdev **wlan_vdev_list);
+
 /**
  * mlo_ap_get_active_vdev_list() - get mlo vdev list
  * @vdev: vdev pointer

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

@@ -101,6 +101,44 @@ bool mlo_ap_vdev_attach(struct wlan_objmgr_vdev *vdev,
 }
 #endif
 
+void mlo_peer_get_vdev_list(struct wlan_objmgr_peer *peer,
+			    uint16_t *vdev_count,
+			    struct wlan_objmgr_vdev **wlan_vdev_list)
+{
+	struct wlan_mlo_link_peer_entry *peer_entry;
+	struct wlan_objmgr_peer *link_peer;
+	int i;
+	QDF_STATUS status;
+
+	*vdev_count = 0;
+
+	if (!peer) {
+		mlo_err("Invalid input");
+		return;
+	}
+
+	mlo_peer_lock_acquire(peer->mlo_peer_ctx);
+
+	for (i = 0; i < MAX_MLO_LINK_PEERS; i++) {
+		peer_entry = &peer->mlo_peer_ctx->peer_list[i];
+		link_peer = peer_entry->link_peer;
+		if (!link_peer)
+			continue;
+
+		status = wlan_objmgr_vdev_try_get_ref(
+				wlan_peer_get_vdev(link_peer),
+				WLAN_MLO_MGR_ID);
+		if (QDF_IS_STATUS_ERROR(status))
+			break;
+
+		wlan_vdev_list[*vdev_count] =
+				wlan_peer_get_vdev(link_peer);
+		(*vdev_count) += 1;
+	}
+
+	mlo_peer_lock_release(peer->mlo_peer_ctx);
+}
+
 void mlo_ap_get_vdev_list(struct wlan_objmgr_vdev *vdev,
 			  uint16_t *vdev_count,
 			  struct wlan_objmgr_vdev **wlan_vdev_list)