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