From 2131be63808a2c192adef259529ecd3882e49461 Mon Sep 17 00:00:00 2001 From: Jia Ding Date: Tue, 26 Apr 2022 11:27:21 +0800 Subject: [PATCH] qcacld-3.0: Configure TSF auto report to target As part of uplink delay report feature, send WMI cmd to enable and disable target automatically sending TSF report to HOST on a per vdev basis. Change-Id: I79ef5bff5b91aca311ef16d7207e9dd2fb7ae0f2 CRs-Fixed: 2991975 --- core/wma/inc/wma_api.h | 5 ++++ core/wma/inc/wma_internal.h | 23 ++++++++++++++++++ core/wma/src/wma_features.c | 48 +++++++++++++++++++++++++++++++++++++ core/wma/src/wma_main.c | 8 ++++++- 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index e9eb4eb644a4..cd9a90270991 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -50,6 +51,8 @@ typedef void *WMA_HANDLE; * @GEN_VDEV_PARAM_RX_AMPDU: Set rx ampdu size * @GEN_VDEV_PARAM_TX_AMSDU: Set tx amsdu size * @GEN_VDEV_PARAM_RX_AMSDU: Set rx amsdu size + * @GEN_PARAM_TSF_AUTO_REPORT_ENABLE: Enable auto report of clock delta change + * @GEN_PARAM_TSF_AUTO_REPORT_DISABLE: Disable auto report of clock delta change */ enum GEN_PARAM { GEN_VDEV_PARAM_AMPDU = 0x1, @@ -62,6 +65,8 @@ enum GEN_PARAM { GEN_VDEV_PARAM_RX_AMPDU, GEN_VDEV_PARAM_TX_AMSDU, GEN_VDEV_PARAM_RX_AMSDU, + GEN_PARAM_TSF_AUTO_REPORT_ENABLE, + GEN_PARAM_TSF_AUTO_REPORT_DISABLE, }; /** diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index c7fcd1fa747e..c1ffd432cb11 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1336,6 +1337,28 @@ int wma_vdev_tsf_handler(void *handle, uint8_t *data, uint32_t data_len); 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_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin); + +#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY +/** + * wma_set_tsf_auto_report() - Set TSF auto report in firmware + * @wma_handle: wma handle + * @vdev_id: vdev id + * @param_id: enum GEN_PARAM + * @ena: true for enable, and false for disable + * + * Return: QDF_STATUS_SUCCESS for success, otherwise for failure + */ +QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id, + uint32_t param_id, bool ena); +#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY */ +static inline QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, + uint32_t vdev_id, + uint32_t param_id, bool ena) +{ + return QDF_STATUS_E_FAILURE; +} +#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */ + #else static inline QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle, uint32_t vdev_id) diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 3c57aa225e64..e2532df44c4f 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -476,6 +477,53 @@ QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin) } return QDF_STATUS_SUCCESS; } + +#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY +QDF_STATUS wma_set_tsf_auto_report(WMA_HANDLE handle, uint32_t vdev_id, + uint32_t param_id, bool ena) +{ + wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd; + tp_wma_handle wma = (tp_wma_handle)handle; + struct wmi_unified *wmi_handle; + int len = sizeof(*cmd); + QDF_STATUS status; + uint8_t *buf_ptr; + wmi_buf_t buf; + + if (param_id != GEN_PARAM_TSF_AUTO_REPORT_ENABLE && + param_id != GEN_PARAM_TSF_AUTO_REPORT_DISABLE) + return QDF_STATUS_E_FAILURE; + + wmi_handle = wma->wmi_handle; + if (wmi_validate_handle(wmi_handle)) + return QDF_STATUS_E_INVAL; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + buf_ptr = (uint8_t *)wmi_buf_data(buf); + cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *)buf_ptr; + cmd->vdev_id = vdev_id; + cmd->tsf_action = ena ? TSF_TSTAMP_AUTO_REPORT_ENABLE : + TSF_TSTAMP_AUTO_REPORT_DISABLE; + + wma_debug("vdev_id %u tsf_action %d", cmd->vdev_id, cmd->tsf_action); + + WMITLV_SET_HDR( + &cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_vdev_tsf_tstamp_action_cmd_fixed_param)); + + status = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_VDEV_TSF_TSTAMP_ACTION_CMDID); + if (QDF_IS_STATUS_ERROR(status)) + wmi_buf_free(buf); + + return status; +} +#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */ #endif /** diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index d68120da0a56..bb73e6936aeb 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -1014,7 +1014,13 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma, ret = wma_reset_tsf_gpio(wma, privcmd->param_value); break; default: - wma_err("Invalid param id 0x%x", privcmd->param_id); + ret = wma_set_tsf_auto_report(wma, + privcmd->param_vdev_id, + privcmd->param_id, + privcmd->param_value); + if (ret == QDF_STATUS_E_FAILURE) + wma_err("Invalid param id 0x%x", + privcmd->param_id); break; } break;