1 /*
2  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-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: This file has the dcs dispatcher API which is exposed to outside of dcs
20  * component.
21  */
22 #ifndef _WLAN_DCS_UCFG_API_H_
23 #define _WLAN_DCS_UCFG_API_H_
24 
25 #include <qdf_status.h>
26 #include <wlan_objmgr_pdev_obj.h>
27 #include <wlan_dcs_public_structs.h>
28 
29 /**
30  * typedef dcs_callback() - DCS callback
31  * @psoc: Pointer to psoc
32  * @mac_id: mac id
33  * @interference_type: interference type
34  * @arg: list of arguments
35  */
36 typedef void (*dcs_callback)(
37 		struct wlan_objmgr_psoc *psoc,
38 		uint8_t mac_id,
39 		uint8_t interference_type,
40 		void *arg);
41 
42 /**
43  * typedef dcs_switch_chan_cb() - DCS callback for switching channel
44  * @vdev: Pointer to vdev
45  * @tgt_freq: target channel frequency
46  * @tgt_width: target channel width
47  */
48 typedef QDF_STATUS (*dcs_switch_chan_cb)(struct wlan_objmgr_vdev *vdev,
49 					 qdf_freq_t tgt_freq,
50 					 enum phy_ch_width tgt_width);
51 
52 /**
53  * typedef dcs_afc_select_chan_cb() - DCS callback for AFC channel selection
54  * @arg: pointer to argument
55  * @vdev_id: vdev id
56  * @cur_freq: current channel frequency
57  * @cur_bw: current channel bandwidth
58  * @pref_bw: pointer to bandwidth of prefer bandwidth when input, and target
59  *           bandwidth switch to when output
60  */
61 typedef qdf_freq_t (*dcs_afc_select_chan_cb)(void *arg,
62 					     uint32_t vdev_id,
63 					     qdf_freq_t cur_freq,
64 					     enum phy_ch_width cur_bw,
65 					     enum phy_ch_width *pref_bw);
66 
67 #ifdef DCS_INTERFERENCE_DETECTION
68 /**
69  * ucfg_dcs_register_cb() - API to register dcs callback
70  * @psoc: pointer to psoc object
71  * @cbk: dcs callback to be registered
72  * @arg: argument
73  *
74  * This function gets called to register dcs callback function
75  *
76  * Return: None
77  */
78 void ucfg_dcs_register_cb(
79 		struct wlan_objmgr_psoc *psoc,
80 		dcs_callback cbk,
81 		void *arg);
82 
83 /**
84  * ucfg_dcs_register_user_cb() - API to register dcs user callback
85  * @psoc: pointer to psoc object
86  * @mac_id: mac id
87  * @vdev_id: vdev id
88  * @cb: dcs user callback to be registered
89  *
90  * Return: None
91  */
92 void ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc *psoc,
93 			       uint8_t mac_id, uint8_t vdev_id,
94 			       void (*cb)(uint8_t vdev_id,
95 				      struct wlan_host_dcs_im_user_stats *stats,
96 				      int status));
97 
98 /**
99  * ucfg_dcs_register_awgn_cb() - API to register dcs awgn callback
100  * @psoc: pointer to psoc object
101  * @cb: dcs switch channel callback to be registered
102  *
103  * Return: QDF_STATUS
104  */
105 QDF_STATUS ucfg_dcs_register_awgn_cb(struct wlan_objmgr_psoc *psoc,
106 				     dcs_switch_chan_cb cb);
107 
108 /**
109  * ucfg_dcs_register_afc_sel_chan_cb() - API to register SAP channel selection
110  *                                       callback for AFC DCS
111  * @psoc: pointer to psoc object
112  * @cb: dcs user callback to be registered
113  * @arg: argument
114  *
115  * Return: QDF_STATUS
116  */
117 QDF_STATUS ucfg_dcs_register_afc_sel_chan_cb(struct wlan_objmgr_psoc *psoc,
118 					     dcs_afc_select_chan_cb cb,
119 					     void *arg);
120 /**
121  * ucfg_wlan_dcs_cmd(): API to send dcs command
122  * @psoc: pointer to psoc object
123  * @mac_id: mac id
124  * @is_host_pdev_id: pdev_id is host id or not
125  *
126  * This function gets called to send dcs command
127  *
128  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
129  */
130 QDF_STATUS
131 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc,
132 		  uint32_t mac_id,
133 		  bool is_host_pdev_id);
134 
135 /**
136  * ucfg_config_dcs_enable() - API to config dcs enable
137  * @psoc: pointer to psoc object
138  * @mac_id: mac id
139  * @interference_type: type mask(WLAN_HOST_DCS_CWIM / WLAN_HOST_DCS_WLANIM)
140  *
141  * This function gets called to config dcs enable
142  *
143  * Return: None
144  */
145 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc,
146 			    uint32_t mac_id,
147 			    uint8_t interference_type);
148 
149 /**
150  * ucfg_config_dcs_disable() - API to config dcs disable
151  * @psoc: pointer to psoc object
152  * @mac_id: mac id
153  * @interference_type: type mask(WLAN_HOST_DCS_CWIM / WLAN_HOST_DCS_WLANIM)
154  *
155  * This function gets called to config dcs disable
156  *
157  * Return: None
158  */
159 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc,
160 			     uint32_t mac_id,
161 			     uint8_t interference_type);
162 
163 /**
164  * ucfg_get_dcs_enable() - API to get dcs enable
165  * @psoc: pointer to psoc object
166  * @mac_id: mac id
167  *
168  * This function gets called to get current host
169  * config dcs enable/disable status
170  *
171  * Return: WLANIM/CWIM enable status
172  */
173 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t mac_id);
174 
175 /**
176  * ucfg_dcs_clear() - API to clear dcs related information
177  * @psoc: pointer to psoc object
178  * @mac_id: mac id
179  *
180  * This function gets called to clear dcs related information
181  *
182  * Return: None
183  */
184 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t mac_id);
185 
186 /**
187  * ucfg_config_dcs_event_data() - config dcs event data to do algorithm
188  * process or not
189  * @psoc: psoc pointer
190  * @mac_id: mac id
191  * @dcs_algorithm_process: dcs algorithm process or not
192  *
193  * The function gets called to config dcs event data to do algorithm
194  * process or not
195  *
196  * Return: None
197  */
198 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
199 				bool dcs_algorithm_process);
200 
201 /*
202  * ucfg_dcs_reset_user_stats() - API to reset dcs user stats
203  * @psoc: pointer to psoc object
204  * @mac_id: mac id
205  *
206  * Return: None
207  */
208 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t mac_id);
209 
210 /**
211  * ucfg_dcs_set_user_request() - API to set dcs user stats request counter
212  * @psoc: pointer to psoc object
213  * @mac_id: mac id
214  * @user_request_count: user stats request counter
215  *
216  * Return: None
217  */
218 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
219 			       uint32_t user_request_count);
220 
221 /**
222  * ucfg_dcs_get_ch_util() - API to get channel interference values
223  * @psoc: pointer to psoc object
224  * @mac_id: mac id
225  * @dcs_stats: pointer to wlan_host_dcs_ch_util_stats
226  *
227  * Return: Integer
228  */
229 QDF_STATUS ucfg_dcs_get_ch_util(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
230 				struct wlan_host_dcs_ch_util_stats *dcs_stats);
231 /**
232  * ucfg_dcs_switch_chan() - switch channel for vdev
233  * @vdev: vdev ptr
234  * @tgt_freq: target frequency
235  * @tgt_width: target channel width
236  *
237  * Return: QDF_STATUS
238  */
239 QDF_STATUS
240 ucfg_dcs_switch_chan(struct wlan_objmgr_vdev *vdev, qdf_freq_t tgt_freq,
241 		     enum phy_ch_width tgt_width);
242 #else
243 static inline void
ucfg_dcs_register_cb(struct wlan_objmgr_psoc * psoc,dcs_callback cbk,void * arg)244 ucfg_dcs_register_cb(struct wlan_objmgr_psoc *psoc, dcs_callback cbk, void *arg)
245 {
246 }
247 
248 static inline void
ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc * psoc,uint8_t mac_id,uint8_t vdev_id,void (* cb)(uint8_t vdev_id,struct wlan_host_dcs_im_user_stats * stats,int status))249 ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc *psoc,
250 			  uint8_t mac_id, uint8_t vdev_id,
251 			  void (*cb)(uint8_t vdev_id,
252 				     struct wlan_host_dcs_im_user_stats *stats,
253 				     int status))
254 {
255 }
256 
257 static inline QDF_STATUS
ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc * psoc,uint32_t mac_id,bool is_host_pdev_id)258 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
259 		  bool is_host_pdev_id)
260 {
261 	return QDF_STATUS_SUCCESS;
262 }
263 
264 static inline void
ucfg_config_dcs_enable(struct wlan_objmgr_psoc * psoc,uint32_t mac_id,uint8_t interference_type)265 ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
266 		       uint8_t interference_type)
267 {
268 }
269 
270 static inline void
ucfg_config_dcs_disable(struct wlan_objmgr_psoc * psoc,uint32_t mac_id,uint8_t interference_type)271 ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
272 			uint8_t interference_type)
273 {
274 }
275 
276 static inline uint8_t
ucfg_get_dcs_enable(struct wlan_objmgr_psoc * psoc,uint8_t mac_id)277 ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t mac_id)
278 {
279 	return 0;
280 }
281 
282 static inline void
ucfg_dcs_clear(struct wlan_objmgr_psoc * psoc,uint32_t mac_id)283 ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t mac_id)
284 {
285 }
286 
287 static inline void
ucfg_config_dcs_event_data(struct wlan_objmgr_psoc * psoc,uint32_t mac_id,bool dcs_algorithm_process)288 ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
289 			   bool dcs_algorithm_process)
290 {
291 }
292 
293 static inline void
ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc * psoc,uint8_t mac_id)294 ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t mac_id)
295 {
296 }
297 
298 static inline void
ucfg_dcs_set_user_request(struct wlan_objmgr_psoc * psoc,uint8_t mac_id,uint32_t user_request_count)299 ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
300 			  uint32_t user_request_count)
301 {
302 }
303 
304 static inline QDF_STATUS
ucfg_dcs_get_ch_util(struct wlan_objmgr_psoc * psoc,uint8_t mac_id,struct wlan_host_dcs_ch_util_stats * dcs_stats)305 ucfg_dcs_get_ch_util(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
306 		     struct wlan_host_dcs_ch_util_stats *dcs_stats)
307 {
308 	return QDF_STATUS_SUCCESS;
309 }
310 
311 static inline QDF_STATUS
ucfg_dcs_switch_chan(struct wlan_objmgr_vdev * vdev,qdf_freq_t tgt_freq,enum phy_ch_width tgt_width)312 ucfg_dcs_switch_chan(struct wlan_objmgr_vdev *vdev, qdf_freq_t tgt_freq,
313 		     enum phy_ch_width tgt_width)
314 {
315 	return QDF_STATUS_SUCCESS;
316 }
317 
318 #endif
319 #endif /* _WLAN_DCS_UCFG_API_H_ */
320