瀏覽代碼

qcacmn: Free the raw mode mpdus in REO error ring

Raw mode mpdus in REO end up resulting in NULL_QUEUE_DESCRIPTOR error.
Raw mode mpdus are not expected in REO, free them without further
processing.

Change-Id: Ica920caecf90a1107ce17836051e1019c9dfc994
CRs-Fixed: 3282836
Prakash Manjunathappa 2 年之前
父節點
當前提交
60c0c089cd
共有 6 個文件被更改,包括 52 次插入8 次删除
  1. 1 0
      dp/inc/cdp_txrx_stats_struct.h
  2. 0 6
      dp/wifi3.0/dp_rx.c
  3. 11 0
      dp/wifi3.0/dp_rx_err.c
  4. 7 0
      dp/wifi3.0/dp_stats.c
  5. 2 0
      dp/wifi3.0/dp_types.h
  6. 31 2
      hal/wifi3.0/kiwi/hal_kiwi.c

+ 1 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -2650,6 +2650,7 @@ struct cdp_soc_stats {
 			uint32_t rx_hw_err_msdu_buf_rcved;
 			uint32_t rx_hw_err_msdu_buf_invalid_cookie;
 			uint32_t rx_hw_err_oor_drop;
+			uint32_t rx_hw_err_raw_mpdu_drop;
 			uint32_t rx_hw_err_oor_to_stack;
 			uint32_t rx_hw_err_oor_sg_count;
 			uint32_t msdu_count_mismatch;

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

@@ -1505,12 +1505,6 @@ out:
 	if (soc->cdp_soc.ol_ops->rx_invalid_peer)
 		soc->cdp_soc.ol_ops->rx_invalid_peer(vdev->vdev_id, wh);
 free:
-	/* reset the head and tail pointers */
-	pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
-	if (pdev) {
-		pdev->invalid_peer_head_msdu = NULL;
-		pdev->invalid_peer_tail_msdu = NULL;
-	}
 
 	/* Drop and free packet */
 	curr_nbuf = mpdu;

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

@@ -1557,6 +1557,17 @@ more_msdu_link_desc:
 			goto process_next_msdu;
 		}
 
+		hal_rx_tlv_populate_mpdu_desc_info(soc->hal_soc,
+						   qdf_nbuf_data(head_nbuf),
+						   mpdu_desc_info);
+		if (qdf_unlikely(mpdu_desc_info->mpdu_flags &
+				 HAL_MPDU_F_RAW_AMPDU)) {
+			dp_err_rl("RAW ampdu in REO error not expected");
+			DP_STATS_INC(soc, rx.err.reo_err_raw_mpdu_drop, 1);
+			qdf_nbuf_list_free(head_nbuf);
+			goto process_next_msdu;
+		}
+
 		rx_tlv_hdr_first = qdf_nbuf_data(head_nbuf);
 		rx_tlv_hdr_last = qdf_nbuf_data(tail_nbuf);
 

+ 7 - 0
dp/wifi3.0/dp_stats.c

@@ -7262,6 +7262,8 @@ void dp_txrx_path_stats(struct dp_soc *soc)
 			       pdev->soc->stats.rx.err.reo_err_oor_to_stack);
 		DP_PRINT_STATS("REO err oor msdu drop: %u",
 			       pdev->soc->stats.rx.err.reo_err_oor_drop);
+		DP_PRINT_STATS("REO err raw mpdu drop: %u",
+			       pdev->soc->stats.rx.err.reo_err_raw_mpdu_drop);
 		DP_PRINT_STATS("Rx err msdu rejected: %d",
 			       soc->stats.rx.err.rejected);
 		DP_PRINT_STATS("Rx raw frame dropped: %d",
@@ -7928,6 +7930,9 @@ dp_print_soc_rx_stats(struct dp_soc *soc)
 	DP_PRINT_STATS("REO err oor msdu drop: %d",
 		       soc->stats.rx.err.reo_err_oor_drop);
 
+	DP_PRINT_STATS("REO err raw ampdu drop: %d",
+		       soc->stats.rx.err.reo_err_raw_mpdu_drop);
+
 	DP_PRINT_STATS("Rx err msdu rejected: %d",
 		       soc->stats.rx.err.rejected);
 
@@ -8910,6 +8915,8 @@ QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
 			soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie;
 	soc_stats->rx.err.rx_hw_err_oor_drop =
 					soc->stats.rx.err.reo_err_oor_drop;
+	soc_stats->rx.err.rx_hw_err_raw_mpdu_drop =
+					soc->stats.rx.err.reo_err_raw_mpdu_drop;
 	soc_stats->rx.err.rx_hw_err_oor_to_stack =
 					soc->stats.rx.err.reo_err_oor_to_stack;
 	soc_stats->rx.err.rx_hw_err_oor_sg_count =

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

@@ -1217,6 +1217,8 @@ struct dp_soc_stats {
 			uint32_t reo_err_oor_to_stack;
 			/* REO OOR scattered msdu count */
 			uint32_t reo_err_oor_sg_count;
+			/* REO ERR RAW mpdu drops */
+			uint32_t reo_err_raw_mpdu_drop;
 			/* RX msdu rejected count on delivery to vdev stack_fn*/
 			uint32_t rejected;
 			/* Incorrect msdu count in MPDU desc info */

+ 31 - 2
hal/wifi3.0/kiwi/hal_kiwi.c

@@ -1109,6 +1109,36 @@ static void hal_rx_dump_pkt_tlvs_kiwi(hal_soc_handle_t hal_soc_hdl,
 	hal_rx_dump_pkt_hdr_tlv_kiwi(pkt_tlvs, dbg_level);
 }
 
+/**
+ * hal_rx_get_mpdu_flags_from_tlv() - Populate the local mpdu_flags elements
+ *				      from the rx tlvs
+ * @mpdu_info: buf address to rx_mpdu_info
+ *
+ * Return: mpdu_flags.
+ */
+static inline uint32_t
+hal_rx_get_mpdu_flags_from_tlv(struct rx_mpdu_info *mpdu_info)
+{
+	uint32_t mpdu_flags = 0;
+
+	if (mpdu_info->fragment_flag)
+		mpdu_flags |= HAL_MPDU_F_FRAGMENT;
+
+	if (mpdu_info->mpdu_retry)
+		mpdu_flags |= HAL_MPDU_F_RETRY_BIT;
+
+	if (mpdu_info->ampdu_flag)
+		mpdu_flags |= HAL_MPDU_F_AMPDU_FLAG;
+
+	if (mpdu_info->raw_mpdu)
+		mpdu_flags |= HAL_MPDU_F_RAW_AMPDU;
+
+	if (mpdu_info->mpdu_qos_control_valid)
+		mpdu_flags |= HAL_MPDU_F_QOS_CONTROL_VALID;
+
+	return mpdu_flags;
+}
+
 /**
  * hal_rx_tlv_populate_mpdu_desc_info_kiwi() - Populate the local mpdu_desc_info
  *			elements from the rx tlvs
@@ -1130,8 +1160,7 @@ hal_rx_tlv_populate_mpdu_desc_info_kiwi(uint8_t *buf,
 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
 
 	mpdu_desc_info->mpdu_seq = mpdu_info->mpdu_sequence_number;
-	mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags((uint32_t *)
-							    mpdu_info);
+	mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags_from_tlv(mpdu_info);
 	mpdu_desc_info->peer_meta_data = mpdu_info->peer_meta_data;
 	mpdu_desc_info->bar_frame = mpdu_info->bar_frame;
 }