1  /*
2   * Copyright (c) 2021, Qualcomm Innovation Center, Inc. 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_wifi_radar_utils_api.h>
18  #include <wlan_wifi_radar_tgt_api.h>
19  #include <qdf_module.h>
20  #include <wifi_radar_defs_i.h>
21  #include <wlan_objmgr_global_obj.h>
22  #include <wlan_objmgr_pdev_obj.h>
23  
wlan_wifi_radar_init(void)24  QDF_STATUS wlan_wifi_radar_init(void)
25  {
26  	if (wlan_objmgr_register_psoc_create_handler(
27  	    WLAN_UMAC_COMP_WIFI_RADAR,
28  	    wlan_wifi_radar_psoc_obj_create_handler, NULL)
29  		!= QDF_STATUS_SUCCESS) {
30  		return QDF_STATUS_E_FAILURE;
31  	}
32  	if (wlan_objmgr_register_psoc_destroy_handler(
33  	    WLAN_UMAC_COMP_WIFI_RADAR,
34  		wlan_wifi_radar_psoc_obj_destroy_handler, NULL)
35  		!= QDF_STATUS_SUCCESS) {
36  		return QDF_STATUS_E_FAILURE;
37  	}
38  	if (wlan_objmgr_register_pdev_create_handler(
39  		WLAN_UMAC_COMP_WIFI_RADAR,
40  		wlan_wifi_radar_pdev_obj_create_handler, NULL)
41  		!= QDF_STATUS_SUCCESS) {
42  		return QDF_STATUS_E_FAILURE;
43  	}
44  	if (wlan_objmgr_register_pdev_destroy_handler(
45  		WLAN_UMAC_COMP_WIFI_RADAR,
46  		wlan_wifi_radar_pdev_obj_destroy_handler, NULL)
47  		!= QDF_STATUS_SUCCESS) {
48  		return QDF_STATUS_E_FAILURE;
49  	}
50  	return QDF_STATUS_SUCCESS;
51  }
52  
wlan_wifi_radar_deinit(void)53  QDF_STATUS wlan_wifi_radar_deinit(void)
54  {
55  	QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
56  
57  	if (wlan_objmgr_unregister_psoc_create_handler(
58  		WLAN_UMAC_COMP_WIFI_RADAR,
59  		wlan_wifi_radar_psoc_obj_create_handler, NULL)
60  		!= QDF_STATUS_SUCCESS) {
61  		wifi_radar_err("failed to unregister psoc create handler");
62  		ret_status = QDF_STATUS_E_FAILURE;
63  	}
64  	if (wlan_objmgr_unregister_psoc_destroy_handler(
65  		WLAN_UMAC_COMP_WIFI_RADAR,
66  		wlan_wifi_radar_psoc_obj_destroy_handler, NULL)
67  		!= QDF_STATUS_SUCCESS) {
68  		wifi_radar_err("failed to unregister psoc destroy handler");
69  		ret_status = QDF_STATUS_E_FAILURE;
70  	}
71  	if (wlan_objmgr_unregister_pdev_create_handler(
72  		WLAN_UMAC_COMP_WIFI_RADAR,
73  		wlan_wifi_radar_pdev_obj_create_handler, NULL)
74  		!= QDF_STATUS_SUCCESS) {
75  		wifi_radar_err("failed to unregister pdev create handler");
76  		ret_status = QDF_STATUS_E_FAILURE;
77  	}
78  	if (wlan_objmgr_unregister_pdev_destroy_handler(
79  		WLAN_UMAC_COMP_WIFI_RADAR,
80  		wlan_wifi_radar_pdev_obj_destroy_handler, NULL)
81  		!= QDF_STATUS_SUCCESS) {
82  		wifi_radar_err("failed to unregister pdev destroy handler");
83  		ret_status = QDF_STATUS_E_FAILURE;
84  	}
85  	return ret_status;
86  }
87  
wlan_wifi_radar_pdev_open(struct wlan_objmgr_pdev * pdev)88  QDF_STATUS wlan_wifi_radar_pdev_open(struct wlan_objmgr_pdev *pdev)
89  {
90  	QDF_STATUS status;
91  
92  	if (wlan_wifi_radar_is_feature_disabled(pdev)) {
93  		wifi_radar_err("WiFi Radar is disabled");
94  		return QDF_STATUS_COMP_DISABLED;
95  	}
96  
97  	/* RealyFS init */
98  	status = wifi_radar_streamfs_init(pdev);
99  	if (status != QDF_STATUS_SUCCESS) {
100  		wifi_radar_err(
101  		"wifi_radar_streamfs_init failed with %d",
102  		status);
103  		return QDF_STATUS_SUCCESS;
104  	}
105  
106  	return QDF_STATUS_SUCCESS;
107  }
108  
wlan_wifi_radar_pdev_close(struct wlan_objmgr_pdev * pdev)109  QDF_STATUS wlan_wifi_radar_pdev_close(struct wlan_objmgr_pdev *pdev)
110  {
111  	QDF_STATUS status = QDF_STATUS_SUCCESS;
112  
113  	if (wlan_wifi_radar_is_feature_disabled(pdev)) {
114  		wifi_radar_err("WiFi Radar is disabled");
115  		return QDF_STATUS_COMP_DISABLED;
116  	}
117  
118  	status = wifi_radar_streamfs_remove(pdev);
119  
120  	return status;
121  }
122  
wifi_radar_initialize_pdev(struct wlan_objmgr_pdev * pdev)123  QDF_STATUS wifi_radar_initialize_pdev(struct wlan_objmgr_pdev *pdev)
124  {
125  	QDF_STATUS status = QDF_STATUS_SUCCESS;
126  
127  	if (wlan_wifi_radar_is_feature_disabled(pdev)) {
128  		wifi_radar_err("WiFi Radar is disabled");
129  		return QDF_STATUS_COMP_DISABLED;
130  	}
131  
132  	return status;
133  }
134  
135  qdf_export_symbol(wifi_radar_initialize_pdev);
136  
wifi_radar_deinitialize_pdev(struct wlan_objmgr_pdev * pdev)137  QDF_STATUS wifi_radar_deinitialize_pdev(struct wlan_objmgr_pdev *pdev)
138  {
139  	QDF_STATUS status = QDF_STATUS_SUCCESS;
140  
141  	if (wlan_wifi_radar_is_feature_disabled(pdev)) {
142  		wifi_radar_err("WiFi Radar is disabled");
143  		return QDF_STATUS_COMP_DISABLED;
144  	}
145  
146  	return status;
147  }
148  
149  qdf_export_symbol(wifi_radar_deinitialize_pdev);
150  
wlan_wifi_radar_is_feature_disabled(struct wlan_objmgr_pdev * pdev)151  bool wlan_wifi_radar_is_feature_disabled(struct wlan_objmgr_pdev *pdev)
152  {
153  	if (!pdev) {
154  		wifi_radar_err("PDEV is NULL!");
155  		return true;
156  	}
157  
158  	return (wlan_pdev_nif_feat_ext_cap_get(
159  			pdev, WLAN_PDEV_FEXT_WIFI_RADAR_ENABLE) ? false : true);
160  }
161