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
This commit is contained in:

committed by
Madan Koyyalamudi

parent
bfe1e87b25
commit
74458d4542
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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 */
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
};
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user