qcacld-3.0: decouple TSF auto report from uplink delay feature
TSF auto report is a stand alone feature, which can be used to sync TQM clock and TSF clock, more than one features depend on it. Introduce a new build flag WLAN_FEATURE_TSF_AUTO_REPORT to decouple it from uplink delay feature. And also introduce trigger source for TSF auto report to identify different triggers and maintain the enablement state. Change-Id: I61005d0ba29e62995aeb88067d18ad48767bd8b5 CRs-Fixed: 3560239
This commit is contained in:
8
Kbuild
8
Kbuild
@@ -4119,8 +4119,14 @@ endif
|
|||||||
# Enable feature sync tsf for chips based on Adrastea arch
|
# Enable feature sync tsf for chips based on Adrastea arch
|
||||||
ccflags-$(CONFIG_WLAN_SYNC_TSF_PLUS_NOIRQ) += -DWLAN_FEATURE_TSF_PLUS_NOIRQ
|
ccflags-$(CONFIG_WLAN_SYNC_TSF_PLUS_NOIRQ) += -DWLAN_FEATURE_TSF_PLUS_NOIRQ
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_WLAN_TSF_UPLINK_DELAY), y)
|
||||||
# Enable uplink delay report feature
|
# Enable uplink delay report feature
|
||||||
ccflags-$(CONFIG_WLAN_TSF_UPLINK_DELAY) += -DWLAN_FEATURE_TSF_UPLINK_DELAY
|
ccflags-y += -DWLAN_FEATURE_TSF_UPLINK_DELAY
|
||||||
|
CONFIG_WLAN_TSF_AUTO_REPORT := y
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Enable TSF auto report feature
|
||||||
|
ccflags-$(CONFIG_WLAN_TSF_AUTO_REPORT) += -DWLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
|
|
||||||
ccflags-$(CONFIG_ATH_PROCFS_DIAG_SUPPORT) += -DCONFIG_ATH_PROCFS_DIAG_SUPPORT
|
ccflags-$(CONFIG_ATH_PROCFS_DIAG_SUPPORT) += -DCONFIG_ATH_PROCFS_DIAG_SUPPORT
|
||||||
|
|
||||||
|
5
Kconfig
5
Kconfig
@@ -1619,8 +1619,13 @@ config WLAN_TRACEPOINTS
|
|||||||
bool "Enable WLAN_TRACEPOINTS"
|
bool "Enable WLAN_TRACEPOINTS"
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config WLAN_TSF_AUTO_REPORT
|
||||||
|
bool "Enable WLAN_TSF_AUTO_REPORT"
|
||||||
|
default n
|
||||||
|
|
||||||
config WLAN_TSF_UPLINK_DELAY
|
config WLAN_TSF_UPLINK_DELAY
|
||||||
bool "Enable WLAN_TSF_UPLINK_DELAY"
|
bool "Enable WLAN_TSF_UPLINK_DELAY"
|
||||||
|
depends on WLAN_TSF_AUTO_REPORT
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config WLAN_TWT_CONVERGED
|
config WLAN_TWT_CONVERGED
|
||||||
|
@@ -1328,6 +1328,10 @@
|
|||||||
#define WLAN_FEATURE_TSF_PLUS_NOIRQ (1)
|
#define WLAN_FEATURE_TSF_PLUS_NOIRQ (1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_WLAN_TSF_AUTO_REPORT
|
||||||
|
#define WLAN_FEATURE_TSF_AUTO_REPORT (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_WLAN_TSF_UPLINK_DELAY
|
#ifdef CONFIG_WLAN_TSF_UPLINK_DELAY
|
||||||
#define WLAN_FEATURE_TSF_UPLINK_DELAY (1)
|
#define WLAN_FEATURE_TSF_UPLINK_DELAY (1)
|
||||||
#endif
|
#endif
|
||||||
|
@@ -331,6 +331,7 @@ CONFIG_WLAN_SYSFS_BITRATES=y
|
|||||||
CONFIG_WLAN_THERMAL_CFG=y
|
CONFIG_WLAN_THERMAL_CFG=y
|
||||||
CONFIG_WLAN_THERMAL_MULTI_CLIENT_SUPPORT=y
|
CONFIG_WLAN_THERMAL_MULTI_CLIENT_SUPPORT=y
|
||||||
CONFIG_WLAN_TRACEPOINTS=y
|
CONFIG_WLAN_TRACEPOINTS=y
|
||||||
|
CONFIG_WLAN_TSF_AUTO_REPORT=y
|
||||||
CONFIG_WLAN_TSF_UPLINK_DELAY=y
|
CONFIG_WLAN_TSF_UPLINK_DELAY=y
|
||||||
CONFIG_WLAN_TWT_CONVERGED=y
|
CONFIG_WLAN_TWT_CONVERGED=y
|
||||||
CONFIG_WLAN_TWT_SAP_PDEV_COUNT=y
|
CONFIG_WLAN_TWT_SAP_PDEV_COUNT=y
|
||||||
|
@@ -72,6 +72,51 @@ struct hdd_tsf_op_response {
|
|||||||
uint64_t soc_time;
|
uint64_t soc_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum hdd_tsf_auto_rpt_source - trigger source of tsf auto report
|
||||||
|
* @HDD_TSF_AUTO_RPT_SOURCE_UPLINK_DELAY: uplink delay feature
|
||||||
|
* @HDD_TSF_AUTO_RPT_SOURCE_TX_LATENCY: transmit latency statistics
|
||||||
|
*/
|
||||||
|
enum hdd_tsf_auto_rpt_source {
|
||||||
|
HDD_TSF_AUTO_RPT_SOURCE_UPLINK_DELAY,
|
||||||
|
HDD_TSF_AUTO_RPT_SOURCE_TX_LATENCY,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
|
/**
|
||||||
|
* hdd_set_tsf_auto_report() - enable or disable tsf auto report
|
||||||
|
* for an adapter
|
||||||
|
* @adapter: pointer to Adapter context
|
||||||
|
* @ena: requesting state (true or false)
|
||||||
|
* @source: source of the request
|
||||||
|
*
|
||||||
|
* Return: 0 for success or non-zero negative failure code
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
hdd_set_tsf_auto_report(struct hdd_adapter *adapter, bool ena,
|
||||||
|
enum hdd_tsf_auto_rpt_source source);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hdd_tsf_auto_report_init() - initialize tsf auto report related
|
||||||
|
* structures for an adapter
|
||||||
|
* @adapter: pointer to Adapter context
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void hdd_tsf_auto_report_init(struct hdd_adapter *adapter);
|
||||||
|
#else
|
||||||
|
static inline int
|
||||||
|
hdd_set_tsf_auto_report(struct hdd_adapter *adapter, bool ena,
|
||||||
|
enum hdd_tsf_auto_rpt_source source)
|
||||||
|
{
|
||||||
|
return -ENOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void hdd_tsf_auto_report_init(struct hdd_adapter *adapter)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct hdd_vdev_tsf - Adapter level tsf params
|
* struct hdd_vdev_tsf - Adapter level tsf params
|
||||||
* @cur_target_time: tsf value received from firmware.
|
* @cur_target_time: tsf value received from firmware.
|
||||||
@@ -97,7 +142,7 @@ struct hdd_tsf_op_response {
|
|||||||
* @continuous_cap_retry_count: to store the count of continuous capture retry.
|
* @continuous_cap_retry_count: to store the count of continuous capture retry.
|
||||||
* @tsf_sync_ready_flag: to indicate whether tsf_sync has been initialized.
|
* @tsf_sync_ready_flag: to indicate whether tsf_sync has been initialized.
|
||||||
* @gpio_tsf_sync_work: work to sync send TSF CAP WMI command.
|
* @gpio_tsf_sync_work: work to sync send TSF CAP WMI command.
|
||||||
* @tsf_auto_report: to indicate if TSF auto report is enabled or not.
|
* @auto_rpt_src: bitmap to record trigger sources of TSF auto report
|
||||||
*/
|
*/
|
||||||
struct hdd_vdev_tsf {
|
struct hdd_vdev_tsf {
|
||||||
uint64_t cur_target_time;
|
uint64_t cur_target_time;
|
||||||
@@ -130,8 +175,9 @@ struct hdd_vdev_tsf {
|
|||||||
qdf_work_t gpio_tsf_sync_work;
|
qdf_work_t gpio_tsf_sync_work;
|
||||||
#endif
|
#endif
|
||||||
#endif /* WLAN_FEATURE_TSF_PLUS */
|
#endif /* WLAN_FEATURE_TSF_PLUS */
|
||||||
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
|
#ifdef WLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
qdf_atomic_t tsf_auto_report;
|
unsigned long auto_rpt_src;
|
||||||
|
|
||||||
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -4377,6 +4377,7 @@ QDF_STATUS hdd_init_ap_mode(struct hdd_adapter *adapter,
|
|||||||
/* rcpi info initialization */
|
/* rcpi info initialization */
|
||||||
qdf_mem_zero(&adapter->rcpi, sizeof(adapter->rcpi));
|
qdf_mem_zero(&adapter->rcpi, sizeof(adapter->rcpi));
|
||||||
|
|
||||||
|
hdd_tsf_auto_report_init(adapter);
|
||||||
hdd_exit();
|
hdd_exit();
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@@ -7517,7 +7517,9 @@ QDF_STATUS hdd_init_station_mode(struct wlan_hdd_link_info *link_info)
|
|||||||
goto error_wmm_init;
|
goto error_wmm_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hdd_tsf_auto_report_init(adapter);
|
||||||
hdd_objmgr_put_vdev_by_user(vdev, WLAN_INIT_DEINIT_ID);
|
hdd_objmgr_put_vdev_by_user(vdev, WLAN_INIT_DEINIT_ID);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
error_wmm_init:
|
error_wmm_init:
|
||||||
@@ -9682,7 +9684,6 @@ QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx)
|
|||||||
WLAN_DATA_FLOW_CONTROL);
|
WLAN_DATA_FLOW_CONTROL);
|
||||||
|
|
||||||
hdd_reset_scan_operation(link_info);
|
hdd_reset_scan_operation(link_info);
|
||||||
|
|
||||||
if (test_bit(WMM_INIT_DONE, &adapter->event_flags)) {
|
if (test_bit(WMM_INIT_DONE, &adapter->event_flags)) {
|
||||||
hdd_wmm_adapter_close(adapter);
|
hdd_wmm_adapter_close(adapter);
|
||||||
clear_bit(WMM_INIT_DONE, &adapter->event_flags);
|
clear_bit(WMM_INIT_DONE, &adapter->event_flags);
|
||||||
|
@@ -672,6 +672,7 @@ int hdd_init_nan_data_mode(struct hdd_adapter *adapter)
|
|||||||
|
|
||||||
hdd_set_netdev_flags(adapter);
|
hdd_set_netdev_flags(adapter);
|
||||||
|
|
||||||
|
hdd_tsf_auto_report_init(adapter);
|
||||||
update_ndi_state(adapter, NAN_DATA_NDI_CREATING_STATE);
|
update_ndi_state(adapter, NAN_DATA_NDI_CREATING_STATE);
|
||||||
hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
|
hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
@@ -35,7 +35,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ol_txrx_api.h"
|
#include "ol_txrx_api.h"
|
||||||
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
|
#ifdef WLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
#include <cdp_txrx_ctrl.h>
|
#include <cdp_txrx_ctrl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -3000,18 +3000,23 @@ static void wlan_hdd_phc_deinit(struct hdd_context *hdd_ctx)
|
|||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_TSF_PTP */
|
#endif /* WLAN_FEATURE_TSF_PTP */
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
|
#ifdef WLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
static int hdd_set_tsf_auto_report(struct hdd_adapter *adapter, bool ena)
|
void hdd_tsf_auto_report_init(struct hdd_adapter *adapter)
|
||||||
{
|
{
|
||||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
adapter->tsf.auto_rpt_src = 0;
|
||||||
int ret;
|
}
|
||||||
|
|
||||||
if (QDF_IS_STATUS_ERROR(cdp_set_tsf_ul_delay_report(
|
int
|
||||||
soc,
|
hdd_set_tsf_auto_report(struct hdd_adapter *adapter, bool ena,
|
||||||
adapter->deflink->vdev_id,
|
enum hdd_tsf_auto_rpt_source source)
|
||||||
ena))) {
|
{
|
||||||
hdd_err_rl("Set tsf report uplink delay failed");
|
int ret = 0;
|
||||||
return -EPERM;
|
bool enabled;
|
||||||
|
|
||||||
|
enabled = !!adapter->tsf.auto_rpt_src;
|
||||||
|
if (enabled == ena) {
|
||||||
|
hdd_info_rl("current %d and no action is required", enabled);
|
||||||
|
goto set_src;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wma_cli_set_command((int)adapter->deflink->vdev_id,
|
ret = wma_cli_set_command((int)adapter->deflink->vdev_id,
|
||||||
@@ -3019,67 +3024,58 @@ static int hdd_set_tsf_auto_report(struct hdd_adapter *adapter, bool ena)
|
|||||||
(int)GEN_PARAM_TSF_AUTO_REPORT_DISABLE,
|
(int)GEN_PARAM_TSF_AUTO_REPORT_DISABLE,
|
||||||
ena, GEN_CMD);
|
ena, GEN_CMD);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
hdd_err_rl("tsf auto report %d failed", ena);
|
hdd_err_rl("tsf auto report %d failed: %d", ena, ret);
|
||||||
return -EINPROGRESS;
|
ret = -EINPROGRESS;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_atomic_set(&adapter->tsf.tsf_auto_report, ena);
|
set_src:
|
||||||
|
if (ena)
|
||||||
|
qdf_atomic_set_bit(source, &adapter->tsf.auto_rpt_src);
|
||||||
|
else
|
||||||
|
qdf_atomic_clear_bit(source, &adapter->tsf.auto_rpt_src);
|
||||||
|
|
||||||
return 0;
|
out:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hdd_handle_tsf_auto_report(): Handle TSF auto report enable or disable
|
* hdd_tsf_auto_report_enabled() - get current state of tsf auto report
|
||||||
* @adapter: pointer of struct hdd_adapter
|
* for an adapter
|
||||||
* @tsf_cmd: TSF command from user space
|
* @adapter: pointer to Adapter context
|
||||||
*
|
*
|
||||||
* Return: 0 for success, -EINVAL to continue to handle other TSF commands and
|
* Return: true for enabled, false for disabled
|
||||||
* else errors
|
|
||||||
*/
|
*/
|
||||||
static int hdd_handle_tsf_auto_report(struct hdd_adapter *adapter,
|
static inline bool hdd_tsf_auto_report_enabled(struct hdd_adapter *adapter)
|
||||||
uint32_t tsf_cmd)
|
|
||||||
{
|
{
|
||||||
bool ena;
|
return !!adapter->tsf.auto_rpt_src;
|
||||||
|
|
||||||
if (tsf_cmd != QCA_TSF_AUTO_REPORT_ENABLE &&
|
|
||||||
tsf_cmd != QCA_TSF_AUTO_REPORT_DISABLE) {
|
|
||||||
hdd_debug_rl("tsf_cmd %d not for uplink delay", tsf_cmd);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* uplink delay feature is required for STA and P2P-GC mode */
|
|
||||||
if (adapter->device_mode != QDF_STA_MODE &&
|
|
||||||
adapter->device_mode != QDF_P2P_CLIENT_MODE) {
|
|
||||||
hdd_debug_rl("tsf_cmd %d not allowed for device mode %d",
|
|
||||||
tsf_cmd, adapter->device_mode);
|
|
||||||
return -EPERM;
|
|
||||||
}
|
|
||||||
|
|
||||||
ena = (tsf_cmd == QCA_TSF_AUTO_REPORT_ENABLE) ? true : false;
|
|
||||||
|
|
||||||
return hdd_set_tsf_auto_report(adapter, ena);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hdd_set_delta_tsf() - calculate and save the time difference between
|
||||||
|
* TQM clock and TSF clock
|
||||||
|
* @adapter: pointer to Adapter context
|
||||||
|
* @ptsf: pointer to tsf information
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
static QDF_STATUS hdd_set_delta_tsf(struct hdd_adapter *adapter,
|
static QDF_STATUS hdd_set_delta_tsf(struct hdd_adapter *adapter,
|
||||||
struct stsf *ptsf)
|
struct stsf *ptsf)
|
||||||
{
|
{
|
||||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||||
uint32_t delta_tsf;
|
uint32_t delta_tsf;
|
||||||
|
|
||||||
/* If TSF report is for uplink delay, mac_id_valid will be set to
|
/* A tsf report event with mac_id_valid equals to 1 represents
|
||||||
* 1 by target. If not, the report is not for uplink delay feature
|
* for tsf auto report, that's what we need to handle in this
|
||||||
* and return failure here so that legacy BSS TSF logic can be
|
* function; otherwise, return failure here so that legacy BSS
|
||||||
* continued.
|
* TSF logic can be continued.
|
||||||
*/
|
*/
|
||||||
if (!ptsf->mac_id_valid) {
|
if (!ptsf->mac_id_valid) {
|
||||||
hdd_debug_rl("TSF report not for uplink delay");
|
hdd_debug_rl("Not TSF auto report");
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For uplink delay feature, TSF auto report needs to be enabled
|
if (!hdd_tsf_auto_report_enabled(adapter)) {
|
||||||
* first. Otherwise TSF event will not be posted by target.
|
|
||||||
*/
|
|
||||||
if (!qdf_atomic_read(&adapter->tsf.tsf_auto_report)) {
|
|
||||||
hdd_debug_rl("adapter %u tsf_auto_report disabled",
|
hdd_debug_rl("adapter %u tsf_auto_report disabled",
|
||||||
adapter->deflink->vdev_id);
|
adapter->deflink->vdev_id);
|
||||||
goto exit_with_success;
|
goto exit_with_success;
|
||||||
@@ -3089,7 +3085,7 @@ static QDF_STATUS hdd_set_delta_tsf(struct hdd_adapter *adapter,
|
|||||||
hdd_debug("vdev %u tsf_low %u qtimer_low %u delta_tsf %u",
|
hdd_debug("vdev %u tsf_low %u qtimer_low %u delta_tsf %u",
|
||||||
ptsf->vdev_id, ptsf->tsf_low, ptsf->soc_timer_low, delta_tsf);
|
ptsf->vdev_id, ptsf->tsf_low, ptsf->soc_timer_low, delta_tsf);
|
||||||
|
|
||||||
/* Pass delta_tsf to DP layer to report uplink delay
|
/* Pass delta_tsf to DP layer to calculate hw delay
|
||||||
* on a per vdev basis
|
* on a per vdev basis
|
||||||
*/
|
*/
|
||||||
cdp_set_delta_tsf(soc, adapter->deflink->vdev_id, delta_tsf);
|
cdp_set_delta_tsf(soc, adapter->deflink->vdev_id, delta_tsf);
|
||||||
@@ -3097,6 +3093,45 @@ static QDF_STATUS hdd_set_delta_tsf(struct hdd_adapter *adapter,
|
|||||||
exit_with_success:
|
exit_with_success:
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#else /* !WLAN_FEATURE_TSF_AUTO_REPORT */
|
||||||
|
static inline QDF_STATUS hdd_set_delta_tsf(struct hdd_adapter *adapter,
|
||||||
|
struct stsf *ptsf)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool hdd_tsf_auto_report_enabled(struct hdd_adapter *adapter)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif /* WLAN_FEATURE_TSF_AUTO_REPORT */
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
|
||||||
|
/**
|
||||||
|
* hdd_set_tsf_ul_delay_report() - enable or disable tsf uplink delay report
|
||||||
|
* for an adapter
|
||||||
|
* @adapter: pointer to Adapter context
|
||||||
|
* @ena: requesting state (true or false)
|
||||||
|
*
|
||||||
|
* Return: 0 for success or non-zero negative failure code
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
hdd_set_tsf_ul_delay_report(struct hdd_adapter *adapter, bool ena)
|
||||||
|
{
|
||||||
|
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
status = cdp_set_tsf_ul_delay_report(soc,
|
||||||
|
adapter->deflink->vdev_id,
|
||||||
|
ena);
|
||||||
|
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
hdd_err_rl("Set tsf report uplink delay failed");
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t hdd_get_uplink_delay_len(struct hdd_adapter *adapter)
|
uint32_t hdd_get_uplink_delay_len(struct hdd_adapter *adapter)
|
||||||
{
|
{
|
||||||
@@ -3117,7 +3152,7 @@ QDF_STATUS hdd_add_uplink_delay(struct hdd_adapter *adapter,
|
|||||||
adapter->device_mode != QDF_P2P_CLIENT_MODE)
|
adapter->device_mode != QDF_P2P_CLIENT_MODE)
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (qdf_atomic_read(&adapter->tsf.tsf_auto_report)) {
|
if (hdd_tsf_auto_report_enabled(adapter)) {
|
||||||
status = cdp_get_uplink_delay(soc, adapter->deflink->vdev_id,
|
status = cdp_get_uplink_delay(soc, adapter->deflink->vdev_id,
|
||||||
&ul_delay);
|
&ul_delay);
|
||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
@@ -3132,18 +3167,11 @@ QDF_STATUS hdd_add_uplink_delay(struct hdd_adapter *adapter,
|
|||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY */
|
static inline int
|
||||||
static inline int hdd_handle_tsf_auto_report(struct hdd_adapter *adapter,
|
hdd_set_tsf_ul_delay_report(struct hdd_adapter *adapter, bool ena)
|
||||||
uint32_t tsf_cmd)
|
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -ENOTSUPP;
|
||||||
}
|
|
||||||
|
|
||||||
static inline QDF_STATUS hdd_set_delta_tsf(struct hdd_adapter *adapter,
|
|
||||||
struct stsf *ptsf)
|
|
||||||
{
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
||||||
|
|
||||||
@@ -3187,7 +3215,7 @@ int hdd_get_tsf_cb(void *pcb_cxt, struct stsf *ptsf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
adapter = link_info->adapter;
|
adapter = link_info->adapter;
|
||||||
/* Intercept tsf report and check if it is for uplink delay.
|
/* Intercept tsf report and check if it is for auto report.
|
||||||
* If yes, return in advance and skip the legacy BSS TSF
|
* If yes, return in advance and skip the legacy BSS TSF
|
||||||
* report. Otherwise continue on to the legacy BSS TSF
|
* report. Otherwise continue on to the legacy BSS TSF
|
||||||
* report logic.
|
* report logic.
|
||||||
@@ -3268,6 +3296,9 @@ static int __wlan_hdd_cfg80211_handle_tsf_cmd(struct wiphy *wiphy,
|
|||||||
uint32_t tsf_cmd;
|
uint32_t tsf_cmd;
|
||||||
enum qca_nl80211_vendor_subcmds_index index =
|
enum qca_nl80211_vendor_subcmds_index index =
|
||||||
QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX;
|
QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX;
|
||||||
|
bool enable_auto_rpt;
|
||||||
|
enum hdd_tsf_auto_rpt_source source =
|
||||||
|
HDD_TSF_AUTO_RPT_SOURCE_UPLINK_DELAY;
|
||||||
|
|
||||||
hdd_enter_dev(wdev->netdev);
|
hdd_enter_dev(wdev->netdev);
|
||||||
|
|
||||||
@@ -3292,13 +3323,22 @@ static int __wlan_hdd_cfg80211_handle_tsf_cmd(struct wiphy *wiphy,
|
|||||||
}
|
}
|
||||||
tsf_cmd = nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_TSF_CMD]);
|
tsf_cmd = nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_TSF_CMD]);
|
||||||
|
|
||||||
/* Intercept tsf_cmd for TSF auto report enable or disable subcmds.
|
/* Intercept tsf_cmd for TSF auto report enable or disable subcmds,
|
||||||
* If status is -EINVAL, it means tsf_cmd is not for auto report and
|
* and treat as trigger for uplink delay report.
|
||||||
* need to continue to handle other tsf cmds.
|
|
||||||
*/
|
*/
|
||||||
status = hdd_handle_tsf_auto_report(adapter, tsf_cmd);
|
if (tsf_cmd == QCA_TSF_AUTO_REPORT_DISABLE ||
|
||||||
if (status != -EINVAL)
|
tsf_cmd == QCA_TSF_AUTO_REPORT_ENABLE) {
|
||||||
|
enable_auto_rpt = (tsf_cmd == QCA_TSF_AUTO_REPORT_ENABLE);
|
||||||
|
status = hdd_set_tsf_auto_report(adapter,
|
||||||
|
enable_auto_rpt,
|
||||||
|
source);
|
||||||
|
if (status)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
hdd_set_tsf_ul_delay_report(adapter, enable_auto_rpt);
|
||||||
goto end;
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
ret = qdf_event_reset(&tsf_sync_get_completion_evt);
|
ret = qdf_event_reset(&tsf_sync_get_completion_evt);
|
||||||
if (QDF_IS_STATUS_ERROR(ret))
|
if (QDF_IS_STATUS_ERROR(ret))
|
||||||
hdd_warn("failed to reset tsf_sync_get_completion_evt");
|
hdd_warn("failed to reset tsf_sync_get_completion_evt");
|
||||||
|
@@ -1245,7 +1245,7 @@ QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle, uint32_t vdev_id);
|
|||||||
QDF_STATUS wma_reset_tsf_gpio(tp_wma_handle wma_handle, uint32_t vdev_id);
|
QDF_STATUS wma_reset_tsf_gpio(tp_wma_handle wma_handle, uint32_t vdev_id);
|
||||||
QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin);
|
QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin);
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
|
#ifdef WLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
/**
|
/**
|
||||||
* wma_set_tsf_auto_report() - Set TSF auto report in firmware
|
* wma_set_tsf_auto_report() - Set TSF auto report in firmware
|
||||||
* @wma_handle: wma handle
|
* @wma_handle: wma handle
|
||||||
@@ -1257,14 +1257,14 @@ QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin);
|
|||||||
*/
|
*/
|
||||||
QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id,
|
QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id,
|
||||||
uint32_t param_id, bool ena);
|
uint32_t param_id, bool ena);
|
||||||
#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY */
|
#else /* !WLAN_FEATURE_TSF_AUTO_REPORT */
|
||||||
static inline QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle,
|
static inline QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle,
|
||||||
uint32_t vdev_id,
|
uint32_t vdev_id,
|
||||||
uint32_t param_id, bool ena)
|
uint32_t param_id, bool ena)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
#endif /* WLAN_FEATURE_TSF_AUTO_REPORT */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle,
|
static inline QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle,
|
||||||
|
@@ -318,7 +318,7 @@ end:
|
|||||||
|
|
||||||
#ifdef WLAN_FEATURE_TSF
|
#ifdef WLAN_FEATURE_TSF
|
||||||
|
|
||||||
#if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(QCA_GET_TSF_VIA_REG)
|
#if defined(WLAN_FEATURE_TSF_AUTO_REPORT) || defined(QCA_GET_TSF_VIA_REG)
|
||||||
static inline void
|
static inline void
|
||||||
wma_vdev_tsf_set_mac_id_tsf_id(struct stsf *ptsf, uint32_t mac_id,
|
wma_vdev_tsf_set_mac_id_tsf_id(struct stsf *ptsf, uint32_t mac_id,
|
||||||
uint32_t mac_id_valid, uint32_t tsf_id,
|
uint32_t mac_id_valid, uint32_t tsf_id,
|
||||||
@@ -333,14 +333,14 @@ wma_vdev_tsf_set_mac_id_tsf_id(struct stsf *ptsf, uint32_t mac_id,
|
|||||||
ptsf->mac_id, ptsf->mac_id_valid, ptsf->tsf_id,
|
ptsf->mac_id, ptsf->mac_id_valid, ptsf->tsf_id,
|
||||||
ptsf->tsf_id_valid);
|
ptsf->tsf_id_valid);
|
||||||
}
|
}
|
||||||
#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY || !QCA_GET_TSF_VIA_REG*/
|
#else /* !(WLAN_FEATURE_TSF_AUTO_REPORT || QCA_GET_TSF_VIA_REG) */
|
||||||
static inline void
|
static inline void
|
||||||
wma_vdev_tsf_set_mac_id_tsf_id(struct stsf *ptsf, uint32_t mac_id,
|
wma_vdev_tsf_set_mac_id_tsf_id(struct stsf *ptsf, uint32_t mac_id,
|
||||||
uint32_t mac_id_valid, uint32_t tsf_id,
|
uint32_t mac_id_valid, uint32_t tsf_id,
|
||||||
uint32_t tsf_id_valid)
|
uint32_t tsf_id_valid)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY || QCA_GET_TSF_VIA_REG*/
|
#endif /* WLAN_FEATURE_TSF_AUTO_REPORT || QCA_GET_TSF_VIA_REG */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wma_vdev_tsf_handler() - handle tsf event indicated by FW
|
* wma_vdev_tsf_handler() - handle tsf event indicated by FW
|
||||||
@@ -515,7 +515,7 @@ QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
|
#ifdef WLAN_FEATURE_TSF_AUTO_REPORT
|
||||||
QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id,
|
QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id,
|
||||||
uint32_t param_id, bool ena)
|
uint32_t param_id, bool ena)
|
||||||
{
|
{
|
||||||
@@ -560,7 +560,7 @@ QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id,
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
|
#endif /* WLAN_FEATURE_TSF_AUTO_REPORT */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user