From 2ac3d3b364e0ae3b3fa46d46b4172bf73781de38 Mon Sep 17 00:00:00 2001 From: Vijay Patil Date: Fri, 24 Sep 2021 19:34:20 +0530 Subject: [PATCH] icnss2: Add debugfs entry to update qmi timeout Add code of debugfs creation for qmi timeout as control parameter. This feature adds support to update qmi timeout at runtime. Change-Id: I707a87269e3bb94e2ec3fe90d4a438b175d34997 Signed-off-by: Vijay Patil --- drivers/soc/qcom/icnss2/debug.c | 79 +++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/drivers/soc/qcom/icnss2/debug.c b/drivers/soc/qcom/icnss2/debug.c index 719c77e65530..99ac2aa36d97 100644 --- a/drivers/soc/qcom/icnss2/debug.c +++ b/drivers/soc/qcom/icnss2/debug.c @@ -710,6 +710,83 @@ static const struct file_operations icnss_fw_debug_fops = { .owner = THIS_MODULE, .llseek = seq_lseek, }; + +static ssize_t icnss_control_params_debug_write(struct file *fp, + const char __user *user_buf, + size_t count, loff_t *off) +{ + struct icnss_priv *priv = + ((struct seq_file *)fp->private_data)->private; + + char buf[64]; + char *sptr, *token; + char *cmd; + u32 val; + unsigned int len = 0; + const char *delim = " "; + + if (!priv) + return -ENODEV; + + len = min(count, sizeof(buf) - 1); + if (copy_from_user(buf, user_buf, len)) + return -EINVAL; + + buf[len] = '\0'; + sptr = buf; + + token = strsep(&sptr, delim); + if (!token) + return -EINVAL; + if (!sptr) + return -EINVAL; + cmd = token; + + token = strsep(&sptr, delim); + if (!token) + return -EINVAL; + if (kstrtou32(token, 0, &val)) + return -EINVAL; + + if (strcmp(cmd, "qmi_timeout") == 0) + priv->ctrl_params.qmi_timeout = msecs_to_jiffies(val); + else + return -EINVAL; + + return count; +} + +static int icnss_control_params_debug_show(struct seq_file *s, void *data) +{ + struct icnss_priv *priv = s->private; + + seq_puts(s, "\nUsage: echo > /icnss/control_params\n"); + seq_puts(s, " can be from below:\n"); + seq_puts(s, "qmi_timeout: Timeout for QMI message in milliseconds\n"); + + seq_puts(s, "\nCurrent value:\n"); + + seq_printf(s, "qmi_timeout: %u\n", priv->ctrl_params.qmi_timeout); + + return 0; +} + +static int icnss_control_params_debug_open(struct inode *inode, + struct file *file) +{ + return single_open(file, icnss_control_params_debug_show, + inode->i_private); +} + +static const struct file_operations icnss_control_params_debug_fops = { + .read = seq_read, + .write = icnss_control_params_debug_write, + .release = single_release, + .open = icnss_control_params_debug_open, + .owner = THIS_MODULE, + .llseek = seq_lseek, +}; + #ifdef CONFIG_ICNSS2_DEBUG int icnss_debugfs_create(struct icnss_priv *priv) { @@ -734,6 +811,8 @@ int icnss_debugfs_create(struct icnss_priv *priv) &icnss_regread_fops); debugfs_create_file("reg_write", 0600, root_dentry, priv, &icnss_regwrite_fops); + debugfs_create_file("control_params", 0600, root_dentry, priv, + &icnss_control_params_debug_fops); out: return ret; }