1 /*
2  * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  * DOC: wlan_hdd_sysfs_wlan_dbg.c
19  *
20  * Implementation for creating sysfs file wlan_dbg
21  */
22 
23 #include <wlan_hdd_includes.h>
24 #include "osif_psoc_sync.h"
25 #include <wlan_hdd_sysfs.h>
26 #include <wlan_hdd_sysfs_wlan_dbg.h>
27 
28 static ssize_t
__hdd_sysfs_wlan_dbg_store(struct hdd_context * hdd_ctx,struct kobj_attribute * attr,const char * buf,size_t count)29 __hdd_sysfs_wlan_dbg_store(struct hdd_context *hdd_ctx,
30 			   struct kobj_attribute *attr,
31 			       const char *buf, size_t count)
32 {
33 	char buf_local[MAX_SYSFS_USER_COMMAND_SIZE_LENGTH + 1];
34 	char *sptr, *token;
35 	uint32_t val1, val2, val3;
36 	int ret;
37 
38 	if (!wlan_hdd_validate_modules_state(hdd_ctx))
39 		return -EINVAL;
40 
41 	ret = hdd_sysfs_validate_and_copy_buf(buf_local, sizeof(buf_local),
42 					      buf, count);
43 	if (ret) {
44 		hdd_err_rl("invalid input");
45 		return ret;
46 	}
47 
48 	sptr = buf_local;
49 	hdd_debug("set_wlan_dbg: count %zu buf_local:(%s)",
50 		  count, buf_local);
51 
52 	/* Get val1 */
53 	token = strsep(&sptr, " ");
54 	if (!token)
55 		return -EINVAL;
56 	if (kstrtou32(token, 0, &val1))
57 		return -EINVAL;
58 
59 	/* Get val2 */
60 	token = strsep(&sptr, " ");
61 	if (!token)
62 		return -EINVAL;
63 	if (kstrtou32(token, 0, &val2))
64 		return -EINVAL;
65 
66 	/* Get val3 */
67 	token = strsep(&sptr, " ");
68 	if (!token)
69 		return -EINVAL;
70 	if (kstrtou32(token, 0, &val3))
71 		return -EINVAL;
72 
73 	qdf_print_set_category_verbose(qdf_get_pidx(), val1, val2, val3);
74 
75 	return count;
76 }
77 
78 static ssize_t
hdd_sysfs_wlan_dbg_store(struct kobject * kobj,struct kobj_attribute * attr,const char * buf,size_t count)79 hdd_sysfs_wlan_dbg_store(struct kobject *kobj,
80 			 struct kobj_attribute *attr,
81 			 const char *buf, size_t count)
82 {
83 	struct osif_psoc_sync *psoc_sync;
84 	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
85 	ssize_t errno_size;
86 	int ret;
87 
88 	ret = wlan_hdd_validate_context(hdd_ctx);
89 	if (ret)
90 		return ret;
91 
92 	errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy),
93 					     &psoc_sync);
94 	if (errno_size)
95 		return errno_size;
96 
97 	errno_size = __hdd_sysfs_wlan_dbg_store(hdd_ctx, attr,
98 						buf, count);
99 
100 	osif_psoc_sync_op_stop(psoc_sync);
101 
102 	return errno_size;
103 }
104 
105 static struct kobj_attribute set_wlan_dbg_attribute =
106 	__ATTR(wlan_dbg, 0220, NULL,
107 	       hdd_sysfs_wlan_dbg_store);
108 
hdd_sysfs_wlan_dbg_create(struct kobject * driver_kobject)109 int hdd_sysfs_wlan_dbg_create(struct kobject *driver_kobject)
110 {
111 	int error;
112 
113 	if (!driver_kobject) {
114 		hdd_err("could not get driver kobject!");
115 		return -EINVAL;
116 	}
117 
118 	error = sysfs_create_file(driver_kobject,
119 				  &set_wlan_dbg_attribute.attr);
120 	if (error)
121 		hdd_err("could not create wlan_dbg sysfs file");
122 
123 	return error;
124 }
125 
126 void
hdd_sysfs_wlan_dbg_destroy(struct kobject * driver_kobject)127 hdd_sysfs_wlan_dbg_destroy(struct kobject *driver_kobject)
128 {
129 	if (!driver_kobject) {
130 		hdd_err("could not get driver kobject!");
131 		return;
132 	}
133 	sysfs_remove_file(driver_kobject, &set_wlan_dbg_attribute.attr);
134 }
135