1 /*
2  * Copyright (c) 2016-2019,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
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: cdp_txrx_cfg.h
22  *      Define the host data path configuration API functions
23  */
24 #ifndef _CDP_TXRX_CFG_H_
25 #define _CDP_TXRX_CFG_H_
26 #include "cdp_txrx_handle.h"
27 #include <cdp_txrx_cmn.h>
28 
29 /**
30  * cdp_cfg_set_rx_fwd_disabled() - enable/disable rx forwarding
31  * @soc: data path soc handle
32  * @cfg_pdev: data path device instance
33  * @disable_rx_fwd: enable or disable rx forwarding
34  *
35  * enable/disable rx forwarding
36  *
37  * return NONE
38  */
39 static inline void
cdp_cfg_set_rx_fwd_disabled(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev,uint8_t disable_rx_fwd)40 cdp_cfg_set_rx_fwd_disabled(ol_txrx_soc_handle soc, struct cdp_cfg *cfg_pdev,
41 		uint8_t disable_rx_fwd)
42 {
43 	if (!soc || !soc->ops) {
44 		dp_cdp_debug("invalid instance");
45 		QDF_BUG(0);
46 		return;
47 	}
48 
49 	if (!soc->ops->cfg_ops ||
50 	    !soc->ops->cfg_ops->set_cfg_rx_fwd_disabled)
51 		return;
52 
53 	soc->ops->cfg_ops->set_cfg_rx_fwd_disabled(cfg_pdev,
54 			disable_rx_fwd);
55 }
56 
57 /**
58  * cdp_cfg_set_packet_log_enabled() - enable/disable packet log
59  * @soc: data path soc handle
60  * @cfg_pdev: data path device instance
61  * @val: enable or disable packet log
62  *
63  * packet log enable or disable
64  *
65  * return NONE
66  */
67 static inline void
cdp_cfg_set_packet_log_enabled(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev,uint8_t val)68 cdp_cfg_set_packet_log_enabled(ol_txrx_soc_handle soc,
69 		struct cdp_cfg *cfg_pdev, uint8_t val)
70 {
71 	if (!soc || !soc->ops) {
72 		dp_cdp_debug("invalid instance");
73 		QDF_BUG(0);
74 		return;
75 	}
76 
77 	if (!soc->ops->cfg_ops ||
78 	    !soc->ops->cfg_ops->set_cfg_packet_log_enabled)
79 		return;
80 
81 	soc->ops->cfg_ops->set_cfg_packet_log_enabled(cfg_pdev,
82 				val);
83 }
84 
85 /**
86  * cdp_cfg_attach() - attach config module
87  * @soc: data path soc handle
88  * @osdev: os instance
89  * @cfg_param: configuration parameter should be propagated
90  *
91  * Allocate configuration module instance, and propagate configuration values
92  *
93  * return soc configuration module instance
94  */
95 static inline struct cdp_cfg
cdp_cfg_attach(ol_txrx_soc_handle soc,qdf_device_t osdev,void * cfg_param)96 *cdp_cfg_attach(ol_txrx_soc_handle soc,
97 		qdf_device_t osdev, void *cfg_param)
98 {
99 	if (!soc || !soc->ops) {
100 		dp_cdp_debug("invalid instance");
101 		QDF_BUG(0);
102 		return NULL;
103 	}
104 
105 	if (!soc->ops->cfg_ops ||
106 	    !soc->ops->cfg_ops->cfg_attach)
107 		return NULL;
108 
109 	return soc->ops->cfg_ops->cfg_attach(osdev, cfg_param);
110 }
111 
112 /**
113  * cdp_cfg_vdev_rx_set_intrabss_fwd() - enable/disable intra bass forwarding
114  * @soc: data path soc handle
115  * @vdev_id: virtual interface id
116  * @val: enable or disable intra bss forwarding
117  *
118  * ap isolate, do not forward intra bss traffic
119  *
120  * return NONE
121  */
122 static inline void
cdp_cfg_vdev_rx_set_intrabss_fwd(ol_txrx_soc_handle soc,uint8_t vdev_id,bool val)123 cdp_cfg_vdev_rx_set_intrabss_fwd(ol_txrx_soc_handle soc,
124 				 uint8_t vdev_id, bool val)
125 {
126 	if (!soc || !soc->ops) {
127 		dp_cdp_debug("invalid instance");
128 		QDF_BUG(0);
129 		return;
130 	}
131 
132 	if (!soc->ops->cfg_ops ||
133 	    !soc->ops->cfg_ops->vdev_rx_set_intrabss_fwd)
134 		return;
135 
136 	soc->ops->cfg_ops->vdev_rx_set_intrabss_fwd(soc, vdev_id, val);
137 }
138 
139 /**
140  * cdp_cfg_is_rx_fwd_disabled() - get vdev rx forward
141  * @soc: data path soc handle
142  * @vdev: virtual interface instance
143  *
144  * Return rx forward feature enable status
145  *
146  * return 1 enabled
147  *        0 disabled
148  */
149 static inline uint8_t
cdp_cfg_is_rx_fwd_disabled(ol_txrx_soc_handle soc,struct cdp_vdev * vdev)150 cdp_cfg_is_rx_fwd_disabled(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
151 {
152 	if (!soc || !soc->ops) {
153 		dp_cdp_debug("invalid instance");
154 		QDF_BUG(0);
155 		return 0;
156 	}
157 
158 	if (!soc->ops->cfg_ops ||
159 	    !soc->ops->cfg_ops->is_rx_fwd_disabled)
160 		return 0;
161 
162 	return soc->ops->cfg_ops->is_rx_fwd_disabled(vdev);
163 
164 }
165 
166 /**
167  * cdp_cfg_tx_set_is_mgmt_over_wmi_enabled() - mgmt tx over wmi enable/disable
168  * @soc: data path soc handle
169  * @value: feature enable or disable
170  *
171  * Enable or disable management packet TX over WMI feature
172  *
173  * return None
174  */
175 static inline void
cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(ol_txrx_soc_handle soc,uint8_t value)176 cdp_cfg_tx_set_is_mgmt_over_wmi_enabled(ol_txrx_soc_handle soc,
177 		uint8_t value)
178 {
179 	if (!soc || !soc->ops) {
180 		dp_cdp_debug("invalid instance");
181 		QDF_BUG(0);
182 		return;
183 	}
184 
185 	if (!soc->ops->cfg_ops ||
186 	    !soc->ops->cfg_ops->tx_set_is_mgmt_over_wmi_enabled)
187 		return;
188 
189 	soc->ops->cfg_ops->tx_set_is_mgmt_over_wmi_enabled(value);
190 }
191 
192 /**
193  * cdp_cfg_is_high_latency() - query data path is in high or low latency
194  * @soc: data path soc handle
195  * @cfg_pdev: data path device instance
196  *
197  * query data path is in high or low latency
198  *
199  * return 1 high latency data path, usb or sdio
200  *        0 low latency data path
201  */
202 static inline int
cdp_cfg_is_high_latency(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev)203 cdp_cfg_is_high_latency(ol_txrx_soc_handle soc, struct cdp_cfg *cfg_pdev)
204 {
205 	if (!soc || !soc->ops) {
206 		dp_cdp_debug("invalid instance");
207 		QDF_BUG(0);
208 		return 0;
209 	}
210 
211 	if (!soc->ops->cfg_ops ||
212 	    !soc->ops->cfg_ops->is_high_latency)
213 		return 0;
214 
215 	return soc->ops->cfg_ops->is_high_latency(cfg_pdev);
216 }
217 
218 /**
219  * cdp_cfg_set_flow_control_parameters() - set flow control params
220  * @soc: data path soc handle
221  * @cfg_pdev: dp config module instance
222  * @param: parameters should set
223  *
224  * set flow control params
225  *
226  * return None
227  */
228 static inline void
cdp_cfg_set_flow_control_parameters(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev,void * param)229 cdp_cfg_set_flow_control_parameters(ol_txrx_soc_handle soc,
230 		struct cdp_cfg *cfg_pdev, void *param)
231 {
232 	if (!soc || !soc->ops) {
233 		dp_cdp_debug("invalid instance");
234 		QDF_BUG(0);
235 		return;
236 	}
237 
238 	if (!soc->ops->cfg_ops ||
239 	    !soc->ops->cfg_ops->set_flow_control_parameters)
240 		return;
241 
242 	soc->ops->cfg_ops->set_flow_control_parameters(cfg_pdev,
243 						       param);
244 }
245 
246 /**
247  * cdp_cfg_set_flow_steering - Set Rx flow steering config based on CFG ini
248  *			config.
249  * @soc: data path soc handle
250  * @cfg_pdev: handle to the physical device
251  * @val: 0 - disable, 1 - enable
252  *
253  * Return: None
254  */
cdp_cfg_set_flow_steering(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev,uint8_t val)255 static inline void cdp_cfg_set_flow_steering(ol_txrx_soc_handle soc,
256 		struct cdp_cfg *cfg_pdev, uint8_t val)
257 {
258 	if (!soc || !soc->ops) {
259 		dp_cdp_debug("invalid instance");
260 		QDF_BUG(0);
261 		return;
262 	}
263 
264 	if (!soc->ops->cfg_ops ||
265 	    !soc->ops->cfg_ops->set_flow_steering)
266 		return;
267 
268 	soc->ops->cfg_ops->set_flow_steering(cfg_pdev, val);
269 }
270 
cdp_cfg_get_max_peer_id(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev)271 static inline void cdp_cfg_get_max_peer_id(ol_txrx_soc_handle soc,
272 		struct cdp_cfg *cfg_pdev)
273 {
274 }
275 
276 /**
277  * cdp_cfg_set_ptp_rx_opt_enabled() - enable/disable ptp rx timestamping
278  * @soc: data path soc handle
279  * @cfg_pdev: data path device instance
280  * @val: enable or disable packet log
281  *
282  * ptp rx timestamping enable or disable
283  *
284  * return NONE
285  */
286 static inline void
cdp_cfg_set_ptp_rx_opt_enabled(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev,uint8_t val)287 cdp_cfg_set_ptp_rx_opt_enabled(ol_txrx_soc_handle soc,
288 			       struct cdp_cfg *cfg_pdev, uint8_t val)
289 {
290 	if (!soc || !soc->ops) {
291 		dp_cdp_debug("invalid instance");
292 		QDF_BUG(0);
293 		return;
294 	}
295 
296 	if (!soc->ops->cfg_ops ||
297 	    !soc->ops->cfg_ops->set_ptp_rx_opt_enabled)
298 		return;
299 
300 	soc->ops->cfg_ops->set_ptp_rx_opt_enabled(cfg_pdev, val);
301 }
302 
303 /**
304  * cdp_cfg_set_new_htt_msg_format() - set htt h2t msg feature
305  * @soc: datapath soc handle
306  * @val: enable or disable new htt h2t msg feature
307  *
308  * Enable whether htt h2t message length includes htc header length
309  *
310  * return NONE
311  */
312 static inline void
cdp_cfg_set_new_htt_msg_format(ol_txrx_soc_handle soc,uint8_t val)313 cdp_cfg_set_new_htt_msg_format(ol_txrx_soc_handle soc,
314 			       uint8_t val)
315 {
316 	if (!soc || !soc->ops) {
317 		dp_cdp_debug("invalid instance");
318 		return;
319 	}
320 
321 	if (!soc->ops->cfg_ops ||
322 	    !soc->ops->cfg_ops->set_new_htt_msg_format)
323 		return;
324 
325 	soc->ops->cfg_ops->set_new_htt_msg_format(val);
326 }
327 
328 /**
329  * cdp_cfg_set_peer_unmap_conf_support() - set peer unmap conf feature
330  * @soc: datapath soc handle
331  * @val: enable or disable peer unmap conf feature
332  *
333  * Set if peer unmap confirmation feature is supported by both FW and in INI
334  *
335  * return NONE
336  */
337 static inline void
cdp_cfg_set_peer_unmap_conf_support(ol_txrx_soc_handle soc,bool val)338 cdp_cfg_set_peer_unmap_conf_support(ol_txrx_soc_handle soc, bool val)
339 {
340 	if (!soc || !soc->ops) {
341 		dp_cdp_debug("invalid instance");
342 		QDF_BUG(0);
343 		return;
344 	}
345 
346 	if (!soc->ops->cfg_ops ||
347 	    !soc->ops->cfg_ops->set_peer_unmap_conf_support)
348 		return;
349 
350 	soc->ops->cfg_ops->set_peer_unmap_conf_support(val);
351 }
352 
353 /**
354  * cdp_cfg_get_peer_unmap_conf_support() - check peer unmap conf feature
355  * @soc: datapath soc handle
356  *
357  * Check if peer unmap confirmation feature is enabled
358  *
359  * return true is peer unmap confirmation feature is enabled else false
360  */
361 static inline bool
cdp_cfg_get_peer_unmap_conf_support(ol_txrx_soc_handle soc)362 cdp_cfg_get_peer_unmap_conf_support(ol_txrx_soc_handle soc)
363 {
364 	if (!soc || !soc->ops) {
365 		dp_cdp_debug("invalid instance");
366 		QDF_BUG(0);
367 		return false;
368 	}
369 
370 	if (!soc->ops->cfg_ops ||
371 	    !soc->ops->cfg_ops->get_peer_unmap_conf_support)
372 		return false;
373 
374 	return soc->ops->cfg_ops->get_peer_unmap_conf_support();
375 }
376 
377 static inline void
cdp_cfg_set_tx_compl_tsf64(ol_txrx_soc_handle soc,uint8_t val)378 cdp_cfg_set_tx_compl_tsf64(ol_txrx_soc_handle soc,
379 			   uint8_t val)
380 {
381 	if (!soc || !soc->ops) {
382 		dp_debug("invalid instance");
383 		return;
384 	}
385 
386 	if (!soc->ops->cfg_ops ||
387 	    !soc->ops->cfg_ops->set_tx_compl_tsf64)
388 		return;
389 
390 	soc->ops->cfg_ops->set_tx_compl_tsf64(val);
391 }
392 
393 static inline bool
cdp_cfg_get_tx_compl_tsf64(ol_txrx_soc_handle soc)394 cdp_cfg_get_tx_compl_tsf64(ol_txrx_soc_handle soc)
395 {
396 	if (!soc || !soc->ops) {
397 		dp_debug("invalid instance");
398 		return false;
399 	}
400 
401 	if (!soc->ops->cfg_ops ||
402 	    !soc->ops->cfg_ops->get_tx_compl_tsf64)
403 		return false;
404 
405 	return soc->ops->cfg_ops->get_tx_compl_tsf64();
406 }
407 
408 #endif /* _CDP_TXRX_CFG_H_ */
409