Browse Source

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
Venkateswara Swamy Bandaru 7 years ago
parent
commit
97ca7e92fa
1 changed files with 13 additions and 7 deletions
  1. 13 7
      dp/wifi3.0/dp_tx.c

+ 13 - 7
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,