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