1 /*
2 * Copyright (c) 2016-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
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_ctrl.h
22 * Define the host data path control API functions
23 * called by the host control SW and the OS interface module
24 */
25
26 #ifndef _CDP_TXRX_CTRL_H_
27 #define _CDP_TXRX_CTRL_H_
28 #include "cdp_txrx_handle.h"
29 #include "cdp_txrx_cmn_struct.h"
30 #include "cdp_txrx_cmn.h"
31 #include "cdp_txrx_ops.h"
32
cdp_is_target_ar900b(ol_txrx_soc_handle soc)33 static inline int cdp_is_target_ar900b
34 (ol_txrx_soc_handle soc)
35 {
36 if (!soc || !soc->ops) {
37 dp_cdp_debug("Invalid Instance:");
38 QDF_BUG(0);
39 return 0;
40 }
41
42 if (!soc->ops->ctrl_ops ||
43 !soc->ops->ctrl_ops->txrx_is_target_ar900b)
44 return 0;
45
46 return soc->ops->ctrl_ops->txrx_is_target_ar900b(soc);
47 }
48
49
50 /* WIN */
51 static inline int
cdp_mempools_attach(ol_txrx_soc_handle soc)52 cdp_mempools_attach(ol_txrx_soc_handle soc)
53 {
54 if (!soc || !soc->ops) {
55 dp_cdp_debug("Invalid Instance:");
56 QDF_BUG(0);
57 return 0;
58 }
59
60 if (!soc->ops->ctrl_ops ||
61 !soc->ops->ctrl_ops->txrx_mempools_attach)
62 return 0;
63
64 return soc->ops->ctrl_ops->txrx_mempools_attach(soc);
65 }
66
67
68 #if defined(ATH_SUPPORT_NAC) || defined(ATH_SUPPORT_NAC_RSSI)
69 /**
70 * cdp_update_filter_neighbour_peers() - update the neighbour peer addresses
71 * @soc: the pointer to soc object
72 * @vdev_id: id of the pointer to vdev
73 * @cmd: add/del entry into peer table
74 * @macaddr: the address of neighbour peer
75 *
76 * This defines interface function to update neighbour peers addresses
77 * which needs to be filtered
78 *
79 * Return: int
80 */
81 static inline int
cdp_update_filter_neighbour_peers(ol_txrx_soc_handle soc,uint8_t vdev_id,uint32_t cmd,uint8_t * macaddr)82 cdp_update_filter_neighbour_peers(ol_txrx_soc_handle soc,
83 uint8_t vdev_id, uint32_t cmd, uint8_t *macaddr)
84 {
85 if (!soc || !soc->ops) {
86 dp_cdp_debug("Invalid Instance:");
87 QDF_BUG(0);
88 return 0;
89 }
90
91 if (!soc->ops->mon_ops ||
92 !soc->ops->mon_ops->txrx_update_filter_neighbour_peers)
93 return 0;
94
95 return soc->ops->mon_ops->txrx_update_filter_neighbour_peers
96 (soc, vdev_id, cmd, macaddr);
97 }
98 #endif /* ATH_SUPPORT_NAC || ATH_SUPPORT_NAC_RSSI*/
99
100 /**
101 * cdp_update_mon_mac_filter() - update the monitor buffer and status filter
102 * @soc: the pointer to soc object
103 * @vdev_id: id of the pointer to vdev
104 * @cmd: add/del entry into peer table
105 *
106 * This defines interface function to set/reset monitor filter
107 * in case of special vap (scan radio)
108 *
109 * Return: QDF_STATUS
110 */
111 static inline QDF_STATUS
cdp_update_mon_mac_filter(ol_txrx_soc_handle soc,uint8_t vdev_id,uint32_t cmd)112 cdp_update_mon_mac_filter(ol_txrx_soc_handle soc,
113 uint8_t vdev_id, uint32_t cmd)
114 {
115 if (!soc || !soc->ops) {
116 dp_cdp_debug("Invalid Instance:");
117 QDF_BUG(0);
118 return QDF_STATUS_E_FAILURE;
119 }
120
121 if (!soc->ops->mon_ops ||
122 !soc->ops->mon_ops->txrx_update_mon_mac_filter)
123 return QDF_STATUS_E_FAILURE;
124
125 return soc->ops->mon_ops->txrx_update_mon_mac_filter
126 (soc, vdev_id, cmd);
127 }
128
129 #ifdef WLAN_SUPPORT_MSCS
130 /**
131 * cdp_record_vdev_mscs_params() - record the MSCS data and send it to the
132 * Data path
133 * @soc: the pointer to soc object
134 * @vdev_id: id of the pointer to vdev
135 * @macaddr: the address of neighbour peer
136 * @mscs_params: Structure having MSCS params obtained from handshake
137 * @active: Flag to set MSCS active/inactive
138 *
139 * This defines interface function to record the MSCS procedure
140 * based data parameters so that the data path layer can access it
141 *
142 * Return: QDF_STATUS
143 */
144 static inline QDF_STATUS
cdp_record_vdev_mscs_params(ol_txrx_soc_handle soc,uint8_t * macaddr,uint8_t vdev_id,struct cdp_mscs_params * mscs_params,bool active)145 cdp_record_vdev_mscs_params(ol_txrx_soc_handle soc, uint8_t
146 *macaddr, uint8_t vdev_id, struct cdp_mscs_params *mscs_params,
147 bool active)
148 {
149 if (!soc || !soc->ops) {
150 dp_cdp_debug("Invalid Instance:");
151 QDF_BUG(0);
152 return QDF_STATUS_E_FAILURE;
153 }
154
155 if (!soc->ops->ctrl_ops ||
156 !soc->ops->ctrl_ops->txrx_record_mscs_params)
157 return QDF_STATUS_E_FAILURE;
158 return soc->ops->ctrl_ops->txrx_record_mscs_params
159 (soc, macaddr, vdev_id, mscs_params, active);
160 }
161 #endif
162
163 /**
164 * cdp_set_pdev_reo_dest() - set the Reo Destination ring for the pdev
165 * @soc: pointer to the soc
166 * @pdev_id: id of the data physical device object
167 * @val: the Reo destination ring index (1 to 4)
168 *
169 * This will be used to configure the Reo Destination ring for this pdev.
170 *
171 * Return: QDF_STATUS
172 */
173 static inline QDF_STATUS
cdp_set_pdev_reo_dest(ol_txrx_soc_handle soc,uint8_t pdev_id,enum cdp_host_reo_dest_ring val)174 cdp_set_pdev_reo_dest(ol_txrx_soc_handle soc,
175 uint8_t pdev_id, enum cdp_host_reo_dest_ring val)
176 {
177 if (!soc || !soc->ops) {
178 dp_cdp_debug("Invalid Instance:");
179 QDF_BUG(0);
180 return QDF_STATUS_E_FAILURE;
181 }
182
183 if (!soc->ops->ctrl_ops ||
184 !soc->ops->ctrl_ops->txrx_set_pdev_reo_dest)
185 return QDF_STATUS_E_FAILURE;
186
187 return soc->ops->ctrl_ops->txrx_set_pdev_reo_dest
188 (soc, pdev_id, val);
189 }
190
191 /**
192 * cdp_get_pdev_reo_dest() - get the Reo Destination ring for the pdev
193 * @soc: pointer to the soc
194 * @pdev_id: id of physical device object
195 *
196 * Return: the Reo destination ring index (1 to 4), 0 if not supported.
197 */
198 static inline enum cdp_host_reo_dest_ring
cdp_get_pdev_reo_dest(ol_txrx_soc_handle soc,uint8_t pdev_id)199 cdp_get_pdev_reo_dest(ol_txrx_soc_handle soc, uint8_t pdev_id)
200 {
201 if (!soc || !soc->ops) {
202 dp_cdp_debug("Invalid Instance:");
203 QDF_BUG(0);
204 return cdp_host_reo_dest_ring_unknown;
205 }
206
207 if (!soc->ops->ctrl_ops ||
208 !soc->ops->ctrl_ops->txrx_get_pdev_reo_dest)
209 return cdp_host_reo_dest_ring_unknown;
210
211 return soc->ops->ctrl_ops->txrx_get_pdev_reo_dest(soc, pdev_id);
212 }
213
214 /* Is this similar to ol_txrx_peer_state_update() in MCL */
215
216 /**
217 * cdp_peer_authorize() - Update the authorize peer object at association time
218 * @soc: pointer to the soc
219 * @vdev_id: id of the pointer to vdev
220 * @peer_mac: mac address of the node's object
221 * @authorize: either to authorize or unauthorize peer
222 *
223 * For the host-based implementation of rate-control, it
224 * updates the peer/node-related parameters within rate-control
225 * context of the peer at association.
226 *
227 * Return: QDF_STATUS
228 */
229 static inline QDF_STATUS
cdp_peer_authorize(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,u_int32_t authorize)230 cdp_peer_authorize(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac,
231 u_int32_t authorize)
232 {
233 if (!soc || !soc->ops) {
234 dp_cdp_debug("Invalid Instance:");
235 QDF_BUG(0);
236 return QDF_STATUS_E_FAILURE;
237 }
238
239 if (!soc->ops->ctrl_ops ||
240 !soc->ops->ctrl_ops->txrx_peer_authorize)
241 return QDF_STATUS_E_FAILURE;
242
243 return soc->ops->ctrl_ops->txrx_peer_authorize
244 (soc, vdev_id, peer_mac, authorize);
245 }
246
247 /**
248 * cdp_peer_get_authorize() - Get per authorize status
249 * @soc: pointer to the soc
250 * @vdev_id: id of the pointer to vdev
251 * @peer_mac: mac address of the node's object
252 *
253 * Return: true is peer is authorized, false otherwise
254 */
255 static inline bool
cdp_peer_get_authorize(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac)256 cdp_peer_get_authorize(ol_txrx_soc_handle soc, uint8_t vdev_id,
257 uint8_t *peer_mac)
258 {
259 if (!soc || !soc->ops) {
260 dp_cdp_debug("Invalid Instance:");
261 QDF_BUG(0);
262 return false;
263 }
264
265 if (!soc->ops->ctrl_ops ||
266 !soc->ops->ctrl_ops->txrx_peer_get_authorize)
267 return false;
268
269 return soc->ops->ctrl_ops->txrx_peer_get_authorize
270 (soc, vdev_id, peer_mac);
271 }
272
cdp_tx_flush_buffers(ol_txrx_soc_handle soc,uint8_t vdev_id)273 static inline void cdp_tx_flush_buffers
274 (ol_txrx_soc_handle soc, uint8_t vdev_id)
275 {
276 if (!soc || !soc->ops) {
277 dp_cdp_debug("Invalid Instance:");
278 QDF_BUG(0);
279 return;
280 }
281
282 if (!soc->ops->ctrl_ops ||
283 !soc->ops->ctrl_ops->tx_flush_buffers)
284 return;
285
286 soc->ops->ctrl_ops->tx_flush_buffers(soc, vdev_id);
287 }
288
cdp_txrx_get_vdev_param(ol_txrx_soc_handle soc,uint8_t vdev_id,enum cdp_vdev_param_type type,cdp_config_param_type * val)289 static inline QDF_STATUS cdp_txrx_get_vdev_param(ol_txrx_soc_handle soc,
290 uint8_t vdev_id,
291 enum cdp_vdev_param_type type,
292 cdp_config_param_type *val)
293 {
294 if (!soc || !soc->ops) {
295 dp_cdp_debug("Invalid Instance:");
296 QDF_BUG(0);
297 return QDF_STATUS_E_FAILURE;
298 }
299
300 if (!soc->ops->ctrl_ops ||
301 !soc->ops->ctrl_ops->txrx_get_vdev_param) {
302 dp_cdp_debug("callback not registered:");
303 return QDF_STATUS_E_FAILURE;
304 }
305
306 return soc->ops->ctrl_ops->txrx_get_vdev_param(soc, vdev_id,
307 type, val);
308 }
309
310 static inline QDF_STATUS
cdp_txrx_set_vdev_param(ol_txrx_soc_handle soc,uint8_t vdev_id,enum cdp_vdev_param_type type,cdp_config_param_type val)311 cdp_txrx_set_vdev_param(ol_txrx_soc_handle soc,
312 uint8_t vdev_id, enum cdp_vdev_param_type type,
313 cdp_config_param_type val)
314 {
315 if (!soc || !soc->ops) {
316 dp_cdp_debug("Invalid Instance:");
317 QDF_BUG(0);
318 return QDF_STATUS_E_FAILURE;
319 }
320
321 if (!soc->ops->ctrl_ops ||
322 !soc->ops->ctrl_ops->txrx_set_vdev_param) {
323 dp_cdp_nofl_debug("NULL vdev params callback");
324 return QDF_STATUS_E_FAILURE;
325 }
326
327 return soc->ops->ctrl_ops->txrx_set_vdev_param(soc, vdev_id,
328 type, val);
329 }
330
331 static inline QDF_STATUS
cdp_txrx_set_psoc_param(ol_txrx_soc_handle soc,enum cdp_psoc_param_type type,cdp_config_param_type val)332 cdp_txrx_set_psoc_param(ol_txrx_soc_handle soc,
333 enum cdp_psoc_param_type type,
334 cdp_config_param_type val)
335 {
336 if (!soc || !soc->ops) {
337 dp_cdp_debug("Invalid Instance:");
338 QDF_BUG(0);
339 return QDF_STATUS_E_FAILURE;
340 }
341
342 if (!soc->ops->ctrl_ops ||
343 !soc->ops->ctrl_ops->txrx_set_psoc_param)
344 return QDF_STATUS_E_FAILURE;
345
346 return soc->ops->ctrl_ops->txrx_set_psoc_param(soc, type, val);
347 }
348
349 static inline QDF_STATUS
cdp_txrx_get_psoc_param(ol_txrx_soc_handle soc,enum cdp_psoc_param_type type,cdp_config_param_type * val)350 cdp_txrx_get_psoc_param(ol_txrx_soc_handle soc,
351 enum cdp_psoc_param_type type,
352 cdp_config_param_type *val)
353 {
354 if (!soc || !soc->ops) {
355 dp_cdp_debug("Invalid Instance:");
356 QDF_BUG(0);
357 return QDF_STATUS_E_FAILURE;
358 }
359
360 if (!soc->ops->ctrl_ops ||
361 !soc->ops->ctrl_ops->txrx_get_psoc_param)
362 return QDF_STATUS_E_FAILURE;
363
364 return soc->ops->ctrl_ops->txrx_get_psoc_param(soc, type, val);
365 }
366
367 static inline
cdp_vdev_alloc_vdev_stats_id(ol_txrx_soc_handle soc,uint8_t * vdev_stats_id)368 QDF_STATUS cdp_vdev_alloc_vdev_stats_id(ol_txrx_soc_handle soc,
369 uint8_t *vdev_stats_id)
370 {
371 if (!soc || !soc->ops) {
372 dp_cdp_debug("Invalid Instance:");
373 QDF_BUG(0);
374 return QDF_STATUS_E_FAILURE;
375 }
376
377 if (!soc->ops->host_stats_ops ||
378 !soc->ops->host_stats_ops->txrx_alloc_vdev_stats_id)
379 return QDF_STATUS_E_FAILURE;
380
381 return soc->ops->host_stats_ops->txrx_alloc_vdev_stats_id
382 (soc, vdev_stats_id);
383 }
384
385 static inline
cdp_vdev_reset_vdev_stats_id(ol_txrx_soc_handle soc,uint8_t vdev_stats_id)386 void cdp_vdev_reset_vdev_stats_id(ol_txrx_soc_handle soc,
387 uint8_t vdev_stats_id)
388 {
389 if (!soc || !soc->ops) {
390 dp_cdp_debug("Invalid Instance:");
391 QDF_BUG(0);
392 return;
393 }
394
395 if (!soc->ops->host_stats_ops ||
396 !soc->ops->host_stats_ops->txrx_reset_vdev_stats_id)
397 return;
398
399 soc->ops->host_stats_ops->txrx_reset_vdev_stats_id(soc, vdev_stats_id);
400 }
401
402 #ifdef VDEV_PEER_PROTOCOL_COUNT
403 /**
404 * cdp_set_vdev_peer_protocol_count() - set per-peer protocol count tracking
405 * @soc: pointer to the soc
406 * @vdev_id: the data virtual device object
407 * @enable: enable per-peer protocol count
408 *
409 * Set per-peer protocol count feature enable
410 *
411 * Return: void
412 */
413 static inline
cdp_set_vdev_peer_protocol_count(ol_txrx_soc_handle soc,int8_t vdev_id,bool enable)414 void cdp_set_vdev_peer_protocol_count(ol_txrx_soc_handle soc, int8_t vdev_id,
415 bool enable)
416 {
417 if (!soc || !soc->ops) {
418 dp_cdp_debug("Invalid Instance:");
419 QDF_BUG(0);
420 return;
421 }
422
423 if (!soc->ops->ctrl_ops ||
424 !soc->ops->ctrl_ops->txrx_enable_peer_protocol_count)
425 return;
426
427 soc->ops->ctrl_ops->txrx_enable_peer_protocol_count(soc, vdev_id,
428 enable);
429 }
430
431 /**
432 * cdp_set_vdev_peer_protocol_drop_mask() - set per-peer protocol drop mask
433 * @soc: pointer to the soc
434 * @vdev_id: ID of the data virtual device object
435 * @drop_mask: drop_mask
436 *
437 * Set per-peer protocol drop_mask
438 *
439 * Return: void
440 */
441 static inline
cdp_set_vdev_peer_protocol_drop_mask(ol_txrx_soc_handle soc,int8_t vdev_id,int drop_mask)442 void cdp_set_vdev_peer_protocol_drop_mask(ol_txrx_soc_handle soc,
443 int8_t vdev_id, int drop_mask)
444 {
445 if (!soc || !soc->ops) {
446 dp_cdp_debug("Invalid Instance:");
447 QDF_BUG(0);
448 return;
449 }
450
451 if (!soc->ops->ctrl_ops ||
452 !soc->ops->ctrl_ops->txrx_set_peer_protocol_drop_mask)
453 return;
454
455 soc->ops->ctrl_ops->txrx_set_peer_protocol_drop_mask(soc, vdev_id,
456 drop_mask);
457 }
458
459 /**
460 * cdp_is_vdev_peer_protocol_count_enabled() - whether peer-protocol tracking
461 * enabled
462 * @soc: pointer to the soc
463 * @vdev_id: ID of the data virtual device object
464 *
465 * Get whether peer protocol count feature enabled or not
466 *
467 * Return: whether feature enabled or not
468 */
469 static inline
cdp_is_vdev_peer_protocol_count_enabled(ol_txrx_soc_handle soc,int8_t vdev_id)470 int cdp_is_vdev_peer_protocol_count_enabled(ol_txrx_soc_handle soc,
471 int8_t vdev_id)
472 {
473 if (!soc || !soc->ops) {
474 dp_cdp_debug("Invalid Instance:");
475 QDF_BUG(0);
476 return 0;
477 }
478
479 if (!soc->ops->ctrl_ops ||
480 !soc->ops->ctrl_ops->txrx_is_peer_protocol_count_enabled)
481 return 0;
482
483 return soc->ops->ctrl_ops->txrx_is_peer_protocol_count_enabled(soc,
484 vdev_id);
485 }
486
487 /**
488 * cdp_get_peer_protocol_drop_mask() - get per-peer protocol count drop-mask
489 * @soc: pointer to the soc
490 * @vdev_id: ID of the data virtual device object
491 *
492 * Get peer-protocol-count drop-mask
493 *
494 * Return: peer-protocol-count drop-mask
495 */
496 static inline
cdp_get_peer_protocol_drop_mask(ol_txrx_soc_handle soc,int8_t vdev_id)497 int cdp_get_peer_protocol_drop_mask(ol_txrx_soc_handle soc, int8_t vdev_id)
498 {
499 if (!soc || !soc->ops) {
500 dp_cdp_debug("Invalid Instance:");
501 QDF_BUG(0);
502 return 0;
503 }
504
505 if (!soc->ops->ctrl_ops ||
506 !soc->ops->ctrl_ops->txrx_get_peer_protocol_drop_mask)
507 return 0;
508
509 return soc->ops->ctrl_ops->txrx_get_peer_protocol_drop_mask(soc,
510 vdev_id);
511 }
512
513 /*
514 * Rx-Ingress and Tx-Egress are in the lower level DP layer
515 * Rx-Egress and Tx-ingress are handled in osif layer for DP
516 * So
517 * Rx-Ingress and Tx-Egress definitions are in DP layer
518 * Rx-Egress and Tx-ingress mask definitions are here below
519 */
520 #define VDEV_PEER_PROTOCOL_RX_INGRESS_MASK 1
521 #define VDEV_PEER_PROTOCOL_TX_INGRESS_MASK 2
522 #define VDEV_PEER_PROTOCOL_RX_EGRESS_MASK 4
523 #define VDEV_PEER_PROTOCOL_TX_EGRESS_MASK 8
524
525 #else
526 #define cdp_set_vdev_peer_protocol_count(soc, vdev_id, enable)
527 #define cdp_set_vdev_peer_protocol_drop_mask(soc, vdev_id, drop_mask)
528 #define cdp_is_vdev_peer_protocol_count_enabled(soc, vdev_id) 0
529 #define cdp_get_peer_protocol_drop_mask(soc, vdev_id) 0
530 #endif
531
532 /**
533 * cdp_txrx_set_pdev_param() - set pdev parameter
534 * @soc: opaque soc handle
535 * @pdev_id: id of data path pdev handle
536 * @type: param type
537 * @val: value
538 *
539 * Return: status: 0 - Success, non-zero: Failure
540 */
cdp_txrx_set_pdev_param(ol_txrx_soc_handle soc,uint8_t pdev_id,enum cdp_pdev_param_type type,cdp_config_param_type val)541 static inline QDF_STATUS cdp_txrx_set_pdev_param(ol_txrx_soc_handle soc,
542 uint8_t pdev_id,
543 enum cdp_pdev_param_type type,
544 cdp_config_param_type val)
545 {
546 if (!soc || !soc->ops) {
547 dp_cdp_debug("Invalid Instance:");
548 QDF_BUG(0);
549 return QDF_STATUS_E_FAILURE;
550 }
551
552 if (!soc->ops->ctrl_ops ||
553 !soc->ops->ctrl_ops->txrx_set_pdev_param)
554 return QDF_STATUS_E_FAILURE;
555
556 return soc->ops->ctrl_ops->txrx_set_pdev_param
557 (soc, pdev_id, type, val);
558 }
559
560 /**
561 * cdp_txrx_set_peer_param() - set pdev parameter
562 * @soc: opaque soc handle
563 * @vdev_id: id of data path vdev handle
564 * @peer_mac: peer mac address
565 * @type: param type
566 * @val: value
567 *
568 * Return: status: 0 - Success, non-zero: Failure
569 */
cdp_txrx_set_peer_param(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,enum cdp_peer_param_type type,cdp_config_param_type val)570 static inline QDF_STATUS cdp_txrx_set_peer_param(ol_txrx_soc_handle soc,
571 uint8_t vdev_id,
572 uint8_t *peer_mac,
573 enum cdp_peer_param_type type,
574 cdp_config_param_type val)
575 {
576 if (!soc || !soc->ops) {
577 dp_cdp_debug("Invalid Instance:");
578 QDF_BUG(0);
579 return QDF_STATUS_E_FAILURE;
580 }
581
582 if (!soc->ops->ctrl_ops ||
583 !soc->ops->ctrl_ops->txrx_set_peer_param)
584 return QDF_STATUS_E_FAILURE;
585
586 return soc->ops->ctrl_ops->txrx_set_peer_param
587 (soc, vdev_id, peer_mac, type, val);
588 }
589
590 /**
591 * cdp_txrx_get_peer_param() - set pdev parameter
592 * @soc: opaque soc handle
593 * @vdev_id: id of data path vdev handle
594 * @peer_mac: peer mac address
595 * @type: param type
596 * @val: address of buffer
597 *
598 * Return: status
599 */
cdp_txrx_get_peer_param(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,enum cdp_peer_param_type type,cdp_config_param_type * val)600 static inline QDF_STATUS cdp_txrx_get_peer_param(ol_txrx_soc_handle soc,
601 uint8_t vdev_id,
602 uint8_t *peer_mac,
603 enum cdp_peer_param_type type,
604 cdp_config_param_type *val)
605 {
606 if (!soc || !soc->ops) {
607 dp_cdp_debug("Invalid Instance:");
608 QDF_BUG(0);
609 return QDF_STATUS_E_FAILURE;
610 }
611
612 if (!soc->ops->ctrl_ops ||
613 !soc->ops->ctrl_ops->txrx_get_peer_param)
614 return QDF_STATUS_E_FAILURE;
615
616 return soc->ops->ctrl_ops->txrx_get_peer_param
617 (soc, vdev_id, peer_mac, type, val);
618 }
619
620 #ifdef QCA_MULTIPASS_SUPPORT
621 static inline void
cdp_peer_set_vlan_id(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,uint16_t vlan_id)622 cdp_peer_set_vlan_id(ol_txrx_soc_handle soc, uint8_t vdev_id,
623 uint8_t *peer_mac, uint16_t vlan_id)
624 {
625 if (!soc || !soc->ops) {
626 dp_cdp_debug("Invalid Instance:");
627 QDF_BUG(0);
628 return;
629 }
630
631 if (!soc->ops->ctrl_ops ||
632 !soc->ops->ctrl_ops->txrx_peer_set_vlan_id)
633 return;
634
635 soc->ops->ctrl_ops->txrx_peer_set_vlan_id(soc, vdev_id, peer_mac,
636 vlan_id);
637 }
638 #endif
639
640 /**
641 * cdp_txrx_get_pdev_param() - get pdev parameter
642 * @soc: opaque soc handle
643 * @pdev_id: id of data path pdev handle
644 * @type: param type
645 * @value: address of value buffer
646 *
647 * Return: status
648 */
cdp_txrx_get_pdev_param(ol_txrx_soc_handle soc,uint8_t pdev_id,enum cdp_pdev_param_type type,cdp_config_param_type * value)649 static inline QDF_STATUS cdp_txrx_get_pdev_param(ol_txrx_soc_handle soc,
650 uint8_t pdev_id,
651 enum cdp_pdev_param_type type,
652 cdp_config_param_type *value)
653 {
654 if (!soc || !soc->ops) {
655 dp_cdp_debug("Invalid Instance:");
656 QDF_BUG(0);
657 return QDF_STATUS_E_FAILURE;
658 }
659
660 if (!soc->ops->ctrl_ops ||
661 !soc->ops->ctrl_ops->txrx_get_pdev_param)
662 return QDF_STATUS_E_FAILURE;
663
664 return soc->ops->ctrl_ops->txrx_get_pdev_param
665 (soc, pdev_id, type, value);
666 }
667
668 /**
669 * cdp_txrx_peer_protocol_cnt() - set peer protocol count
670 * @soc: opaque soc handle
671 * @vdev_id: vdev id
672 * @nbuf: data packet
673 * @is_egress: whether egress or ingress
674 * @is_rx: whether tx or rx
675 *
676 * Return: void
677 */
678 #ifdef VDEV_PEER_PROTOCOL_COUNT
679 static inline void
cdp_txrx_peer_protocol_cnt(ol_txrx_soc_handle soc,int8_t vdev_id,qdf_nbuf_t nbuf,enum vdev_peer_protocol_enter_exit is_egress,enum vdev_peer_protocol_tx_rx is_rx)680 cdp_txrx_peer_protocol_cnt(ol_txrx_soc_handle soc,
681 int8_t vdev_id,
682 qdf_nbuf_t nbuf,
683 enum vdev_peer_protocol_enter_exit is_egress,
684 enum vdev_peer_protocol_tx_rx is_rx)
685 {
686 if (!soc || !soc->ops) {
687 dp_cdp_debug("Invalid Instance:");
688 QDF_BUG(0);
689 return;
690 }
691
692 if (!soc->ops->ctrl_ops ||
693 !soc->ops->ctrl_ops->txrx_peer_protocol_cnt)
694 return;
695
696 soc->ops->ctrl_ops->txrx_peer_protocol_cnt(soc, vdev_id, nbuf,
697 is_egress, is_rx);
698 }
699 #else
700 #define cdp_txrx_peer_protocol_cnt(soc, vdev_id, nbuf, is_egress, is_rx)
701 #endif
702
703 /**
704 * cdp_enable_peer_based_pktlog()- Set flag in peer structure
705 * @soc: pointer to the soc
706 * @pdev_id: id of the data physical device object
707 * @enable: enable or disable peer based filter based pktlog
708 * @peer_macaddr: Mac address of peer which needs to be
709 * filtered
710 *
711 * This function will set flag in peer structure if peer based filtering
712 * is enabled for pktlog
713 *
714 * Return: int
715 */
716 static inline int
cdp_enable_peer_based_pktlog(ol_txrx_soc_handle soc,uint8_t pdev_id,char * peer_macaddr,uint8_t enable)717 cdp_enable_peer_based_pktlog(ol_txrx_soc_handle soc, uint8_t pdev_id,
718 char *peer_macaddr,
719 uint8_t enable)
720 {
721 if (!soc || !soc->ops) {
722 QDF_TRACE_ERROR(QDF_MODULE_ID_DP,
723 "%s invalid instance", __func__);
724 QDF_BUG(0);
725 return 0;
726 }
727
728 if (!soc->ops->ctrl_ops ||
729 !soc->ops->ctrl_ops->enable_peer_based_pktlog)
730 return 0;
731
732 return soc->ops->ctrl_ops->enable_peer_based_pktlog
733 (soc, pdev_id, peer_macaddr, enable);
734 }
735
736 /**
737 * cdp_calculate_delay_stats()- get rx delay stats
738 * @soc: pointer to the soc
739 * @vdev_id: id of vdev handle
740 * @nbuf: nbuf which is passed
741 *
742 * This function will calculate rx delay statistics.
743 */
744 static inline QDF_STATUS
cdp_calculate_delay_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,qdf_nbuf_t nbuf)745 cdp_calculate_delay_stats(ol_txrx_soc_handle soc, uint8_t vdev_id,
746 qdf_nbuf_t nbuf)
747 {
748 if (!soc || !soc->ops) {
749 dp_cdp_debug("Invalid Instance:");
750 QDF_BUG(0);
751 return QDF_STATUS_E_FAILURE;
752 }
753
754 if (!soc->ops->ctrl_ops ||
755 !soc->ops->ctrl_ops->calculate_delay_stats) {
756 dp_cdp_debug("callback not registered:");
757 return QDF_STATUS_E_FAILURE;
758 }
759
760 return soc->ops->ctrl_ops->calculate_delay_stats(soc, vdev_id, nbuf);
761 }
762
763 /**
764 * cdp_wdi_event_sub() - Subscribe to a specified WDI event.
765 * @soc: pointer to the soc
766 * @pdev_id: id of the data physical device object
767 * @event_cb_sub: the callback and context for the event subscriber
768 * @event: which event's notifications are being subscribed to
769 *
770 * This function adds the provided wdi_event_subscribe object to a list of
771 * subscribers for the specified WDI event.
772 * When the event in question happens, each subscriber for the event will
773 * have their callback function invoked.
774 * The order in which callback functions from multiple subscribers are
775 * invoked is unspecified.
776 *
777 * Return: int
778 */
779 static inline int
cdp_wdi_event_sub(ol_txrx_soc_handle soc,uint8_t pdev_id,wdi_event_subscribe * event_cb_sub,uint32_t event)780 cdp_wdi_event_sub(ol_txrx_soc_handle soc, uint8_t pdev_id,
781 wdi_event_subscribe *event_cb_sub, uint32_t event)
782 {
783
784 if (!soc || !soc->ops) {
785 dp_cdp_debug("invalid instance");
786 QDF_BUG(0);
787 return 0;
788 }
789
790 if (!soc->ops->ctrl_ops ||
791 !soc->ops->ctrl_ops->txrx_wdi_event_sub)
792 return 0;
793
794 return soc->ops->ctrl_ops->txrx_wdi_event_sub
795 (soc, pdev_id, event_cb_sub, event);
796 }
797
798 /**
799 * cdp_wdi_event_unsub() - Unsubscribe from a specified WDI event.
800 * @soc: pointer to the soc
801 * @pdev_id: id of the data physical device object
802 * @event_cb_sub: the callback and context for the event subscriber
803 * @event: which event's notifications are being subscribed to
804 *
805 * This function removes the provided event subscription object from the
806 * list of subscribers for its event.
807 * This function shall only be called if there was a successful prior call
808 * to cdp_wdi_event_sub() on the same wdi_event_subscribe object.
809 *
810 * Return: int
811 */
812 static inline int
cdp_wdi_event_unsub(ol_txrx_soc_handle soc,uint8_t pdev_id,wdi_event_subscribe * event_cb_sub,uint32_t event)813 cdp_wdi_event_unsub(ol_txrx_soc_handle soc,
814 uint8_t pdev_id, wdi_event_subscribe *event_cb_sub,
815 uint32_t event)
816 {
817
818 if (!soc || !soc->ops) {
819 dp_cdp_debug("invalid instance");
820 QDF_BUG(0);
821 return 0;
822 }
823
824 if (!soc->ops->ctrl_ops ||
825 !soc->ops->ctrl_ops->txrx_wdi_event_unsub)
826 return 0;
827
828 return soc->ops->ctrl_ops->txrx_wdi_event_unsub
829 (soc, pdev_id, event_cb_sub, event);
830 }
831
832 /**
833 * cdp_get_sec_type() - Get security type from the from peer.
834 * @soc: pointer to the soc
835 * @vdev_id: id of vdev handle
836 * @peer_mac: peer mac address
837 * @sec_idx: mcast or ucast frame type.
838 *
839 * This function gets the Security information from the peer handler.
840 * The security information is got from the rx descriptor and filled in
841 * to the peer handler.
842 *
843 * Return: int
844 */
845 static inline int
cdp_get_sec_type(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,uint8_t sec_idx)846 cdp_get_sec_type(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac,
847 uint8_t sec_idx)
848 {
849 if (!soc || !soc->ops) {
850 dp_cdp_debug("invalid instance");
851 QDF_BUG(0);
852 return A_ERROR;
853 }
854
855 if (!soc->ops->ctrl_ops ||
856 !soc->ops->ctrl_ops->txrx_get_sec_type)
857 return A_ERROR;
858
859 return soc->ops->ctrl_ops->txrx_get_sec_type
860 (soc, vdev_id, peer_mac, sec_idx);
861 }
862
863 /**
864 * cdp_set_mgmt_tx_power() - function to set tx power for mgmt frames
865 * @soc: pointer to the soc
866 * @vdev_id : id of vdev handle
867 * @subtype: subtype
868 * @tx_power: Tx power
869 *
870 * Return: QDF_STATUS
871 */
872 static inline QDF_STATUS
cdp_set_mgmt_tx_power(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t subtype,uint8_t tx_power)873 cdp_set_mgmt_tx_power(ol_txrx_soc_handle soc,
874 uint8_t vdev_id, uint8_t subtype, uint8_t tx_power)
875 {
876 if (!soc || !soc->ops) {
877 dp_cdp_debug("Invalid Instance:");
878 QDF_BUG(0);
879 return QDF_STATUS_E_FAILURE;
880 }
881
882 if (!soc->ops->ctrl_ops ||
883 !soc->ops->ctrl_ops->txrx_update_mgmt_txpow_vdev)
884 return QDF_STATUS_E_FAILURE;
885
886 return soc->ops->ctrl_ops->txrx_update_mgmt_txpow_vdev(soc, vdev_id,
887 subtype, tx_power);
888 }
889
890 /**
891 * cdp_get_pldev() - function to get pktlog device handle
892 * @soc: datapath soc handle
893 * @pdev_id: physical device id
894 *
895 * Return: pktlog device handle or NULL
896 */
897 static inline void *
cdp_get_pldev(ol_txrx_soc_handle soc,uint8_t pdev_id)898 cdp_get_pldev(ol_txrx_soc_handle soc, uint8_t pdev_id)
899 {
900 if (!soc || !soc->ops) {
901 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
902 "%s invalid instance", __func__);
903 QDF_BUG(0);
904 return NULL;
905 }
906
907 if (!soc->ops->ctrl_ops || !soc->ops->ctrl_ops->txrx_get_pldev)
908 return NULL;
909
910 return soc->ops->ctrl_ops->txrx_get_pldev(soc, pdev_id);
911 }
912
913 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
914 /**
915 * cdp_cfr_filter() - Configure Host RX monitor status ring for CFR
916 * @soc: SOC TXRX handle
917 * @pdev_id: ID of the physical device object
918 * @enable: Enable or disable CFR
919 * @filter_val: Flag to select filter for monitor mode
920 * @cfr_enable_monitor_mode: Flag to be enabled when scan radio is brought up
921 * in special vap mode
922 */
923 static inline void
cdp_cfr_filter(ol_txrx_soc_handle soc,uint8_t pdev_id,bool enable,struct cdp_monitor_filter * filter_val,bool cfr_enable_monitor_mode)924 cdp_cfr_filter(ol_txrx_soc_handle soc,
925 uint8_t pdev_id,
926 bool enable, struct cdp_monitor_filter *filter_val,
927 bool cfr_enable_monitor_mode)
928 {
929 if (!soc || !soc->ops) {
930 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
931 "%s invalid instance", __func__);
932 QDF_BUG(0);
933 return;
934 }
935
936 if (!soc->ops->mon_ops || !soc->ops->mon_ops->txrx_cfr_filter)
937 return;
938
939 soc->ops->mon_ops->txrx_cfr_filter(soc, pdev_id, enable, filter_val,
940 cfr_enable_monitor_mode);
941 }
942
943 /**
944 * cdp_get_cfr_rcc() - get cfr rcc config
945 * @soc: Datapath soc handle
946 * @pdev_id: id of objmgr pdev
947 *
948 * Return: true/false based on cfr mode setting
949 */
950 static inline
cdp_get_cfr_rcc(ol_txrx_soc_handle soc,uint8_t pdev_id)951 bool cdp_get_cfr_rcc(ol_txrx_soc_handle soc, uint8_t pdev_id)
952 {
953 if (!soc || !soc->ops) {
954 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
955 "%s invalid instance", __func__);
956 QDF_BUG(0);
957 return 0;
958 }
959
960 if (!soc->ops->cfr_ops || !soc->ops->cfr_ops->txrx_get_cfr_rcc)
961 return 0;
962
963 return soc->ops->cfr_ops->txrx_get_cfr_rcc(soc, pdev_id);
964 }
965
966 /**
967 * cdp_set_cfr_rcc() - enable/disable cfr rcc config
968 * @soc: Datapath soc handle
969 * @pdev_id: id of objmgr pdev
970 * @enable: Enable/Disable cfr rcc mode
971 *
972 * Return: none
973 */
974 static inline
cdp_set_cfr_rcc(ol_txrx_soc_handle soc,uint8_t pdev_id,bool enable)975 void cdp_set_cfr_rcc(ol_txrx_soc_handle soc, uint8_t pdev_id, bool enable)
976 {
977 if (!soc || !soc->ops) {
978 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
979 "%s invalid instance", __func__);
980 QDF_BUG(0);
981 return;
982 }
983
984 if (!soc->ops->cfr_ops || !soc->ops->cfr_ops->txrx_set_cfr_rcc)
985 return;
986
987 return soc->ops->cfr_ops->txrx_set_cfr_rcc(soc, pdev_id, enable);
988 }
989
990 /**
991 * cdp_get_cfr_dbg_stats() - Get debug statistics for CFR
992 * @soc: SOC TXRX handle
993 * @pdev_id: ID of the physical device object
994 * @buf: CFR RCC debug statistics buffer
995 *
996 * Return: None
997 */
998 static inline void
cdp_get_cfr_dbg_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_cfr_rcc_stats * buf)999 cdp_get_cfr_dbg_stats(ol_txrx_soc_handle soc, uint8_t pdev_id,
1000 struct cdp_cfr_rcc_stats *buf)
1001 {
1002 if (!soc || !soc->ops) {
1003 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1004 "%s invalid instance", __func__);
1005 QDF_BUG(0);
1006 return;
1007 }
1008
1009 if (!soc->ops->cfr_ops || !soc->ops->cfr_ops->txrx_get_cfr_dbg_stats)
1010 return;
1011
1012 soc->ops->cfr_ops->txrx_get_cfr_dbg_stats(soc, pdev_id, buf);
1013 }
1014
1015 /**
1016 * cdp_cfr_clr_dbg_stats() - Clear debug statistics for CFR
1017 * @soc: SOC TXRX handle
1018 * @pdev_id: ID of the physical device object
1019 */
1020 static inline void
cdp_cfr_clr_dbg_stats(ol_txrx_soc_handle soc,uint8_t pdev_id)1021 cdp_cfr_clr_dbg_stats(ol_txrx_soc_handle soc, uint8_t pdev_id)
1022 {
1023 if (!soc || !soc->ops) {
1024 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1025 "%s invalid instance", __func__);
1026 QDF_BUG(0);
1027 return;
1028 }
1029
1030 if (!soc->ops->cfr_ops || !soc->ops->cfr_ops->txrx_clear_cfr_dbg_stats)
1031 return;
1032
1033 soc->ops->cfr_ops->txrx_clear_cfr_dbg_stats(soc, pdev_id);
1034 }
1035 #endif
1036
1037 #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH)
1038 /**
1039 * cdp_update_peer_pkt_capture_params() - Sets Rx & Tx Capture params for a peer
1040 * @soc: SOC TXRX handle
1041 * @pdev_id: id of CDP pdev pointer
1042 * @is_rx_pkt_cap_enable: enable/disable rx pkt capture for this peer
1043 * @is_tx_pkt_cap_enable: enable/disable tx pkt capture for this peer
1044 * @peer_mac: MAC address of peer for which pkt_cap is to be enabled/disabled
1045 *
1046 * Return: Success when matching peer is found & flags are set, error otherwise
1047 */
1048 static inline QDF_STATUS
cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc,uint8_t pdev_id,bool is_rx_pkt_cap_enable,uint8_t is_tx_pkt_cap_enable,uint8_t * peer_mac)1049 cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc,
1050 uint8_t pdev_id,
1051 bool is_rx_pkt_cap_enable,
1052 uint8_t is_tx_pkt_cap_enable,
1053 uint8_t *peer_mac)
1054 {
1055 if (!soc || !soc->ops) {
1056 dp_err("Invalid SOC instance");
1057 QDF_BUG(0);
1058 return QDF_STATUS_E_FAILURE;
1059 }
1060
1061 if (!soc->ops->ctrl_ops ||
1062 !soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params)
1063 return QDF_STATUS_E_FAILURE;
1064
1065 return soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params
1066 (soc, pdev_id, is_rx_pkt_cap_enable,
1067 is_tx_pkt_cap_enable, peer_mac);
1068 }
1069 #endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
1070
1071 #ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
1072 /**
1073 * cdp_update_pdev_rx_protocol_tag() - wrapper function to set the protocol
1074 * tag in CDP layer from cfg layer
1075 * @soc: SOC TXRX handle
1076 * @pdev_id: id of CDP pdev pointer
1077 * @protocol_mask: Bitmap for protocol for which tagging is enabled
1078 * @protocol_type: Protocol type for which the tag should be update
1079 * @tag: Actual tag value for the given prototype
1080 * Return: Returns QDF_STATUS_SUCCESS/FAILURE
1081 */
1082 static inline QDF_STATUS
cdp_update_pdev_rx_protocol_tag(ol_txrx_soc_handle soc,uint8_t pdev_id,uint32_t protocol_mask,uint16_t protocol_type,uint16_t tag)1083 cdp_update_pdev_rx_protocol_tag(ol_txrx_soc_handle soc,
1084 uint8_t pdev_id, uint32_t protocol_mask,
1085 uint16_t protocol_type, uint16_t tag)
1086 {
1087 if (!soc || !soc->ops) {
1088 dp_err("Invalid SOC instance");
1089 QDF_BUG(0);
1090 return QDF_STATUS_E_FAILURE;
1091 }
1092
1093 if (!soc->ops->ctrl_ops ||
1094 !soc->ops->ctrl_ops->txrx_update_pdev_rx_protocol_tag)
1095 return QDF_STATUS_E_FAILURE;
1096
1097 return soc->ops->ctrl_ops->txrx_update_pdev_rx_protocol_tag
1098 (soc, pdev_id, protocol_mask, protocol_type, tag);
1099 }
1100
1101 #ifdef WLAN_SUPPORT_RX_TAG_STATISTICS
1102 /**
1103 * cdp_dump_pdev_rx_protocol_tag_stats() - wrapper function to dump the protocol
1104 * tag statistics for given or all protocols
1105 * @soc: SOC TXRX handle
1106 * @pdev_id: id of CDP pdev pointer
1107 * @protocol_type: Protocol type for which the tag should be update
1108 *
1109 * Return: Returns QDF_STATUS_SUCCESS/FAILURE
1110 */
1111 static inline QDF_STATUS
cdp_dump_pdev_rx_protocol_tag_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,uint16_t protocol_type)1112 cdp_dump_pdev_rx_protocol_tag_stats(ol_txrx_soc_handle soc,
1113 uint8_t pdev_id,
1114 uint16_t protocol_type)
1115 {
1116 if (!soc || !soc->ops) {
1117 dp_err("Invalid SOC instance");
1118 QDF_BUG(0);
1119 return QDF_STATUS_E_FAILURE;
1120 }
1121
1122 if (!soc->ops->ctrl_ops ||
1123 !soc->ops->ctrl_ops->txrx_dump_pdev_rx_protocol_tag_stats)
1124 return QDF_STATUS_E_FAILURE;
1125
1126 soc->ops->ctrl_ops->txrx_dump_pdev_rx_protocol_tag_stats(soc, pdev_id,
1127 protocol_type);
1128 return QDF_STATUS_SUCCESS;
1129 }
1130 #endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */
1131 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
1132
1133 #ifdef ATH_SUPPORT_NAC_RSSI
1134 /**
1135 * cdp_vdev_config_for_nac_rssi() - To invoke dp callback for nac rssi config
1136 * @soc: soc pointer
1137 * @vdev_id: id of vdev
1138 * @nac_cmd: specifies nac_rss config action add, del, list
1139 * @bssid: Neighbour bssid
1140 * @client_macaddr: Non-Associated client MAC
1141 * @chan_num: channel number to scan
1142 *
1143 * Return: QDF_STATUS
1144 */
cdp_vdev_config_for_nac_rssi(ol_txrx_soc_handle soc,uint8_t vdev_id,enum cdp_nac_param_cmd nac_cmd,char * bssid,char * client_macaddr,uint8_t chan_num)1145 static inline QDF_STATUS cdp_vdev_config_for_nac_rssi(ol_txrx_soc_handle soc,
1146 uint8_t vdev_id, enum cdp_nac_param_cmd nac_cmd,
1147 char *bssid, char *client_macaddr, uint8_t chan_num)
1148 {
1149 if (!soc || !soc->ops) {
1150 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1151 "%s invalid instance", __func__);
1152 QDF_BUG(0);
1153 return QDF_STATUS_E_FAILURE;
1154 }
1155
1156 if (!soc->ops->mon_ops ||
1157 !soc->ops->mon_ops->txrx_vdev_config_for_nac_rssi)
1158 return QDF_STATUS_E_FAILURE;
1159
1160 return soc->ops->mon_ops->txrx_vdev_config_for_nac_rssi(soc, vdev_id,
1161 nac_cmd, bssid, client_macaddr, chan_num);
1162 }
1163
1164 /**
1165 * cdp_vdev_get_neighbour_rssi() - invoke dp callback to get rssi value of nac
1166 * @soc: soc pointer
1167 * @vdev_id: id of vdev
1168 * @macaddr: Non-Associated client MAC
1169 * @rssi: rssi
1170 *
1171 * Return: QDF_STATUS
1172 */
cdp_vdev_get_neighbour_rssi(ol_txrx_soc_handle soc,uint8_t vdev_id,char * macaddr,uint8_t * rssi)1173 static inline QDF_STATUS cdp_vdev_get_neighbour_rssi(ol_txrx_soc_handle soc,
1174 uint8_t vdev_id,
1175 char *macaddr,
1176 uint8_t *rssi)
1177 {
1178 if (!soc || !soc->ops) {
1179 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1180 "%s invalid instance", __func__);
1181 QDF_BUG(0);
1182 return QDF_STATUS_E_FAILURE;
1183 }
1184
1185 if (!soc->ops->mon_ops ||
1186 !soc->ops->mon_ops->txrx_vdev_get_neighbour_rssi)
1187 return QDF_STATUS_E_FAILURE;
1188
1189 return soc->ops->mon_ops->txrx_vdev_get_neighbour_rssi(soc, vdev_id,
1190 macaddr,
1191 rssi);
1192 }
1193 #endif
1194
1195 #ifdef WLAN_SUPPORT_RX_FLOW_TAG
1196 /**
1197 * cdp_set_rx_flow_tag() - wrapper function to set the flow
1198 * tag in CDP layer from cfg layer
1199 * @soc: SOC TXRX handle
1200 * @pdev_id: id of CDP pdev pointer
1201 * @flow_info: Flow 5-tuple, along with tag, if any, that needs to added/deleted
1202 *
1203 * Return: Success when add/del operation is successful, error otherwise
1204 */
1205 static inline QDF_STATUS
cdp_set_rx_flow_tag(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_rx_flow_info * flow_info)1206 cdp_set_rx_flow_tag(ol_txrx_soc_handle soc, uint8_t pdev_id,
1207 struct cdp_rx_flow_info *flow_info)
1208 {
1209 if (!soc || !soc->ops) {
1210 dp_err("Invalid SOC instance");
1211 QDF_BUG(0);
1212 return QDF_STATUS_E_FAILURE;
1213 }
1214
1215 if (!soc->ops->ctrl_ops ||
1216 !soc->ops->ctrl_ops->txrx_set_rx_flow_tag)
1217 return QDF_STATUS_E_FAILURE;
1218
1219 return soc->ops->ctrl_ops->txrx_set_rx_flow_tag(soc, pdev_id,
1220 flow_info);
1221 }
1222
1223 /**
1224 * cdp_dump_rx_flow_tag_stats() - wrapper function to dump the flow
1225 * tag statistics for given flow
1226 * @soc: SOC TXRX handle
1227 * @pdev_id: id of CDP pdev
1228 * @flow_info: Flow tuple for which we want to print the statistics
1229 *
1230 * Return: Success when flow is found and stats are printed, error otherwise
1231 */
1232 static inline QDF_STATUS
cdp_dump_rx_flow_tag_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_rx_flow_info * flow_info)1233 cdp_dump_rx_flow_tag_stats(ol_txrx_soc_handle soc, uint8_t pdev_id,
1234 struct cdp_rx_flow_info *flow_info)
1235 {
1236 if (!soc || !soc->ops) {
1237 dp_err("Invalid SOC instance");
1238 QDF_BUG(0);
1239 return QDF_STATUS_E_FAILURE;
1240 }
1241
1242 if (!soc->ops->ctrl_ops ||
1243 !soc->ops->ctrl_ops->txrx_dump_rx_flow_tag_stats)
1244 return QDF_STATUS_E_FAILURE;
1245
1246 return soc->ops->ctrl_ops->txrx_dump_rx_flow_tag_stats(soc,
1247 pdev_id,
1248 flow_info);
1249 }
1250 #endif /* WLAN_SUPPORT_RX_FLOW_TAG */
1251
1252 /**
1253 * cdp_txrx_peer_flush_frags() - flush frags for peer
1254 * @soc: pointer to the soc
1255 * @vdev_id: vdev id
1256 * @peer_mac: peer MAC address
1257 *
1258 * Get peer-protocol-count drop-mask
1259 *
1260 * Return: peer-protocol-count drop-mask
1261 */
1262 static inline
cdp_txrx_peer_flush_frags(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac)1263 void cdp_txrx_peer_flush_frags(ol_txrx_soc_handle soc, uint8_t vdev_id,
1264 uint8_t *peer_mac)
1265 {
1266 if (!soc || !soc->ops) {
1267 dp_cdp_err("Invalid Instance:");
1268 QDF_BUG(0);
1269 return;
1270 }
1271
1272 if (!soc->ops->ctrl_ops ||
1273 !soc->ops->ctrl_ops->txrx_peer_flush_frags)
1274 return;
1275
1276 return soc->ops->ctrl_ops->txrx_peer_flush_frags(soc, vdev_id,
1277 peer_mac);
1278 }
1279
1280 #if defined(WLAN_FEATURE_TSF_AUTO_REPORT) || defined(WLAN_CONFIG_TX_DELAY)
1281 /**
1282 * cdp_set_delta_tsf() - wrapper function to set delta_tsf
1283 * @soc: SOC TXRX handle
1284 * @vdev_id: vdev id
1285 * @delta_tsf: difference between TSF clock and qtimer
1286 *
1287 * Return: None
1288 */
cdp_set_delta_tsf(ol_txrx_soc_handle soc,uint8_t vdev_id,uint32_t delta_tsf)1289 static inline void cdp_set_delta_tsf(ol_txrx_soc_handle soc, uint8_t vdev_id,
1290 uint32_t delta_tsf)
1291 {
1292 if (!soc || !soc->ops) {
1293 dp_cdp_err("Invalid instance");
1294 QDF_BUG(0);
1295 return;
1296 }
1297
1298 if (!soc->ops->ctrl_ops ||
1299 !soc->ops->ctrl_ops->txrx_set_delta_tsf)
1300 return;
1301
1302 soc->ops->ctrl_ops->txrx_set_delta_tsf(soc, vdev_id, delta_tsf);
1303 }
1304 #endif
1305 #ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
1306 /**
1307 * cdp_set_tsf_ul_delay_report() - Enable or disable reporting uplink delay
1308 * @soc: SOC TXRX handle
1309 * @vdev_id: vdev id
1310 * @enable: true to enable and false to disable
1311 *
1312 * Return: QDF_STATUS
1313 */
cdp_set_tsf_ul_delay_report(ol_txrx_soc_handle soc,uint8_t vdev_id,bool enable)1314 static inline QDF_STATUS cdp_set_tsf_ul_delay_report(ol_txrx_soc_handle soc,
1315 uint8_t vdev_id,
1316 bool enable)
1317 {
1318 if (!soc || !soc->ops) {
1319 dp_cdp_err("Invalid SOC instance");
1320 QDF_BUG(0);
1321 return QDF_STATUS_E_FAILURE;
1322 }
1323
1324 if (!soc->ops->ctrl_ops ||
1325 !soc->ops->ctrl_ops->txrx_set_tsf_ul_delay_report)
1326 return QDF_STATUS_E_FAILURE;
1327
1328 return soc->ops->ctrl_ops->txrx_set_tsf_ul_delay_report(soc, vdev_id,
1329 enable);
1330 }
1331
1332 /**
1333 * cdp_get_uplink_delay() - Get uplink delay value
1334 * @soc: SOC TXRX handle
1335 * @vdev_id: vdev id
1336 * @val: pointer to save uplink delay value
1337 *
1338 * Return: QDF_STATUS
1339 */
cdp_get_uplink_delay(ol_txrx_soc_handle soc,uint32_t vdev_id,uint32_t * val)1340 static inline QDF_STATUS cdp_get_uplink_delay(ol_txrx_soc_handle soc,
1341 uint32_t vdev_id, uint32_t *val)
1342 {
1343 if (!soc || !soc->ops) {
1344 dp_cdp_err("Invalid SOC instance");
1345 QDF_BUG(0);
1346 return QDF_STATUS_E_FAILURE;
1347 }
1348
1349 if (!val) {
1350 dp_cdp_err("Invalid params val");
1351 return QDF_STATUS_E_FAILURE;
1352 }
1353
1354 if (!soc->ops->ctrl_ops ||
1355 !soc->ops->ctrl_ops->txrx_get_uplink_delay)
1356 return QDF_STATUS_E_FAILURE;
1357
1358 return soc->ops->ctrl_ops->txrx_get_uplink_delay(soc, vdev_id, val);
1359 }
1360 #endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */
1361
1362 #ifdef QCA_UNDECODED_METADATA_SUPPORT
1363 /**
1364 * cdp_txrx_set_pdev_phyrx_error_mask() - set phyrx error mask
1365 * @soc: opaque soc handle
1366 * @pdev_id: id of data path pdev handle
1367 * @mask: mask to configure 0 to 31 phy error
1368 * @mask_cont: mask to configure 32 to 63 phy error
1369 *
1370 * Return: status: 0 - Success, non-zero: Failure
1371 */
1372 static inline
cdp_txrx_set_pdev_phyrx_error_mask(ol_txrx_soc_handle soc,uint8_t pdev_id,uint32_t mask,uint32_t mask_cont)1373 QDF_STATUS cdp_txrx_set_pdev_phyrx_error_mask(ol_txrx_soc_handle soc,
1374 uint8_t pdev_id, uint32_t mask,
1375 uint32_t mask_cont)
1376 {
1377 if (!soc || !soc->ops) {
1378 dp_cdp_debug("Invalid Instance:");
1379 QDF_BUG(0);
1380 return QDF_STATUS_E_FAILURE;
1381 }
1382
1383 if (!soc->ops->ctrl_ops ||
1384 !soc->ops->ctrl_ops->txrx_set_pdev_phyrx_error_mask)
1385 return QDF_STATUS_E_FAILURE;
1386
1387 return soc->ops->ctrl_ops->txrx_set_pdev_phyrx_error_mask
1388 (soc, pdev_id, mask, mask_cont);
1389 }
1390
1391 static inline
cdp_txrx_get_pdev_phyrx_error_mask(ol_txrx_soc_handle soc,uint8_t pdev_id,uint32_t * mask,uint32_t * mask_cont)1392 QDF_STATUS cdp_txrx_get_pdev_phyrx_error_mask(ol_txrx_soc_handle soc,
1393 uint8_t pdev_id, uint32_t *mask,
1394 uint32_t *mask_cont)
1395 {
1396 if (!soc || !soc->ops) {
1397 dp_cdp_debug("Invalid Instance:");
1398 QDF_BUG(0);
1399 return QDF_STATUS_E_FAILURE;
1400 }
1401
1402 if (!soc->ops->ctrl_ops ||
1403 !soc->ops->ctrl_ops->txrx_get_pdev_phyrx_error_mask)
1404 return QDF_STATUS_E_FAILURE;
1405
1406 return soc->ops->ctrl_ops->txrx_get_pdev_phyrx_error_mask
1407 (soc, pdev_id, mask, mask_cont);
1408 }
1409 #endif
1410
1411 #ifdef DP_UMAC_HW_RESET_SUPPORT
1412 /**
1413 * cdp_get_umac_reset_in_progress_state() - API to get the umac reset in
1414 * progress state
1415 * @soc: opaque soc handle
1416 *
1417 * Return: Umac reset in progress state
1418 */
1419 static inline enum cdp_umac_reset_state
cdp_get_umac_reset_in_progress_state(ol_txrx_soc_handle soc)1420 cdp_get_umac_reset_in_progress_state(ol_txrx_soc_handle soc)
1421 {
1422 if (!soc || !soc->ops) {
1423 dp_cdp_debug("Invalid soc or soc->ops:");
1424 return CDP_UMAC_RESET_INVALID_STATE;
1425 }
1426
1427 if (!soc->ops->ctrl_ops ||
1428 !soc->ops->ctrl_ops->get_umac_reset_in_progress_state)
1429 return CDP_UMAC_RESET_INVALID_STATE;
1430
1431 return soc->ops->ctrl_ops->get_umac_reset_in_progress_state(soc);
1432 }
1433
1434 /**
1435 * cdp_umac_reset_is_inprogress() - API to check if umac reset is in progress
1436 * @soc: opaque soc handle
1437 *
1438 * Return: true if umac reset is in progress, else false.
1439 */
1440 static inline bool
cdp_umac_reset_is_inprogress(ol_txrx_soc_handle soc)1441 cdp_umac_reset_is_inprogress(ol_txrx_soc_handle soc)
1442 {
1443 enum cdp_umac_reset_state state;
1444
1445 state = cdp_get_umac_reset_in_progress_state(soc);
1446
1447 if (state == CDP_UMAC_RESET_IN_PROGRESS ||
1448 state == CDP_UMAC_RESET_IN_PROGRESS_DURING_BUFFER_WINDOW)
1449 return true;
1450 else
1451 return false;
1452 }
1453 #else
1454 static inline bool
cdp_umac_reset_is_inprogress(ol_txrx_soc_handle soc)1455 cdp_umac_reset_is_inprogress(ol_txrx_soc_handle soc)
1456 {
1457 return false;
1458 }
1459 #endif
1460
1461 #ifdef WLAN_SUPPORT_RX_FISA
1462 static inline
cdp_txrx_fisa_config(struct cdp_soc_t * soc,uint8_t pdev_id,enum cdp_fisa_config_id config_id,union cdp_fisa_config * cfg)1463 QDF_STATUS cdp_txrx_fisa_config(struct cdp_soc_t *soc, uint8_t pdev_id,
1464 enum cdp_fisa_config_id config_id,
1465 union cdp_fisa_config *cfg)
1466 {
1467 if (!soc || !soc->ops) {
1468 dp_cdp_debug("Invalid Instance:");
1469 QDF_BUG(0);
1470 return QDF_STATUS_E_FAILURE;
1471 }
1472
1473 if (!soc->ops->ctrl_ops || !soc->ops->ctrl_ops->txrx_fisa_config)
1474 return QDF_STATUS_E_FAILURE;
1475
1476 return soc->ops->ctrl_ops->txrx_fisa_config(soc, pdev_id, config_id,
1477 cfg);
1478 }
1479 #endif
1480 #endif /* _CDP_TXRX_CTRL_H_ */
1481