소스 검색

qcacmn: Add API to get primary VDEV from ML peer

Add API to get primary VDEV using primary link peer.

Change-Id: I309070bf33bdae017f174b00ae5eea3d34292a97
CRs-Fixed: 3570511
Shreedhar Parande 1 년 전
부모
커밋
10000aedc1
2개의 변경된 파일62개의 추가작업 그리고 0개의 파일을 삭제
  1. 12 0
      umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h
  2. 50 0
      umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

+ 12 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h

@@ -158,6 +158,18 @@ QDF_STATUS wlan_mlo_peer_is_assoc_done(struct wlan_mlo_peer_context *ml_peer);
 struct wlan_objmgr_peer *wlan_mlo_peer_get_assoc_peer(
 					struct wlan_mlo_peer_context *ml_peer);
 
+/**
+ * wlan_mlo_peer_get_primary_link_vdev() - Get primary link vdev
+ * @ml_peer: MLO peer
+ *
+ * This function iterates through ml_peer to find primary link
+ * and returns VDEV to which primary link is attached.
+ *
+ * Return: Pointer to vdev, if primary link is found else NULL
+ */
+struct wlan_objmgr_vdev *
+wlan_mlo_peer_get_primary_link_vdev(struct wlan_mlo_peer_context *ml_peer);
+
 /**
  * wlan_mlo_peer_get_bridge_peer() - get bridge peer
  * @ml_peer: MLO peer

+ 50 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -321,6 +321,56 @@ struct wlan_objmgr_peer *wlan_mlo_peer_get_bridge_peer(
 
 qdf_export_symbol(wlan_mlo_peer_get_bridge_peer);
 
+struct wlan_objmgr_vdev *
+wlan_mlo_peer_get_primary_link_vdev(struct wlan_mlo_peer_context *ml_peer)
+{
+	struct wlan_mlo_link_peer_entry *peer_entry = NULL;
+	struct wlan_objmgr_peer *link_peer;
+	struct wlan_objmgr_vdev *link_vdev;
+	uint8_t i;
+
+	if (!ml_peer) {
+		mlo_err("ml_peer is null");
+		return NULL;
+	}
+	mlo_peer_lock_acquire(ml_peer);
+
+	if ((ml_peer->mlpeer_state != ML_PEER_CREATED) &&
+	    (ml_peer->mlpeer_state != ML_PEER_ASSOC_DONE)) {
+		mlo_peer_lock_release(ml_peer);
+		mlo_err("ml_peer is not created and association is not done");
+		return NULL;
+	}
+
+	for (i = 0; i < MAX_MLO_LINK_PEERS; i++) {
+		peer_entry = &ml_peer->peer_list[i];
+		link_peer = peer_entry->link_peer;
+		if (!link_peer)
+			continue;
+
+		if (peer_entry->is_primary) {
+			link_vdev = wlan_peer_get_vdev(link_peer);
+			if (!link_vdev) {
+				mlo_peer_lock_release(ml_peer);
+				mlo_err("link vdev not found");
+				return NULL;
+			}
+			if (wlan_objmgr_vdev_try_get_ref(link_vdev, WLAN_MLO_MGR_ID) !=
+					QDF_STATUS_SUCCESS) {
+				mlo_peer_lock_release(ml_peer);
+				mlo_err("taking ref failed");
+				return NULL;
+			}
+			mlo_peer_lock_release(ml_peer);
+			return link_vdev;
+		}
+	}
+	mlo_peer_lock_release(ml_peer);
+	mlo_err("None of the peer is designated as primary");
+
+	return NULL;
+}
+
 bool mlo_peer_is_assoc_peer(struct wlan_mlo_peer_context *ml_peer,
 			    struct wlan_objmgr_peer *peer)
 {