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 #include <wlan_hdd_main.h>
18 #include <wlan_hdd_sysfs.h>
19 #include <wlan_hdd_sysfs_pkt_log.h>
20 #include "osif_sync.h"
21
22 #define MAX_USER_COMMAND_SIZE_PKT_LOG_CMD 4
23
__hdd_sysfs_pkt_log_cmd_store(struct hdd_context * hdd_ctx,const char * buf,size_t count)24 static ssize_t __hdd_sysfs_pkt_log_cmd_store(struct hdd_context *hdd_ctx,
25 const char *buf, size_t count)
26 {
27 char buf_local[MAX_USER_COMMAND_SIZE_PKT_LOG_CMD + 1];
28 char *sptr, *token;
29 uint32_t val1, val2;
30 int ret;
31
32 hdd_enter();
33
34 if (!wlan_hdd_validate_modules_state(hdd_ctx))
35 return -EINVAL;
36
37 ret = hdd_sysfs_validate_and_copy_buf(buf_local, sizeof(buf_local),
38 buf, count);
39 if (ret)
40 return -EINVAL;
41
42 sptr = buf_local;
43 /* Get val1 */
44 token = strsep(&sptr, " ");
45 if (!token)
46 return -EINVAL;
47 if (kstrtou32(token, 0, &val1))
48 return -EINVAL;
49
50 sptr = buf_local;
51 /* Get val2 */
52 token = strsep(&sptr, " ");
53 if (!token)
54 return -EINVAL;
55 if (kstrtou32(token, 0, &val2))
56 return -EINVAL;
57
58 ret = hdd_process_pktlog_command(hdd_ctx, val1, val2);
59
60 hdd_exit();
61 return count;
62 }
63
hdd_sysfs_pkt_log_cmd_store(struct kobject * kobj,struct kobj_attribute * attr,const char * buf,size_t count)64 static ssize_t hdd_sysfs_pkt_log_cmd_store(struct kobject *kobj,
65 struct kobj_attribute *attr,
66 const char *buf,
67 size_t count)
68 {
69 struct osif_psoc_sync *psoc_sync;
70 struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
71 ssize_t err_size;
72
73 if (wlan_hdd_validate_context(hdd_ctx))
74 return 0;
75
76 err_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy),
77 &psoc_sync);
78 if (err_size)
79 return err_size;
80
81 err_size = __hdd_sysfs_pkt_log_cmd_store(hdd_ctx, buf, count);
82
83 osif_psoc_sync_op_stop(psoc_sync);
84 return err_size;
85 }
86
87 static struct kobj_attribute pktlog_attribute =
88 __ATTR(pktlog, 0220, NULL,
89 hdd_sysfs_pkt_log_cmd_store);
90
hdd_sysfs_pktlog_create(struct kobject * driver_kobject)91 void hdd_sysfs_pktlog_create(struct kobject *driver_kobject)
92 {
93 if (sysfs_create_file(driver_kobject, &pktlog_attribute.attr))
94 hdd_err("Failed to create pktlog sysfs entry");
95 }
96
hdd_sysfs_pktlog_destroy(struct kobject * driver_kobject)97 void hdd_sysfs_pktlog_destroy(struct kobject *driver_kobject)
98 {
99 sysfs_remove_file(driver_kobject, &pktlog_attribute.attr);
100 }
101