Przeglądaj źródła

qcacmn: Fixes for monitor ring stall issues

STATUS_DONE is missing sometimes in monitor status ring,
causing stalled processing in host and backpressure to RXDMA.
Adding a WAR to skip such entries.
Also increased the size of monitor link descriptor ring since
multiple descriptors are used for large MPDUs.

Change-Id: I556b4196482ed738471afc1f7e7b73cf3f8fbc51
Karunakar Dasineni 7 lat temu
rodzic
commit
37995ac196

+ 6 - 2
dp/wifi3.0/dp_main.c

@@ -564,7 +564,8 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
 	 * monitor buffer rings.
 	 * TODO: See if this is required for any other ring
 	 */
-	if ((ring_type == RXDMA_BUF) || (ring_type == RXDMA_MONITOR_BUF)) {
+	if ((ring_type == RXDMA_BUF) || (ring_type == RXDMA_MONITOR_BUF) ||
+		(ring_type == RXDMA_MONITOR_STATUS)) {
 		/* TODO: Setting low threshold to 1/8th of ring size
 		 * see if this needs to be configurable
 		 */
@@ -914,6 +915,9 @@ static void dp_soc_interrupt_map_calculate_integrated(struct dp_soc *soc,
 			irq_id_map[num_irq++] =
 				ppdu_end_interrupts_mac1 -
 				wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j);
+			irq_id_map[num_irq++] =
+				rxdma2host_monitor_status_ring_mac1 -
+				wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j);
 		}
 
 		if (rx_wbm_rel_ring_mask & (1 << j))
@@ -1423,7 +1427,7 @@ static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc)
 #define RXDMA_MONITOR_BUF_RING_SIZE 4096
 #define RXDMA_MONITOR_DST_RING_SIZE 2048
 #define RXDMA_MONITOR_STATUS_RING_SIZE 1024
-#define RXDMA_MONITOR_DESC_RING_SIZE 2048
+#define RXDMA_MONITOR_DESC_RING_SIZE 4096
 #define RXDMA_ERR_DST_RING_SIZE 1024
 
 /*

+ 5 - 1
dp/wifi3.0/dp_rx_mon_dest.c

@@ -294,7 +294,11 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 		hal_rx_mon_next_link_desc_get(rx_msdu_link_desc, &buf_info,
 			&p_buf_addr_info);
 
-		dp_rx_mon_link_desc_return(dp_pdev, p_last_buf_addr_info);
+		if (dp_rx_mon_link_desc_return(dp_pdev, p_last_buf_addr_info)
+			!= QDF_STATUS_SUCCESS) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				"dp_rx_mon_link_desc_return failed\n");
+		}
 		p_last_buf_addr_info = p_buf_addr_info;
 
 	} while (buf_info.paddr && msdu_cnt);

+ 10 - 6
dp/wifi3.0/dp_rx_mon_status.c

@@ -452,11 +452,16 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, uint32_t mac_id,
 			status = hal_get_rx_status_done(status_buf);
 
 			if (status != QDF_STATUS_SUCCESS) {
+				uint32_t hp, tp;
+				hal_api_get_tphp(hal_soc, mon_status_srng,
+					&tp, &hp);
 				QDF_TRACE(QDF_MODULE_ID_DP,
-				QDF_TRACE_LEVEL_WARN,
-				"[%s][%d] status not done",
-				__func__, __LINE__);
-				break;
+				QDF_TRACE_LEVEL_ERROR,
+				"[%s][%d] status not done - hp:%u, tp:%u",
+				__func__, __LINE__, hp, tp);
+				/* WAR for missing status: Skip status entry */
+				hal_srng_src_get_next(hal_soc, mon_status_srng);
+				continue;
 			}
 			qdf_nbuf_set_pktlen(status_nbuf, RX_BUFFER_SIZE);
 
@@ -501,8 +506,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, uint32_t mac_id,
 		hal_rxdma_buff_addr_info_set(rxdma_mon_status_ring_entry,
 			paddr, rx_desc->cookie, HAL_RX_BUF_RBM_SW3_BM);
 
-		rxdma_mon_status_ring_entry =
-			hal_srng_src_get_next(hal_soc, mon_status_srng);
+		hal_srng_src_get_next(hal_soc, mon_status_srng);
 		work_done++;
 	}
 done: