Pārlūkot izejas kodu

qcacmn: Fix double nbuf unmap error for Pine

When nbuf map-unmap debug is enabled and monitor vap is created on
Pine, then double nbuf unmap error is reported.
This is because in case of Pine, first monitor destination ring is
processed, then first buffer from monitor status ring is processed
to check for ppdu_id difference and then finally monitor status ring
is processed where the same buffer is unmapped again and thus resulting
in the issue.
Add fix to resolve the same.

Change-Id: Ic20b2ead8ef345c4ff568242544d5f69e83fcfdf
Harsh Kumar Bijlani 4 gadi atpakaļ
vecāks
revīzija
02fbfe0c0a
1 mainītis faili ar 12 papildinājumiem un 4 dzēšanām
  1. 12 4
      dp/wifi3.0/dp_rx_mon_status.c

+ 12 - 4
dp/wifi3.0/dp_rx_mon_status.c

@@ -2009,10 +2009,13 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
 				if (reap_status == DP_MON_STATUS_NO_DMA)
 					continue;
 				else if (reap_status == DP_MON_STATUS_REPLENISH) {
-					qdf_nbuf_unmap_nbytes_single(
+					if (!rx_desc->unmapped) {
+						qdf_nbuf_unmap_nbytes_single(
 							soc->osdev, status_nbuf,
 							QDF_DMA_FROM_DEVICE,
 							rx_desc_pool->buf_size);
+						rx_desc->unmapped = 1;
+					}
 					qdf_nbuf_free(status_nbuf);
 					goto buf_replenish;
 				}
@@ -2020,9 +2023,12 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
 			qdf_nbuf_set_pktlen(status_nbuf,
 					    RX_MON_STATUS_BUF_SIZE);
 
-			qdf_nbuf_unmap_nbytes_single(soc->osdev, status_nbuf,
-						     QDF_DMA_FROM_DEVICE,
-						     rx_desc_pool->buf_size);
+			if (!rx_desc->unmapped) {
+				qdf_nbuf_unmap_nbytes_single(soc->osdev, status_nbuf,
+							     QDF_DMA_FROM_DEVICE,
+							     rx_desc_pool->buf_size);
+				rx_desc->unmapped = 1;
+			}
 
 			/* Put the status_nbuf to queue */
 			qdf_nbuf_queue_add(&pdev->rx_status_q, status_nbuf);
@@ -2083,6 +2089,7 @@ buf_replenish:
 
 		rx_desc->nbuf = status_nbuf;
 		rx_desc->in_use = 1;
+		rx_desc->unmapped = 0;
 
 		hal_rxdma_buff_addr_info_set(rxdma_mon_status_ring_entry,
 			paddr, rx_desc->cookie, HAL_RX_BUF_RBM_SW3_BM);
@@ -2398,6 +2405,7 @@ QDF_STATUS dp_rx_mon_status_buffers_replenish(struct dp_soc *dp_soc,
 
 		(*desc_list)->rx_desc.nbuf = rx_netbuf;
 		(*desc_list)->rx_desc.in_use = 1;
+		(*desc_list)->rx_desc.unmapped = 0;
 		count++;
 
 		hal_rxdma_buff_addr_info_set(rxdma_ring_entry, paddr,