Browse Source

qcacmn: Fix monitor hang issue on receive amsdu pkt

Remove the NAPI quota check on processing monitor destination
ring. The quota is applied to monitor status ring process.

change Dummy TLV in status ring handling. The Dummy TLV
is not an indication of PPDU done.

Remove the mpdu err check in MPDU pop function.

Increase Monitor buffer ring, monitor destination ring
and monitor descriptor ring size.

Push destination ring buffer to stack when ppdu id from
status ring is bigger than ppdu id from destination ring.

Change-Id: If592a89ad132d405ab215024c8198a020153a9ff
Kai Chen 7 years ago
parent
commit
ad516ae457
4 changed files with 9 additions and 14 deletions
  1. 3 3
      dp/wifi3.0/dp_main.c
  2. 3 8
      dp/wifi3.0/dp_rx_mon_dest.c
  3. 1 1
      dp/wifi3.0/dp_rx_mon_status.c
  4. 2 2
      hal/wifi3.0/hal_api_mon.h

+ 3 - 3
dp/wifi3.0/dp_main.c

@@ -1520,10 +1520,10 @@ static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc)
 #define REO_STATUS_RING_SIZE 32
 #define RXDMA_BUF_RING_SIZE 1024
 #define RXDMA_REFILL_RING_SIZE 2048
-#define RXDMA_MONITOR_BUF_RING_SIZE 1024
-#define RXDMA_MONITOR_DST_RING_SIZE 1024
+#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 1024
+#define RXDMA_MONITOR_DESC_RING_SIZE 2048
 #define RXDMA_ERR_DST_RING_SIZE 1024
 
 /*

+ 3 - 8
dp/wifi3.0/dp_rx_mon_dest.c

@@ -142,7 +142,6 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 	uint32_t msdu_ppdu_id, msdu_cnt;
 	uint8_t *data;
 	uint32_t i;
-	bool mpdu_err = false;
 	uint32_t total_frag_len, frag_len;
 	bool is_frag, is_first_msdu;
 
@@ -153,10 +152,6 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 	hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, &buf_info,
 		&p_last_buf_addr_info, &msdu_cnt);
 
-	if(HAL_RX_WBM_RXDMA_PSH_RSN_ERROR ==
-		hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc))
-		mpdu_err = true;
-
 	is_frag = false;
 	is_first_msdu = true;
 
@@ -208,7 +203,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 					__func__, __LINE__, *ppdu_id,
 					msdu_ppdu_id);
 
-				if ((*ppdu_id != msdu_ppdu_id) && !mpdu_err) {
+				if (*ppdu_id < msdu_ppdu_id) {
 					*ppdu_id = msdu_ppdu_id;
 					return rx_bufs_used;
 				}
@@ -762,8 +757,8 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 
 	ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
 	rx_bufs_used = 0;
-	while (qdf_likely((rxdma_dst_ring_desc =
-		hal_srng_dst_peek(hal_soc, mon_dst_srng)) && quota--)) {
+	while (qdf_likely(rxdma_dst_ring_desc =
+		hal_srng_dst_peek(hal_soc, mon_dst_srng))) {
 		qdf_nbuf_t head_msdu, tail_msdu;
 		uint32_t npackets;
 		head_msdu = (qdf_nbuf_t) NULL;

+ 1 - 1
dp/wifi3.0/dp_rx_mon_status.c

@@ -146,7 +146,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id,
 	qdf_nbuf_t status_nbuf;
 	uint8_t *rx_tlv;
 	uint8_t *rx_tlv_start;
-	uint32_t tlv_status = HAL_TLV_STATUS_DUMMY;
+	uint32_t tlv_status = HAL_TLV_STATUS_BUF_DONE;
 
 	ppdu_info = &pdev->ppdu_info;
 

+ 2 - 2
hal/wifi3.0/hal_api_mon.h

@@ -71,7 +71,7 @@
 
 #define HAL_TLV_STATUS_PPDU_NOT_DONE		0
 #define HAL_TLV_STATUS_PPDU_DONE		1
-#define HAL_TLV_STATUS_DUMMY			2
+#define HAL_TLV_STATUS_BUF_DONE			2
 
 #define HAL_MAX_UL_MU_USERS			8
 
@@ -537,7 +537,7 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info)
 		return HAL_TLV_STATUS_PPDU_DONE;
 
 	case WIFIDUMMY_E:
-		return HAL_TLV_STATUS_PPDU_DONE;
+		return HAL_TLV_STATUS_BUF_DONE;
 
 	case WIFIPHYRX_HT_SIG_E:
 	{