summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/cds/inc/cds_config.h1
-rw-r--r--core/dp/txrx/ol_tx_send.c94
-rw-r--r--core/dp/txrx/ol_txrx.c35
-rw-r--r--core/dp/txrx/ol_txrx.h19
-rw-r--r--core/dp/txrx/ol_txrx_types.h1
-rw-r--r--core/hdd/inc/wlan_hdd_cfg.h3
-rw-r--r--core/hdd/inc/wlan_hdd_tsf.h15
-rw-r--r--core/hdd/src/wlan_hdd_main.c3
-rw-r--r--core/hdd/src/wlan_hdd_tsf.c11
-rw-r--r--core/wma/inc/wma.h1
-rw-r--r--core/wma/src/wma_features.c6
-rw-r--r--core/wma/src/wma_main.c13
12 files changed, 186 insertions, 16 deletions
diff --git a/core/cds/inc/cds_config.h b/core/cds/inc/cds_config.h
index 06a23cf029..80de4e6c60 100644
--- a/core/cds/inc/cds_config.h
+++ b/core/cds/inc/cds_config.h
@@ -100,6 +100,7 @@ struct cds_config_info {
uint8_t bandcapability;
bool rps_enabled;
uint32_t num_vdevs;
+ bool enable_tx_compl_tsf64;
};
#ifdef WLAN_FEATURE_FILS_SK
diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c
index 654ffef469..912e26377a 100644
--- a/core/dp/txrx/ol_tx_send.c
+++ b/core/dp/txrx/ol_tx_send.c
@@ -562,21 +562,29 @@ void ol_tx_flow_pool_unlock(struct ol_tx_desc_t *tx_desc)
#ifdef WLAN_FEATURE_TSF_PLUS
static inline struct htt_tx_compl_ind_append_tx_tstamp *ol_tx_get_txtstamps(
- u_int32_t *msg_word, int num_msdus)
+ u_int32_t *msg_word_header, u_int32_t **msg_word_payload,
+ int num_msdus)
{
u_int32_t has_tx_tsf;
u_int32_t has_retry;
+
struct htt_tx_compl_ind_append_tx_tstamp *txtstamp_list = NULL;
struct htt_tx_compl_ind_append_retries *retry_list = NULL;
int offset_dwords;
- has_tx_tsf = HTT_TX_COMPL_IND_APPEND1_GET(*msg_word);
- if (num_msdus <= 0 || !has_tx_tsf)
+ if (num_msdus <= 0)
return NULL;
- offset_dwords = 1 + ((num_msdus + 1) >> 1);
+ has_tx_tsf = HTT_TX_COMPL_IND_APPEND1_GET(*msg_word_header);
+
+ /* skip header and MSDUx ID part*/
+ offset_dwords = ((num_msdus + 1) >> 1);
+ *msg_word_payload += offset_dwords;
+
+ if (!has_tx_tsf)
+ return NULL;
- has_retry = HTT_TX_COMPL_IND_APPEND_GET(*msg_word);
+ has_retry = HTT_TX_COMPL_IND_APPEND_GET(*msg_word_header);
if (has_retry) {
int retry_index = 0;
int width_for_each_retry =
@@ -584,19 +592,51 @@ static inline struct htt_tx_compl_ind_append_tx_tstamp *ol_tx_get_txtstamps(
3) >> 2;
retry_list = (struct htt_tx_compl_ind_append_retries *)
- (msg_word + offset_dwords);
+ (*msg_word_payload + offset_dwords);
while (retry_list) {
if (retry_list[retry_index++].flag == 0)
break;
}
- offset_dwords += retry_index * width_for_each_retry;
+ offset_dwords = retry_index * width_for_each_retry;
}
- txtstamp_list = (struct htt_tx_compl_ind_append_tx_tstamp *)
- (msg_word + offset_dwords);
+ *msg_word_payload += offset_dwords;
+ txtstamp_list = (struct htt_tx_compl_ind_append_tx_tstamp *)
+ (*msg_word_payload);
return txtstamp_list;
}
+static inline
+struct htt_tx_compl_ind_append_tx_tsf64 *ol_tx_get_txtstamp64s(
+ u_int32_t *msg_word_header, u_int32_t **msg_word_payload,
+ int num_msdus)
+{
+ u_int32_t has_tx_tstamp64;
+ u_int32_t has_rssi;
+ struct htt_tx_compl_ind_append_tx_tsf64 *txtstamp64_list = NULL;
+
+ int offset_dwords = 0;
+
+ if (num_msdus <= 0)
+ return NULL;
+
+ has_tx_tstamp64 = HTT_TX_COMPL_IND_APPEND3_GET(*msg_word_header);
+ if (!has_tx_tstamp64)
+ return NULL;
+
+ /*skip MSDUx ACK RSSI part*/
+ has_rssi = HTT_TX_COMPL_IND_APPEND2_GET(*msg_word_header);
+ if (has_rssi)
+ offset_dwords = ((num_msdus + 1) >> 1);
+
+ *msg_word_payload = *msg_word_payload + offset_dwords;
+ txtstamp64_list =
+ (struct htt_tx_compl_ind_append_tx_tsf64 *)
+ (*msg_word_payload);
+
+ return txtstamp64_list;
+}
+
static inline void ol_tx_timestamp(ol_txrx_pdev_handle pdev,
qdf_nbuf_t netbuf, u_int64_t ts)
{
@@ -608,7 +648,16 @@ static inline void ol_tx_timestamp(ol_txrx_pdev_handle pdev,
}
#else
static inline struct htt_tx_compl_ind_append_tx_tstamp *ol_tx_get_txtstamps(
- u_int32_t *msg_word, int num_msdus)
+ u_int32_t *msg_word_header, u_int32_t **msg_word_payload,
+ int num_msdus)
+{
+ return NULL;
+}
+
+static inline
+struct htt_tx_compl_ind_append_tx_tsf64 *ol_tx_get_txtstamp64s(
+ u_int32_t *msg_word_header, u_int32_t **msg_word_payload,
+ int num_msdus)
{
return NULL;
}
@@ -765,17 +814,27 @@ ol_tx_completion_handler(ol_txrx_pdev_handle pdev,
#endif
uint32_t is_tx_desc_freed = 0;
struct htt_tx_compl_ind_append_tx_tstamp *txtstamp_list = NULL;
+ struct htt_tx_compl_ind_append_tx_tsf64 *txtstamp64_list = NULL;
+ u_int32_t *msg_word_header = (u_int32_t *)msg;
+ /*msg_word skip header*/
+ u_int32_t *msg_word_payload = msg_word_header + 1;
u_int32_t *msg_word = (u_int32_t *)msg;
u_int16_t *desc_ids = (u_int16_t *)(msg_word + 1);
union ol_tx_desc_list_elem_t *lcl_freelist = NULL;
union ol_tx_desc_list_elem_t *tx_desc_last = NULL;
ol_tx_desc_list tx_descs;
+ uint64_t tx_tsf64;
TAILQ_INIT(&tx_descs);
ol_tx_delay_compute(pdev, status, desc_ids, num_msdus);
- if (status == htt_tx_status_ok)
- txtstamp_list = ol_tx_get_txtstamps(msg_word, num_msdus);
+ if (status == htt_tx_status_ok) {
+ txtstamp_list = ol_tx_get_txtstamps(
+ msg_word_header, &msg_word_payload, num_msdus);
+ if (pdev->enable_tx_compl_tsf64)
+ txtstamp64_list = ol_tx_get_txtstamp64s(
+ msg_word_header, &msg_word_payload, num_msdus);
+ }
for (i = 0; i < num_msdus; i++) {
tx_desc_id = desc_ids[i];
@@ -791,7 +850,13 @@ ol_tx_completion_handler(ol_txrx_pdev_handle pdev,
tx_desc->status = status;
netbuf = tx_desc->netbuf;
- if (txtstamp_list)
+ if (txtstamp64_list) {
+ tx_tsf64 =
+ (u_int64_t)txtstamp64_list[i].tx_tsf64_high << 32 |
+ txtstamp64_list[i].tx_tsf64_low;
+
+ ol_tx_timestamp(pdev, netbuf, tx_tsf64);
+ } else if (txtstamp_list)
ol_tx_timestamp(pdev, netbuf,
(u_int64_t)txtstamp_list->timestamp[i]
);
@@ -801,7 +866,8 @@ ol_tx_completion_handler(ol_txrx_pdev_handle pdev,
if (QDF_NBUF_CB_GET_PACKET_TYPE(netbuf) ==
QDF_NBUF_CB_PACKET_TYPE_ARP) {
if (qdf_nbuf_data_is_arp_req(netbuf))
- ol_tx_update_arp_stats(tx_desc, netbuf, status);
+ ol_tx_update_arp_stats(tx_desc, netbuf,
+ status);
}
/* check tx completion notification */
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 860b5d7f4f..a6e44caf19 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -5726,6 +5726,8 @@ static struct cdp_cfg_ops ol_ops_cfg = {
ol_txrx_set_new_htt_msg_format,
.set_peer_unmap_conf_support = ol_txrx_set_peer_unmap_conf_support,
.get_peer_unmap_conf_support = ol_txrx_get_peer_unmap_conf_support,
+ .set_tx_compl_tsf64 = ol_txrx_set_tx_compl_tsf64,
+ .get_tx_compl_tsf64 = ol_txrx_get_tx_compl_tsf64,
};
static struct cdp_peer_ops ol_ops_peer = {
@@ -5886,3 +5888,36 @@ void ol_txrx_set_peer_unmap_conf_support(bool val)
}
pdev->enable_peer_unmap_conf_support = val;
}
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+bool ol_txrx_get_tx_compl_tsf64(void)
+{
+ struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+
+ if (!pdev) {
+ qdf_print("%s: pdev is NULL\n", __func__);
+ return false;
+ }
+ return pdev->enable_tx_compl_tsf64;
+}
+
+void ol_txrx_set_tx_compl_tsf64(bool val)
+{
+ struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+
+ if (!pdev) {
+ qdf_print("%s: pdev is NULL\n", __func__);
+ return;
+ }
+ pdev->enable_tx_compl_tsf64 = val;
+}
+#else
+bool ol_txrx_get_tx_compl_tsf64(void)
+{
+ return false;
+}
+
+void ol_txrx_set_tx_compl_tsf64(bool val)
+{
+}
+#endif
diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h
index 720f505131..b586bb4ed9 100644
--- a/core/dp/txrx/ol_txrx.h
+++ b/core/dp/txrx/ol_txrx.h
@@ -419,4 +419,23 @@ void ol_txrx_set_peer_unmap_conf_support(bool val);
* return true is peer unmap conf feature is enabled else false
*/
bool ol_txrx_get_peer_unmap_conf_support(void);
+
+/**
+ * ol_txrx_get_tx_compl_tsf64() - check tx compl tsf64 feature
+ *
+ * Check if tx compl tsf64 feature is enabled
+ *
+ * return true is tx compl tsf64 feature is enabled else false
+ */
+bool ol_txrx_get_tx_compl_tsf64(void);
+
+/**
+ * ol_txrx_set_tx_compl_tsf64() - set tx compl tsf64 feature
+ * @val - enable or disable tx compl tsf64 feature
+ *
+ * Set if tx compl tsf64 feature is supported FW
+ *
+ * return NONE
+ */
+void ol_txrx_set_tx_compl_tsf64(bool val);
#endif /* _OL_TXRX__H_ */
diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h
index 08a70db2a0..051ae1c80e 100644
--- a/core/dp/txrx/ol_txrx_types.h
+++ b/core/dp/txrx/ol_txrx_types.h
@@ -1069,6 +1069,7 @@ struct ol_txrx_pdev_t {
bool new_htt_msg_format;
uint8_t peer_id_unmap_ref_cnt;
bool enable_peer_unmap_conf_support;
+ bool enable_tx_compl_tsf64;
};
struct ol_txrx_vdev_t {
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index b1bc3bb354..f2c1f3ce4b 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -214,6 +214,9 @@ struct hdd_config {
uint32_t cfg_wmi_credit_cnt;
uint32_t sar_version;
bool is_wow_disabled;
+#ifdef WLAN_FEATURE_TSF_PLUS
+ uint8_t tsf_ptp_options;
+#endif /* WLAN_FEATURE_TSF_PLUS */
};
/**
diff --git a/core/hdd/inc/wlan_hdd_tsf.h b/core/hdd/inc/wlan_hdd_tsf.h
index 547e19d6cc..a1c670bc20 100644
--- a/core/hdd/inc/wlan_hdd_tsf.h
+++ b/core/hdd/inc/wlan_hdd_tsf.h
@@ -279,6 +279,15 @@ int hdd_rx_timestamp(qdf_nbuf_t netbuf, uint64_t target_time);
void hdd_capture_req_timer_expired_handler(void *arg);
+/**
+ * hdd_tsf_is_tsf64_tx_set() - check ini configuration
+ * @hdd: pointer to hdd context
+ *
+ * This function checks tsf configuration for ptp on tsf64 tx
+ *
+ * Return: true on enable, false on disable
+ */
+bool hdd_tsf_is_tsf64_tx_set(struct hdd_context *hdd);
#else
static inline int hdd_start_tsf_sync(struct hdd_adapter *adapter)
{
@@ -314,6 +323,12 @@ static inline
void hdd_capture_req_timer_expired_handler(void *arg)
{
}
+
+static inline
+bool hdd_tsf_is_tsf64_tx_set(struct hdd_context *hdd)
+{
+ return FALSE;
+}
#endif
#ifdef WLAN_FEATURE_TSF_PTP
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index fae15291ad..ccf6d2dfff 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -9844,7 +9844,8 @@ static int hdd_update_cds_config(struct hdd_context *hdd_ctx)
cds_cfg->bandcapability = band_capability;
cds_cfg->num_vdevs = hdd_ctx->config->num_vdevs;
-
+ cds_cfg->enable_tx_compl_tsf64 =
+ hdd_tsf_is_tsf64_tx_set(hdd_ctx);
hdd_txrx_populate_cds_config(cds_cfg, hdd_ctx);
hdd_lpass_populate_cds_config(cds_cfg, hdd_ctx);
cds_init_ini_config(cds_cfg);
diff --git a/core/hdd/src/wlan_hdd_tsf.c b/core/hdd/src/wlan_hdd_tsf.c
index 42fed2ea0d..f79ce52f99 100644
--- a/core/hdd/src/wlan_hdd_tsf.c
+++ b/core/hdd/src/wlan_hdd_tsf.c
@@ -261,6 +261,17 @@ bool hdd_tsf_is_dbg_fs_set(struct hdd_context *hdd)
else
return false;
}
+
+bool hdd_tsf_is_tsf64_tx_set(struct hdd_context *hdd)
+{
+ uint32_t tsf_ptp_options;
+
+ if (hdd && QDF_IS_STATUS_SUCCESS(
+ ucfg_fwol_get_tsf_ptp_options(hdd->psoc, &tsf_ptp_options)))
+ return tsf_ptp_options & CFG_SET_TSF_PTP_OPT_TSF64_TX;
+ else
+ return false;
+}
#endif
static enum hdd_tsf_op_result hdd_capture_tsf_internal(
diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h
index 7b22ee2d1f..146d7fcfc7 100644
--- a/core/wma/inc/wma.h
+++ b/core/wma/inc/wma.h
@@ -1166,6 +1166,7 @@ typedef struct {
qdf_mc_timer_t wma_fw_time_sync_timer;
qdf_atomic_t critical_events_in_flight;
bool fw_therm_throt_support;
+ bool enable_tx_compl_tsf64;
} t_wma_handle, *tp_wma_handle;
/**
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index 75bf6313ba..084bbd439d 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -396,10 +396,14 @@ int wma_vdev_tsf_handler(void *handle, uint8_t *data, uint32_t data_len)
ptsf->tsf_high = tsf_event->tsf_high;
ptsf->soc_timer_low = tsf_event->qtimer_low;
ptsf->soc_timer_high = tsf_event->qtimer_high;
-
+ ptsf->global_tsf_low = tsf_event->wlan_global_tsf_low;
+ ptsf->global_tsf_high = tsf_event->wlan_global_tsf_high;
wma_nofl_debug("receive WMI_VDEV_TSF_REPORT_EVENTID on %d, tsf: %d %d",
ptsf->vdev_id, ptsf->tsf_low, ptsf->tsf_high);
+ wma_nofl_debug("g_tsf: %d %d; soc_timer: %d %d",
+ ptsf->global_tsf_low, ptsf->global_tsf_high,
+ ptsf->soc_timer_low, ptsf->soc_timer_high);
tsf_msg.type = eWNI_SME_TSF_EVENT;
tsf_msg.bodyptr = ptsf;
tsf_msg.bodyval = 0;
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index 9c0db99bfc..61989ab3e1 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -3303,6 +3303,9 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
target_psoc_set_htc_hdl(tgt_psoc_info, htc_handle);
wma_handle->cds_context = cds_context;
wma_handle->qdf_dev = qdf_dev;
+ wma_handle->enable_tx_compl_tsf64 =
+ cds_cfg->enable_tx_compl_tsf64;
+
/* Register Converged Event handlers */
init_deinit_register_tgt_psoc_ev_handlers(psoc);
@@ -6839,6 +6842,16 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event,
cdp_cfg_set_peer_unmap_conf_support(soc, false);
}
+ if (wma_handle->enable_tx_compl_tsf64 &&
+ wmi_service_enabled(wmi_handle,
+ wmi_service_tx_compl_tsf64)) {
+ wlan_res_cfg->tstamp64_en = true;
+ cdp_cfg_set_tx_compl_tsf64(soc, true);
+ } else {
+ wlan_res_cfg->tstamp64_en = false;
+ cdp_cfg_set_tx_compl_tsf64(soc, false);
+ }
+
return 0;
}