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
This commit is contained in:
Soumya Bhat 2018-01-31 15:38:21 +05:30 • committed by snandini
commit 1df9464a4d
3 changed files with 10 additions and 4 deletions

View file

@ -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
* */

View file

@ -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);

View file

@ -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;