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