Преглед на файлове

qcacmn: Changes to caluclate soc max peer id

Changes to caluclate max peer id in case
of MLO

Change-Id: Ib52cfb4f92eafb88689774e8e6c406751d30372a
Chaithanya Garrepalli преди 3 години
родител
ревизия
97a1c8bff1
променени са 7 файла, в които са добавени 94 реда и са изтрити 37 реда
  1. 42 0
      dp/wifi3.0/be/dp_be.c
  2. 21 21
      dp/wifi3.0/dp_main.c
  3. 4 4
      dp/wifi3.0/dp_peer.c
  4. 2 2
      dp/wifi3.0/dp_peer.h
  5. 1 1
      dp/wifi3.0/dp_rx.c
  6. 7 3
      dp/wifi3.0/dp_types.h
  7. 17 6
      dp/wifi3.0/li/dp_li.c

+ 42 - 0
dp/wifi3.0/be/dp_be.c

@@ -1339,6 +1339,46 @@ QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH
+static inline void
+dp_soc_max_peer_id_set(struct dp_soc *soc)
+{
+	soc->peer_id_shift = dp_log2_ceil(soc->max_peers);
+	soc->peer_id_mask = (1 << soc->peer_id_shift) - 1;
+	/*
+	 * Double the peers since we use ML indication bit
+	 * alongwith peer_id to find peers.
+	 */
+	soc->max_peer_id = 1 << (soc->peer_id_shift + 1);
+}
+#else
+static inline void
+dp_soc_max_peer_id_set(struct dp_soc *soc)
+{
+	soc->max_peer_id =
+		(1 << (HTT_RX_PEER_META_DATA_V1_ML_PEER_VALID_S + 1)) - 1;
+}
+#endif /* DP_USE_REDUCED_PEER_ID_FIELD_WIDTH */
+#else
+static inline void
+dp_soc_max_peer_id_set(struct dp_soc *soc)
+{
+	soc->max_peer_id = soc->max_peers;
+}
+#endif /* WLAN_FEATURE_11BE_MLO */
+
+static void dp_peer_map_detach_be(struct dp_soc *soc)
+{
+}
+
+static QDF_STATUS dp_peer_map_attach_be(struct dp_soc *soc)
+{
+	dp_soc_max_peer_id_set(soc);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 {
 #ifndef QCA_HOST_MODE_WIFI_DISABLED
@@ -1369,6 +1409,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	arch_ops->txrx_pdev_detach = dp_pdev_detach_be;
 	arch_ops->txrx_vdev_attach = dp_vdev_attach_be;
 	arch_ops->txrx_vdev_detach = dp_vdev_detach_be;
+	arch_ops->txrx_peer_map_attach = dp_peer_map_attach_be;
+	arch_ops->txrx_peer_map_detach = dp_peer_map_detach_be;
 	arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be;
 	arch_ops->dp_rx_peer_metadata_peer_id_get =
 					dp_rx_peer_metadata_peer_id_get_be;

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

@@ -5524,9 +5524,8 @@ static void dp_soc_deinit(void *txrx_soc)
 
 	/* free peer tables & AST tables allocated during peer_map_attach */
 	if (soc->peer_map_attach_success) {
-		if (soc->arch_ops.txrx_peer_detach)
-			soc->arch_ops.txrx_peer_detach(soc);
 		dp_peer_find_detach(soc);
+		soc->arch_ops.txrx_peer_map_detach(soc);
 		soc->peer_map_attach_success = FALSE;
 	}
 
@@ -6373,7 +6372,7 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
 		dp_vdev_iterate_peer_lock_safe(vdev, dp_peer_delete, NULL,
 					       DP_MOD_ID_CDP);
 
-	for (i = 0; i < soc->max_peers ; i++) {
+	for (i = 0; i < soc->max_peer_id ; i++) {
 		peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP);
 
 		if (!peer)
@@ -9221,7 +9220,7 @@ static void dp_rx_update_peer_delay_stats(struct dp_soc *soc,
 	struct cdp_peer_ext_stats *pext_stats = NULL;
 
 	peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
-	if (peer_id > soc->max_peers)
+	if (peer_id > soc->max_peer_id)
 		return;
 
 	peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_CDP);
@@ -11280,34 +11279,35 @@ static QDF_STATUS dp_peer_map_attach_wifi3(struct cdp_soc_t  *soc_hdl,
 					   uint8_t peer_map_unmap_versions)
 {
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
+	QDF_STATUS status;
 
-	soc->peer_id_shift = dp_log2_ceil(max_peers);
-	soc->peer_id_mask = (1 << soc->peer_id_shift) - 1;
-	/*
-	 * Double the peers since we use ML indication bit
-	 * alongwith peer_id to find peers.
-	 */
-	soc->max_peers = 1 << (soc->peer_id_shift + 1);
+	soc->max_peers = max_peers;
 
-	dp_info("max_peers %u, calculated max_peers %u max_ast_index: %u\n",
-		max_peers, soc->max_peers, max_ast_index);
 	wlan_cfg_set_max_ast_idx(soc->wlan_cfg_ctx, max_ast_index);
 
-	if (dp_peer_find_attach(soc))
+	status = soc->arch_ops.txrx_peer_map_attach(soc);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		dp_err("failure in allocating peer tables");
 		return QDF_STATUS_E_FAILURE;
+	}
 
-	if (soc->arch_ops.txrx_peer_attach) {
-		QDF_STATUS status;
-		status = soc->arch_ops.txrx_peer_attach(soc);
-		if (!QDF_IS_STATUS_SUCCESS(status)) {
-			dp_peer_find_detach(soc);
-			return QDF_STATUS_E_FAILURE;
-		}
+	dp_info("max_peers %u, calculated max_peers %u max_ast_index: %u\n",
+		max_peers, soc->max_peer_id, max_ast_index);
+
+	status = dp_peer_find_attach(soc);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		dp_err("Peer find attach failure");
+		goto fail;
 	}
+
 	soc->peer_map_unmap_versions = peer_map_unmap_versions;
 	soc->peer_map_attach_success = TRUE;
 
 	return QDF_STATUS_SUCCESS;
+fail:
+	soc->arch_ops.txrx_peer_map_detach(soc);
+
+	return status;
 }
 
 static QDF_STATUS dp_soc_set_param(struct cdp_soc_t  *soc_hdl,

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

@@ -186,7 +186,7 @@ static QDF_STATUS dp_peer_find_map_attach(struct dp_soc *soc)
 {
 	uint32_t max_peers, peer_map_size;
 
-	max_peers = soc->max_peers;
+	max_peers = soc->max_peer_id;
 	/* allocate the peer ID -> peer object map */
 	dp_peer_info("\n%pK:<=== cfg max peer id %d ====>", soc, max_peers);
 	peer_map_size = max_peers * sizeof(soc->peer_id_to_obj_map[0]);
@@ -714,7 +714,7 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
 				struct dp_peer *peer,
 				uint16_t peer_id)
 {
-	QDF_ASSERT(peer_id <= soc->max_peers);
+	QDF_ASSERT(peer_id <= soc->max_peer_id);
 
 	qdf_spin_lock_bh(&soc->peer_map_lock);
 
@@ -747,7 +747,7 @@ void dp_peer_find_id_to_obj_remove(struct dp_soc *soc,
 				   uint16_t peer_id)
 {
 	struct dp_peer *peer = NULL;
-	QDF_ASSERT(peer_id <= soc->max_peers);
+	QDF_ASSERT(peer_id <= soc->max_peer_id);
 
 	qdf_spin_lock_bh(&soc->peer_map_lock);
 	peer = soc->peer_id_to_obj_map[peer_id];
@@ -2460,7 +2460,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
 {
 	struct dp_peer *peer;
 
-	QDF_ASSERT(peer_id <= soc->max_peers);
+	QDF_ASSERT(peer_id <= soc->max_peer_id);
 	/* check if there's already a peer object with this MAC address */
 	peer = dp_peer_find_hash_find(soc, peer_mac_addr,
 		0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG);

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

@@ -114,7 +114,7 @@ __dp_peer_get_ref_by_id(struct dp_soc *soc,
 	struct dp_peer *peer;
 
 	qdf_spin_lock_bh(&soc->peer_map_lock);
-	peer = (peer_id >= soc->max_peers) ? NULL :
+	peer = (peer_id >= soc->max_peer_id) ? NULL :
 				soc->peer_id_to_obj_map[peer_id];
 	if (!peer ||
 	    (dp_peer_get_ref(soc, peer, mod_id) != QDF_STATUS_SUCCESS)) {
@@ -144,7 +144,7 @@ struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc,
 	struct dp_peer *peer;
 
 	qdf_spin_lock_bh(&soc->peer_map_lock);
-	peer = (peer_id >= soc->max_peers) ? NULL :
+	peer = (peer_id >= soc->max_peer_id) ? NULL :
 				soc->peer_id_to_obj_map[peer_id];
 
 	if (!peer || peer->peer_state >= DP_PEER_STATE_LOGICAL_DELETE ||

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

@@ -1866,7 +1866,7 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
 				FRAME_MASK_IPV4_EAPOL | FRAME_MASK_IPV6_DHCP;
 
 	peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
-	if (peer_id > soc->max_peers)
+	if (peer_id > soc->max_peer_id)
 		goto deliver_fail;
 
 	vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);

+ 7 - 3
dp/wifi3.0/dp_types.h

@@ -1649,8 +1649,8 @@ struct dp_arch_ops {
 				       struct dp_vdev *vdev);
 	QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc,
 				       struct dp_vdev *vdev);
-	QDF_STATUS (*txrx_peer_attach)(struct dp_soc *soc);
-	void (*txrx_peer_detach)(struct dp_soc *soc);
+	QDF_STATUS (*txrx_peer_map_attach)(struct dp_soc *soc);
+	void (*txrx_peer_map_detach)(struct dp_soc *soc);
 	QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc);
 	void (*soc_cfg_attach)(struct dp_soc *soc);
 	void (*peer_get_reo_hash)(struct dp_vdev *vdev,
@@ -2007,11 +2007,15 @@ struct dp_soc {
 	/* Protect peer_id_to_objmap */
 	DP_MUTEX_TYPE peer_map_lock;
 
-	/* maximum value for peer_id */
+	/* maximum number of suppoerted peers */
 	uint32_t max_peers;
+	/* maximum value for peer_id */
+	uint32_t max_peer_id;
 
+#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH
 	uint32_t peer_id_shift;
 	uint32_t peer_id_mask;
+#endif
 
 	/* SoC level data path statistics */
 	struct dp_soc_stats stats;

+ 17 - 6
dp/wifi3.0/li/dp_li.c

@@ -108,7 +108,7 @@ static QDF_STATUS dp_vdev_detach_li(struct dp_soc *soc, struct dp_vdev *vdev)
 }
 
 #ifdef AST_OFFLOAD_ENABLE
-static void dp_peer_detach_li(struct dp_soc *soc)
+static void dp_peer_map_detach_li(struct dp_soc *soc)
 {
 	dp_soc_wds_detach(soc);
 	dp_peer_ast_table_detach(soc);
@@ -116,10 +116,12 @@ static void dp_peer_detach_li(struct dp_soc *soc)
 	dp_peer_mec_hash_detach(soc);
 }
 
-static QDF_STATUS dp_peer_attach_li(struct dp_soc *soc)
+static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc)
 {
 	QDF_STATUS status;
 
+	soc->max_peer_id = soc->max_peers;
+
 	status = dp_peer_ast_table_attach(soc);
 	if (!QDF_IS_STATUS_SUCCESS(status))
 		return status;
@@ -143,6 +145,17 @@ ast_table_detach:
 
 	return status;
 }
+#else
+static void dp_peer_map_detach_li(struct dp_soc *soc)
+{
+}
+
+static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc)
+{
+	soc->max_peer_id = soc->max_peers;
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 qdf_size_t dp_get_soc_context_size_li(void)
@@ -399,10 +412,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 	arch_ops->txrx_pdev_detach = dp_pdev_detach_li;
 	arch_ops->txrx_vdev_attach = dp_vdev_attach_li;
 	arch_ops->txrx_vdev_detach = dp_vdev_detach_li;
-#ifdef AST_OFFLOAD_ENABLE
-	arch_ops->txrx_peer_attach = dp_peer_attach_li;
-	arch_ops->txrx_peer_detach = dp_peer_detach_li;
-#endif
+	arch_ops->txrx_peer_map_attach = dp_peer_map_attach_li;
+	arch_ops->txrx_peer_map_detach = dp_peer_map_detach_li;
 	arch_ops->dp_rx_desc_cookie_2_va =
 			dp_rx_desc_cookie_2_va_li;
 	arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li;