Loading drivers/net/wireless/cnss2/debug.c +78 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,82 @@ static const struct file_operations cnss_reg_write_debug_fops = { .llseek = seq_lseek, }; static ssize_t cnss_runtime_pm_debug_write(struct file *fp, const char __user *user_buf, size_t count, loff_t *off) { struct cnss_plat_data *plat_priv = ((struct seq_file *)fp->private_data)->private; struct cnss_pci_data *pci_priv; char buf[64]; char *cmd; unsigned int len = 0; int ret = 0; if (!plat_priv) return -ENODEV; pci_priv = plat_priv->bus_priv; if (!pci_priv) return -ENODEV; len = min(count, sizeof(buf) - 1); if (copy_from_user(buf, user_buf, len)) return -EFAULT; buf[len] = '\0'; cmd = buf; if (sysfs_streq(cmd, "usage_count")) { cnss_pci_pm_runtime_show_usage_count(pci_priv); } else if (sysfs_streq(cmd, "get")) { ret = cnss_pci_pm_runtime_get(pci_priv); } else if (sysfs_streq(cmd, "get_noresume")) { cnss_pci_pm_runtime_get_noresume(pci_priv); } else if (sysfs_streq(cmd, "put_autosuspend")) { ret = cnss_pci_pm_runtime_put_autosuspend(pci_priv); } else if (sysfs_streq(cmd, "put_noidle")) { cnss_pci_pm_runtime_put_noidle(pci_priv); } else if (sysfs_streq(cmd, "mark_last_busy")) { cnss_pci_pm_runtime_mark_last_busy(pci_priv); } else { cnss_pr_err("Runtime PM debugfs command is invalid\n"); ret = -EINVAL; } if (ret) return ret; return count; } static int cnss_runtime_pm_debug_show(struct seq_file *s, void *data) { seq_puts(s, "\nUsage: echo <action> > <debugfs_path>/cnss/runtime_pm\n"); seq_puts(s, "<action> can be one of below:\n"); seq_puts(s, "usage_count: get runtime PM usage count\n"); seq_puts(s, "get: do runtime PM get\n"); seq_puts(s, "get_noresume: do runtime PM get noresume\n"); seq_puts(s, "put_noidle: do runtime PM put noidle\n"); seq_puts(s, "put_autosuspend: do runtime PM put autosuspend\n"); seq_puts(s, "mark_last_busy: do runtime PM mark last busy\n"); return 0; } static int cnss_runtime_pm_debug_open(struct inode *inode, struct file *file) { return single_open(file, cnss_runtime_pm_debug_show, inode->i_private); } static const struct file_operations cnss_runtime_pm_debug_fops = { .read = seq_read, .write = cnss_runtime_pm_debug_write, .open = cnss_runtime_pm_debug_open, .owner = THIS_MODULE, .llseek = seq_lseek, }; #ifdef CONFIG_CNSS2_DEBUG static int cnss_create_debug_only_node(struct cnss_plat_data *plat_priv) { Loading @@ -439,6 +515,8 @@ static int cnss_create_debug_only_node(struct cnss_plat_data *plat_priv) &cnss_reg_read_debug_fops); debugfs_create_file("reg_write", 0600, root_dentry, plat_priv, &cnss_reg_write_debug_fops); debugfs_create_file("runtime_pm", 0600, root_dentry, plat_priv, &cnss_runtime_pm_debug_fops); return 0; } Loading drivers/net/wireless/cnss2/pci.c +53 −0 Original line number Diff line number Diff line Loading @@ -1124,6 +1124,59 @@ int cnss_wlan_pm_control(struct device *dev, bool vote) } EXPORT_SYMBOL(cnss_wlan_pm_control); void cnss_pci_pm_runtime_show_usage_count(struct cnss_pci_data *pci_priv) { struct device *dev; if (!pci_priv) return; dev = &pci_priv->pci_dev->dev; cnss_pr_dbg("Runtime PM usage count: %d\n", atomic_read(&dev->power.usage_count)); } int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv) { if (!pci_priv) return -ENODEV; return pm_runtime_get(&pci_priv->pci_dev->dev); } void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv) { if (!pci_priv) return; return pm_runtime_get_noresume(&pci_priv->pci_dev->dev); } int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv) { if (!pci_priv) return -ENODEV; return pm_runtime_put_autosuspend(&pci_priv->pci_dev->dev); } void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv) { if (!pci_priv) return; pm_runtime_put_noidle(&pci_priv->pci_dev->dev); } void cnss_pci_pm_runtime_mark_last_busy(struct cnss_pci_data *pci_priv) { if (!pci_priv) return; pm_runtime_mark_last_busy(&pci_priv->pci_dev->dev); } int cnss_auto_suspend(struct device *dev) { int ret = 0; Loading drivers/net/wireless/cnss2/pci.h +6 −0 Original line number Diff line number Diff line Loading @@ -143,5 +143,11 @@ int cnss_pci_register_driver_hdlr(struct cnss_pci_data *pci_priv, void *data); int cnss_pci_unregister_driver_hdlr(struct cnss_pci_data *pci_priv); int cnss_pci_call_driver_modem_status(struct cnss_pci_data *pci_priv, int modem_current_status); void cnss_pci_pm_runtime_show_usage_count(struct cnss_pci_data *pci_priv); int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv); void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv); int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv); void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv); void cnss_pci_pm_runtime_mark_last_busy(struct cnss_pci_data *pci_priv); #endif /* _CNSS_PCI_H */ Loading
drivers/net/wireless/cnss2/debug.c +78 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,82 @@ static const struct file_operations cnss_reg_write_debug_fops = { .llseek = seq_lseek, }; static ssize_t cnss_runtime_pm_debug_write(struct file *fp, const char __user *user_buf, size_t count, loff_t *off) { struct cnss_plat_data *plat_priv = ((struct seq_file *)fp->private_data)->private; struct cnss_pci_data *pci_priv; char buf[64]; char *cmd; unsigned int len = 0; int ret = 0; if (!plat_priv) return -ENODEV; pci_priv = plat_priv->bus_priv; if (!pci_priv) return -ENODEV; len = min(count, sizeof(buf) - 1); if (copy_from_user(buf, user_buf, len)) return -EFAULT; buf[len] = '\0'; cmd = buf; if (sysfs_streq(cmd, "usage_count")) { cnss_pci_pm_runtime_show_usage_count(pci_priv); } else if (sysfs_streq(cmd, "get")) { ret = cnss_pci_pm_runtime_get(pci_priv); } else if (sysfs_streq(cmd, "get_noresume")) { cnss_pci_pm_runtime_get_noresume(pci_priv); } else if (sysfs_streq(cmd, "put_autosuspend")) { ret = cnss_pci_pm_runtime_put_autosuspend(pci_priv); } else if (sysfs_streq(cmd, "put_noidle")) { cnss_pci_pm_runtime_put_noidle(pci_priv); } else if (sysfs_streq(cmd, "mark_last_busy")) { cnss_pci_pm_runtime_mark_last_busy(pci_priv); } else { cnss_pr_err("Runtime PM debugfs command is invalid\n"); ret = -EINVAL; } if (ret) return ret; return count; } static int cnss_runtime_pm_debug_show(struct seq_file *s, void *data) { seq_puts(s, "\nUsage: echo <action> > <debugfs_path>/cnss/runtime_pm\n"); seq_puts(s, "<action> can be one of below:\n"); seq_puts(s, "usage_count: get runtime PM usage count\n"); seq_puts(s, "get: do runtime PM get\n"); seq_puts(s, "get_noresume: do runtime PM get noresume\n"); seq_puts(s, "put_noidle: do runtime PM put noidle\n"); seq_puts(s, "put_autosuspend: do runtime PM put autosuspend\n"); seq_puts(s, "mark_last_busy: do runtime PM mark last busy\n"); return 0; } static int cnss_runtime_pm_debug_open(struct inode *inode, struct file *file) { return single_open(file, cnss_runtime_pm_debug_show, inode->i_private); } static const struct file_operations cnss_runtime_pm_debug_fops = { .read = seq_read, .write = cnss_runtime_pm_debug_write, .open = cnss_runtime_pm_debug_open, .owner = THIS_MODULE, .llseek = seq_lseek, }; #ifdef CONFIG_CNSS2_DEBUG static int cnss_create_debug_only_node(struct cnss_plat_data *plat_priv) { Loading @@ -439,6 +515,8 @@ static int cnss_create_debug_only_node(struct cnss_plat_data *plat_priv) &cnss_reg_read_debug_fops); debugfs_create_file("reg_write", 0600, root_dentry, plat_priv, &cnss_reg_write_debug_fops); debugfs_create_file("runtime_pm", 0600, root_dentry, plat_priv, &cnss_runtime_pm_debug_fops); return 0; } Loading
drivers/net/wireless/cnss2/pci.c +53 −0 Original line number Diff line number Diff line Loading @@ -1124,6 +1124,59 @@ int cnss_wlan_pm_control(struct device *dev, bool vote) } EXPORT_SYMBOL(cnss_wlan_pm_control); void cnss_pci_pm_runtime_show_usage_count(struct cnss_pci_data *pci_priv) { struct device *dev; if (!pci_priv) return; dev = &pci_priv->pci_dev->dev; cnss_pr_dbg("Runtime PM usage count: %d\n", atomic_read(&dev->power.usage_count)); } int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv) { if (!pci_priv) return -ENODEV; return pm_runtime_get(&pci_priv->pci_dev->dev); } void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv) { if (!pci_priv) return; return pm_runtime_get_noresume(&pci_priv->pci_dev->dev); } int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv) { if (!pci_priv) return -ENODEV; return pm_runtime_put_autosuspend(&pci_priv->pci_dev->dev); } void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv) { if (!pci_priv) return; pm_runtime_put_noidle(&pci_priv->pci_dev->dev); } void cnss_pci_pm_runtime_mark_last_busy(struct cnss_pci_data *pci_priv) { if (!pci_priv) return; pm_runtime_mark_last_busy(&pci_priv->pci_dev->dev); } int cnss_auto_suspend(struct device *dev) { int ret = 0; Loading
drivers/net/wireless/cnss2/pci.h +6 −0 Original line number Diff line number Diff line Loading @@ -143,5 +143,11 @@ int cnss_pci_register_driver_hdlr(struct cnss_pci_data *pci_priv, void *data); int cnss_pci_unregister_driver_hdlr(struct cnss_pci_data *pci_priv); int cnss_pci_call_driver_modem_status(struct cnss_pci_data *pci_priv, int modem_current_status); void cnss_pci_pm_runtime_show_usage_count(struct cnss_pci_data *pci_priv); int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv); void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv); int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv); void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv); void cnss_pci_pm_runtime_mark_last_busy(struct cnss_pci_data *pci_priv); #endif /* _CNSS_PCI_H */