Browse Source

qcacmn: Do not flush SLO peers in mode1 recovery

Do not flush SLO peers in mode1 recovery.

Change-Id: Ie2f9d07943a48c21dd786afe0421672b1315f3bb
CRs-Fixed: 3512377
Sai Rupesh Chevuru 2 years ago
parent
commit
0cdd3f48a7
2 changed files with 41 additions and 0 deletions
  1. 40 0
      dp/wifi3.0/dp_main.c
  2. 1 0
      dp/wifi3.0/dp_peer.c

+ 40 - 0
dp/wifi3.0/dp_main.c

@@ -3985,11 +3985,39 @@ void dp_peer_delete(struct dp_soc *soc,
 #endif
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
+static uint8_t
+dp_mlo_get_num_link_peer(struct dp_soc *soc, struct dp_peer *peer)
+{
+	struct dp_peer *mld_peer = NULL;
+	struct dp_mld_link_peers link_peers_info = {0};
+	uint8_t num_link = 0;
+
+	if (IS_MLO_DP_LINK_PEER(peer))
+		mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
+
+	if (IS_MLO_DP_MLD_PEER(peer))
+		mld_peer = peer;
+
+	if (!mld_peer)
+		return 0;
+
+	/* get link peers with reference */
+	dp_get_link_peers_ref_from_mld_peer(soc, mld_peer, &link_peers_info,
+					    DP_MOD_ID_CDP);
+	num_link = link_peers_info.num_links;
+	dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP);
+	return num_link;
+}
+
 void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 {
 	if (!peer->valid)
 		return;
 
+	/* skip deleting the SLO peers */
+	if (dp_mlo_get_num_link_peer(soc, peer) == 1)
+		return;
+
 	if (IS_MLO_DP_LINK_PEER(peer))
 		dp_peer_delete_wifi3((struct cdp_soc_t *)soc,
 				     peer->vdev->vdev_id,
@@ -4033,6 +4061,12 @@ static void dp_mlo_link_peer_flush(struct dp_soc *soc, struct dp_peer *peer)
 	dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP);
 }
 #else
+static uint8_t
+dp_mlo_get_num_link_peer(struct dp_soc *soc, struct dp_peer *peer)
+{
+	return 0;
+}
+
 void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 {
 }
@@ -4097,6 +4131,12 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
 			dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap",
 				QDF_MAC_ADDR_REF(peer->mac_addr.raw));
 
+			/* skip deleting the SLO peers */
+			if (dp_mlo_get_num_link_peer(soc, peer) ==  1) {
+				dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
+				continue;
+			}
+
 			dp_mlo_link_peer_flush(soc, peer);
 			dp_rx_peer_unmap_handler(soc, i,
 						 vdev->vdev_id,

+ 1 - 0
dp/wifi3.0/dp_peer.c

@@ -694,6 +694,7 @@ void dp_peer_find_id_to_obj_remove(struct dp_soc *soc,
 	qdf_spin_lock_bh(&soc->peer_map_lock);
 	peer = soc->peer_id_to_obj_map[peer_id];
 	if (!peer) {
+		dp_err("unable to get peer during peer id obj map remove");
 		qdf_spin_unlock_bh(&soc->peer_map_lock);
 		return;
 	}