1  /*
2   * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for any
6   * purpose with or without fee is hereby granted, provided that the above
7   * copyright notice and this permission notice appear in all copies.
8   *
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16   */
17  
18  /**
19   * DOC: wlan_hdd_sysfs_radar.c
20   *
21   * Implementation for creating sysfs file radar
22   */
23  
24  #include <wlan_hdd_includes.h>
25  #include "osif_vdev_sync.h"
26  #include <wlan_hdd_sysfs.h>
27  #include <wlan_hdd_sysfs_radar.h>
28  #include "wlan_dfs_tgt_api.h"
29  
30  static ssize_t
__hdd_sysfs_radar_store(struct net_device * net_dev,char const * buf,size_t count)31  __hdd_sysfs_radar_store(struct net_device *net_dev,
32  			char const *buf, size_t count)
33  {
34  	struct hdd_adapter *adapter = netdev_priv(net_dev);
35  	struct hdd_ap_ctx *ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter->deflink);
36  	char buf_local[MAX_SYSFS_USER_COMMAND_SIZE_LENGTH + 1];
37  	struct wlan_objmgr_pdev *pdev;
38  	struct radar_found_info radar;
39  	struct hdd_context *hdd_ctx;
40  	char *sptr, *token;
41  	int set_value;
42  	int ret;
43  
44  	if (hdd_validate_adapter(adapter))
45  		return -EINVAL;
46  
47  	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
48  	ret = wlan_hdd_validate_context(hdd_ctx);
49  	if (ret != 0)
50  		return ret;
51  
52  	if (!wlan_hdd_validate_modules_state(hdd_ctx))
53  		return -EINVAL;
54  
55  	ret = hdd_sysfs_validate_and_copy_buf(buf_local, sizeof(buf_local),
56  					      buf, count);
57  
58  	if (ret) {
59  		hdd_err_rl("invalid input");
60  		return ret;
61  	}
62  
63  	sptr = buf_local;
64  	hdd_debug("set_radar: count %zu buf_local:(%s) net_devname %s",
65  		  count, buf_local, net_dev->name);
66  
67  	/* Get set_value */
68  	token = strsep(&sptr, " ");
69  	if (!token)
70  		return -EINVAL;
71  	if (kstrtou32(token, 0, &set_value))
72  		return -EINVAL;
73  
74  	hdd_debug("Set QCASAP_SET_RADAR_CMD val %d", set_value);
75  
76  	pdev = hdd_ctx->pdev;
77  	if (!pdev) {
78  		hdd_err("null pdev");
79  		return -EINVAL;
80  	}
81  
82  	qdf_mem_zero(&radar, sizeof(radar));
83  	if (policy_mgr_get_dfs_beaconing_session_id(hdd_ctx->psoc) !=
84  	    WLAN_UMAC_VDEV_ID_MAX)
85  		tgt_dfs_process_radar_ind(pdev, &radar);
86  	else
87  		hdd_debug("Ignore set radar, op ch_freq(%d) is not dfs",
88  			  ap_ctx->operating_chan_freq);
89  
90  	return count;
91  }
92  
93  static ssize_t
hdd_sysfs_radar_store(struct device * dev,struct device_attribute * attr,char const * buf,size_t count)94  hdd_sysfs_radar_store(struct device *dev,
95  		      struct device_attribute *attr,
96  		      char const *buf, size_t count)
97  {
98  	struct net_device *net_dev = container_of(dev, struct net_device, dev);
99  	struct osif_vdev_sync *vdev_sync;
100  	ssize_t errno_size;
101  
102  	errno_size = osif_vdev_sync_op_start(net_dev, &vdev_sync);
103  	if (errno_size)
104  		return errno_size;
105  
106  	errno_size = __hdd_sysfs_radar_store(net_dev, buf, count);
107  
108  	osif_vdev_sync_op_stop(vdev_sync);
109  
110  	return errno_size;
111  }
112  
113  static DEVICE_ATTR(radar, 0220,
114  		   NULL, hdd_sysfs_radar_store);
115  
hdd_sysfs_radar_create(struct hdd_adapter * adapter)116  int hdd_sysfs_radar_create(struct hdd_adapter *adapter)
117  {
118  	int error;
119  
120  	error = device_create_file(&adapter->dev->dev, &dev_attr_radar);
121  	if (error)
122  		hdd_err("could not create radar sysfs file");
123  
124  	return error;
125  }
126  
hdd_sysfs_radar_destroy(struct hdd_adapter * adapter)127  void hdd_sysfs_radar_destroy(struct hdd_adapter *adapter)
128  {
129  	device_remove_file(&adapter->dev->dev, &dev_attr_radar);
130  }
131