Explorar o código

qcacmn: optimization changes to improve RX KPI for WIN

done the following changes to improve the RX path KPI
	1. remove the extra invalidate in RX path as
	we no longer dirty the RX TLV cache lines.
	we now store the rx error codes in nbuf cb instead
	of RX TLVs reserved memory bytes.

	2. with features like flow tag and wds extended mode
	enabled by default, the rx_fast_flag is always set
       	to false, this resulted	in lot more instructions
       	being executed in RX path.
	Now we ensured this flag is at least set for other
	features which are not enabled by default.

Change-Id: I04c6bdc52a2b3f1248b822a108d8bd1a70abcc7c
CRs-Fixed: 3406505
Tallapragada Kalyan %!s(int64=2) %!d(string=hai) anos
pai
achega
e4798ea69b

+ 13 - 16
dp/wifi3.0/be/dp_be_rx.c

@@ -759,15 +759,6 @@ done:
 			dp_rx_update_flow_tag(soc, vdev, nbuf, rx_tlv_hdr,
 					      true);
 
-			if (qdf_likely(vdev->rx_decap_type ==
-				       htt_cmn_pkt_type_ethernet) &&
-			    qdf_likely(!vdev->mesh_vdev)) {
-				dp_rx_wds_learn(soc, vdev,
-						rx_tlv_hdr,
-						txrx_peer,
-						nbuf);
-			}
-
 			if (qdf_unlikely(vdev->mesh_vdev)) {
 				if (dp_rx_filter_mesh_packets(vdev, nbuf,
 							      rx_tlv_hdr)
@@ -787,6 +778,15 @@ done:
 			}
 		}
 
+		if (qdf_likely(vdev->rx_decap_type ==
+			       htt_cmn_pkt_type_ethernet) &&
+		    qdf_likely(!vdev->mesh_vdev)) {
+			dp_rx_wds_learn(soc, vdev,
+					rx_tlv_hdr,
+					txrx_peer,
+					nbuf);
+		}
+
 		dp_rx_msdu_stats_update(soc, nbuf, rx_tlv_hdr, txrx_peer,
 					reo_ring_num, tid_stats, link_id);
 
@@ -1905,12 +1905,9 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc,
 		 * info when we do the actual nbuf processing
 		 */
 		wbm_err_info.pool_id = rx_desc->pool_id;
-		hal_rx_priv_info_set_in_tlv(soc->hal_soc,
-					    qdf_nbuf_data(nbuf),
-					    (uint8_t *)&wbm_err_info,
-					    sizeof(wbm_err_info));
 
-		dp_rx_err_tlv_invalidate(soc, nbuf);
+		dp_rx_set_err_info(soc, nbuf, wbm_err_info);
+
 		rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++;
 
 		if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) {
@@ -1967,12 +1964,12 @@ done:
 
 			rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id];
 
-			dp_rx_buffers_replenish(replenish_soc, mac_id,
+			dp_rx_buffers_replenish_simple(replenish_soc, mac_id,
 						dp_rxdma_srng,
 						rx_desc_pool,
 						rx_bufs_reaped[chip_id][mac_id],
 						&head[chip_id][mac_id],
-						&tail[chip_id][mac_id], false);
+						&tail[chip_id][mac_id]);
 			*rx_bufs_used += rx_bufs_reaped[chip_id][mac_id];
 		}
 	}

+ 1 - 12
dp/wifi3.0/dp_main.c

@@ -1329,13 +1329,8 @@ void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev)
 	struct dp_vdev *vdev = NULL;
 	uint8_t rx_fast_flag = true;
 
-	if (wlan_cfg_is_rx_flow_tag_enabled(soc->wlan_cfg_ctx)) {
-		rx_fast_flag = false;
-		goto update_flag;
-	}
-
 	/* Check if protocol tagging enable */
-	if (pdev->is_rx_protocol_tagging_enabled) {
+	if (pdev->is_rx_protocol_tagging_enabled && !pdev->enhanced_stats_en) {
 		rx_fast_flag = false;
 		goto update_flag;
 	}
@@ -1359,12 +1354,6 @@ void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev)
 			rx_fast_flag = false;
 			break;
 		}
-
-		/* Check if any VDEV has WDS ext enabled */
-		if (dp_vdev_is_wds_ext_enabled(vdev)) {
-			rx_fast_flag = false;
-			break;
-		}
 	}
 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
 

+ 38 - 14
dp/wifi3.0/dp_rx.h

@@ -2505,6 +2505,20 @@ void dp_audio_smmu_unmap(qdf_device_t qdf_dev, qdf_dma_addr_t iova,
 #endif
 
 #if defined(QCA_DP_RX_NBUF_NO_MAP_UNMAP) && !defined(BUILD_X86)
+static inline
+void dp_rx_set_err_info(struct dp_soc *soc, qdf_nbuf_t nbuf,
+			struct hal_wbm_err_desc_info wbm_err_info)
+{
+	QDF_NBUF_CB_RX_ERR_CODES(nbuf) = *((uint32_t *)&wbm_err_info);
+}
+
+static inline
+struct hal_wbm_err_desc_info dp_rx_get_err_info(struct dp_soc *soc,
+						qdf_nbuf_t nbuf)
+{
+	return *(struct hal_wbm_err_desc_info *)&QDF_NBUF_CB_RX_ERR_CODES(nbuf);
+}
+
 static inline
 QDF_STATUS dp_pdev_rx_buffers_attach_simple(struct dp_soc *soc, uint32_t mac_id,
 					    struct dp_srng *rxdma_srng,
@@ -2577,22 +2591,9 @@ qdf_dma_addr_t dp_rx_nbuf_sync_no_dsb(struct dp_soc *dp_soc,
 	if (unlikely(!nbuf->fast_recycled)) {
 		qdf_nbuf_dma_inv_range_no_dsb((void *)nbuf->data,
 					      (void *)(nbuf->data + buf_size));
-	} else {
-		/*
-		 * In case of fast_recycled is set we can avoid invalidating
-		 * the complete buffer as it would have been invalidated
-		 * by tx driver before giving to recycler.
-		 *
-		 * But we need to still invalidate rx_pkt_tlv_size as this
-		 * area will not be invalidated in TX path
-		 */
-		DP_STATS_INC(dp_soc, rx.fast_recycled, 1);
-		qdf_nbuf_dma_inv_range_no_dsb((void *)nbuf->data,
-					      (void *)(nbuf->data +
-						       dp_soc->rx_pkt_tlv_size +
-						       L3_HEADER_PAD));
 	}
 
+	DP_STATS_INC(dp_soc, rx.fast_recycled, 1);
 	nbuf->fast_recycled = 0;
 
 	return (qdf_dma_addr_t)qdf_mem_virt_to_phys(nbuf->data);
@@ -2672,6 +2673,29 @@ void  dp_rx_nbuf_free(qdf_nbuf_t nbuf)
 	qdf_nbuf_free_simple(nbuf);
 }
 #else
+static inline
+void dp_rx_set_err_info(struct dp_soc *soc, qdf_nbuf_t nbuf,
+			struct hal_wbm_err_desc_info wbm_err_info)
+{
+	hal_rx_priv_info_set_in_tlv(soc->hal_soc,
+				    qdf_nbuf_data(nbuf),
+				    (uint8_t *)&wbm_err_info,
+				    sizeof(wbm_err_info));
+}
+
+static inline
+struct hal_wbm_err_desc_info dp_rx_get_err_info(struct dp_soc *soc,
+						qdf_nbuf_t nbuf)
+{
+	struct hal_wbm_err_desc_info wbm_err_info = { 0 };
+
+	hal_rx_priv_info_get_from_tlv(soc->hal_soc, qdf_nbuf_data(nbuf),
+				      (uint8_t *)&wbm_err_info,
+				      sizeof(struct hal_wbm_err_desc_info));
+
+	return wbm_err_info;
+}
+
 static inline
 QDF_STATUS dp_pdev_rx_buffers_attach_simple(struct dp_soc *soc, uint32_t mac_id,
 					    struct dp_srng *rxdma_srng,

+ 1 - 4
dp/wifi3.0/dp_rx_err.c

@@ -2372,10 +2372,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
 		 * retrieve the wbm desc info from nbuf TLV, so we can
 		 * handle error cases appropriately
 		 */
-		hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_tlv_hdr,
-					      (uint8_t *)&wbm_err_info,
-					      sizeof(wbm_err_info));
-
+		wbm_err_info = dp_rx_get_err_info(soc, nbuf);
 		peer_meta_data = hal_rx_tlv_peer_meta_data_get(soc->hal_soc,
 							       rx_tlv_hdr);
 		peer_id = dp_rx_peer_metadata_peer_id_get(soc, peer_meta_data);

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

@@ -1244,12 +1244,8 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc,
 		 * info when we do the actual nbuf processing
 		 */
 		wbm_err_info.pool_id = rx_desc->pool_id;
-		hal_rx_priv_info_set_in_tlv(soc->hal_soc,
-					    qdf_nbuf_data(nbuf),
-					    (uint8_t *)&wbm_err_info,
-					    sizeof(wbm_err_info));
+		dp_rx_set_err_info(soc, nbuf, wbm_err_info);
 
-		dp_rx_err_tlv_invalidate(soc, nbuf);
 		rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++;
 
 		if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) {
@@ -1306,12 +1302,12 @@ done:
 
 			rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id];
 
-			dp_rx_buffers_replenish(replenish_soc, mac_id,
+			dp_rx_buffers_replenish_simple(replenish_soc, mac_id,
 						dp_rxdma_srng,
 						rx_desc_pool,
 						rx_bufs_reaped[chip_id][mac_id],
 						&head[chip_id][mac_id],
-						&tail[chip_id][mac_id], false);
+						&tail[chip_id][mac_id]);
 			*rx_bufs_used += rx_bufs_reaped[chip_id][mac_id];
 		}
 	}

+ 4 - 0
qdf/linux/src/i_qdf_nbuf_w.h

@@ -411,6 +411,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 	(((struct qdf_nbuf_cb *) \
 	  ((skb)->cb))->u.rx.hw_info.desc_info.msdu_desc_info)
 
+#define QDF_NBUF_CB_RX_ERR_CODES(skb) \
+	(((struct qdf_nbuf_cb *) \
+	  ((skb)->cb))->u.rx.hw_info.desc_info.rx_error_codes)
+
 #define QDF_NBUF_CB_RX_MPDU_DESC_INFO(skb) \
 	(((struct qdf_nbuf_cb *) \
 	  ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info)