diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/cds/inc/cds_config.h | 1 | ||||
-rw-r--r-- | core/dp/txrx/ol_tx_send.c | 94 | ||||
-rw-r--r-- | core/dp/txrx/ol_txrx.c | 35 | ||||
-rw-r--r-- | core/dp/txrx/ol_txrx.h | 19 | ||||
-rw-r--r-- | core/dp/txrx/ol_txrx_types.h | 1 | ||||
-rw-r--r-- | core/hdd/inc/wlan_hdd_cfg.h | 3 | ||||
-rw-r--r-- | core/hdd/inc/wlan_hdd_tsf.h | 15 | ||||
-rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 3 | ||||
-rw-r--r-- | core/hdd/src/wlan_hdd_tsf.c | 11 | ||||
-rw-r--r-- | core/wma/inc/wma.h | 1 | ||||
-rw-r--r-- | core/wma/src/wma_features.c | 6 | ||||
-rw-r--r-- | core/wma/src/wma_main.c | 13 |
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; } |