Browse Source

qcacld-3.0: Debug same FISA flow frames ring mismatch issue

If same FISA flow frames goes into different REO2SW rings, this will
introduce unexpected FISA behavior result in different issue.
Add assert for DEF build to catch this issue early then easy to
debug further, for PERF build, stop FISA aggregation if REO2SW ring
mismatch happened.

Change-Id: I5320133a9b289fe63a727ac2a5cf4c7c19c19224
CRs-Fixed: 2785871
Jinwei Chen 4 years ago
parent
commit
6e2754da8a
1 changed files with 23 additions and 4 deletions
  1. 23 4
      core/dp/txrx3.0/dp_fisa_rx.c

+ 23 - 4
core/dp/txrx3.0/dp_fisa_rx.c

@@ -25,6 +25,9 @@
 
 static void dp_rx_fisa_flush_flow_wrap(struct dp_fisa_rx_sw_ft *sw_ft);
 
+/** REO will push frame into REO2FW RING */
+#define REO_DESTINATION_FW 6
+
 #if defined(FISA_DEBUG_ENABLE)
 /**
  * hex_dump_skb_data() - Helper function to dump skb while debugging
@@ -899,6 +902,7 @@ dp_rx_get_fisa_flow(struct dp_rx_fst *fisa_hdl, struct dp_vdev *vdev,
 {
 	uint8_t *rx_tlv_hdr;
 	uint32_t flow_idx;
+	uint32_t reo_destination_indication;
 	bool flow_invalid, flow_timeout, flow_idx_valid;
 	struct dp_fisa_rx_sw_ft *sw_ft_entry = NULL;
 	hal_soc_handle_t hal_soc_hdl = fisa_hdl->soc_hdl->hal_soc;
@@ -907,6 +911,20 @@ dp_rx_get_fisa_flow(struct dp_rx_fst *fisa_hdl, struct dp_vdev *vdev,
 		return sw_ft_entry;
 
 	rx_tlv_hdr = qdf_nbuf_data(nbuf);
+	/*
+	 * Get reo_destination_indication from RX_PKT_TLV-->msdu_end,
+	 * if reo_destination_indication == 6, it means this frame is
+	 * reinjected by FW offload module, these frames should not go to FISA
+	 * since REO2SW1 will be selected by FW offload module. If same flow
+	 * frames hash select other REO2SW rings, same flow UDP frames will go
+	 * to different REO2SW ring.
+	 */
+	hal_rx_msdu_get_reo_destination_indication(hal_soc_hdl, rx_tlv_hdr,
+						   &reo_destination_indication);
+
+	if (qdf_unlikely(reo_destination_indication == REO_DESTINATION_FW))
+		return sw_ft_entry;
+
 	hal_rx_msdu_get_flow_params(hal_soc_hdl, rx_tlv_hdr, &flow_invalid,
 				    &flow_timeout, &flow_idx);
 
@@ -1094,7 +1112,7 @@ dp_rx_fisa_aggr_udp(struct dp_rx_fst *fisa_hdl,
 		 * This is 3rd skb for flow.
 		 * After head skb, 2nd skb in fraglist
 		 */
-		if (fisa_flow->last_skb) {
+		if (qdf_likely(fisa_flow->last_skb)) {
 			qdf_nbuf_set_next(fisa_flow->last_skb, nbuf);
 		} else {
 			qdf_nbuf_free(nbuf);
@@ -1443,8 +1461,11 @@ static int dp_add_nbuf_to_fisa_flow(struct dp_rx_fst *fisa_hdl,
 	/* Packets of the flow are arriving on a different REO than
 	 * the one configured.
 	 */
-	if (fisa_flow->napi_id != napi_id)
+	if (qdf_unlikely(fisa_flow->napi_id != napi_id)) {
+		QDF_BUG(0);
 		DP_STATS_INC(fisa_hdl, reo_mismatch, 1);
+		return FISA_AGGR_NOT_ELIGIBLE;
+	}
 
 	hal_cumulative_ip_len = hal_rx_get_fisa_cumulative_ip_length(
 								hal_soc_hdl,
@@ -1716,8 +1737,6 @@ QDF_STATUS dp_fisa_rx(struct dp_soc *soc, struct dp_vdev *vdev,
 						    head_nbuf, fisa_flow);
 		if (fisa_ret == FISA_AGGR_DONE)
 			goto next_msdu;
-		else
-			qdf_assert(0);
 
 pull_nbuf:
 		nbuf_skip_rx_pkt_tlv(dp_fisa_rx_hdl->soc_hdl->hal_soc,