qcacld-3.0: Add sysfs entry for the ipaucstat

Add the sysfs entry for the ipaucstat.

Previously ipaucstat would be queried via iwpriv
--> iwpriv wlan0 ipaucstat 1

it is now changed to support via sysfs:
--> echo "1" > /sys/class/net/wlanxx/ipaucstat

Change-Id: I5a3195a36cd2d7252eb3ef0312545d338b40d3ec
CRs-Fixed: 2676440
This commit is contained in:
Arun Kumar Khandavalli 2020-05-12 08:51:38 +05:30 committed by nshrivas
parent 5a1000a798
commit 40c74bf143
4 changed files with 188 additions and 0 deletions

3
Kbuild
View File

@ -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)

View File

@ -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

View File

@ -70,6 +70,7 @@
#include <wlan_hdd_sysfs_get_temp.h>
#include <wlan_hdd_sysfs_thermal_cfg.h>
#include <wlan_hdd_sysfs_motion_detection.h>
#include <wlan_hdd_sysfs_ipa.h>
#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);

View File

@ -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 <wlan_hdd_main.h>
#include <wlan_hdd_sysfs_ipa.h>
#include <wlan_ipa_ucfg_api.h>
#include <wlan_hdd_sysfs.h>
#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);
}