Browse Source

qcacmn: Add flexibility to flush MLO peers only

Add changes to support flushing of MLO peers only.
This is required to support the mode-1 behavior of target
recovery feature, where we delete MLO peers and retain
legacy peers across SOCs which are not crashed.

CRs-Fixed: 3243549
Change-Id: I5ae326bfffd1267768c83fd7f60fa1343ef305fe
Shwetha G K 2 năm trước cách đây
mục cha
commit
690e9eba92
4 tập tin đã thay đổi với 77 bổ sung21 xóa
  1. 6 2
      dp/inc/cdp_txrx_cmn.h
  2. 2 1
      dp/inc/cdp_txrx_ops.h
  3. 58 18
      dp/wifi3.0/dp_main.c
  4. 11 0
      dp/wifi3.0/dp_peer.h

+ 6 - 2
dp/inc/cdp_txrx_cmn.h

@@ -254,7 +254,9 @@ cdp_vdev_detach(ol_txrx_soc_handle soc, uint8_t vdev_id,
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
 static inline void
-cdp_vdev_recovery_flush_peers(ol_txrx_soc_handle soc, uint8_t vdev_id)
+cdp_vdev_recovery_flush_peers(ol_txrx_soc_handle soc,
+			      uint8_t vdev_id,
+			      bool mlo_peers_only)
 {
 	if (!soc || !soc->ops) {
 		dp_cdp_debug("Invalid Instance:");
@@ -266,7 +268,9 @@ cdp_vdev_recovery_flush_peers(ol_txrx_soc_handle soc, uint8_t vdev_id)
 	    !soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers)
 		return;
 
-	soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers(soc, vdev_id);
+	soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers(soc,
+							      vdev_id,
+							      mlo_peers_only);
 }
 #endif
 

+ 2 - 1
dp/inc/cdp_txrx_ops.h

@@ -673,7 +673,8 @@ struct cdp_cmn_ops {
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
 	void (*txrx_recovery_vdev_flush_peers)(struct cdp_soc_t *soc,
-					       uint8_t vdev_id);
+					       uint8_t vdev_id,
+					       bool mlo_peers_only);
 #endif
 };
 

+ 58 - 18
dp/wifi3.0/dp_main.c

@@ -242,7 +242,8 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
 				       uint8_t *peer_mac, uint32_t bitmap,
 				       enum cdp_peer_type peer_type);
 static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
-				bool unmap_only);
+				bool unmap_only,
+				bool mlo_peers_only);
 #ifdef ENABLE_VERBOSE_DEBUG
 bool is_dp_verbose_debug_enabled;
 #endif
@@ -5664,7 +5665,7 @@ static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev)
 	qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
 
 	for (i = 0; i < num_vdevs; i++) {
-		dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0);
+		dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0, 0);
 		dp_vdev_unref_delete(soc, vdev_arr[i], DP_MOD_ID_CDP);
 	}
 }
@@ -7007,6 +7008,22 @@ void dp_peer_delete(struct dp_soc *soc,
 }
 #endif
 
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
+void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
+{
+	if (!peer->valid)
+		return;
+
+	if (IS_MLO_DP_LINK_PEER(peer))
+		dp_peer_delete_wifi3((struct cdp_soc_t *)soc,
+				     peer->vdev->vdev_id,
+				     peer->mac_addr.raw, 0);
+}
+#else
+void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
+{
+}
+#endif
 /**
  * dp_vdev_flush_peers() - Forcibily Flush peers of vdev
  * @vdev: Datapath VDEV handle
@@ -7014,7 +7031,9 @@ void dp_peer_delete(struct dp_soc *soc,
  *
  * Return: void
  */
-static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
+static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
+				bool unmap_only,
+				bool mlo_peers_only)
 {
 	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
 	struct dp_pdev *pdev = vdev->pdev;
@@ -7023,9 +7042,18 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
 	uint32_t i = 0;
 
 
-	if (!unmap_only)
-		dp_vdev_iterate_peer_lock_safe(vdev, dp_peer_delete, NULL,
-					       DP_MOD_ID_CDP);
+	if (!unmap_only) {
+		if (!mlo_peers_only)
+			dp_vdev_iterate_peer_lock_safe(vdev,
+						       dp_peer_delete,
+						       NULL,
+						       DP_MOD_ID_CDP);
+		else
+			dp_vdev_iterate_peer_lock_safe(vdev,
+						       dp_mlo_peer_delete,
+						       NULL,
+						       DP_MOD_ID_CDP);
+	}
 
 	for (i = 0; i < soc->max_peer_id ; i++) {
 		peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP);
@@ -7038,17 +7066,27 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
 			continue;
 		}
 
-		dp_info("peer: "QDF_MAC_ADDR_FMT" is getting unmap",
-			QDF_MAC_ADDR_REF(peer->mac_addr.raw));
+		if (!mlo_peers_only) {
+			dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap",
+				QDF_MAC_ADDR_REF(peer->mac_addr.raw));
+			dp_rx_peer_unmap_handler(soc, i,
+						 vdev->vdev_id,
+						 peer->mac_addr.raw, 0,
+						 DP_PEER_WDS_COUNT_INVALID);
+			SET_PEER_REF_CNT_ONE(peer);
+		} else if (IS_MLO_DP_LINK_PEER(peer) ||
+			   IS_MLO_DP_MLD_PEER(peer)) {
+			dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap",
+				QDF_MAC_ADDR_REF(peer->mac_addr.raw));
+			dp_rx_peer_unmap_handler(soc, i,
+						 vdev->vdev_id,
+						 peer->mac_addr.raw, 0,
+						 DP_PEER_WDS_COUNT_INVALID);
+			SET_PEER_REF_CNT_ONE(peer);
+		}
 
-		dp_rx_peer_unmap_handler(soc, i,
-					 vdev->vdev_id,
-					 peer->mac_addr.raw, 0,
-					 DP_PEER_WDS_COUNT_INVALID);
-		SET_PEER_REF_CNT_ONE(peer);
 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
 	}
-
 }
 
 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
@@ -7154,9 +7192,9 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 	 * unmap commands from Target
 	 */
 	if (!hif_is_target_ready(HIF_GET_SOFTC(soc->hif_handle)))
-		dp_vdev_flush_peers((struct cdp_vdev *)vdev, false);
+		dp_vdev_flush_peers((struct cdp_vdev *)vdev, false, false);
 	else if (hif_get_target_status(soc->hif_handle) == TARGET_STATUS_RESET)
-		dp_vdev_flush_peers((struct cdp_vdev *)vdev, true);
+		dp_vdev_flush_peers((struct cdp_vdev *)vdev, true, false);
 
 	/* indicate that the vdev needs to be deleted */
 	vdev->delete.pending = 1;
@@ -12671,7 +12709,9 @@ dp_check_vdev_tx_delay_stats_enabled(struct cdp_soc_t *soc_hdl,
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
 static void
-dp_recovery_vdev_flush_peers(struct cdp_soc_t *cdp_soc, uint8_t vdev_id)
+dp_recovery_vdev_flush_peers(struct cdp_soc_t *cdp_soc,
+			     uint8_t vdev_id,
+			     bool mlo_peers_only)
 {
 	struct dp_soc *soc = (struct dp_soc *)cdp_soc;
 	struct dp_vdev *vdev;
@@ -12681,7 +12721,7 @@ dp_recovery_vdev_flush_peers(struct cdp_soc_t *cdp_soc, uint8_t vdev_id)
 	if (!vdev)
 		return;
 
-	dp_vdev_flush_peers((struct cdp_vdev *)vdev, false);
+	dp_vdev_flush_peers((struct cdp_vdev *)vdev, false, mlo_peers_only);
 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 #endif

+ 11 - 0
dp/wifi3.0/dp_peer.h

@@ -1169,6 +1169,17 @@ void dp_peer_delete(struct dp_soc *soc,
 		    struct dp_peer *peer,
 		    void *arg);
 
+/**
+ * dp_mlo_peer_delete() - delete MLO DP peer
+ *
+ * @soc: Datapath soc
+ * @peer: Datapath peer
+ * @arg: argument to iter function
+ *
+ * Return: void
+ */
+void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg);
+
 #ifdef WLAN_FEATURE_11BE_MLO
 
 /* is MLO connection mld peer */