Browse Source

qca-wifi: Fix non-QOS Tx frame capture

Fix for missing non-QOS frames in Tx capture.

Change-Id: I8f76130b894d72701e675f36caadb5b555bc2ed6
Karunakar Dasineni 5 years ago
parent
commit
8b89b32689
1 changed files with 25 additions and 7 deletions
  1. 25 7
      dp/wifi3.0/dp_tx_capture.c

+ 25 - 7
dp/wifi3.0/dp_tx_capture.c

@@ -667,7 +667,8 @@ static uint32_t dp_tx_update_80211_hdr(struct dp_pdev *pdev,
 	}
 
 	mpdu_buf_len = sizeof(struct ieee80211_frame) + LLC_SNAP_HDR_LEN;
-	mpdu_buf_len += sizeof(struct ieee80211_qoscntl);
+	if (qdf_likely(ppdu_desc->user[0].tid != DP_NON_QOS_TID))
+		mpdu_buf_len += sizeof(struct ieee80211_qoscntl);
 
 	nbuf->protocol = qdf_htons(ETH_P_802_2);
 
@@ -684,9 +685,11 @@ static uint32_t dp_tx_update_80211_hdr(struct dp_pdev *pdev,
 	ptr_hdr = ptr_hdr + (sizeof(struct ieee80211_frame));
 
 	/* update qoscntl header */
-	qdf_mem_copy(ptr_hdr, ptr_qoscntl, sizeof(struct ieee80211_qoscntl));
-
-	ptr_hdr = ptr_hdr + sizeof(struct ieee80211_qoscntl);
+	if (qdf_likely(ppdu_desc->user[0].tid != DP_NON_QOS_TID)) {
+		qdf_mem_copy(ptr_hdr, ptr_qoscntl,
+			     sizeof(struct ieee80211_qoscntl));
+		ptr_hdr = ptr_hdr + sizeof(struct ieee80211_qoscntl);
+	}
 
 	/* update LLC */
 	*ptr_hdr =  LLC_SNAP_LSAP;
@@ -1340,7 +1343,13 @@ free_ppdu_desc:
 			/* missed seq number */
 			seq_no = ppdu_desc->user[0].start_seq + i;
 
-			if (!(ppdu_desc->user[0].failed_bitmap[k] & 1 << i)) {
+			/* Fill failed MPDUs in AMPDU if they're available in
+			 * subsequent PPDUs in current burst schedule. This
+			 * is not applicable for non-QoS TIDs (no AMPDUs)
+			 */
+			if (qdf_likely(ppdu_desc->user[0].tid !=
+			    DP_NON_QOS_TID) &&
+			    !(ppdu_desc->user[0].failed_bitmap[k] & (1 << i))) {
 				QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
 					  QDF_TRACE_LEVEL_ERROR,
 					  "%s: finding missing seq no: %d in other ppdu list cnt[%d]",
@@ -1619,9 +1628,18 @@ void dp_tx_ppdu_stats_process(void *context)
 					qdf_nbuf_free(nbuf);
 					continue;
 				}
-dequeue_msdu_again:
 
-				tid = ppdu_desc->user[0].tid;
+				/* Non-QOS frames are being indicated with TID 0
+				 * in WBM completion path, an hence we should
+				 * TID 0 to reap MSDUs from completion path
+				 */
+				if (qdf_unlikely(ppdu_desc->user[0].tid ==
+				    DP_NON_QOS_TID))
+					tid = 0;
+				else
+					tid = ppdu_desc->user[0].tid;
+
+dequeue_msdu_again:
 				num_msdu = ppdu_desc->user[0].num_msdu;
 				start_tsf = ppdu_desc->ppdu_start_timestamp;
 				end_tsf = ppdu_desc->ppdu_end_timestamp;