Selaa lähdekoodia

qcacmn: Handle TLV received asynchronously from Firmware

When TLVs come from TAC_thread last tlv sent by FW is
HTT_PPDU_STATS_SCH_CMD_STATUS_TLV
and in Tqm thread HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV is the last
TLV to be sent. HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV though can
come either in tqm thread or tac thread based on tid type.

Add change to process HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV when it
comes from tqm thread and pass the populated buffer to the appropriate APIs

Change-Id: I7a064aba4e3c6814b63dcf4bb97cfb3be0194c39
CRs-Fixed: 2180477
Soumya Bhat 7 vuotta sitten
vanhempi
sitoutus
1df9464a4d
3 muutettua tiedostoa jossa 10 lisäystä ja 4 poistoa
  1. 1 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 7 4
      dp/wifi3.0/dp_htt.c
  3. 2 0
      dp/wifi3.0/dp_types.h

+ 1 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -103,6 +103,7 @@
 #define CDP_MU_MAX_USERS 8
 #define CDP_MU_MAX_USER_INDEX (CDP_MU_MAX_USERS - 1)
 
+#define CDP_DATA_TID_MAX 8
 /*
  * advance rx monitor filter
  * */

+ 7 - 4
dp/wifi3.0/dp_htt.c

@@ -2249,6 +2249,10 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 		if (tlv_type == HTT_PPDU_STATS_SCH_CMD_STATUS_TLV)
 			status = QDF_STATUS_SUCCESS;
 
+		if ((tlv_type == HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) &&
+				(pdev->last_ppdu_id != ppdu_id))
+			status = QDF_STATUS_SUCCESS;
+
 		tlv_length += HTT_TLV_HDR_LEN;
 		dp_process_ppdu_tag(pdev, msg_word, tlv_length);
 
@@ -2256,6 +2260,7 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 		msg_word = (uint32_t *)((uint8_t *)tlv_buf + tlv_length);
 		length -= (tlv_length);
 	}
+	pdev->last_ppdu_id = ppdu_id;
 	return status;
 }
 #endif /* FEATURE_PERPKT_INFO */
@@ -2274,7 +2279,6 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 		uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg)
 {
 	struct dp_pdev *pdev = soc->pdev_list[pdev_id];
-	struct dp_vdev *vdev;
 	struct dp_peer *peer;
 	struct cdp_tx_completion_ppdu *ppdu_desc;
 	int status;
@@ -2321,8 +2325,7 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 		ppdu_desc = (struct cdp_tx_completion_ppdu *)
 			qdf_nbuf_data(pdev->tx_ppdu_info.buf);
 
-		vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc,
-				ppdu_desc->vdev_id);
+		ppdu_desc->num_users = pdev->tx_ppdu_info.last_user;
 
 		for (i = 0; i < ppdu_desc->num_users; i++) {
 			peer = dp_peer_find_by_id(soc,
@@ -2333,7 +2336,7 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 			ppdu_desc->num_mpdu += ppdu_desc->user[i].num_mpdu;
 			ppdu_desc->num_msdu += ppdu_desc->user[i].num_msdu;
 
-			if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_DATA) {
+			if (ppdu_desc->user[i].tid < CDP_DATA_TID_MAX) {
 				dp_tx_stats_update(soc, peer,
 						&ppdu_desc->user[i],
 						ppdu_desc->ack_rssi);

+ 2 - 0
dp/wifi3.0/dp_types.h

@@ -1087,6 +1087,8 @@ struct dp_pdev {
 	/* WDI event handlers */
 	struct wdi_event_subscribe_t **wdi_event_list;
 
+	/* ppdu_id of last received HTT TX stats */
+	uint32_t last_ppdu_id;
 	struct {
 		uint8_t last_user;
 		qdf_nbuf_t buf;