Sfoglia il codice sorgente

qca-wifi: Change monitor ring reap sequence for qcn9000

For qcn9000 in case of monitor mode, reap monitor destination
ring first and status ring later to avoid backpressure
on monitor destination ring

Change-Id: If107d40471a4d01ce8d42054ed844b98217e60cf
CRs-Fixed: 2670656
Amir 5 anni fa
parent
commit
dcfa3f37ed
1 ha cambiato i file con 20 aggiunte e 23 eliminazioni
  1. 20 23
      dp/wifi3.0/dp_full_mon.c

+ 20 - 23
dp/wifi3.0/dp_full_mon.c

@@ -125,30 +125,24 @@ dp_rx_mon_reap_status_ring(struct dp_soc *soc,
 {
 	struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
 	uint8_t status_buf_count;
-	uint32_t work_done;
+	uint32_t work_done = 0;
 
 	status_buf_count = desc_info->status_buf_count;
 
-	qdf_mem_copy(&pdev->mon_desc, desc_info,
-		     sizeof(struct hal_rx_mon_desc_info));
-
-	work_done = dp_rx_mon_status_process(soc, mac_id, status_buf_count);
+status_reap:
+	work_done += dp_rx_mon_status_process(soc, mac_id, status_buf_count);
 
 	if (desc_info->ppdu_id != pdev->ppdu_info.com_info.ppdu_id) {
-		qdf_err("DEBUG: count: %d quota: %d", status_buf_count, quota);
-		dp_print_ring_stats(pdev);
-		qdf_assert_always(0);
-	}
+		pdev->rx_mon_stats.ppdu_id_mismatch++;
 
-	/* DEBUG */
-	if (work_done != status_buf_count) {
-		qdf_err("Reaped status ring buffers are not equal to "
-			"status buf count from destination ring work_done:"
-			" %d status_buf_count: %d",
-			work_done, status_buf_count);
+		qdf_err("count: %d quota: %d work_done: %d status_ppdu_id: %d"
+			 "dest_ppdu_id: %d ", status_buf_count, quota,
+					      work_done,
+					      pdev->ppdu_info.com_info.ppdu_id,
+					      desc_info->ppdu_id);
 
-		dp_print_ring_stats(pdev);
-		qdf_assert_always(0);
+		if (desc_info->ppdu_id > pdev->ppdu_info.com_info.ppdu_id)
+			goto status_reap;
 	}
 
 	return work_done;
@@ -339,12 +333,11 @@ next_msdu:
 						   mac_id,
 						   HAL_BM_ACTION_PUT_IN_IDLE_LIST)
 				!= QDF_STATUS_SUCCESS) {
-			dp_print_ring_stats(pdev);
-			qdf_assert_always(0);
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 				  "dp_rx_monitor_link_desc_return failed");
 		}
 	}
+	pdev->rx_mon_stats.dest_mpdu_done++;
 
 	if (last_msdu)
 		qdf_nbuf_set_next(last_msdu, NULL);
@@ -384,7 +377,7 @@ uint32_t dp_rx_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 	QDF_STATUS status;
 
 	if (qdf_unlikely(!dp_soc_is_full_mon_enable(pdev)))
-		return quota;
+		return dp_rx_mon_status_process(soc, mac_id, quota);
 
 	mon_dest_srng = dp_rxdma_get_mon_dst_ring(pdev, mac_for_pdev);
 
@@ -427,8 +420,7 @@ uint32_t dp_rx_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 		 * are zero.
 		 */
 		if (qdf_unlikely(!desc_info->end_of_ppdu && !rx_bufs_reaped)) {
-			dp_print_ring_stats(pdev);
-			qdf_assert_always(0);
+			qdf_err("end_of_ppdu and rx_bufs_reaped are zero");
 		}
 
 		rx_mon_stats->mon_rx_bufs_reaped_dest += rx_bufs_reaped;
@@ -468,6 +460,7 @@ uint32_t dp_rx_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 			if (!head_msdu) {
 				ring_desc = hal_srng_dst_get_next(hal_soc,
 								  mon_dest_srng);
+
 				continue;
 			}
 
@@ -508,9 +501,11 @@ uint32_t dp_rx_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 		 */
 		rx_mon_stats->dest_ppdu_done++;
 
+#if 0
 		if (pdev->ppdu_info.com_info.ppdu_id !=
 		    pdev->mon_desc->ppdu_id) {
 			pdev->rx_mon_stats.ppdu_id_mismatch++;
+
 			qdf_err("PPDU id mismatch, status_ppdu_id: %d"
 				"dest_ppdu_id: %d status_ppdu_done: %d "
 				"dest_ppdu_done: %d ppdu_id_mismatch_cnt: %u"
@@ -562,7 +557,10 @@ uint32_t dp_rx_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 				  ring_desc);
 				goto done2;
 		}
+#endif
 
+		quota -= dp_rx_mon_reap_status_ring(soc, mac_id,
+							quota, desc_info);
 		/* Deliver all MPDUs for a PPDU */
 		dp_rx_monitor_deliver_ppdu(soc, mac_id);
 
@@ -570,7 +568,6 @@ uint32_t dp_rx_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 		break;
 	}
 
-done2:
 	hal_srng_access_end(hal_soc, mon_dest_srng);
 
 done1: