diff --git a/Kbuild b/Kbuild index 2a55264402e8..b44c2868d6ea 100644 --- a/Kbuild +++ b/Kbuild @@ -355,6 +355,9 @@ endif ifeq ($(CONFIG_WLAN_GTX_BW_MASK), y) HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_gtx_bw_mask.o endif +ifeq ($(CONFIG_IPA_OFFLOAD), y) +HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_sysfs_ipa.o +endif endif ifeq ($(CONFIG_QCACLD_FEATURE_FW_STATE), y) diff --git a/core/hdd/inc/wlan_hdd_sysfs_ipa.h b/core/hdd/inc/wlan_hdd_sysfs_ipa.h new file mode 100644 index 000000000000..9ac49c51a53a --- /dev/null +++ b/core/hdd/inc/wlan_hdd_sysfs_ipa.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2011-2020, 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. + */ +#ifndef WLAN_HDD_SYSFS_IPA_H +#define WLAN_HDD_SYSFS_IPA_H + +#if defined(WLAN_SYSFS) && defined(IPA_OFFLOAD) + +enum ipa_debug_cmd { + IPA_UC_STAT = 1, + IPA_UC_INFO, + IPA_UC_RT_DEBUG_HOST_DUMP, + IPA_DUMP_INFO, +}; + +/** + * hdd_sysfs_ipa_create(): Initialize ipa specific sysfs file + * @adapter: os if adapter + * + * Function to initialize ipa specific mode syfs files. + * + * Return: NONE + */ +void hdd_sysfs_ipa_create(struct hdd_adapter *adapter); + +/** + * hdd_sysfs_ipa_destroy(): Remove ipucstat specific sysfs file + * @adapter: os if adapter + * + * Function to remove ipa specific mode syfs files. + * + * Return: NONE + */ +void hdd_sysfs_ipa_destroy(struct hdd_adapter *adapter); +#else +static inline +void hdd_sysfs_ipa_create(struct hdd_adapter *adapter) +{ +} + +static inline +void hdd_sysfs_ipa_destroy(struct hdd_adapter *adapter) +{ +} +#endif +#endif diff --git a/core/hdd/src/wlan_hdd_sysfs.c b/core/hdd/src/wlan_hdd_sysfs.c index 306542e8abe3..9d1fa501a5ee 100644 --- a/core/hdd/src/wlan_hdd_sysfs.c +++ b/core/hdd/src/wlan_hdd_sysfs.c @@ -70,6 +70,7 @@ #include #include #include +#include #define MAX_PSOC_ID_SIZE 10 @@ -716,11 +717,13 @@ hdd_sysfs_create_sap_adapter_root_obj(struct hdd_adapter *adapter) hdd_sysfs_txrx_stats_create(adapter); hdd_sysfs_get_temp_create(adapter); hdd_sysfs_range_ext_create(adapter); + hdd_sysfs_ipa_create(adapter); } static void hdd_sysfs_destroy_sap_adapter_root_obj(struct hdd_adapter *adapter) { + hdd_sysfs_ipa_destroy(adapter); hdd_sysfs_range_ext_destroy(adapter); hdd_sysfs_get_temp_destroy(adapter); hdd_sysfs_txrx_stats_destroy(adapter); diff --git a/core/hdd/src/wlan_hdd_sysfs_ipa.c b/core/hdd/src/wlan_hdd_sysfs_ipa.c new file mode 100644 index 000000000000..09a2520677a0 --- /dev/null +++ b/core/hdd/src/wlan_hdd_sysfs_ipa.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2011-2020, 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. + */ + +#include +#include +#include +#include +#include "osif_sync.h" + +#define MAX_USER_COMMAND_SIZE_IPAUCSTAT 4 + +static ssize_t __hdd_sysfs_ipaucstate_store(struct net_device *net_dev, + const char __user *buf, + size_t count) +{ + struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(net_dev); + struct hdd_context *hdd_ctx; + uint8_t cmd[MAX_USER_COMMAND_SIZE_IPAUCSTAT] = {0}; + int ret; + char *sptr, *token; + uint8_t set_value = 0; + + hdd_enter(); + + if (hdd_validate_adapter(adapter)) + return -EINVAL; + + hdd_ctx = WLAN_HDD_GET_CTX(adapter); + ret = wlan_hdd_validate_context(hdd_ctx); + if (ret) + return ret; + + if (!wlan_hdd_validate_modules_state(hdd_ctx)) + return -EINVAL; + + if (!ucfg_ipa_is_enabled()) + return -EINVAL; + + if (adapter->device_mode != QDF_SAP_MODE) + return -EINVAL; + + ret = hdd_sysfs_validate_and_copy_buf(cmd, sizeof(cmd), + buf, count); + if (ret) { + hdd_err_rl("invalid input"); + return ret; + } + + sptr = cmd; + /* Get set_value */ + token = strsep(&sptr, " "); + if (!token) + return -EINVAL; + if (kstrtou8(token, 0, &set_value)) + return -EINVAL; + + /* If input value is non-zero get stats */ + switch (set_value) { + case IPA_UC_STAT: + ucfg_ipa_uc_stat(hdd_ctx->pdev); + break; + case IPA_UC_INFO: + ucfg_ipa_uc_info(hdd_ctx->pdev); + break; + case IPA_UC_RT_DEBUG_HOST_DUMP: + ucfg_ipa_uc_rt_debug_host_dump(hdd_ctx->pdev); + break; + case IPA_DUMP_INFO: + ucfg_ipa_dump_info(hdd_ctx->pdev); + break; + default: + /* place holder for stats clean up + * Stats clean not implemented yet on FW and IPA + */ + break; + } + hdd_exit(); + return count; +} + +static ssize_t hdd_sysfs_ipaucstate_store(struct device *dev, + struct device_attribute *attr, + char const *buf, size_t count) +{ + struct net_device *net_dev = container_of(dev, struct net_device, dev); + struct osif_vdev_sync *vdev_sync; + ssize_t err_size; + + err_size = osif_vdev_sync_op_start(net_dev, &vdev_sync); + if (err_size) + return err_size; + + err_size = __hdd_sysfs_ipaucstate_store(net_dev, buf, count); + + osif_vdev_sync_op_stop(vdev_sync); + return err_size; +} + +static DEVICE_ATTR(ipaucstat, 0220, + NULL, hdd_sysfs_ipaucstate_store); + +void hdd_sysfs_ipa_create(struct hdd_adapter *adapter) +{ + if (device_create_file(&adapter->dev->dev, &dev_attr_ipaucstat)) + hdd_err("could not create wlan sysfs file"); +} + +void hdd_sysfs_ipa_destroy(struct hdd_adapter *adapter) +{ + device_remove_file(&adapter->dev->dev, &dev_attr_ipaucstat); +}