diff --git a/Kbuild b/Kbuild index c0386d82d9..1d64332d0c 100644 --- a/Kbuild +++ b/Kbuild @@ -471,6 +471,10 @@ ifeq ($(CONFIG_WLAN_SYSFS_WDS_MODE), y) HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_wds_mode.o endif +ifeq ($(CONFIG_WLAN_SYSFS_ROAM_TRIGGER_BITMAP), y) +HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_roam_trigger_bitmap.o +endif + endif # CONFIG_WLAN_SYSFS ifeq ($(CONFIG_QCACLD_FEATURE_FW_STATE), y) @@ -3654,6 +3658,7 @@ ccflags-$(CONFIG_WLAN_SYSFS_LOG_BUFFER) += -DFEATURE_SYSFS_LOG_BUFFER ccflags-$(CONFIG_ENABLE_VALLOC_REPLACE_MALLOC) += -DENABLE_VALLOC_REPLACE_MALLOC ccflags-$(CONFIG_WLAN_SYSFS_DFSNOL) += -DCONFIG_WLAN_SYSFS_DFSNOL ccflags-$(CONFIG_WLAN_SYSFS_WDS_MODE) += -DFEATURE_SYSFS_WDS_MODE +ccflags-$(CONFIG_WLAN_SYSFS_ROAM_TRIGGER_BITMAP) += -DFEATURE_SYSFS_ROAM_TRIGGER_BITMAP ifeq ($(CONFIG_LEAK_DETECTION), y) ccflags-y += \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 7a93f6504b..c5cbfc6523 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -3331,6 +3331,16 @@ wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, */ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc); +/** + * wlan_mlme_set_roaming_triggers() - Set the roaming triggers bitmap + * @psoc: Pointer to PSOC object + * @trigger_bitmap: Roaming triggers bitmap to set + * + * Return: void + */ +void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, + uint32_t trigger_bitmap); + /** * wlan_mlme_get_roaming_offload() - Get roaming offload setting * @psoc: pointer to psoc object @@ -3458,6 +3468,12 @@ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) return 0xFFFF; } +static inline +void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, + uint32_t trigger_bitmap) +{ +} + static inline QDF_STATUS wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, bool *val) diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index ae0e36cbaa..944cc71170 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -1162,6 +1162,21 @@ ucfg_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) { return wlan_mlme_get_roaming_triggers(psoc); } + +/** + * ucfg_mlme_set_roaming_triggers() - Set roaming triggers bitmap + * value + * @psoc: pointer to psoc object + * @trigger_bitmap: Roaming triggers bitmap to set + * + * Return: void + */ +static inline void +ucfg_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, + uint32_t trigger_bitmap) +{ + wlan_mlme_set_roaming_triggers(psoc, trigger_bitmap); +} #else static inline QDF_STATUS ucfg_mlme_get_roam_disable_config(struct wlan_objmgr_psoc *psoc, @@ -1191,6 +1206,12 @@ ucfg_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) { return 0xffff; } + +static inline void +ucfg_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, + uint32_t trigger_bitmap) +{ +} #endif /** diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 05ef2922ea..1a847249c2 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -5211,6 +5211,18 @@ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) return mlme_obj->cfg.lfr.roam_trigger_bitmap; } +void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, + uint32_t trigger_bitmap) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return; + + mlme_obj->cfg.lfr.roam_trigger_bitmap = trigger_bitmap; +} + QDF_STATUS wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, bool *val) diff --git a/configs/config_to_feature.h b/configs/config_to_feature.h index 555ea71b1d..814eec27ce 100644 --- a/configs/config_to_feature.h +++ b/configs/config_to_feature.h @@ -920,6 +920,10 @@ #define FEATURE_SYSFS_WDS_MODE (1) #endif +#ifdef CONFIG_WLAN_SYSFS_ROAM_TRIGGER_BITMAP +#define FEATURE_SYSFS_ROAM_TRIGGER_BITMAP (1) +#endif + #ifdef CONFIG_RX_PERFORMANCE #define RX_PERFORMANCE (1) #endif diff --git a/configs/default_defconfig b/configs/default_defconfig index 751e54b206..45ae241c53 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -410,6 +410,7 @@ endif CONFIG_WLAN_SYSFS_LOG_BUFFER := y CONFIG_WLAN_SYSFS_DFSNOL := y CONFIG_WLAN_SYSFS_WDS_MODE := y + CONFIG_WLAN_SYSFS_ROAM_TRIGGER_BITMAP := y endif CONFIG_WLAN_PDEV_VDEV_SEND_MULTI_PARAM := y CONFIG_WLAN_POWER_DEBUG := y diff --git a/core/hdd/src/wlan_hdd_sysfs.c b/core/hdd/src/wlan_hdd_sysfs.c index 03e2e88e51..b158e5e0a1 100644 --- a/core/hdd/src/wlan_hdd_sysfs.c +++ b/core/hdd/src/wlan_hdd_sysfs.c @@ -93,6 +93,7 @@ #include #include #include +#include #define MAX_PSOC_ID_SIZE 10 @@ -959,12 +960,14 @@ void hdd_create_sysfs_files(struct hdd_context *hdd_ctx) hdd_sysfs_runtime_pm_create(driver_kobject); hdd_sysfs_log_buffer_create(driver_kobject); hdd_sysfs_wds_mode_create(driver_kobject); + hdd_sysfs_roam_trigger_bitmap_create(driver_kobject); } } void hdd_destroy_sysfs_files(void) { if (QDF_GLOBAL_MISSION_MODE == hdd_get_conparam()) { + hdd_sysfs_roam_trigger_bitmap_destroy(driver_kobject); hdd_sysfs_wds_mode_destroy(driver_kobject); hdd_sysfs_log_buffer_destroy(driver_kobject); hdd_sysfs_runtime_pm_destroy(driver_kobject); diff --git a/core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.c b/core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.c new file mode 100644 index 0000000000..12f7b65a20 --- /dev/null +++ b/core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.c @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2023 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 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. + */ + +#include +#include "osif_psoc_sync.h" +#include +#include + +static ssize_t __hdd_sysfs_roam_trigger_bitmap_show(struct hdd_context *hdd_ctx, + struct kobj_attribute *attr, + char *buf) +{ + int ret = 0; + + if (!hdd_ctx || !hdd_ctx->psoc) { + hdd_err_rl("invalid input"); + return ret; + } + + ret = scnprintf(buf, PAGE_SIZE, "0x%x", + ucfg_mlme_get_roaming_triggers(hdd_ctx->psoc)); + + return ret; +} + +static ssize_t hdd_sysfs_roam_trigger_bitmap_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; + + errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), + &psoc_sync); + if (errno_size) + return errno_size; + + errno_size = __hdd_sysfs_roam_trigger_bitmap_show(hdd_ctx, attr, buf); + + osif_psoc_sync_op_stop(psoc_sync); + + return errno_size; +} + +static ssize_t +__hdd_sysfs_roam_trigger_bitmap_store(struct hdd_context *hdd_ctx, + struct kobj_attribute *attr, + const char *buf, + size_t count) +{ + char buf_local[MAX_SYSFS_USER_COMMAND_SIZE_LENGTH + 1]; + char *sptr, *token; + uint32_t value; + int ret = 0; + + if (!hdd_ctx || !hdd_ctx->psoc) { + hdd_err_rl("invalid hdd ctx"); + return ret; + } + + 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; + token = strsep(&sptr, " "); + if (!token) + return -EINVAL; + if (kstrtou32(token, 0, &value)) + return -EINVAL; + + hdd_debug("roam_trigger_bitmap: 0x%x", value); + + ucfg_mlme_set_roaming_triggers(hdd_ctx->psoc, value); + + return count; +} + +static ssize_t +hdd_sysfs_roam_trigger_bitmap_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; + + errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), + &psoc_sync); + if (errno_size) + return errno_size; + + errno_size = __hdd_sysfs_roam_trigger_bitmap_store(hdd_ctx, attr, + buf, count); + + osif_psoc_sync_op_stop(psoc_sync); + + return errno_size; +} + +static struct kobj_attribute roam_trigger_bitmap_attribute = + __ATTR(roam_trigger_bitmap, 0664, hdd_sysfs_roam_trigger_bitmap_show, + hdd_sysfs_roam_trigger_bitmap_store); + +int hdd_sysfs_roam_trigger_bitmap_create(struct kobject *driver_kobject) +{ + int error; + + if (!driver_kobject) { + hdd_err("could not get driver kobject!"); + return -EINVAL; + } + + error = sysfs_create_file(driver_kobject, + &roam_trigger_bitmap_attribute.attr); + if (error) + hdd_err("could not create roam_trigger_bitmap sysfs file"); + + return error; +} + +void +hdd_sysfs_roam_trigger_bitmap_destroy(struct kobject *driver_kobject) +{ + if (!driver_kobject) { + hdd_err("could not get driver kobject!"); + return; + } + sysfs_remove_file(driver_kobject, &roam_trigger_bitmap_attribute.attr); +} diff --git a/core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.h b/core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.h new file mode 100644 index 0000000000..ab089e6a72 --- /dev/null +++ b/core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2023 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 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. + */ + +#ifndef _WLAN_HDD_SYSFS_ROAM_TRIGGER_BITMAP_H +#define _WLAN_HDD_SYSFS_ROAM_TRIGGER_BITMAP_H + +#if defined(WLAN_SYSFS) && defined(FEATURE_SYSFS_ROAM_TRIGGER_BITMAP) + +/** + * hdd_sysfs_roam_trigger_bitmap_create() - API to create roam_trigger_bitmap + * sysfs file + * @driver_kobject: sysfs driver kobject + * + * file path: /sys/kernel/kiwi_v2/roam_trigger_bitmap + * + * usage: + * echo [arg_0] > roam_trigger_bitmap + * + * Return: 0 on success and errno on failure + */ +int hdd_sysfs_roam_trigger_bitmap_create(struct kobject *driver_kobject); + +/** + * hdd_sysfs_roam_trigger_bitmap_destroy() - destroy hdd roam_trigger_bitmap + * sysfs node + * @driver_kobject: pointer to driver kobject + * + * Return: void + * + */ +void +hdd_sysfs_roam_trigger_bitmap_destroy(struct kobject *driver_kobject); + +#else + +static inline int +hdd_sysfs_roam_trigger_bitmap_create(struct kobject *driver_kobject) +{ + return 0; +} + +static inline void +hdd_sysfs_roam_trigger_bitmap_destroy(struct kobject *driver_kobject) +{ +} +#endif +#endif diff --git a/wlan_qcacld3_modules.bzl b/wlan_qcacld3_modules.bzl index d777e5fd9b..4e22aa7090 100644 --- a/wlan_qcacld3_modules.bzl +++ b/wlan_qcacld3_modules.bzl @@ -1872,6 +1872,11 @@ _conditional_srcs = { "core/hdd/src/wlan_hdd_sysfs_wds_mode.c", ], }, + "CONFIG_WLAN_SYSFS_ROAM_TRIGGER_BITMAP": { + True: [ + "core/hdd/src/wlan_hdd_sysfs_roam_trigger_bitmap.c", + ], + }, "CONFIG_WLAN_SYSFS_DP_STATS": { True: [ "core/hdd/src/wlan_hdd_sysfs_txrx_stats_console.c",