qcacld-3.0: Add support for Tx OTA Ack stats

Add stats in vdev for Tx OTA success and failure count

Change-Id: I6849dfc1d11351f5cc63acf3a22bf72a1ef8109c
CRs-Fixed: 2211898
diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c
index 06134c1..f124323 100644
--- a/core/dp/txrx/ol_tx_send.c
+++ b/core/dp/txrx/ol_tx_send.c
@@ -629,6 +629,17 @@
 }
 #endif
 
+static void ol_tx_update_ack_count(struct ol_tx_desc_t *tx_desc,
+				   enum htt_tx_status status)
+{
+	if (!tx_desc->vdev)
+		return;
+
+	if (status == htt_tx_status_ok)
+		++tx_desc->vdev->txrx_stats.txack_success;
+	else
+		++tx_desc->vdev->txrx_stats.txack_failed;
+}
 /**
  * ol_tx_update_connectivity_stats() - update connectivity stats
  * @tx_desc: tx desc
@@ -750,6 +761,7 @@
 		if (pkt_type_bitmap)
 			ol_tx_update_connectivity_stats(tx_desc, netbuf,
 							status);
+		ol_tx_update_ack_count(tx_desc, status);
 
 		if (tx_desc->pkt_type != OL_TX_FRM_TSO) {
 			packetdump_cb = pdev->ol_tx_packetdump_cb;
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 4bc567d..33e5c50 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -2245,6 +2245,9 @@
 	vdev->osif_flow_control_is_pause = NULL;
 	vdev->osif_fc_ctx = NULL;
 
+	vdev->txrx_stats.txack_success = 0;
+	vdev->txrx_stats.txack_failed = 0;
+
 	/* Default MAX Q depth for every VDEV */
 	vdev->ll_pause.max_q_depth =
 		ol_tx_cfg_max_tx_queue_depth_ll(vdev->pdev->ctrl_pdev);
@@ -4668,6 +4671,24 @@
 	vdev->mac_id = mac_id;
 }
 
+/**
+ * ol_txrx_get_tx_ack_count() - get tx ack count
+ * @vdev_id: vdev_id
+ *
+ * Return: tx ack count
+ */
+static uint32_t ol_txrx_get_tx_ack_stats(uint8_t vdev_id)
+{
+	struct ol_txrx_vdev_t *vdev =
+		(struct ol_txrx_vdev_t *)ol_txrx_get_vdev_from_vdev_id(vdev_id);
+	if (!vdev) {
+		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+			  "%s: Invalid vdev_id %d", __func__, vdev_id);
+		return 0;
+	}
+	return vdev->txrx_stats.txack_success;
+}
+
 #ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
 
 /**
@@ -5837,6 +5858,7 @@
 	.hl_tdls_flag_reset = ol_txrx_hl_tdls_flag_reset,
 	.tx_non_std = ol_tx_non_std,
 	.get_vdev_id = ol_txrx_get_vdev_id,
+	.get_tx_ack_stats = ol_txrx_get_tx_ack_stats,
 	.set_wisa_mode = ol_txrx_set_wisa_mode,
 	.txrx_data_stall_cb_register = ol_register_data_stall_detect_cb,
 	.txrx_data_stall_cb_deregister = ol_deregister_data_stall_detect_cb,
diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h
index 9257887..c3f1e84 100644
--- a/core/dp/txrx/ol_txrx_types.h
+++ b/core/dp/txrx/ol_txrx_types.h
@@ -1040,6 +1040,11 @@
 	ol_txrx_stats_rx_fp stats_rx; /* receive function used by this vdev */
 
 	struct {
+		uint32_t txack_success;
+		uint32_t txack_failed;
+	} txrx_stats;
+
+	struct {
 		/*
 		 * If the vdev object couldn't be deleted immediately because
 		 * it still had some peer objects left, remember that a delete