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