Ver Fonte

qcacmn: Peer id parsing changes for beryllium

Take care of the MLO peer bit indication to be
concatenated with peer_id to access the peer map
object.

Change-Id: Ia603a728101e83829a8906d1b847f42389e78ca6
CRs-Fixed: 3039326
Rakesh Pillai há 4 anos atrás
pai
commit
57e2c01e5e

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

@@ -1037,6 +1037,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	arch_ops->txrx_vdev_attach = dp_vdev_attach_be;
 	arch_ops->txrx_vdev_detach = dp_vdev_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;
 	arch_ops->soc_cfg_attach = dp_soc_cfg_attach_be;
 	arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_be;
 

+ 3 - 3
dp/wifi3.0/be/dp_be_rx.c

@@ -335,13 +335,13 @@ more_data:
 		rx_bufs_reaped[rx_desc->pool_id]++;
 		peer_mdata = mpdu_desc_info.peer_meta_data;
 		QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) =
-			DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
+			dp_rx_peer_metadata_peer_id_get_be(soc, peer_mdata);
 		QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
-			DP_PEER_METADATA_VDEV_ID_GET(peer_mdata);
+			dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata);
 
 		/* to indicate whether this msdu is rx offload */
 		pkt_capture_offload =
-			DP_PEER_METADATA_OFFLOAD_GET(peer_mdata);
+			DP_PEER_METADATA_OFFLOAD_GET_BE(peer_mdata);
 
 		/*
 		 * save msdu flags first, last and continuation msdu in

+ 37 - 0
dp/wifi3.0/be/dp_be_rx.h

@@ -125,6 +125,43 @@ dp_rx_desc_sw_cc_check(struct dp_soc *soc,
 }
 #endif /* DP_FEATURE_HW_COOKIE_CONVERSION && DP_HW_COOKIE_CONVERT_EXCEPTION */
 
+#define DP_PEER_METADATA_OFFLOAD_GET_BE(_peer_metadata)		(0)
+
+#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH
+static inline uint16_t
+dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
+{
+	struct htt_rx_peer_metadata_v1 *metadata =
+			(struct htt_rx_peer_metadata_v1 *)&peer_metadata;
+	uint16_t peer_id;
+
+	peer_id = metadata->peer_id |
+		  (metadata->ml_peer_valid << soc->peer_id_shift);
+
+	return peer_id;
+}
+#else
+/* Combine ml_peer_valid and peer_id field */
+#define DP_BE_PEER_METADATA_PEER_ID_MASK	0x00003fff
+#define DP_BE_PEER_METADATA_PEER_ID_SHIFT	0
+
+static inline uint16_t
+dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
+{
+	return ((peer_metadata & DP_BE_PEER_METADATA_PEER_ID_MASK) >>
+		DP_BE_PEER_METADATA_PEER_ID_SHIFT);
+}
+#endif
+
+static inline uint16_t
+dp_rx_peer_metadata_vdev_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
+{
+	struct htt_rx_peer_metadata_v1 *metadata =
+			(struct htt_rx_peer_metadata_v1 *)&peer_metadata;
+
+	return metadata->vdev_id;
+}
+
 #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
 /**
  * dp_rx_nf_process() - Near Full state handler for RX rings.

+ 38 - 0
dp/wifi3.0/be/dp_be_tx.c

@@ -27,6 +27,32 @@
 
 extern uint8_t sec_type_map[MAX_CDP_SEC_TYPE];
 
+#ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH
+static inline uint16_t dp_tx_comp_get_peer_id(struct dp_soc *soc,
+					      void *tx_comp_hal_desc)
+{
+	uint16_t peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc);
+	struct dp_tx_comp_peer_id *tx_peer_id =
+			(struct dp_tx_comp_peer_id *)&peer_id;
+
+	return (tx_peer_id->peer_id |
+	        (tx_peer_id->ml_peer_valid << soc->peer_id_shift));
+}
+#else
+/* Combine ml_peer_valid and peer_id field */
+#define DP_BE_TX_COMP_PEER_ID_MASK	0x00003fff
+#define DP_BE_TX_COMP_PEER_ID_SHIFT	0
+
+static inline uint16_t dp_tx_comp_get_peer_id(struct dp_soc *soc,
+					      void *tx_comp_hal_desc)
+{
+	uint16_t peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc);
+
+	return ((peer_id & DP_BE_TX_COMP_PEER_ID_MASK) >>
+		DP_BE_TX_COMP_PEER_ID_SHIFT);
+}
+#endif
+
 #ifdef DP_FEATURE_HW_COOKIE_CONVERSION
 #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
 void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc,
@@ -46,6 +72,10 @@ void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc,
 		*r_tx_desc =
 		(struct dp_tx_desc_s *)dp_cc_desc_find(soc, tx_desc_id);
 	}
+
+	if (*r_tx_desc)
+		(*r_tx_desc)->peer_id = dp_tx_comp_get_peer_id(soc,
+							       tx_comp_hal_desc);
 }
 #else
 void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc,
@@ -54,6 +84,10 @@ void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc,
 {
 	*r_tx_desc = (struct dp_tx_desc_s *)
 			hal_tx_comp_get_desc_va(tx_comp_hal_desc);
+
+	if (*r_tx_desc)
+		(*r_tx_desc)->peer_id = dp_tx_comp_get_peer_id(soc,
+							       tx_comp_hal_desc);
 }
 #endif /* DP_HW_COOKIE_CONVERT_EXCEPTION */
 #else
@@ -68,6 +102,10 @@ void dp_tx_comp_get_params_from_hal_desc_be(struct dp_soc *soc,
 	tx_desc_id = hal_tx_comp_get_desc_id(tx_comp_hal_desc);
 	*r_tx_desc =
 	(struct dp_tx_desc_s *)dp_cc_desc_find(soc, tx_desc_id);
+
+	if (*r_tx_desc)
+		(*r_tx_desc)->peer_id = dp_tx_comp_get_peer_id(soc,
+							       tx_comp_hal_desc);
 }
 #endif /* DP_FEATURE_HW_COOKIE_CONVERSION */
 

+ 6 - 0
dp/wifi3.0/be/dp_be_tx.h

@@ -27,6 +27,12 @@
 #include <dp_types.h>
 #include "dp_be.h"
 
+struct __attribute__((__packed__)) dp_tx_comp_peer_id {
+	uint16_t peer_id:13,
+		 ml_peer_valid:1,
+		 reserved:2;
+};
+
 /* Invalid TX Bank ID value */
 #define DP_BE_INVALID_BANK_ID -1
 

+ 14 - 0
dp/wifi3.0/dp_internal.h

@@ -869,6 +869,20 @@ void DP_PRINT_STATS(const char *fmt, ...);
 #define FRAME_MASK_IPV4_EAPOL 4
 #define FRAME_MASK_IPV6_DHCP  8
 
+static inline int dp_log2_ceil(unsigned int value)
+{
+	unsigned int tmp = value;
+	int log2 = -1;
+
+	while (tmp) {
+		log2++;
+		tmp >>= 1;
+	}
+	if (1 << log2 != value)
+		log2++;
+	return log2;
+}
+
 #ifdef QCA_SUPPORT_PEER_ISOLATION
 #define dp_get_peer_isolation(_peer) ((_peer)->isolation)
 

+ 9 - 3
dp/wifi3.0/dp_main.c

@@ -10770,10 +10770,16 @@ static QDF_STATUS dp_peer_map_attach_wifi3(struct cdp_soc_t  *soc_hdl,
 {
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
 
-	soc->max_peers = max_peers;
+	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);
 
-	qdf_print ("%s max_peers %u, max_ast_index: %u\n",
-		   __func__, max_peers, max_ast_index);
+	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))

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

@@ -208,20 +208,6 @@ static QDF_STATUS dp_peer_find_map_attach(struct dp_soc *soc)
 	return QDF_STATUS_SUCCESS; /* success */
 }
 
-static int dp_log2_ceil(unsigned int value)
-{
-	unsigned int tmp = value;
-	int log2 = -1;
-
-	while (tmp) {
-		log2++;
-		tmp >>= 1;
-	}
-	if (1 << log2 != value)
-		log2++;
-	return log2;
-}
-
 #define DP_PEER_HASH_LOAD_MULT  2
 #define DP_PEER_HASH_LOAD_SHIFT 0
 

+ 7 - 20
dp/wifi3.0/dp_rx.h

@@ -43,28 +43,8 @@
 
 #define RX_BUFFER_RESERVATION   0
 
-#define DP_PEER_METADATA_PEER_ID_MASK	0x0000ffff
-#define DP_PEER_METADATA_PEER_ID_SHIFT	0
-#define DP_PEER_METADATA_VDEV_ID_MASK	0x003f0000
-#define DP_PEER_METADATA_VDEV_ID_SHIFT	16
-#define DP_PEER_METADATA_OFFLOAD_MASK	0x01000000
-#define DP_PEER_METADATA_OFFLOAD_SHIFT	24
-
-
 #define DP_DEFAULT_NOISEFLOOR	(-96)
 
-#define DP_PEER_METADATA_PEER_ID_GET(_peer_metadata)		\
-	(((_peer_metadata) & DP_PEER_METADATA_PEER_ID_MASK)	\
-			>> DP_PEER_METADATA_PEER_ID_SHIFT)
-
-#define DP_PEER_METADATA_VDEV_ID_GET(_peer_metadata)		\
-	(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK)	\
-			>> DP_PEER_METADATA_VDEV_ID_SHIFT)
-
-#define DP_PEER_METADATA_OFFLOAD_GET(_peer_metadata)		\
-	(((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK)	\
-			>> DP_PEER_METADATA_OFFLOAD_SHIFT)
-
 #define DP_RX_DESC_MAGIC 0xdec0de
 
 #define dp_rx_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_RX, params)
@@ -2079,6 +2059,13 @@ dp_rx_get_defrag_bm_id(struct dp_soc *soc)
 }
 #endif
 
+static inline uint16_t
+dp_rx_peer_metadata_peer_id_get(struct dp_soc *soc, uint32_t peer_metadata)
+{
+	return soc->arch_ops.dp_rx_peer_metadata_peer_id_get(soc,
+							     peer_metadata);
+}
+
 /**
  * dp_rx_desc_pool_init_generic() - Generic Rx descriptors initialization
  * @soc: SOC handle

+ 2 - 2
dp/wifi3.0/dp_rx_defrag.c

@@ -1711,8 +1711,8 @@ dp_rx_defrag_store_fragment(struct dp_soc *soc,
 	qdf_nbuf_append_ext_list(frag, NULL, 0);
 
 	/* Check if the packet is from a valid peer */
-	peer_id = DP_PEER_METADATA_PEER_ID_GET(
-					mpdu_desc_info->peer_meta_data);
+	peer_id = dp_rx_peer_metadata_peer_id_get(soc,
+					       mpdu_desc_info->peer_meta_data);
 	peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR);
 
 	if (!peer) {

+ 7 - 6
dp/wifi3.0/dp_rx_err.c

@@ -449,8 +449,8 @@ dp_rx_pn_error_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc,
 	struct dp_peer *peer;
 	bool peer_pn_policy = false;
 
-	peer_id = DP_PEER_METADATA_PEER_ID_GET(
-				mpdu_desc_info->peer_meta_data);
+	peer_id = dp_rx_peer_metadata_peer_id_get(soc,
+					       mpdu_desc_info->peer_meta_data);
 
 
 	peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR);
@@ -627,7 +627,8 @@ _dp_rx_bar_frame_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
 	uint16_t peer_id;
 	struct dp_peer *peer;
 
-	peer_id = DP_PEER_METADATA_PEER_ID_GET(mpdu_desc_info->peer_meta_data);
+	peer_id = dp_rx_peer_metadata_peer_id_get(soc,
+					       mpdu_desc_info->peer_meta_data);
 	peer = dp_peer_get_tgt_peer_by_id(soc, peer_id, DP_MOD_ID_RX_ERR);
 	if (!peer)
 		return;
@@ -703,8 +704,8 @@ dp_rx_reo_err_entry_process(struct dp_soc *soc,
 	QDF_STATUS status;
 	bool ret;
 
-	peer_id = DP_PEER_METADATA_PEER_ID_GET(
-					mpdu_desc_info->peer_meta_data);
+	peer_id = dp_rx_peer_metadata_peer_id_get(soc,
+					       mpdu_desc_info->peer_meta_data);
 
 more_msdu_link_desc:
 	hal_rx_msdu_list_get(soc->hal_soc, link_desc_va, &msdu_list,
@@ -777,7 +778,7 @@ more_msdu_link_desc:
 			hal_rx_tlv_populate_mpdu_desc_info(soc->hal_soc,
 							   qdf_nbuf_data(nbuf),
 							   mpdu_desc_info);
-			peer_id = DP_PEER_METADATA_PEER_ID_GET(
+			peer_id = dp_rx_peer_metadata_peer_id_get(soc,
 					mpdu_desc_info->peer_meta_data);
 
 			if (mpdu_desc_info->bar_frame)

+ 0 - 2
dp/wifi3.0/dp_tx.c

@@ -4687,8 +4687,6 @@ more_data:
 			dp_tx_process_htt_completion(soc, tx_desc,
 					htt_tx_status, ring_id);
 		} else {
-			tx_desc->peer_id =
-				hal_tx_comp_get_peer_id(tx_comp_hal_desc);
 			tx_desc->tx_status =
 				hal_tx_comp_get_tx_status(tx_comp_hal_desc);
 			tx_desc->buffer_src = buffer_src;

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

@@ -1660,6 +1660,8 @@ struct dp_arch_ops {
 					       uint32_t dp_budget);
 	void (*tx_implicit_rbm_set)(struct dp_soc *soc, uint8_t tx_ring_id,
 				    uint8_t bm_id);
+	uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc,
+						    uint32_t peer_metadata);
 
 	/* Control Arch Ops */
 	QDF_STATUS (*txrx_set_vdev_param)(struct dp_soc *soc,
@@ -1958,6 +1960,9 @@ struct dp_soc {
 	/* maximum value for peer_id */
 	uint32_t max_peers;
 
+	uint32_t peer_id_shift;
+	uint32_t peer_id_mask;
+
 	/* SoC level data path statistics */
 	struct dp_soc_stats stats;
 #ifdef WLAN_SYSFS_DP_STATS

+ 2 - 0
dp/wifi3.0/li/dp_li.c

@@ -374,6 +374,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 	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;
+	arch_ops->dp_rx_peer_metadata_peer_id_get =
+					dp_rx_peer_metadata_peer_id_get_li;
 	arch_ops->soc_cfg_attach = dp_soc_cfg_attach_li;
 	arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li;
 }

+ 3 - 3
dp/wifi3.0/li/dp_li_rx.c

@@ -340,13 +340,13 @@ more_data:
 		rx_bufs_reaped[rx_desc->pool_id]++;
 		peer_mdata = mpdu_desc_info.peer_meta_data;
 		QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) =
-			DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
+			dp_rx_peer_metadata_peer_id_get_li(soc, peer_mdata);
 		QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
-			DP_PEER_METADATA_VDEV_ID_GET(peer_mdata);
+			DP_PEER_METADATA_VDEV_ID_GET_LI(peer_mdata);
 
 		/* to indicate whether this msdu is rx offload */
 		pkt_capture_offload =
-			DP_PEER_METADATA_OFFLOAD_GET(peer_mdata);
+			DP_PEER_METADATA_OFFLOAD_GET_LI(peer_mdata);
 
 		/*
 		 * save msdu flags first, last and continuation msdu in

+ 22 - 0
dp/wifi3.0/li/dp_li_rx.h

@@ -78,4 +78,26 @@ struct dp_rx_desc *dp_rx_desc_cookie_2_va_li(struct dp_soc *soc,
 {
 	return dp_rx_cookie_2_va_rxdma_buf(soc, cookie);
 }
+
+#define DP_PEER_METADATA_VDEV_ID_MASK	0x003f0000
+#define DP_PEER_METADATA_VDEV_ID_SHIFT	16
+#define DP_PEER_METADATA_OFFLOAD_MASK	0x01000000
+#define DP_PEER_METADATA_OFFLOAD_SHIFT	24
+
+#define DP_PEER_METADATA_VDEV_ID_GET_LI(_peer_metadata)		\
+	(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK)	\
+			>> DP_PEER_METADATA_VDEV_ID_SHIFT)
+
+#define DP_PEER_METADATA_OFFLOAD_GET_LI(_peer_metadata)		\
+	(((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK)	\
+			>> DP_PEER_METADATA_OFFLOAD_SHIFT)
+
+static inline uint16_t
+dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata)
+{
+	struct htt_rx_peer_metadata_v0 *metadata =
+			(struct htt_rx_peer_metadata_v0 *)&peer_metadata;
+
+	return metadata->peer_id;
+}
 #endif

+ 2 - 0
dp/wifi3.0/li/dp_li_tx.c

@@ -51,6 +51,8 @@ void dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc *soc,
 
 		qdf_assert_always(0);
 	}
+
+	(*r_tx_desc)->peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc);
 }
 
 #ifdef QCA_OL_TX_MULTIQ_SUPPORT