浏览代码

qcacmn: Add function to calculate hardware Tx delay

Define a new function to calculate HW delay so that same logic
can be used to calculate delay by other modules.

Change-Id: Id3740bcaa2cd558b89ab02d8e88d5947eb5997b1
CRs-Fixed: 3198305
Ripan Deuri 3 年之前
父节点
当前提交
74458d4542
共有 8 个文件被更改,包括 73 次插入40 次删除
  1. 1 1
      dp/inc/cdp_txrx_ctrl.h
  2. 1 1
      dp/inc/cdp_txrx_ops.h
  3. 1 1
      dp/wifi3.0/dp_main.c
  4. 48 31
      dp/wifi3.0/dp_tx.c
  5. 17 1
      dp/wifi3.0/dp_tx.h
  6. 1 1
      dp/wifi3.0/dp_types.h
  7. 1 1
      hal/wifi3.0/hal_tx.h
  8. 3 3
      hal/wifi3.0/li/hal_li_generic_api.h

+ 1 - 1
dp/inc/cdp_txrx_ctrl.h

@@ -1321,7 +1321,7 @@ void cdp_txrx_peer_flush_frags(ol_txrx_soc_handle soc, uint8_t vdev_id,
 							 peer_mac);
 }
 
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
 /**
  * cdp_set_delta_tsf() - wrapper function to set delta_tsf
  * @soc: SOC TXRX handle

+ 1 - 1
dp/inc/cdp_txrx_ops.h

@@ -868,7 +868,7 @@ struct cdp_ctrl_ops {
 
 #endif
 
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
 	void (*txrx_set_delta_tsf)(struct cdp_soc_t *soc, uint8_t vdev_id,
 				   uint32_t delta_tsf);
 #endif

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

@@ -12621,7 +12621,7 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
 #ifdef QCA_MULTIPASS_SUPPORT
 	.txrx_peer_set_vlan_id = dp_peer_set_vlan_id,
 #endif /*QCA_MULTIPASS_SUPPORT*/
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
 	.txrx_set_delta_tsf = dp_set_delta_tsf,
 #endif
 #ifdef WLAN_FEATURE_TSF_UPLINK_DELAY

+ 48 - 31
dp/wifi3.0/dp_tx.c

@@ -4529,7 +4529,51 @@ void dp_tx_update_connectivity_stats(struct dp_soc *soc,
 }
 #endif
 
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
+QDF_STATUS
+dp_tx_compute_hw_delay_us(struct hal_tx_completion_status *ts,
+			  uint32_t delta_tsf,
+			  uint32_t *delay_us)
+{
+	uint32_t buffer_ts;
+	uint32_t delay;
+
+	if (!delay_us)
+		return QDF_STATUS_E_INVAL;
+
+	/* Tx_rate_stats_info_valid is 0 and tsf is invalid then */
+	if (!ts->valid)
+		return QDF_STATUS_E_INVAL;
+
+	/* buffer_timestamp is in units of 1024 us and is [31:13] of
+	 * WBM_RELEASE_RING_4. After left shift 10 bits, it's
+	 * valid up to 29 bits.
+	 */
+	buffer_ts = ts->buffer_timestamp << 10;
+
+	delay = ts->tsf - buffer_ts - delta_tsf;
+	delay &= 0x1FFFFFFF; /* mask 29 BITS */
+	if (delay > 0x1000000) {
+		dp_info_rl("----------------------\n"
+			   "Tx completion status:\n"
+			   "----------------------\n"
+			   "release_src = %d\n"
+			   "ppdu_id = 0x%x\n"
+			   "release_reason = %d\n"
+			   "tsf = %u (0x%x)\n"
+			   "buffer_timestamp = %u (0x%x)\n"
+			   "delta_tsf = %u (0x%x)\n",
+			   ts->release_src, ts->ppdu_id, ts->status,
+			   ts->tsf, ts->tsf, ts->buffer_timestamp,
+			   ts->buffer_timestamp, delta_tsf, delta_tsf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	*delay_us = delay;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 void dp_set_delta_tsf(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		      uint32_t delta_tsf)
 {
@@ -4607,14 +4651,8 @@ QDF_STATUS dp_get_uplink_delay(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 static void dp_tx_update_uplink_delay(struct dp_soc *soc, struct dp_vdev *vdev,
 				      struct hal_tx_completion_status *ts)
 {
-	uint32_t buffer_ts;
-	uint32_t delta_tsf;
 	uint32_t ul_delay;
 
-	/* Tx_rate_stats_info_valid is 0 and tsf is invalid then */
-	if (!ts->valid)
-		return;
-
 	if (qdf_unlikely(!vdev)) {
 		dp_info_rl("vdev is null or delete in progrss");
 		return;
@@ -4623,31 +4661,10 @@ static void dp_tx_update_uplink_delay(struct dp_soc *soc, struct dp_vdev *vdev,
 	if (!qdf_atomic_read(&vdev->ul_delay_report))
 		return;
 
-	delta_tsf = vdev->delta_tsf;
-
-	/* buffer_timestamp is in units of 1024 us and is [31:13] of
-	 * WBM_RELEASE_RING_4. After left shift 10 bits, it's
-	 * valid up to 29 bits.
-	 */
-	buffer_ts = ts->buffer_timestamp << 10;
-
-	ul_delay = ts->tsf - buffer_ts - delta_tsf;
-	ul_delay &= 0x1FFFFFFF; /* mask 29 BITS */
-	if (ul_delay > 0x1000000) {
-		dp_info_rl("----------------------\n"
-			   "Tx completion status:\n"
-			   "----------------------\n"
-			   "release_src = %d\n"
-			   "ppdu_id = 0x%x\n"
-			   "release_reason = %d\n"
-			   "tsf = %u (0x%x)\n"
-			   "buffer_timestamp = %u (0x%x)\n"
-			   "delta_tsf = %u (0x%x)\n",
-			   ts->release_src, ts->ppdu_id, ts->status,
-			   ts->tsf, ts->tsf, ts->buffer_timestamp,
-			   ts->buffer_timestamp, delta_tsf, delta_tsf);
+	if (QDF_IS_STATUS_ERROR(dp_tx_compute_hw_delay_us(ts,
+							  vdev->delta_tsf,
+							  &ul_delay)))
 		return;
-	}
 
 	ul_delay /= 1000; /* in unit of ms */
 

+ 17 - 1
dp/wifi3.0/dp_tx.h

@@ -916,7 +916,23 @@ dp_tx_hw_desc_update_evt(uint8_t *hal_tx_desc_cached,
 }
 #endif
 
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
+/**
+ * dp_tx_compute_hw_delay_us() - Compute hardware Tx completion delay
+ * @ts: Tx completion status
+ * @delta_tsf: Difference between TSF clock and qtimer
+ * @delay_us: Delay in microseconds
+ *
+ * Return: QDF_STATUS_SUCCESS   : Success
+ *         QDF_STATUS_E_INVAL   : Tx completion status is invalid or
+ *                                delay_us is NULL
+ *         QDF_STATUS_E_FAILURE : Error in delay calculation
+ */
+QDF_STATUS
+dp_tx_compute_hw_delay_us(struct hal_tx_completion_status *ts,
+			  uint32_t delta_tsf,
+			  uint32_t *delay_us);
+
 /**
  * dp_set_delta_tsf() - Set delta_tsf to dp_soc structure
  * @soc_hdl: cdp soc pointer

+ 1 - 1
dp/wifi3.0/dp_types.h

@@ -3210,7 +3210,7 @@ struct dp_vdev {
 #ifdef WIFI_MONITOR_SUPPORT
 	struct dp_mon_vdev *monitor_vdev;
 #endif
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
 	/* Delta between TQM clock and TSF clock */
 	uint32_t delta_tsf;
 #endif

+ 1 - 1
hal/wifi3.0/hal_tx.h

@@ -233,7 +233,7 @@ struct hal_tx_completion_status {
 	uint8_t transmit_cnt;
 	uint8_t tid;
 	uint16_t peer_id;
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
 	uint32_t buffer_timestamp:19;
 #endif
 };

+ 3 - 3
hal/wifi3.0/li/hal_li_generic_api.h

@@ -69,7 +69,7 @@ void hal_rx_wbm_err_info_get_generic_li(void *wbm_desc,
 	wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
 }
 
-#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(CONFIG_SAWF)
+#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_PEER_EXT_STATS)
 static inline void
 hal_tx_comp_get_buffer_timestamp(void *desc,
 				 struct hal_tx_completion_status *ts)
@@ -77,13 +77,13 @@ hal_tx_comp_get_buffer_timestamp(void *desc,
 	ts->buffer_timestamp = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
 					       BUFFER_TIMESTAMP);
 }
-#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY || CONFIG_SAWF */
+#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY || QCA_PEER_EXT_STATS */
 static inline void
 hal_tx_comp_get_buffer_timestamp(void *desc,
 				 struct hal_tx_completion_status *ts)
 {
 }
-#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY || CONFIG_SAWF */
+#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY || QCA_PEER_EXT_STATS */
 
 #ifdef QCA_UNDECODED_METADATA_SUPPORT
 static inline void