From 1df9464a4de1390f4bb8c451d2672c66edd16abe Mon Sep 17 00:00:00 2001 From: Soumya Bhat Date: Wed, 31 Jan 2018 15:38:21 +0530 Subject: [PATCH] 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 --- dp/inc/cdp_txrx_cmn_struct.h | 1 + dp/wifi3.0/dp_htt.c | 11 +++++++---- dp/wifi3.0/dp_types.h | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 7b54f87ff6ba..a9190d72162d 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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 * */ diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 508c134eaa18..b9a8e69f2a64 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/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); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index a95076cf4ab2..375a329e44da 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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;