Browse Source

qcacmn: Get tx success completions count

Add support to get tx success completions count for lithium
data path.

Change-Id: I3a3d1044f6b13dbf182c140a3a1463fc41b6bf98
CRs-Fixed: 2434653
Sravan Kumar Kairam 6 years ago
parent
commit
c71219ea55
3 changed files with 48 additions and 4 deletions
  1. 6 3
      dp/inc/cdp_txrx_misc.h
  2. 1 1
      dp/inc/cdp_txrx_ops.h
  3. 41 0
      dp/wifi3.0/dp_main.c

+ 6 - 3
dp/inc/cdp_txrx_misc.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -336,13 +336,15 @@ cdp_get_vdev_id(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
 /**
  * cdp_get_tx_ack_stats() - get tx ack count for vdev
  * @soc - data path soc handle
+ * @pdev - data path device instance
  * @vdev_id - vdev id
  *
  * return tx ack count
  *          0 invalid count
  */
 static inline uint32_t
-cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
+cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
+		     uint8_t vdev_id)
 {
 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
@@ -351,7 +353,8 @@ cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
 	}
 
 	if (soc->ops->misc_ops->get_tx_ack_stats)
-		return soc->ops->misc_ops->get_tx_ack_stats(vdev_id);
+		return soc->ops->misc_ops->get_tx_ack_stats(pdev, vdev_id);
+
 	return 0;
 }
 

+ 1 - 1
dp/inc/cdp_txrx_ops.h

@@ -989,7 +989,7 @@ struct cdp_misc_ops {
 	qdf_nbuf_t (*tx_non_std)(struct cdp_vdev *vdev,
 		enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list);
 	uint16_t (*get_vdev_id)(struct cdp_vdev *vdev);
-	uint32_t (*get_tx_ack_stats)(uint8_t vdev_id);
+	uint32_t (*get_tx_ack_stats)(struct cdp_pdev *pdev, uint8_t vdev_id);
 	QDF_STATUS (*set_wisa_mode)(struct cdp_vdev *vdev, bool enable);
 	QDF_STATUS (*txrx_data_stall_cb_register)(data_stall_detect_cb cb);
 	QDF_STATUS (*txrx_data_stall_cb_deregister)(data_stall_detect_cb cb);

+ 41 - 0
dp/wifi3.0/dp_main.c

@@ -10081,6 +10081,46 @@ static QDF_STATUS dp_runtime_resume(struct cdp_pdev *opaque_pdev)
 }
 #endif /* FEATURE_RUNTIME_PM */
 
+/**
+ * dp_tx_get_success_ack_stats() - get tx success completion count
+ * @opaque_pdev: dp pdev context
+ * @vdevid: vdev identifier
+ *
+ * Return: tx success ack count
+ */
+static uint32_t dp_tx_get_success_ack_stats(struct cdp_pdev *pdev,
+					    uint8_t vdev_id)
+{
+	struct dp_vdev *vdev =
+		(struct dp_vdev *)dp_get_vdev_from_vdev_id_wifi3(pdev,
+								 vdev_id);
+	struct dp_soc *soc = ((struct dp_pdev *)pdev)->soc;
+	struct cdp_vdev_stats *vdev_stats = NULL;
+	uint32_t tx_success;
+
+	if (!vdev) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			  FL("Invalid vdev id %d"), vdev_id);
+		return 0;
+	}
+
+	vdev_stats = qdf_mem_malloc_atomic(sizeof(struct cdp_vdev_stats));
+	if (!vdev_stats) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			  "DP alloc failure - unable to get alloc vdev stats");
+		return 0;
+	}
+
+	qdf_spin_lock_bh(&soc->peer_ref_mutex);
+	dp_aggregate_vdev_stats(vdev, vdev_stats);
+	qdf_spin_unlock_bh(&soc->peer_ref_mutex);
+
+	tx_success = vdev_stats->tx.tx_success.num;
+	qdf_mem_free(vdev_stats);
+
+	return tx_success;
+}
+
 #ifndef CONFIG_WIN
 static struct cdp_misc_ops dp_ops_misc = {
 #ifdef FEATURE_WLAN_TDLS
@@ -10094,6 +10134,7 @@ static struct cdp_misc_ops dp_ops_misc = {
 	.pkt_log_init = dp_pkt_log_init,
 	.pkt_log_con_service = dp_pkt_log_con_service,
 	.get_num_rx_contexts = dp_get_num_rx_contexts,
+	.get_tx_ack_stats = dp_tx_get_success_ack_stats,
 };
 
 static struct cdp_flowctl_ops dp_ops_flowctl = {