ソースを参照

qcacmn: Handle mlo case for ppe ds peer setup

Handle mlo case for ppe ds peer setup by
making sure the src_info is always extracted from
primary vdev.

Change-Id: Ie4b0d8f475966e8c4264cea5cf32f0dc95e76c4a
CRs-Fixed: 3346074
Pavankumar Nandeshwar 2 年 前
コミット
1f137636fa
2 ファイル変更86 行追加20 行削除
  1. 85 20
      dp/wifi3.0/be/dp_be.c
  2. 1 0
      dp/wifi3.0/dp_types.h

+ 85 - 20
dp/wifi3.0/be/dp_be.c

@@ -121,7 +121,8 @@ qdf_size_t dp_get_context_size_be(enum dp_context_type context_type)
 #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
 /**
  * dp_cc_wbm_sw_en_cfg() - configure HW cookie conversion enablement
-			   per wbm2sw ring
+ *			   per wbm2sw ring
+ *
  * @cc_cfg: HAL HW cookie conversion configuration structure pointer
  *
  * Return: None
@@ -185,7 +186,8 @@ static QDF_STATUS dp_fisa_fst_cmem_addr_init(struct dp_soc *soc)
 
 /**
  * dp_cc_reg_cfg_init() - initialize and configure HW cookie
-			  conversion register
+ *			  conversion register
+ *
  * @soc: SOC handle
  * @is_4k_align: page address 4k aligned
  *
@@ -238,9 +240,9 @@ static inline void dp_hw_cc_cmem_write(hal_soc_handle_t hal_soc_hdl,
 
 /**
  * dp_hw_cc_cmem_addr_init() - Check and initialize CMEM base address for
-			       HW cookie conversion
+ *			       HW cookie conversion
+ *
  * @soc: SOC handle
- * @cc_ctx: cookie conversion context pointer
  *
  * Return: 0 in case of success, else error value
  */
@@ -506,15 +508,13 @@ static QDF_STATUS dp_soc_ppe_detach_be(struct dp_soc *soc)
 	return QDF_STATUS_SUCCESS;
 }
 
-static QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc,
-				       struct dp_peer_be *be_peer,
-				       struct dp_vdev_be *be_vdev)
+static QDF_STATUS dp_peer_ppeds_default_route_be(struct dp_soc *soc,
+						 struct dp_peer_be *be_peer,
+						 uint8_t vdev_id,
+						 uint16_t src_info)
 {
 	uint16_t service_code;
 	uint8_t priority_valid;
-	struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile;
-	uint16_t src_info = ppe_vp_profile->vp_num;
-	uint8_t vdev_id = be_vdev->vdev.vdev_id;
 	uint8_t use_ppe = PEER_ROUTING_USE_PPE;
 	uint8_t peer_routing_enabled = PEER_ROUTING_ENABLED;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -543,6 +543,78 @@ static QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc,
 
 	return QDF_STATUS_SUCCESS;
 }
+
+static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
+					 struct dp_peer *peer,
+					 struct dp_vdev_be *be_vdev)
+{
+	struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile;
+	uint16_t src_info = ppe_vp_profile->vp_num;
+	uint8_t vdev_id = be_vdev->vdev.vdev_id;
+	struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer);
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
+
+	if (!be_peer) {
+		qdf_err("BE peer is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (IS_DP_LEGACY_PEER(peer)) {
+		qdf_status = dp_peer_ppeds_default_route_be(soc, be_peer,
+							    vdev_id, src_info);
+	} else if (IS_MLO_DP_MLD_PEER(peer)) {
+		int i;
+		struct dp_peer *link_peer = NULL;
+		struct dp_mld_link_peers link_peers_info;
+
+		/* get link peers with reference */
+		dp_get_link_peers_ref_from_mld_peer(soc, peer, &link_peers_info,
+						    DP_MOD_ID_DS);
+
+		for (i = 0; i < link_peers_info.num_links; i++) {
+			link_peer = link_peers_info.link_peers[i];
+			be_peer = dp_get_be_peer_from_dp_peer(link_peer);
+			if (!be_peer) {
+				qdf_err("BE peer is null for peer id %d ",
+							link_peer->peer_id);
+				continue;
+			}
+
+			be_vdev = dp_get_be_vdev_from_dp_vdev(link_peer->vdev);
+			if (!be_vdev) {
+				qdf_err("BE vap is null for peer id %d ",
+							link_peer->peer_id);
+				continue;
+			}
+
+			vdev_id = be_vdev->vdev.vdev_id;
+			qdf_status = dp_peer_ppeds_default_route_be(soc,
+								    be_peer,
+								    vdev_id,
+								    src_info);
+		}
+
+		dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_DS);
+	} else {
+		struct dp_peer *mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
+
+		if (!mld_peer)
+			return qdf_status;
+
+		be_vdev = dp_get_be_vdev_from_dp_vdev(mld_peer->vdev);
+		if (!be_vdev) {
+			qdf_err("BE vap is null");
+			return QDF_STATUS_E_NULL_VALUE;
+		}
+
+		ppe_vp_profile = &be_vdev->ppe_vp_profile;
+		src_info = ppe_vp_profile->vp_num;
+		qdf_status = dp_peer_ppeds_default_route_be(soc, be_peer,
+							    vdev_id, src_info);
+	}
+
+	return qdf_status;
+}
 #else
 static QDF_STATUS dp_ppeds_init_soc_be(struct dp_soc *soc)
 {
@@ -565,9 +637,8 @@ static inline QDF_STATUS dp_soc_ppe_detach_be(struct dp_soc *soc)
 }
 
 static inline
-QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc,
-				struct dp_peer_be *be_peer,
-				struct dp_vdev_be *be_vdev)
+QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc, struct dp_peer *peer,
+				  struct dp_vdev_be *be_vdev)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -878,15 +949,9 @@ static QDF_STATUS dp_vdev_detach_be(struct dp_soc *soc, struct dp_vdev *vdev)
 #ifdef WLAN_SUPPORT_PPEDS
 static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer)
 {
-	struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer);
 	struct dp_vdev_be *be_vdev;
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 
-	if (!be_peer) {
-		qdf_err("BE peer is null");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
 	be_vdev = dp_get_be_vdev_from_dp_vdev(peer->vdev);
 	if (!be_vdev) {
 		qdf_err("BE vap is null");
@@ -897,7 +962,7 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer)
 	 * Check if PPE routing is enabled on the associated vap.
 	 */
 	if (be_vdev->ppe_vp_enabled == PPE_VP_USER_TYPE_DS)
-		qdf_status = dp_peer_setup_ppe_be(soc, be_peer, be_vdev);
+		qdf_status = dp_peer_setup_ppeds_be(soc, peer, be_vdev);
 
 	return qdf_status;
 }

+ 1 - 0
dp/wifi3.0/dp_types.h

@@ -263,6 +263,7 @@ enum dp_mod_id {
 	DP_MOD_ID_SCS,
 	DP_MOD_ID_UMAC_RESET,
 	DP_MOD_ID_TX_MCAST,
+	DP_MOD_ID_DS,
 	DP_MOD_ID_MAX,
 };