xref: /wlan-driver/qca-wifi-host-cmn/umac/dcs/core/src/wlan_dcs.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /**
19*5113495bSYour Name  * DOC: This file has main dcs structures definition.
20*5113495bSYour Name  */
21*5113495bSYour Name 
22*5113495bSYour Name #ifndef _WLAN_DCS_H_
23*5113495bSYour Name #define _WLAN_DCS_H_
24*5113495bSYour Name 
25*5113495bSYour Name #include <wmi_unified_param.h>
26*5113495bSYour Name #include "wlan_dcs_tgt_api.h"
27*5113495bSYour Name #include "wlan_dcs_ucfg_api.h"
28*5113495bSYour Name 
29*5113495bSYour Name #define dcs_debug(args ...) \
30*5113495bSYour Name 		QDF_TRACE_DEBUG(QDF_MODULE_ID_DCS, ## args)
31*5113495bSYour Name #define dcs_info(args ...) \
32*5113495bSYour Name 		QDF_TRACE_INFO(QDF_MODULE_ID_DCS, ## args)
33*5113495bSYour Name #define dcs_err(args ...) \
34*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_DCS, ## args)
35*5113495bSYour Name 
36*5113495bSYour Name #define WLAN_DCS_MAX_PDEVS 3
37*5113495bSYour Name 
38*5113495bSYour Name #define DCS_TX_MAX_CU  30
39*5113495bSYour Name #define MAX_DCS_TIME_RECORD 10
40*5113495bSYour Name #define DCS_FREQ_CONTROL_TIME (5 * 60 * 1000)
41*5113495bSYour Name 
42*5113495bSYour Name /**
43*5113495bSYour Name  * enum wlan_dcs_debug_level - dcs debug trace level
44*5113495bSYour Name  * @DCS_DEBUG_DISABLE: disable debug trace
45*5113495bSYour Name  * @DCS_DEBUG_CRITICAL: critical debug trace level
46*5113495bSYour Name  * @DCS_DEBUG_VERBOSE:  verbose debug trace level
47*5113495bSYour Name  */
48*5113495bSYour Name enum wlan_dcs_debug_level {
49*5113495bSYour Name 	DCS_DEBUG_DISABLE = 0,
50*5113495bSYour Name 	DCS_DEBUG_CRITICAL = 1,
51*5113495bSYour Name 	DCS_DEBUG_VERBOSE = 2
52*5113495bSYour Name };
53*5113495bSYour Name 
54*5113495bSYour Name /**
55*5113495bSYour Name  * struct pdev_dcs_im_stats - define dcs interference mitigation
56*5113495bSYour Name  *                            stats in pdev object
57*5113495bSYour Name  * @prev_dcs_im_stats: previous statistics at last time
58*5113495bSYour Name  * @user_dcs_im_stats: statistics requested from userspace
59*5113495bSYour Name  * @dcs_ch_util_im_stats: chan utilization statistics
60*5113495bSYour Name  * @im_intfr_cnt: number of times the interference is
61*5113495bSYour Name  *                detected within detection window
62*5113495bSYour Name  * @im_samp_cnt: sample counter
63*5113495bSYour Name  */
64*5113495bSYour Name struct pdev_dcs_im_stats {
65*5113495bSYour Name 	struct wlan_host_dcs_im_tgt_stats prev_dcs_im_stats;
66*5113495bSYour Name 	struct wlan_host_dcs_im_user_stats user_dcs_im_stats;
67*5113495bSYour Name 	struct wlan_host_dcs_ch_util_stats dcs_ch_util_im_stats;
68*5113495bSYour Name 	uint8_t im_intfr_cnt;
69*5113495bSYour Name 	uint8_t im_samp_cnt;
70*5113495bSYour Name };
71*5113495bSYour Name 
72*5113495bSYour Name /**
73*5113495bSYour Name  * struct pdev_dcs_params - define dcs configuration parameter in pdev object
74*5113495bSYour Name  * @dcs_enable_cfg: dcs enable from ini config
75*5113495bSYour Name  * @dcs_enable: dcs enable from ucfg config
76*5113495bSYour Name  * @dcs_algorithm_process: do dcs algorithm process or not
77*5113495bSYour Name  * @force_disable_algorithm: disable dcs algorithm forcely
78*5113495bSYour Name  * @dcs_debug: dcs debug trace level
79*5113495bSYour Name  * @phy_err_penalty: phy error penalty
80*5113495bSYour Name  * @phy_err_threshold: phy error threshold
81*5113495bSYour Name  * @radar_err_threshold: radar error threshold
82*5113495bSYour Name  * @coch_intfr_threshold: co-channel interference threshold
83*5113495bSYour Name  * @user_max_cu: tx channel utilization due to AP's tx and rx
84*5113495bSYour Name  * @intfr_detection_threshold: interference detection threshold
85*5113495bSYour Name  * @intfr_detection_window: interference sampling window
86*5113495bSYour Name  * @tx_err_threshold: transmission failure rate threshold
87*5113495bSYour Name  * @user_request_count: counter of stats requested from userspace
88*5113495bSYour Name  * @notify_user: whether to notify userspace
89*5113495bSYour Name  */
90*5113495bSYour Name struct pdev_dcs_params {
91*5113495bSYour Name 	uint8_t dcs_enable_cfg;
92*5113495bSYour Name 	uint8_t dcs_enable;
93*5113495bSYour Name 	bool dcs_algorithm_process;
94*5113495bSYour Name 	bool force_disable_algorithm;
95*5113495bSYour Name 	enum wlan_dcs_debug_level dcs_debug;
96*5113495bSYour Name 	uint32_t phy_err_penalty;
97*5113495bSYour Name 	uint32_t phy_err_threshold;
98*5113495bSYour Name 	uint32_t radar_err_threshold;
99*5113495bSYour Name 	uint32_t coch_intfr_threshold;
100*5113495bSYour Name 	uint32_t user_max_cu;
101*5113495bSYour Name 	uint32_t intfr_detection_threshold;
102*5113495bSYour Name 	uint32_t intfr_detection_window;
103*5113495bSYour Name 	uint32_t tx_err_threshold;
104*5113495bSYour Name 	uint32_t user_request_count;
105*5113495bSYour Name 	uint8_t notify_user;
106*5113495bSYour Name };
107*5113495bSYour Name 
108*5113495bSYour Name /**
109*5113495bSYour Name  * struct pdev_dcs_freq_ctrl_params - define dcs frequency control parameter
110*5113495bSYour Name  *                                    in pdebv object
111*5113495bSYour Name  * @disable_threshold_per_5mins: in five minutes, if dcs happen more than
112*5113495bSYour Name  *                               threshold, then disable dcs for some time
113*5113495bSYour Name  * @restart_delay: when dcs happen more than threshold in five minutes,
114*5113495bSYour Name  *                 then start to disable dcs for restart_delay minutes
115*5113495bSYour Name  * @timestamp: record dcs happened timestamp
116*5113495bSYour Name  * @dcs_happened_count: dcs happened count
117*5113495bSYour Name  * @disable_delay_process: in dcs disable delay process or not
118*5113495bSYour Name  */
119*5113495bSYour Name struct pdev_dcs_freq_ctrl_params {
120*5113495bSYour Name 	uint8_t disable_threshold_per_5mins;
121*5113495bSYour Name 	uint32_t restart_delay;
122*5113495bSYour Name 	unsigned long timestamp[MAX_DCS_TIME_RECORD];
123*5113495bSYour Name 	unsigned long dcs_happened_count;
124*5113495bSYour Name 	bool disable_delay_process;
125*5113495bSYour Name };
126*5113495bSYour Name 
127*5113495bSYour Name /**
128*5113495bSYour Name  * struct pdev_dcs_timer_args - define pdev dcs timer args
129*5113495bSYour Name  * @psoc: psoc pointer
130*5113495bSYour Name  * @pdev_id: pdev id
131*5113495bSYour Name  */
132*5113495bSYour Name struct pdev_dcs_timer_args {
133*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
134*5113495bSYour Name 	uint32_t pdev_id;
135*5113495bSYour Name };
136*5113495bSYour Name 
137*5113495bSYour Name /**
138*5113495bSYour Name  * struct psoc_dcs_cbk - define dcs callback in psoc object
139*5113495bSYour Name  * @cbk: callback
140*5113495bSYour Name  * @arg: arguments
141*5113495bSYour Name  */
142*5113495bSYour Name struct psoc_dcs_cbk {
143*5113495bSYour Name 	dcs_callback cbk;
144*5113495bSYour Name 	void *arg;
145*5113495bSYour Name };
146*5113495bSYour Name 
147*5113495bSYour Name #define WLAN_DCS_MAX_STA_NUM  1
148*5113495bSYour Name #define WLAN_DCS_MAX_SAP_NUM  2
149*5113495bSYour Name #define WLAN_DCS_AFC_PREFER_BW  CH_WIDTH_80MHZ
150*5113495bSYour Name 
151*5113495bSYour Name /**
152*5113495bSYour Name  * struct connection_chan_info - define connection channel information
153*5113495bSYour Name  * @freq: channel frequency
154*5113495bSYour Name  * @bw: channel bandwidth
155*5113495bSYour Name  * @vdev_id: connection vdev id
156*5113495bSYour Name  */
157*5113495bSYour Name struct connection_chan_info {
158*5113495bSYour Name 	qdf_freq_t freq;
159*5113495bSYour Name 	enum phy_ch_width bw;
160*5113495bSYour Name 	uint8_t vdev_id;
161*5113495bSYour Name };
162*5113495bSYour Name 
163*5113495bSYour Name /**
164*5113495bSYour Name  * struct wlan_dcs_conn_info - define arguments list for DCS when AFC updated
165*5113495bSYour Name  * @sta_cnt: station count
166*5113495bSYour Name  * @sap_5ghz_cnt: 5 GHz sap count
167*5113495bSYour Name  * @sap_6ghz_cnt: 6 GHz sap count
168*5113495bSYour Name  * @sta: connection info of station
169*5113495bSYour Name  * @sap_5ghz: connection info of 5 GHz sap
170*5113495bSYour Name  * @sap_6ghz: connection info of 6 GHz sap
171*5113495bSYour Name  * @exit_condition: flag to exit iteration immediately
172*5113495bSYour Name  */
173*5113495bSYour Name struct wlan_dcs_conn_info {
174*5113495bSYour Name 	uint8_t sta_cnt;
175*5113495bSYour Name 	uint8_t sap_5ghz_cnt;
176*5113495bSYour Name 	uint8_t sap_6ghz_cnt;
177*5113495bSYour Name 	struct connection_chan_info sta[WLAN_DCS_MAX_STA_NUM];
178*5113495bSYour Name 	struct connection_chan_info sap_5ghz[WLAN_DCS_MAX_SAP_NUM];
179*5113495bSYour Name 	struct connection_chan_info sap_6ghz[WLAN_DCS_MAX_SAP_NUM];
180*5113495bSYour Name 	bool exit_condition;
181*5113495bSYour Name };
182*5113495bSYour Name 
183*5113495bSYour Name /**
184*5113495bSYour Name  * struct dcs_afc_select_chan_cbk - define sap afc select channel callback
185*5113495bSYour Name  * @cbk: callback
186*5113495bSYour Name  * @arg: argument supply by register
187*5113495bSYour Name  */
188*5113495bSYour Name struct dcs_afc_select_chan_cbk {
189*5113495bSYour Name 	dcs_afc_select_chan_cb cbk;
190*5113495bSYour Name 	void *arg;
191*5113495bSYour Name };
192*5113495bSYour Name 
193*5113495bSYour Name /**
194*5113495bSYour Name  * struct dcs_pdev_priv_obj - define dcs pdev priv
195*5113495bSYour Name  * @dcs_host_params: dcs host configuration parameter
196*5113495bSYour Name  * @dcs_im_stats: dcs im statistics
197*5113495bSYour Name  * @dcs_freq_ctrl_params: dcs frequency control parameter
198*5113495bSYour Name  * @dcs_disable_timer: dcs disable timer
199*5113495bSYour Name  * @dcs_timer_args: dcs disable timer args
200*5113495bSYour Name  * @lock: lock to protect dcs pdev priv
201*5113495bSYour Name  * @requestor_vdev_id: user request vdev id
202*5113495bSYour Name  * @user_cb: user request callback
203*5113495bSYour Name  */
204*5113495bSYour Name struct dcs_pdev_priv_obj {
205*5113495bSYour Name 	struct pdev_dcs_params dcs_host_params;
206*5113495bSYour Name 	struct pdev_dcs_im_stats dcs_im_stats;
207*5113495bSYour Name 	struct pdev_dcs_freq_ctrl_params dcs_freq_ctrl_params;
208*5113495bSYour Name 	qdf_timer_t dcs_disable_timer;
209*5113495bSYour Name 	struct pdev_dcs_timer_args dcs_timer_args;
210*5113495bSYour Name 	qdf_spinlock_t lock;
211*5113495bSYour Name 	uint8_t requestor_vdev_id;
212*5113495bSYour Name 	void (*user_cb)(uint8_t vdev_id,
213*5113495bSYour Name 			struct wlan_host_dcs_im_user_stats *stats,
214*5113495bSYour Name 			int status);
215*5113495bSYour Name };
216*5113495bSYour Name 
217*5113495bSYour Name /**
218*5113495bSYour Name  * enum wlan_dcs_chan_seg - Different segments in the channel band.
219*5113495bSYour Name  * @WLAN_DCS_SEG_INVALID: invalid segment
220*5113495bSYour Name  * @WLAN_DCS_SEG_PRI20: primary 20MHz
221*5113495bSYour Name  * @WLAN_DCS_SEG_SEC20: secondary 20MHz
222*5113495bSYour Name  * @WLAN_DCS_SEG_SEC40: secondary 40MHz
223*5113495bSYour Name  * @WLAN_DCS_SEG_SEC80: secondary 80MHz
224*5113495bSYour Name  * @WLAN_DCS_SEG_SEC160: secondary 160MHz
225*5113495bSYour Name  */
226*5113495bSYour Name enum wlan_dcs_chan_seg {
227*5113495bSYour Name 	WLAN_DCS_SEG_INVALID,
228*5113495bSYour Name 	WLAN_DCS_SEG_PRI20,
229*5113495bSYour Name 	WLAN_DCS_SEG_SEC20,
230*5113495bSYour Name 	WLAN_DCS_SEG_SEC40,
231*5113495bSYour Name 	WLAN_DCS_SEG_SEC80,
232*5113495bSYour Name 	WLAN_DCS_SEG_SEC160,
233*5113495bSYour Name };
234*5113495bSYour Name 
235*5113495bSYour Name /* masks for segments */
236*5113495bSYour Name #define WLAN_DCS_SEG_PRI20_MASK BIT(0)
237*5113495bSYour Name #define WLAN_DCS_SEG_SEC20_MASK BIT(1)
238*5113495bSYour Name #define WLAN_DCS_SEG_SEC40_MASK (BIT(2) | BIT(3))
239*5113495bSYour Name #define WLAN_DCS_SEG_SEC80_MASK (BIT(4) | BIT(5) | BIT(6) | BIT(7))
240*5113495bSYour Name #define WLAN_DCS_SEG_SEC160_MASK (BIT(8) | BIT(9) | BIT(10) | BIT(11) | \
241*5113495bSYour Name 				  BIT(12) | BIT(13) | BIT(14) | BIT(15))
242*5113495bSYour Name 
243*5113495bSYour Name #define WLAN_DCS_CHAN_FREQ_OFFSET 5
244*5113495bSYour Name #define WLAN_DCS_IS_FREQ_IN_WIDTH(__cfreq, __cfreq0, __cfreq1, __width, __freq)\
245*5113495bSYour Name 	((((__width) == CH_WIDTH_20MHZ) &&                                     \
246*5113495bSYour Name 	  ((__cfreq) == (__freq))) ||                                          \
247*5113495bSYour Name 	 (((__width) == CH_WIDTH_40MHZ) &&                                     \
248*5113495bSYour Name 	  (((__freq) >= ((__cfreq0) - (2 * WLAN_DCS_CHAN_FREQ_OFFSET))) &&     \
249*5113495bSYour Name 	   ((__freq) <= ((__cfreq0) + (2 * WLAN_DCS_CHAN_FREQ_OFFSET))))) ||   \
250*5113495bSYour Name 	 (((__width) == CH_WIDTH_80MHZ) &&                                     \
251*5113495bSYour Name 	  (((__freq) >= ((__cfreq0) - (6 * WLAN_DCS_CHAN_FREQ_OFFSET))) &&     \
252*5113495bSYour Name 	   ((__freq) <= ((__cfreq0) + (6 * WLAN_DCS_CHAN_FREQ_OFFSET))))) ||   \
253*5113495bSYour Name 	 (((__width) == CH_WIDTH_160MHZ) &&                                    \
254*5113495bSYour Name 	  (((__freq) >= ((__cfreq1) - (14 * WLAN_DCS_CHAN_FREQ_OFFSET))) &&    \
255*5113495bSYour Name 	   ((__freq) <= ((__cfreq1) + (14 * WLAN_DCS_CHAN_FREQ_OFFSET))))) ||  \
256*5113495bSYour Name 	 (((__width) == CH_WIDTH_80P80MHZ) &&                                  \
257*5113495bSYour Name 	  ((((__freq) >= ((__cfreq0) - (6 * WLAN_DCS_CHAN_FREQ_OFFSET))) &&    \
258*5113495bSYour Name 	   ((__freq) <= ((__cfreq0) + (6 * WLAN_DCS_CHAN_FREQ_OFFSET)))) ||    \
259*5113495bSYour Name 	   (((__freq) >= ((__cfreq1) - (6 * WLAN_DCS_CHAN_FREQ_OFFSET))) &&    \
260*5113495bSYour Name 	   ((__freq) <= ((__cfreq1) + (6 * WLAN_DCS_CHAN_FREQ_OFFSET)))))))
261*5113495bSYour Name 
262*5113495bSYour Name /**
263*5113495bSYour Name  * struct dcs_psoc_priv_obj - define dcs psoc priv
264*5113495bSYour Name  * @dcs_pdev_priv: dcs pdev priv
265*5113495bSYour Name  * @dcs_cbk: dcs callback
266*5113495bSYour Name  * @switch_chan_cb: callback for switching channel
267*5113495bSYour Name  * @afc_sel_chan_cbk: callback for afc channel selection
268*5113495bSYour Name  */
269*5113495bSYour Name struct dcs_psoc_priv_obj {
270*5113495bSYour Name 	struct dcs_pdev_priv_obj dcs_pdev_priv[WLAN_DCS_MAX_PDEVS];
271*5113495bSYour Name 	struct psoc_dcs_cbk dcs_cbk;
272*5113495bSYour Name 	dcs_switch_chan_cb switch_chan_cb;
273*5113495bSYour Name 	struct dcs_afc_select_chan_cbk afc_sel_chan_cbk;
274*5113495bSYour Name };
275*5113495bSYour Name 
276*5113495bSYour Name /**
277*5113495bSYour Name  * wlan_dcs_get_pdev_private_obj() - get dcs pdev private object
278*5113495bSYour Name  * @psoc: psoc pointer
279*5113495bSYour Name  * @pdev_id: pdev_id
280*5113495bSYour Name  *
281*5113495bSYour Name  * API to retrieve the pdev private object from the psoc context
282*5113495bSYour Name  *
283*5113495bSYour Name  * Return: pdev private object pointer on success, NULL on error
284*5113495bSYour Name  */
285*5113495bSYour Name struct dcs_pdev_priv_obj *
286*5113495bSYour Name wlan_dcs_get_pdev_private_obj(struct wlan_objmgr_psoc *psoc, uint32_t pdev_id);
287*5113495bSYour Name 
288*5113495bSYour Name /**
289*5113495bSYour Name  * wlan_dcs_attach() - Attach dcs handler
290*5113495bSYour Name  * @psoc: psoc pointer
291*5113495bSYour Name  *
292*5113495bSYour Name  * This function gets called to register dcs FW events handler
293*5113495bSYour Name  *
294*5113495bSYour Name  * Return: QDF_STATUS
295*5113495bSYour Name  */
296*5113495bSYour Name QDF_STATUS wlan_dcs_attach(struct wlan_objmgr_psoc *psoc);
297*5113495bSYour Name 
298*5113495bSYour Name /**
299*5113495bSYour Name  * wlan_dcs_detach() - Detach dcs handler
300*5113495bSYour Name  * @psoc: psoc pointer
301*5113495bSYour Name  *
302*5113495bSYour Name  * This function gets called to unregister dcs FW events handler
303*5113495bSYour Name  *
304*5113495bSYour Name  * Return: QDF_STATUS
305*5113495bSYour Name  */
306*5113495bSYour Name QDF_STATUS wlan_dcs_detach(struct wlan_objmgr_psoc *psoc);
307*5113495bSYour Name 
308*5113495bSYour Name /**
309*5113495bSYour Name  * wlan_dcs_cmd_send() - Send dcs command to target_if layer
310*5113495bSYour Name  * @psoc: psoc pointer
311*5113495bSYour Name  * @pdev_id: pdev_id
312*5113495bSYour Name  * @is_host_pdev_id: pdev_id is host id or not
313*5113495bSYour Name  *
314*5113495bSYour Name  * The function gets called to send dcs command to FW
315*5113495bSYour Name  *
316*5113495bSYour Name  * return: QDF_STATUS_SUCCESS for success or error code
317*5113495bSYour Name  */
318*5113495bSYour Name QDF_STATUS wlan_dcs_cmd_send(struct wlan_objmgr_psoc *psoc,
319*5113495bSYour Name 			     uint32_t pdev_id,
320*5113495bSYour Name 			     bool is_host_pdev_id);
321*5113495bSYour Name 
322*5113495bSYour Name /**
323*5113495bSYour Name  * wlan_dcs_process() - dcs process main entry
324*5113495bSYour Name  * @psoc: psoc pointer
325*5113495bSYour Name  * @event: dcs event pointer
326*5113495bSYour Name  *
327*5113495bSYour Name  * This function is the main entry to do dcs related operation
328*5113495bSYour Name  * such as algorithm handling and dcs frequency control.
329*5113495bSYour Name  *
330*5113495bSYour Name  * Return: QDF_STATUS
331*5113495bSYour Name  */
332*5113495bSYour Name QDF_STATUS wlan_dcs_process(struct wlan_objmgr_psoc *psoc,
333*5113495bSYour Name 			    struct wlan_host_dcs_event *event);
334*5113495bSYour Name 
335*5113495bSYour Name /**
336*5113495bSYour Name  * wlan_dcs_disable_timer_fn() - dcs disable timer callback
337*5113495bSYour Name  * @dcs_timer_args: dcs timer argument pointer
338*5113495bSYour Name  *
339*5113495bSYour Name  * This function gets called when dcs disable timer timeout
340*5113495bSYour Name  *
341*5113495bSYour Name  * Return: None
342*5113495bSYour Name  */
343*5113495bSYour Name void wlan_dcs_disable_timer_fn(void *dcs_timer_args);
344*5113495bSYour Name 
345*5113495bSYour Name /**
346*5113495bSYour Name  * wlan_dcs_clear() - clear dcs information
347*5113495bSYour Name  * @psoc: psoc pointer
348*5113495bSYour Name  * @pdev_id: pdev_id
349*5113495bSYour Name  *
350*5113495bSYour Name  * The function gets called to clear dcs information such as dcs
351*5113495bSYour Name  * frequency control parameters and stop dcs disable timer
352*5113495bSYour Name  *
353*5113495bSYour Name  * Return: None
354*5113495bSYour Name  */
355*5113495bSYour Name void wlan_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t pdev_id);
356*5113495bSYour Name 
357*5113495bSYour Name /**
358*5113495bSYour Name  * wlan_dcs_set_algorithm_process() - config dcs event data to do algorithm
359*5113495bSYour Name  * process or not
360*5113495bSYour Name  * @psoc: psoc pointer
361*5113495bSYour Name  * @pdev_id: pdev_id
362*5113495bSYour Name  * @dcs_algorithm_process: dcs algorithm process
363*5113495bSYour Name  *
364*5113495bSYour Name  * The function gets called to config dcs event data to do algorithm
365*5113495bSYour Name  * process or not
366*5113495bSYour Name  *
367*5113495bSYour Name  * Return: None
368*5113495bSYour Name  */
369*5113495bSYour Name void wlan_dcs_set_algorithm_process(struct wlan_objmgr_psoc *psoc,
370*5113495bSYour Name 				    uint32_t pdev_id,
371*5113495bSYour Name 				    bool dcs_algorithm_process);
372*5113495bSYour Name 
373*5113495bSYour Name /**
374*5113495bSYour Name  * wlan_dcs_pdev_obj_lock() - private API to acquire spinlock at pdev
375*5113495bSYour Name  * @dcs_pdev: pointer to dcs pdev object
376*5113495bSYour Name  *
377*5113495bSYour Name  * Return: void
378*5113495bSYour Name  */
wlan_dcs_pdev_obj_lock(struct dcs_pdev_priv_obj * dcs_pdev)379*5113495bSYour Name static inline void wlan_dcs_pdev_obj_lock(struct dcs_pdev_priv_obj *dcs_pdev)
380*5113495bSYour Name {
381*5113495bSYour Name 	qdf_spin_lock_bh(&dcs_pdev->lock);
382*5113495bSYour Name }
383*5113495bSYour Name 
384*5113495bSYour Name /**
385*5113495bSYour Name  * wlan_dcs_pdev_obj_unlock() - private api to release spinlock at pdev
386*5113495bSYour Name  * @dcs_pdev: pointer to dcs pdev object
387*5113495bSYour Name  *
388*5113495bSYour Name  * Return: void
389*5113495bSYour Name  */
wlan_dcs_pdev_obj_unlock(struct dcs_pdev_priv_obj * dcs_pdev)390*5113495bSYour Name static inline void wlan_dcs_pdev_obj_unlock(struct dcs_pdev_priv_obj *dcs_pdev)
391*5113495bSYour Name {
392*5113495bSYour Name 	qdf_spin_unlock_bh(&dcs_pdev->lock);
393*5113495bSYour Name }
394*5113495bSYour Name 
395*5113495bSYour Name /**
396*5113495bSYour Name  * wlan_dcs_switch_chan() - switch channel for vdev
397*5113495bSYour Name  * @vdev: vdev ptr
398*5113495bSYour Name  * @tgt_freq: target frequency
399*5113495bSYour Name  * @tgt_width: target channel width
400*5113495bSYour Name  *
401*5113495bSYour Name  * Return: QDF_STATUS
402*5113495bSYour Name  */
403*5113495bSYour Name QDF_STATUS
404*5113495bSYour Name wlan_dcs_switch_chan(struct wlan_objmgr_vdev *vdev, qdf_freq_t tgt_freq,
405*5113495bSYour Name 		     enum phy_ch_width tgt_width);
406*5113495bSYour Name #endif  /* _WLAN_DCS_H_ */
407