Răsfoiți Sursa

qcacmn: Handle buffer continuation in RxMON

for a PPDU monitor status can be split across multiple status buffers,
If status buffer continuation is carried in next NAPI budget,
store ppdu status buffers to process in next reap context.

Change-Id: Id00646fa4edb55f3540e23ad327952bf0f5d9889
CRs-Fixed: 3147113
Amir Patel 3 ani în urmă
părinte
comite
a799953c57

+ 2 - 0
dp/wifi3.0/monitor/2.0/dp_mon_2.0.h

@@ -110,6 +110,7 @@ struct dp_mon_desc_pool {
  * @rx_mon_work: Rx mon work
  * @rx_mon_queue: RxMON queue
  * @rx_mon_queue_depth: RxMON queue depth
+ * @desc_count: reaped status desc count
  * @status: reaped status buffer per ppdu
  */
 struct dp_mon_pdev_be {
@@ -125,6 +126,7 @@ struct dp_mon_pdev_be {
 
 	TAILQ_HEAD(, hal_rx_ppdu_info) rx_mon_queue;
 	uint16_t rx_mon_queue_depth;
+	uint16_t desc_count;
 	struct dp_mon_desc *status[DP_MON_MAX_STATUS_BUF];
 };
 

+ 14 - 9
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -226,13 +226,11 @@ void dp_rx_mon_process_tlv_status(struct dp_pdev *pdev,
  * dp_rx_mon_process_status_tlv () - Handle mon status process TLV
  *
  * @pdev: DP pdev handle
- * @status_buf_count : status buf count for a PPDU
  *
  * Return
  */
 static inline struct hal_rx_ppdu_info *
-dp_rx_mon_process_status_tlv(struct dp_pdev *pdev,
-			     uint8_t status_buf_count)
+dp_rx_mon_process_status_tlv(struct dp_pdev *pdev)
 {
 	struct dp_soc *soc = pdev->soc;
 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
@@ -252,8 +250,9 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev,
 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
 	struct dp_mon_desc_pool *rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
 	uint8_t work_done = 0;
+	uint16_t status_buf_count;
 
-	if (!status_buf_count) {
+	if (!mon_pdev_be->desc_count) {
 		dp_mon_err("no of status buffer count is zero: %pK", pdev);
 		return NULL;
 	}
@@ -265,6 +264,7 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev,
 		return NULL;
 	}
 
+	status_buf_count = mon_pdev_be->desc_count;
 	for (idx = 0; idx < status_buf_count; idx++) {
 		mon_desc = mon_pdev_be->status[idx];
 		if (!mon_desc) {
@@ -296,6 +296,7 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev,
 
 		/* set status buffer pointer to NULL */
 		mon_pdev_be->status[idx] = NULL;
+		mon_pdev_be->desc_count--;
 
 		qdf_frag_free(buf);
 	}
@@ -327,7 +328,6 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 	void *mon_dst_srng;
 	uint32_t work_done = 0;
 	struct hal_rx_ppdu_info *ppdu_info = NULL;
-	uint8_t desc_idx = 0;
 	QDF_STATUS status;
 
 	if (!pdev) {
@@ -401,10 +401,10 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 							mon_dst_srng);
 			continue;
 		}
-		if (desc_idx >= DP_MON_MAX_STATUS_BUF)
+		if (mon_pdev_be->desc_count >= DP_MON_MAX_STATUS_BUF)
 			qdf_assert_always(0);
 
-		mon_pdev_be->status[desc_idx++] = mon_desc;
+		mon_pdev_be->status[mon_pdev_be->desc_count++] = mon_desc;
 
 		rx_mon_dst_ring_desc = hal_srng_dst_get_next(hal_soc, mon_dst_srng);
 
@@ -417,7 +417,7 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 
 		mon_pdev->rx_mon_stats.status_ppdu_done++;
 
-		ppdu_info = dp_rx_mon_process_status_tlv(pdev, desc_idx);
+		ppdu_info = dp_rx_mon_process_status_tlv(pdev);
 
 		/* Call enhanced stats update API */
 		if (mon_pdev->enhanced_stats_en && ppdu_info)
@@ -429,7 +429,12 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 			qdf_mem_free(ppdu_info);
 
 		work_done++;
-		desc_idx = 0;
+
+		/* desc_count should be zero  after PPDU status processing */
+		if (mon_pdev_be->desc_count > 0)
+			qdf_assert_always(0);
+
+		mon_pdev_be->desc_count = 0;
 	}
 	dp_srng_access_end(int_ctx, soc, mon_dst_srng);