Преглед изворни кода

qcacmn: Add support of HW Link ID

Add support of HW Link ID in PeerMetaData.
Retrieve the HW Link ID in both Rx per packet
path and RX Error path, store it in nbuf cb.
Use the stored value from nbuf while updating
MLO peer link statistics.

Change-Id: I11596d44fe8557af568fd399d0c0a04d2b887b2a
CRs-Fixed: 3397721
Kenvish Butani пре 2 година
родитељ
комит
4c88b99fe7

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

@@ -2722,6 +2722,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	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->dp_rx_peer_mdata_link_id_get =
+					dp_rx_peer_mdata_link_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;
 	arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_be;

+ 8 - 2
dp/wifi3.0/be/dp_be_rx.c

@@ -565,6 +565,14 @@ done:
 
 		rx_bufs_used++;
 
+		if (txrx_peer->is_mld_peer) {
+			link_id = ((dp_rx_get_msdu_hw_link_id(nbuf)) + 1);
+			if (link_id < 1 || link_id > DP_MAX_MLO_LINKS)
+				link_id = 0;
+		} else {
+			link_id = 0;
+		}
+
 		/* when hlos tid override is enabled, save tid in
 		 * skb->priority
 		 */
@@ -789,7 +797,6 @@ done:
 				if (dp_rx_intrabss_fwd_be(soc, txrx_peer,
 							  rx_tlv_hdr,
 							  nbuf,
-							  msdu_metadata,
 							  link_id)) {
 					nbuf = next;
 					tid_stats->intrabss_cnt++;
@@ -1626,7 +1633,6 @@ dp_rx_intrabss_mcast_handler_be(struct dp_soc *soc,
 
 bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
 			   uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf,
-			   struct hal_rx_msdu_metadata msdu_metadata,
 			   uint8_t link_id)
 {
 	uint8_t tid = qdf_nbuf_get_tid_val(nbuf);

+ 36 - 2
dp/wifi3.0/be/dp_be_rx.h

@@ -47,7 +47,6 @@ struct dp_be_intrabss_params {
  * @ta_txrx_peer: source peer entry
  * @rx_tlv_hdr: start address of rx tlvs
  * @nbuf: nbuf that has to be intrabss forwarded
- * @msdu_metadata: msdu metadata
  * @link_id: link id on which the packet is received
  *
  * Return: true if it is forwarded else false
@@ -56,7 +55,6 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc,
 			   struct dp_txrx_peer *ta_txrx_peer,
 			   uint8_t *rx_tlv_hdr,
 			   qdf_nbuf_t nbuf,
-			   struct hal_rx_msdu_metadata msdu_metadata,
 			   uint8_t link_id);
 #endif
 
@@ -233,6 +231,15 @@ dp_rx_peer_metadata_lmac_id_get_be(uint32_t peer_metadata)
 	return HTT_RX_PEER_META_DATA_V1_LMAC_ID_GET(peer_metadata);
 }
 
+static inline uint8_t
+dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata)
+{
+#ifdef DP_MLO_LINK_STATS_SUPPORT
+	return HTT_RX_PEER_META_DATA_V1A_LOGICAL_LINK_ID_GET(peer_metadata);
+#endif
+	return 0;
+}
+
 #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
 /**
  * dp_rx_nf_process() - Near Full state handler for RX rings.
@@ -630,11 +637,37 @@ dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
 	lmac_id = dp_rx_peer_metadata_lmac_id_get_be(peer_mdata);
 	qdf_nbuf_set_lmac_id(nbuf, lmac_id);
 }
+
+static inline void
+dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
+{
+	uint8_t logical_link_id;
+
+	logical_link_id = dp_rx_peer_mdata_link_id_get_be(peer_mdata);
+	QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf) = logical_link_id;
+}
+
+static inline uint8_t
+dp_rx_get_msdu_hw_link_id(qdf_nbuf_t nbuf)
+{
+	return QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf);
+}
 #else
 static inline void
 dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
 {
 }
+
+static inline void
+dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
+{
+}
+
+static inline uint8_t
+dp_rx_get_msdu_hw_link_id(qdf_nbuf_t nbuf)
+{
+	return QDF_NBUF_CB_RX_HW_LINK_ID(nbuf);
+}
 #endif
 
 #ifndef CONFIG_NBUF_AP_PLATFORM
@@ -687,6 +720,7 @@ static inline uint8_t dp_rx_copy_desc_info_in_nbuf_cb(struct dp_soc *soc,
 	QDF_NBUF_CB_RX_VDEV_ID(nbuf) =
 		dp_rx_peer_metadata_vdev_id_get_be(soc, peer_mdata);
 	dp_rx_set_msdu_lmac_id(nbuf, peer_mdata);
+	dp_rx_set_msdu_hw_link_id(nbuf, peer_mdata);
 
 	/* to indicate whether this msdu is rx offload */
 	pkt_capture_offload =

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

@@ -2472,7 +2472,7 @@ dp_peer_update_rx_pkt_per_lmac(struct dp_txrx_peer *txrx_peer,
 	/* only count stats per lmac for MLO connection*/
 	DP_PEER_PER_PKT_STATS_INCC_PKT(txrx_peer, rx.rx_lmac[lmac_id], 1,
 				       QDF_NBUF_CB_RX_PKT_LEN(nbuf),
-				       txrx_peer->mld_peer, link_id);
+				       txrx_peer->is_mld_peer, link_id);
 }
 #else
 static inline void

+ 6 - 0
dp/wifi3.0/dp_rx.h

@@ -2330,6 +2330,12 @@ dp_rx_peer_metadata_peer_id_get(struct dp_soc *soc, uint32_t peer_metadata)
 							     peer_metadata);
 }
 
+static inline uint8_t
+dp_rx_peer_mdata_link_id_get(struct dp_soc *soc, uint32_t peer_metadata)
+{
+	return soc->arch_ops.dp_rx_peer_mdata_link_id_get(peer_metadata);
+}
+
 /**
  * dp_rx_desc_pool_init_generic() - Generic Rx descriptors initialization
  * @soc: SOC handle

+ 9 - 0
dp/wifi3.0/dp_rx_err.c

@@ -2417,6 +2417,15 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
 			continue;
 		}
 
+		if (txrx_peer && txrx_peer->is_mld_peer) {
+			link_id = ((dp_rx_peer_mdata_link_id_get(
+							soc,
+							peer_meta_data)) + 1);
+			if (link_id < 1 || link_id > DP_MAX_MLO_LINKS)
+				link_id = 0;
+		} else
+			link_id = 0;
+
 		if (wbm_err_info.wbm_err_src == HAL_RX_WBM_ERR_SRC_REO) {
 			if (wbm_err_info.reo_psh_rsn
 					== HAL_RX_WBM_REO_PSH_RSN_ERROR) {

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

@@ -2154,6 +2154,7 @@ enum dp_context_type {
  * @dp_service_near_full_srngs: Handler for servicing the near full IRQ
  * @tx_implicit_rbm_set:
  * @dp_rx_peer_metadata_peer_id_get:
+ * @dp_rx_peer_mdata_link_id_get: Handle to get link id
  * @dp_rx_chain_msdus:
  * @txrx_set_vdev_param: target specific ops while setting vdev params
  * @txrx_get_vdev_mcast_param: target specific ops for getting vdev
@@ -2304,6 +2305,7 @@ struct dp_arch_ops {
 				    uint8_t bm_id);
 	uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc,
 						    uint32_t peer_metadata);
+	uint8_t (*dp_rx_peer_mdata_link_id_get)(uint32_t peer_metadata);
 	bool (*dp_rx_chain_msdus)(struct dp_soc *soc, qdf_nbuf_t nbuf,
 				  uint8_t *rx_tlv_hdr, uint8_t mac_id);
 	/* Control Arch Ops */

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

@@ -657,6 +657,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 	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->dp_rx_peer_mdata_link_id_get =
+					dp_rx_peer_mdata_link_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;
 	arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li;

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

@@ -150,6 +150,12 @@ dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata)
 	return metadata->peer_id;
 }
 
+static inline uint8_t
+dp_rx_peer_mdata_link_id_get_li(uint32_t peer_metadata)
+{
+	return 0;
+}
+
 bool
 dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
 			       qdf_nbuf_t nbuf_copy,

+ 7 - 1
qdf/linux/src/i_qdf_nbuf_m.h

@@ -73,6 +73,7 @@
  * @u.rx.dev.priv_cb_m.lmac_id: lmac id for RX packet
  * @u.rx.dev.priv_cb_m.fr_ds: from DS bit in RX packet
  * @u.rx.dev.priv_cb_m.to_ds: to DS bit in RX packet
+ * @u.rx.dev.priv_cb_m.logical_link_id: link id of RX packet
  * @u.rx.dev.priv_cb_m.reserved1: reserved bits
  * @u.rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number
  * @u.rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number
@@ -215,7 +216,8 @@ struct qdf_nbuf_cb {
 						 lmac_id:2,
 						 fr_ds:1,
 						 to_ds:1,
-						 reserved1:14;
+						 logical_link_id:4,
+						 reserved1:10;
 					uint32_t tcp_seq_num;
 					uint32_t tcp_ack_num;
 					union {
@@ -602,6 +604,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
 	lmac_id)
 
+#define QDF_NBUF_CB_RX_LOGICAL_LINK_ID(skb) \
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
+	logical_link_id)
+
 #define __qdf_nbuf_ipa_owned_get(skb) \
 	QDF_NBUF_CB_TX_IPA_OWNED(skb)
 

+ 6 - 8
qdf/linux/src/i_qdf_nbuf_w.h

@@ -81,9 +81,8 @@
  *
  * @u.rx.hw_info.desc_tlv_members.peer_id: peer id
  * @u.rx.hw_info.desc_tlv_members.ml_peer_valid: is ml peer valid
- * @u.rx.hw_info.desc_tlv_members.logical_link_id: logical link id
  * @u.rx.hw_info.desc_tlv_members.vdev_id: vdev id
- * @u.rx.hw_info.desc_tlv_members.lmac_id: lmac id
+ * @u.rx.hw_info.desc_tlv_members.hw_link_id: link id of RX packet
  * @u.rx.hw_info.desc_tlv_members.chip_id: chip id
  * @u.rx.hw_info.desc_tlv_members.reserved2: reserved
  *
@@ -214,9 +213,8 @@ struct qdf_nbuf_cb {
 					/* 2nd word rx_mpdu_desc_info */
 					uint32_t peer_id:13,
 						 ml_peer_valid:1,
-						 logical_link_id:2,
 						 vdev_id:8,
-						 lmac_id:2,
+						 hw_link_id:4,
 						 chip_id:3,
 						 reserved2:3;
 #ifndef BIG_ENDIAN_HOST
@@ -437,10 +435,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 	(((struct qdf_nbuf_cb *) \
 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.vdev_id)
 
-#define  QDF_NBUF_CB_RX_PACKET_LMAC_ID(skb) \
-	(((struct qdf_nbuf_cb *) \
-	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.lmac_id)
-
 #define QDF_NBUF_CB_RX_PKT_LEN(skb) \
 	(((struct qdf_nbuf_cb *) \
 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.msdu_len)
@@ -634,6 +628,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 		(((struct qdf_nbuf_cb *) \
 		((skb)->cb))->u.rx.flow_idx_timeout)
 
+#define QDF_NBUF_CB_RX_HW_LINK_ID(skb) \
+		(((struct qdf_nbuf_cb *) \
+		((skb)->cb))->u.rx.hw_info.desc_tlv_members.hw_link_id)
+
 #define __qdf_nbuf_set_rx_flow_idx_timeout(skb, val) \
 		((QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT((skb))) = val)