1 /* 2 * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 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_sysfs_wowl_add_ptrn.c 22 * 23 * implementation for creating sysfs file wowl_add_ptrn 24 */ 25 26 #include <wlan_hdd_includes.h> 27 #include <wlan_hdd_sysfs.h> 28 #include "osif_vdev_sync.h" 29 #include "wlan_hdd_wowl.h" 30 #include <wlan_hdd_sysfs_wowl_add_ptrn.h> 31 32 static ssize_t __hdd_sysfs_wowl_add_ptrn_store(struct net_device * net_dev,char const * buf,size_t count)33 __hdd_sysfs_wowl_add_ptrn_store(struct net_device *net_dev, 34 char const *buf, 35 size_t count) 36 { 37 struct hdd_adapter *adapter = netdev_priv(net_dev); 38 struct hdd_context *hdd_ctx; 39 char *buf_local = NULL; 40 int ret; 41 42 if (hdd_validate_adapter(adapter)) 43 return -EINVAL; 44 45 hdd_ctx = WLAN_HDD_GET_CTX(adapter); 46 ret = wlan_hdd_validate_context(hdd_ctx); 47 if (ret) 48 return ret; 49 50 if (!wlan_hdd_validate_modules_state(hdd_ctx)) 51 return -EINVAL; 52 53 if (count > MAX_CMD_INPUT) 54 return -EINVAL; 55 56 buf_local = (char *)qdf_mem_malloc(sizeof(char) * count); 57 if (!buf_local) 58 return -EINVAL; 59 60 strlcpy(buf_local, buf, count); 61 62 buf_local[count - 1] = '\0'; 63 64 hdd_debug("wowl_add_ptrn: count %zu buf_local:(%s)", 65 count, buf_local); 66 67 if (!hdd_add_wowl_ptrn(adapter, buf_local)) { 68 hdd_err_rl("Failed to add wowl ptrn"); 69 qdf_mem_free(buf_local); 70 return -EINVAL; 71 } 72 73 qdf_mem_free(buf_local); 74 return count; 75 } 76 77 static ssize_t hdd_sysfs_wowl_add_ptrn_store(struct device * dev,struct device_attribute * attr,char const * buf,size_t count)78 hdd_sysfs_wowl_add_ptrn_store(struct device *dev, 79 struct device_attribute *attr, 80 char const *buf, size_t count) 81 { 82 struct net_device *net_dev = container_of(dev, struct net_device, dev); 83 struct osif_vdev_sync *vdev_sync; 84 ssize_t err_size; 85 86 err_size = osif_vdev_sync_op_start(net_dev, &vdev_sync); 87 if (err_size) 88 return err_size; 89 90 err_size = __hdd_sysfs_wowl_add_ptrn_store(net_dev, buf, count); 91 92 osif_vdev_sync_op_stop(vdev_sync); 93 94 return err_size; 95 } 96 97 static DEVICE_ATTR(wowl_add_ptrn, 0220, 98 NULL, hdd_sysfs_wowl_add_ptrn_store); 99 hdd_sysfs_wowl_add_ptrn_create(struct hdd_adapter * adapter)100 int hdd_sysfs_wowl_add_ptrn_create(struct hdd_adapter *adapter) 101 { 102 int error; 103 104 error = device_create_file(&adapter->dev->dev, 105 &dev_attr_wowl_add_ptrn); 106 if (error) 107 hdd_err("could not create wowl_add_ptrn sysfs file"); 108 109 return error; 110 } 111 hdd_sysfs_wowl_add_ptrn_destroy(struct hdd_adapter * adapter)112 void hdd_sysfs_wowl_add_ptrn_destroy(struct hdd_adapter *adapter) 113 { 114 device_remove_file(&adapter->dev->dev, &dev_attr_wowl_add_ptrn); 115 } 116