1 /*
2 * Copyright (c) 2020 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 /**
21 * DOC: wlan_hdd_debugfs_unit_test.c
22 *
23 * WLAN Host Device Driver implementation to create debugfs
24 * unit_test_host/unit_test_target/wlan_suspend/wlan_resume
25 */
26 #include "wlan_hdd_main.h"
27 #include "osif_psoc_sync.h"
28 #include "osif_vdev_sync.h"
29 #include "wlan_dsc_test.h"
30 #include "wlan_hdd_unit_test.h"
31 #include "wlan_hdd_debugfs_unit_test.h"
32 #include "wma.h"
33
34 #ifdef WLAN_UNIT_TEST
35 /* strlen("all") + 1(\n) */
36 #define MIN_USER_COMMAND_SIZE_UNIT_TEST_HOST 4
37 #define MAX_USER_COMMAND_SIZE_UNIT_TEST_HOST 32
38
39 /**
40 * __wlan_hdd_write_unit_test_host_debugfs()
41 * - host unit test debugfs handler
42 *
43 * @hdd_ctx: HDD context used to register the debugfs file
44 * @buf: text being written to the debugfs
45 * @count: size of @buf
46 * @ppos: (unused) offset into the virtual file system
47 *
48 * Return: number of bytes processed or errno
49 */
__wlan_hdd_write_unit_test_host_debugfs(struct hdd_context * hdd_ctx,const char __user * buf,size_t count,loff_t * ppos)50 static ssize_t __wlan_hdd_write_unit_test_host_debugfs(
51 struct hdd_context *hdd_ctx,
52 const char __user *buf, size_t count,
53 loff_t *ppos)
54 {
55 char name[MAX_USER_COMMAND_SIZE_UNIT_TEST_HOST + 1];
56 int ret;
57
58 if (count < MIN_USER_COMMAND_SIZE_UNIT_TEST_HOST ||
59 count > MAX_USER_COMMAND_SIZE_UNIT_TEST_HOST) {
60 hdd_err_rl("Command length (%zu) is invalid, expected [%d, %d]",
61 count,
62 MIN_USER_COMMAND_SIZE_UNIT_TEST_HOST,
63 MAX_USER_COMMAND_SIZE_UNIT_TEST_HOST);
64 return -EINVAL;
65 }
66
67 /* Get command from user */
68 if (copy_from_user(name, buf, count))
69 return -EFAULT;
70 /* default 'echo' cmd takes new line character to here*/
71 if (name[count - 1] == '\n')
72 name[count - 1] = '\0';
73 else
74 name[count] = '\0';
75
76 hdd_nofl_info("unit_test: count %zu name: %s", count, name);
77
78 ret = wlan_hdd_unit_test(hdd_ctx, name);
79 if (ret != 0)
80 return ret;
81
82 return count;
83 }
84
85 /**
86 * wlan_hdd_write_unit_test_host_debugfs()
87 * - wrapper for __wlan_hdd_write_unit_test_host_debugfs
88 *
89 * @file: file pointer
90 * @buf: buffer
91 * @count: count
92 * @ppos: position pointer
93 *
94 * Return: number of bytes processed or errno
95 */
wlan_hdd_write_unit_test_host_debugfs(struct file * file,const char __user * buf,size_t count,loff_t * ppos)96 static ssize_t wlan_hdd_write_unit_test_host_debugfs(
97 struct file *file,
98 const char __user *buf,
99 size_t count, loff_t *ppos)
100 {
101 struct hdd_context *hdd_ctx = file_inode(file)->i_private;
102 struct osif_psoc_sync *psoc_sync;
103 ssize_t errno_size;
104
105 errno_size = wlan_hdd_validate_context(hdd_ctx);
106 if (errno_size)
107 return errno_size;
108
109 errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy),
110 &psoc_sync);
111 if (errno_size)
112 return errno_size;
113
114 errno_size = __wlan_hdd_write_unit_test_host_debugfs(
115 hdd_ctx, buf, count, ppos);
116 if (errno_size < 0)
117 hdd_err_rl("err_size %zd", errno_size);
118
119 osif_psoc_sync_op_stop(psoc_sync);
120 return errno_size;
121 }
122
123 static const struct file_operations fops_unit_test_host_debugfs = {
124 .write = wlan_hdd_write_unit_test_host_debugfs,
125 .owner = THIS_MODULE,
126 .llseek = default_llseek,
127 };
128
wlan_hdd_debugfs_unit_test_host_create(struct hdd_context * hdd_ctx)129 int wlan_hdd_debugfs_unit_test_host_create(struct hdd_context *hdd_ctx)
130 {
131 if (!debugfs_create_file("unit_test_host", 00400 | 00200,
132 qdf_debugfs_get_root(),
133 hdd_ctx, &fops_unit_test_host_debugfs))
134 return -EINVAL;
135
136 return 0;
137 }
138 #endif /* WLAN_UNIT_TEST */
139