From 97ca7e92fac8d9df34e3a35ed8694d691f64005f Mon Sep 17 00:00:00 2001 From: Venkateswara Swamy Bandaru Date: Fri, 27 Apr 2018 18:30:10 +0530 Subject: [PATCH] qcacmn: Fix htt included bit set for mesh exception packets There may be race condition in setting htt included when tx desciptors getting prepared in two cpu cores. This is fixed by not setting the bit globally. Change-Id: I861cb2f0cf51a5a14a8fb6fbc6b64b00b82af675 CRs-Fixed: 2229350 --- dp/wifi3.0/dp_tx.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 4215299c4d8b..2df6f96fedc7 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -230,8 +230,6 @@ static uint8_t dp_tx_prepare_htt_metadata(struct dp_vdev *vdev, qdf_nbuf_t nbuf, uint8_t *hdr = NULL; - HTT_TX_TCL_METADATA_VALID_HTT_SET(vdev->htt_tcl_metadata, 1); - /* * Metadata - HTT MSDU Extension header */ @@ -481,9 +479,7 @@ struct dp_tx_ext_desc_elem_s *dp_tx_prepare_ext_desc(struct dp_vdev *vdev, &msdu_info->meta_data[0], sizeof(struct htt_tx_msdu_desc_ext2_t)); qdf_atomic_inc(&vdev->pdev->num_tx_exception); - HTT_TX_TCL_METADATA_VALID_HTT_SET(vdev->htt_tcl_metadata, 1); - } else - HTT_TX_TCL_METADATA_VALID_HTT_SET(vdev->htt_tcl_metadata, 0); + } switch (msdu_info->frm_type) { case dp_tx_frm_sg: @@ -1211,7 +1207,6 @@ static qdf_nbuf_t dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf, uint16_t htt_tcl_metadata = 0; uint8_t tid = msdu_info->tid; - HTT_TX_TCL_METADATA_VALID_HTT_SET(vdev->htt_tcl_metadata, 0); /* Setup Tx descriptor for an MSDU, and MSDU extension descriptor */ tx_desc = dp_tx_prepare_desc_single(vdev, nbuf, tx_q->desc_pool_id, msdu_info, tx_exc_metadata); @@ -1252,6 +1247,11 @@ static qdf_nbuf_t dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf, } else htt_tcl_metadata = vdev->htt_tcl_metadata; + + if (msdu_info->exception_fw) { + HTT_TX_TCL_METADATA_VALID_HTT_SET(htt_tcl_metadata, 1); + } + /* Enqueue the Tx MSDU descriptor to HW for transmit */ status = dp_tx_hw_enqueue(soc, vdev, tx_desc, tid, htt_tcl_metadata, tx_q->ring_id, tx_exc_metadata); @@ -1302,6 +1302,7 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf, struct dp_tx_desc_s *tx_desc; bool is_cce_classified = false; QDF_STATUS status; + uint16_t htt_tcl_metadata = 0; struct dp_tx_queue *tx_q = &msdu_info->tx_queue; void *hal_srng = soc->tcl_data_ring[tx_q->ring_id].hal_srng; @@ -1357,11 +1358,16 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf, if (is_cce_classified) tx_desc->flags |= DP_TX_DESC_FLAG_TO_FW; + htt_tcl_metadata = vdev->htt_tcl_metadata; + if (msdu_info->exception_fw) { + HTT_TX_TCL_METADATA_VALID_HTT_SET(htt_tcl_metadata, 1); + } + /* * Enqueue the Tx MSDU descriptor to HW for transmit */ status = dp_tx_hw_enqueue(soc, vdev, tx_desc, msdu_info->tid, - vdev->htt_tcl_metadata, tx_q->ring_id, NULL); + htt_tcl_metadata, tx_q->ring_id, NULL); if (status != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,