From fcf5fb5a7588eee60f8a704052f8cde24c25647f Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Mon, 28 Jun 2021 22:07:22 +0530 Subject: [PATCH] qcacld-3.0: Move dump in progress feature to separate file With this change introduce featurization for dump in progress and move implementation related to this feature to new files. Change-Id: I4614aecde57a9c5ffec765f3afaa943c58956132 CRs-Fixed: 2979226 --- Kbuild | 4 + configs/default_defconfig | 1 + .../hdd/inc/wlan_hdd_sysfs_dump_in_progress.h | 52 ++++++ core/hdd/src/wlan_hdd_sysfs.c | 133 +-------------- .../hdd/src/wlan_hdd_sysfs_dump_in_progress.c | 159 ++++++++++++++++++ 5 files changed, 219 insertions(+), 130 deletions(-) create mode 100644 core/hdd/inc/wlan_hdd_sysfs_dump_in_progress.h create mode 100644 core/hdd/src/wlan_hdd_sysfs_dump_in_progress.c diff --git a/Kbuild b/Kbuild index 3b8ff4a338ef..f047f315c09b 100644 --- a/Kbuild +++ b/Kbuild @@ -389,6 +389,9 @@ HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_dp_aggregation.o ifeq ($(CONFIG_DP_SWLM), y) HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_swlm.o endif +ifeq ($(CONFIG_WLAN_DUMP_IN_PROGRESS), y) +HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_dump_in_progress.o +endif endif ifeq ($(CONFIG_QCACLD_FEATURE_FW_STATE), y) @@ -2799,6 +2802,7 @@ cppflags-$(CONFIG_WLAN_SYSFS_HE_BSS_COLOR) += -DWLAN_SYSFS_HE_BSS_COLOR cppflags-$(CONFIG_WLAN_SYSFS_STA_INFO) += -DWLAN_SYSFS_STA_INFO cppflags-$(CONFIG_WLAN_DL_MODES) += -DCONFIG_WLAN_DL_MODES cppflags-$(CONFIG_WLAN_THERMAL_MULTI_CLIENT_SUPPORT) += -DFEATURE_WPSS_THERMAL_MITIGATION +cppflags-$(CONFIG_WLAN_DUMP_IN_PROGRESS) += -DCONFIG_WLAN_DUMP_IN_PROGRESS ifeq ($(CONFIG_LEAK_DETECTION), y) cppflags-y += \ diff --git a/configs/default_defconfig b/configs/default_defconfig index a8c74d2baf3a..6f985745be60 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -238,6 +238,7 @@ endif CONFIG_WLAN_SYSFS_TEMPERATURE := y CONFIG_WLAN_THERMAL_CFG := y CONFIG_WLAN_DL_MODES := y + CONFIG_WLAN_DUMP_IN_PROGRESS := y endif CONFIG_WLAN_POWER_DEBUG := y diff --git a/core/hdd/inc/wlan_hdd_sysfs_dump_in_progress.h b/core/hdd/inc/wlan_hdd_sysfs_dump_in_progress.h new file mode 100644 index 000000000000..72f50cadfa42 --- /dev/null +++ b/core/hdd/inc/wlan_hdd_sysfs_dump_in_progress.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017-2021 The Linux Foundation. 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 + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: wlan_hdd_sysfs_dump_in_progress.h + * + * hdd dump in progress declarations + */ + +#if defined(WLAN_SYSFS) && defined(CONFIG_WLAN_DUMP_IN_PROGRESS) +/** + * hdd_sysfs_create_dump_in_progress_interface() - API to create + * dump_in_progress sysfs file + * @wifi_kobject: sysfs wifi kobject + * + * Return: None + */ +void hdd_sysfs_create_dump_in_progress_interface(struct kobject *wifi_kobject); + +/** + * hdd_sysfs_destroy_dump_in_progress_interface() - API to destroy + * dump_in_progress sysfs file + * @driver_kobject: sysfs driver kobject + * + * Return: None + */ +void hdd_sysfs_destroy_dump_in_progress_interface(struct kobject *wifi_kobject); +#else +static inline void +hdd_sysfs_create_dump_in_progress_interface(struct kobject *wifi_kobject) +{ +} +static inline void +hdd_sysfs_destroy_dump_in_progress_interface(struct kobject *wifi_kobject) +{ +} +#endif diff --git a/core/hdd/src/wlan_hdd_sysfs.c b/core/hdd/src/wlan_hdd_sysfs.c index bc8a680e17f3..3487c64561ac 100644 --- a/core/hdd/src/wlan_hdd_sysfs.c +++ b/core/hdd/src/wlan_hdd_sysfs.c @@ -76,6 +76,7 @@ #include #include #include +#include #include "wma_api.h" #define MAX_PSOC_ID_SIZE 10 @@ -495,109 +496,6 @@ static DEVICE_ATTR(beacon_stats, 0444, show_beacon_reception_stats, NULL); #endif -static ssize_t -__hdd_sysfs_dump_in_progress_store(struct hdd_context *hdd_ctx, - struct kobj_attribute *attr, - char const *buf, size_t count) -{ - char buf_local[MAX_SYSFS_USER_COMMAND_SIZE_LENGTH + 1]; - char *sptr, *token; - int value, ret; - - if (!wlan_hdd_validate_modules_state(hdd_ctx)) - return -EINVAL; - - ret = hdd_sysfs_validate_and_copy_buf(buf_local, sizeof(buf_local), - buf, count); - if (ret) { - hdd_err_rl("invalid input"); - return ret; - } - - sptr = buf_local; - /* Get value */ - token = strsep(&sptr, " "); - if (!token) - return -EINVAL; - if (kstrtou32(token, 0, &value)) - return -EINVAL; - - hdd_debug_rl("dump in progress %d", value); - if (value < 0 || value > 1) - return -EINVAL; - - hdd_ctx->dump_in_progress = value; - - return count; -} - -static ssize_t hdd_sysfs_dump_in_progress_store(struct kobject *kobj, - struct kobj_attribute *attr, - char const *buf, size_t count) -{ - struct osif_psoc_sync *psoc_sync; - struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); - ssize_t errno_size; - int ret; - - ret = wlan_hdd_validate_context(hdd_ctx); - if (ret != 0) - return ret; - - errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), - &psoc_sync); - if (errno_size) - return errno_size; - - errno_size = __hdd_sysfs_dump_in_progress_store(hdd_ctx, attr, - buf, count); - - osif_psoc_sync_op_stop(psoc_sync); - - return errno_size; -} - -static ssize_t __hdd_sysfs_dump_in_progress_show(struct hdd_context *hdd_ctx, - struct kobj_attribute *attr, - char *buf) -{ - ssize_t ret_val; - - hdd_debug_rl("dump in progress %d", hdd_ctx->dump_in_progress); - ret_val = scnprintf(buf, PAGE_SIZE, "%d\n", hdd_ctx->dump_in_progress); - - return ret_val; -} - -static ssize_t hdd_sysfs_dump_in_progress_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - struct osif_psoc_sync *psoc_sync; - struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); - ssize_t errno_size; - int ret; - - ret = wlan_hdd_validate_context(hdd_ctx); - if (ret != 0) - return ret; - - errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), - &psoc_sync); - if (errno_size) - return errno_size; - - errno_size = __hdd_sysfs_dump_in_progress_show(hdd_ctx, attr, buf); - - osif_psoc_sync_op_stop(psoc_sync); - - return errno_size; -} - -static struct kobj_attribute dump_in_progress_attribute = - __ATTR(dump_in_progress, 0660, hdd_sysfs_dump_in_progress_show, - hdd_sysfs_dump_in_progress_store); - static struct kobj_attribute dr_ver_attribute = __ATTR(driver_version, 0440, show_driver_version, NULL); static struct kobj_attribute fw_ver_attribute = @@ -683,31 +581,6 @@ static void hdd_sysfs_destroy_wifi_root_obj(void) wifi_kobject = NULL; } -static void hdd_sysfs_create_dump_in_progress_interface(void) -{ - int error; - - if (!wifi_kobject) { - hdd_err("could not get wifi kobject!"); - return; - } - error = sysfs_create_file(wifi_kobject, - &dump_in_progress_attribute.attr); - if (error) - hdd_err("could not create dump in progress sysfs file"); -} - -static void hdd_sysfs_destroy_dump_in_progress_interface(void) -{ - if (!wifi_kobject) { - hdd_err("could not get wifi kobject!"); - return; - } - - sysfs_remove_file(wifi_kobject, - &dump_in_progress_attribute.attr); -} - #ifdef WLAN_POWER_DEBUG static void hdd_sysfs_create_powerstats_interface(void) { @@ -976,7 +849,7 @@ void hdd_create_sysfs_files(struct hdd_context *hdd_ctx) hdd_sysfs_create_wifi_root_obj(); if (QDF_GLOBAL_MISSION_MODE == hdd_get_conparam()) { hdd_sysfs_create_powerstats_interface(); - hdd_sysfs_create_dump_in_progress_interface(); + hdd_sysfs_create_dump_in_progress_interface(wifi_kobject); hdd_sysfs_fw_mode_config_create(driver_kobject); hdd_sysfs_scan_disable_create(driver_kobject); hdd_sysfs_wow_ito_create(driver_kobject); @@ -1011,7 +884,7 @@ void hdd_destroy_sysfs_files(void) hdd_sysfs_wow_ito_destroy(driver_kobject); hdd_sysfs_scan_disable_destroy(driver_kobject); hdd_sysfs_fw_mode_config_destroy(driver_kobject); - hdd_sysfs_destroy_dump_in_progress_interface(); + hdd_sysfs_destroy_dump_in_progress_interface(wifi_kobject); hdd_sysfs_destroy_powerstats_interface(); } hdd_sysfs_destroy_wifi_root_obj(); diff --git a/core/hdd/src/wlan_hdd_sysfs_dump_in_progress.c b/core/hdd/src/wlan_hdd_sysfs_dump_in_progress.c new file mode 100644 index 000000000000..b54855ebd6f7 --- /dev/null +++ b/core/hdd/src/wlan_hdd_sysfs_dump_in_progress.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2017-2021 The Linux Foundation. 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 + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: wlan_hdd_sysfs_dump_in_progress.c + * + * Dump in progress sysfs implementation + */ + +#include + +#include "wlan_hdd_includes.h" +#include "wlan_hdd_sysfs_dump_in_progress.h" +#include "wlan_hdd_sysfs.h" +#include "osif_sync.h" + +static ssize_t +__hdd_sysfs_dump_in_progress_store(struct hdd_context *hdd_ctx, + struct kobj_attribute *attr, + char const *buf, size_t count) +{ + char buf_local[MAX_SYSFS_USER_COMMAND_SIZE_LENGTH + 1]; + char *sptr, *token; + int value, ret; + + if (!wlan_hdd_validate_modules_state(hdd_ctx)) + return -EINVAL; + + ret = hdd_sysfs_validate_and_copy_buf(buf_local, sizeof(buf_local), + buf, count); + if (ret) { + hdd_err_rl("invalid input"); + return ret; + } + + sptr = buf_local; + /* Get value */ + token = strsep(&sptr, " "); + if (!token) + return -EINVAL; + if (kstrtou32(token, 0, &value)) + return -EINVAL; + + hdd_debug_rl("dump in progress %d", value); + if (value < 0 || value > 1) + return -EINVAL; + + hdd_ctx->dump_in_progress = value; + + return count; +} + +static ssize_t hdd_sysfs_dump_in_progress_store(struct kobject *kobj, + struct kobj_attribute *attr, + char const *buf, size_t count) +{ + struct osif_psoc_sync *psoc_sync; + struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + ssize_t errno_size; + int ret; + + ret = wlan_hdd_validate_context(hdd_ctx); + if (ret != 0) + return ret; + + errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), + &psoc_sync); + if (errno_size) + return errno_size; + + errno_size = __hdd_sysfs_dump_in_progress_store(hdd_ctx, attr, + buf, count); + + osif_psoc_sync_op_stop(psoc_sync); + + return errno_size; +} + +static ssize_t __hdd_sysfs_dump_in_progress_show(struct hdd_context *hdd_ctx, + struct kobj_attribute *attr, + char *buf) +{ + ssize_t ret_val; + + hdd_debug_rl("dump in progress %d", hdd_ctx->dump_in_progress); + ret_val = scnprintf(buf, PAGE_SIZE, "%d\n", hdd_ctx->dump_in_progress); + + return ret_val; +} + +static ssize_t hdd_sysfs_dump_in_progress_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + struct osif_psoc_sync *psoc_sync; + struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + ssize_t errno_size; + int ret; + + ret = wlan_hdd_validate_context(hdd_ctx); + if (ret != 0) + return ret; + + errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), + &psoc_sync); + if (errno_size) + return errno_size; + + errno_size = __hdd_sysfs_dump_in_progress_show(hdd_ctx, attr, buf); + + osif_psoc_sync_op_stop(psoc_sync); + + return errno_size; +} + +static struct kobj_attribute dump_in_progress_attribute = + __ATTR(dump_in_progress, 0660, hdd_sysfs_dump_in_progress_show, + hdd_sysfs_dump_in_progress_store); + +void hdd_sysfs_create_dump_in_progress_interface(struct kobject *wifi_kobject) +{ + int error; + + if (!wifi_kobject) { + hdd_err("could not get wifi kobject!"); + return; + } + error = sysfs_create_file(wifi_kobject, + &dump_in_progress_attribute.attr); + if (error) + hdd_err("could not create dump in progress sysfs file"); +} + +void hdd_sysfs_destroy_dump_in_progress_interface(struct kobject *wifi_kobject) +{ + if (!wifi_kobject) { + hdd_err("could not get wifi kobject!"); + return; + } + + sysfs_remove_file(wifi_kobject, + &dump_in_progress_attribute.attr); +} +