xref: /wlan-dirver/qca-wifi-host-cmn/dp/inc/cdp_txrx_misc.h (revision e9dba9646bfd1954b96d80bae0adc757244cbde8)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * @file cdp_txrx_misc.h
21  * @brief Define the host data path miscellaneous API functions
22  * called by the host control SW and the OS interface module
23  */
24 #ifndef _CDP_TXRX_MISC_H_
25 #define _CDP_TXRX_MISC_H_
26 
27 #include "cdp_txrx_handle.h"
28 #include <cdp_txrx_cmn.h>
29 
30 /**
31  * cdp_tx_non_std() - Allow the control-path SW to send data frames
32  * @soc: data path soc handle
33  * @vdev_id: id of vdev
34  * @tx_spec: what non-standard handling to apply to the tx data frames
35  * @msdu_list: NULL-terminated list of tx MSDUs
36  *
37  * Generally, all tx data frames come from the OS shim into the txrx layer.
38  * However, there are rare cases such as TDLS messaging where the UMAC
39  * control-path SW creates tx data frames.
40  *  This UMAC SW can call this function to provide the tx data frames to
41  *  the txrx layer.
42  *  The UMAC SW can request a callback for these data frames after their
43  *  transmission completes, by using the ol_txrx_data_tx_cb_set function
44  *  to register a tx completion callback, and by specifying
45  *  ol_tx_spec_no_free as the tx_spec arg when giving the frames to
46  *  ol_tx_non_std.
47  *  The MSDUs need to have the appropriate L2 header type (802.3 vs. 802.11),
48  *  as specified by ol_cfg_frame_type().
49  *
50  *  Return: null - success, skb - failure
51  */
52 static inline qdf_nbuf_t
53 cdp_tx_non_std(ol_txrx_soc_handle soc, uint8_t vdev_id,
54 	       enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list)
55 {
56 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
57 		dp_cdp_debug("invalid instance");
58 		return NULL;
59 	}
60 
61 	if (soc->ops->misc_ops->tx_non_std)
62 		return soc->ops->misc_ops->tx_non_std(soc, vdev_id, tx_spec,
63 						      msdu_list);
64 	return NULL;
65 }
66 
67 /**
68  * cdp_set_ibss_vdev_heart_beat_timer() - Update ibss vdev heart
69  * beat timer
70  * @soc: data path soc handle
71  * @vdev_id: id of vdev
72  * @timer_value_sec: new heart beat timer value
73  *
74  * Return: Old timer value set in vdev.
75  */
76 static inline uint16_t
77 cdp_set_ibss_vdev_heart_beat_timer(ol_txrx_soc_handle soc,
78 				   uint8_t vdev_id, uint16_t timer_value_sec)
79 {
80 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
81 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
82 			"%s invalid instance", __func__);
83 		return 0;
84 	}
85 
86 	if (soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer)
87 		return soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer(
88 			soc, vdev_id, timer_value_sec);
89 
90 	return 0;
91 }
92 
93 /**
94  * cdp_set_wisa_mode() - set wisa mode
95  * @soc: data path soc handle
96  * @vdev_id: vdev_id
97  * @enable: enable or disable
98  *
99  * Return: QDF_STATUS_SUCCESS mode enable success
100  */
101 static inline QDF_STATUS
102 cdp_set_wisa_mode(ol_txrx_soc_handle soc, uint8_t vdev_id, bool enable)
103 {
104 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
105 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
106 			"%s invalid instance", __func__);
107 		return QDF_STATUS_E_INVAL;
108 	}
109 
110 	if (soc->ops->misc_ops->set_wisa_mode)
111 		return soc->ops->misc_ops->set_wisa_mode(soc, vdev_id, enable);
112 	return QDF_STATUS_SUCCESS;
113 }
114 
115 /**
116  * cdp_data_stall_cb_register() - register data stall callback
117  * @soc: data path soc handle
118  * @pdev_id: id of data path pdev handle
119  * @cb: callback function
120  *
121  * Return: QDF_STATUS_SUCCESS register success
122  */
123 static inline QDF_STATUS cdp_data_stall_cb_register(ol_txrx_soc_handle soc,
124 						    uint8_t pdev_id,
125 						    data_stall_detect_cb cb)
126 {
127 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
128 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
129 			"%s invalid instance", __func__);
130 		return QDF_STATUS_E_INVAL;
131 	}
132 
133 	if (soc->ops->misc_ops->txrx_data_stall_cb_register)
134 		return soc->ops->misc_ops->txrx_data_stall_cb_register(
135 							soc, pdev_id, cb);
136 	return QDF_STATUS_SUCCESS;
137 }
138 
139 /**
140  * cdp_data_stall_cb_deregister() - de-register data stall callback
141  * @soc: data path soc handle
142  * @pdev_id: id of data path pdev handle
143  * @cb - callback function
144  *
145  * Return: QDF_STATUS_SUCCESS de-register success
146  */
147 static inline QDF_STATUS cdp_data_stall_cb_deregister(ol_txrx_soc_handle soc,
148 						      uint8_t pdev_id,
149 						      data_stall_detect_cb cb)
150 {
151 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
152 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
153 			"%s invalid instance", __func__);
154 		return QDF_STATUS_E_INVAL;
155 	}
156 
157 	if (soc->ops->misc_ops->txrx_data_stall_cb_deregister)
158 		return soc->ops->misc_ops->txrx_data_stall_cb_deregister(
159 							soc, pdev_id, cb);
160 	return QDF_STATUS_SUCCESS;
161 }
162 
163 /**
164  * cdp_post_data_stall_event() - post data stall event
165  * @soc: data path soc handle
166  * @indicator: Module triggering data stall
167  * @data_stall_type: data stall event type
168  * @pdev_id: pdev id
169  * @vdev_id_bitmap: vdev id bitmap
170  * @recovery_type: data stall recovery type
171  *
172  * Return: None
173  */
174 static inline void
175 cdp_post_data_stall_event(ol_txrx_soc_handle soc,
176 			  enum data_stall_log_event_indicator indicator,
177 			  enum data_stall_log_event_type data_stall_type,
178 			  uint32_t pdev_id, uint32_t vdev_id_bitmap,
179 			  enum data_stall_log_recovery_type recovery_type)
180 {
181 	if (!soc || !soc->ops) {
182 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
183 			"%s invalid instance", __func__);
184 		QDF_BUG(0);
185 		return;
186 	}
187 
188 	if (!soc->ops->misc_ops ||
189 	    !soc->ops->misc_ops->txrx_post_data_stall_event)
190 		return;
191 
192 	soc->ops->misc_ops->txrx_post_data_stall_event(
193 				soc, indicator, data_stall_type, pdev_id,
194 				vdev_id_bitmap, recovery_type);
195 }
196 
197 /**
198  * cdp_set_wmm_param() - set wmm parameter
199  * @soc: data path soc handle
200  * @pdev_id: id of data path pdev handle
201  * @wmm_param: wmm parameter
202  *
203  * Return: none
204  */
205 static inline void
206 cdp_set_wmm_param(ol_txrx_soc_handle soc, uint8_t pdev_id,
207 		  struct ol_tx_wmm_param_t wmm_param)
208 {
209 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
210 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
211 			"%s invalid instance", __func__);
212 		return;
213 	}
214 
215 	if (soc->ops->misc_ops->set_wmm_param)
216 		return soc->ops->misc_ops->set_wmm_param(soc, pdev_id,
217 							 wmm_param);
218 
219 	return;
220 }
221 
222 /**
223  * cdp_runtime_suspend() - suspend
224  * @soc: data path soc handle
225  * @pdev_id: id of data path pdev handle
226  *
227  * Return: QDF_STATUS_SUCCESS suspend success
228  */
229 static inline QDF_STATUS cdp_runtime_suspend(ol_txrx_soc_handle soc,
230 					     uint8_t pdev_id)
231 {
232 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
233 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
234 			"%s invalid instance", __func__);
235 		return QDF_STATUS_E_INVAL;
236 	}
237 
238 	if (soc->ops->misc_ops->runtime_suspend)
239 		return soc->ops->misc_ops->runtime_suspend(soc, pdev_id);
240 
241 	return QDF_STATUS_SUCCESS;
242 }
243 
244 /**
245  * cdp_runtime_resume() - resume
246  * @soc: data path soc handle
247  * @pdev_id: id of data path pdev handle
248  *
249  * Return: QDF_STATUS_SUCCESS suspend success
250  */
251 static inline QDF_STATUS cdp_runtime_resume(ol_txrx_soc_handle soc,
252 					    uint8_t pdev_id)
253 {
254 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
255 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
256 			"%s invalid instance", __func__);
257 		return QDF_STATUS_E_INVAL;
258 	}
259 
260 	if (soc->ops->misc_ops->runtime_resume)
261 		return soc->ops->misc_ops->runtime_resume(soc, pdev_id);
262 
263 	return QDF_STATUS_SUCCESS;
264 }
265 
266 /**
267  * cdp_hl_tdls_flag_reset() - tdls flag reset
268  * @soc: data path soc handle
269  * @vdev_id: id of vdev
270  * @flag: flag indicating to set/reset tdls
271  *
272  * Return: none
273  */
274 static inline void
275 cdp_hl_tdls_flag_reset(ol_txrx_soc_handle soc, uint8_t vdev_id, bool flag)
276 {
277 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
278 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
279 			"%s invalid instance", __func__);
280 		return;
281 	}
282 
283 	if (soc->ops->misc_ops->hl_tdls_flag_reset)
284 		return soc->ops->misc_ops->hl_tdls_flag_reset(soc, vdev_id,
285 							      flag);
286 
287 	return;
288 }
289 
290 /**
291  * cdp_get_opmode() - get vdev operation mode
292  * @soc: data path soc handle
293  * @vdev_id: id of vdev
294  *
295  * Return virtual device operational mode
296  *      op_mode_ap,
297  *      op_mode_ibss,
298  *      op_mode_sta,
299  *      op_mode_monitor,
300  *      op_mode_ocb,
301  *
302  * return interface id
303  *        0 unknown interface
304  */
305 static inline int
306 cdp_get_opmode(ol_txrx_soc_handle soc, uint8_t vdev_id)
307 {
308 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
309 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
310 			"%s invalid instance", __func__);
311 		return 0;
312 	}
313 
314 	if (soc->ops->misc_ops->get_opmode)
315 		return soc->ops->misc_ops->get_opmode(soc, vdev_id);
316 
317 	return 0;
318 }
319 
320 /**
321  * cdp_get_vdev_id() - get vdev id
322  * @soc - data path soc handle
323  * @vdev - virtual interface instance
324  *
325  * get virtual interface id
326  *
327  * return interface id
328  *        0 unknown interface
329  */
330 static inline uint16_t
331 cdp_get_vdev_id(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
332 {
333 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
334 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
335 			"%s invalid instance", __func__);
336 		return 0;
337 	}
338 
339 	if (soc->ops->misc_ops->get_vdev_id)
340 		return soc->ops->misc_ops->get_vdev_id(vdev);
341 	return 0;
342 }
343 
344 /**
345  * cdp_get_tx_ack_stats() - get tx ack count for vdev
346  * @soc - data path soc handle
347  * @vdev_id - vdev id
348  *
349  * return tx ack count
350  *          0 invalid count
351  */
352 static inline uint32_t
353 cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
354 {
355 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
356 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
357 			"%s invalid instance", __func__);
358 		return 0;
359 	}
360 
361 	if (soc->ops->misc_ops->get_tx_ack_stats)
362 		return soc->ops->misc_ops->get_tx_ack_stats(soc, vdev_id);
363 
364 	return 0;
365 }
366 
367 /**
368  * cdp_bad_peer_txctl_set_setting() - Set peer timer balance parameters
369  * @soc: data path soc handle
370  * @pdev_id: id of datapath pdev handle
371  * @enable: enable/disable peer balance state
372  * @period: balance timer period for peer
373  * @txq_limit: txp limit for peer
374  *
375  * Return: none
376  */
377 static inline void
378 cdp_bad_peer_txctl_set_setting(ol_txrx_soc_handle soc, uint8_t pdev_id,
379 			       int enable, int period, int txq_limit)
380 {
381 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
382 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
383 			"%s invalid instance", __func__);
384 		return;
385 	}
386 
387 	if (soc->ops->misc_ops->bad_peer_txctl_set_setting)
388 		return soc->ops->misc_ops->bad_peer_txctl_set_setting(
389 					soc, pdev_id, enable, period,
390 					txq_limit);
391 	return;
392 }
393 
394 /**
395  * cdp_bad_peer_txctl_update_threshold() - TBD
396  * @soc: data path soc handle
397  * @pdev_id: id of data path pdev handle
398  * @level: index of the threshold configuration
399  * @tput_thresh: peer balance throughput threshold
400  * @tx_limit: peer balance tx limit threshold
401  *
402  * TBD
403  *
404  * Return: none
405  */
406 static inline void
407 cdp_bad_peer_txctl_update_threshold(ol_txrx_soc_handle soc,
408 				    uint8_t pdev_id, int level,
409 				    int tput_thresh, int tx_limit)
410 {
411 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
412 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
413 			"%s invalid instance", __func__);
414 		return;
415 	}
416 
417 	if (soc->ops->misc_ops->bad_peer_txctl_update_threshold)
418 		return soc->ops->misc_ops->bad_peer_txctl_update_threshold(
419 			soc, pdev_id, level, tput_thresh, tx_limit);
420 	return;
421 }
422 
423 /**
424  * cdp_mark_first_wakeup_packet() - set flag to indicate that
425  *    fw is compatible for marking first packet after wow wakeup
426  * @soc: data path soc handle
427  * @pdev_id: id of data path pdev handle
428  * @value: 1 for enabled/ 0 for disabled
429  *
430  * Return: None
431  */
432 static inline void cdp_mark_first_wakeup_packet(ol_txrx_soc_handle soc,
433 						uint8_t pdev_id, uint8_t value)
434 {
435 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
436 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
437 			"%s invalid instance", __func__);
438 		return;
439 	}
440 
441 	if (soc->ops->misc_ops->mark_first_wakeup_packet)
442 		return soc->ops->misc_ops->mark_first_wakeup_packet(
443 							soc, pdev_id, value);
444 	return;
445 }
446 
447 
448 /**
449  * cds_update_mac_id() - update mac_id for vdev
450  * @psoc: data path soc handle
451  * @vdev_id: vdev id
452  * @mac_id: mac id
453  *
454  * Return: none
455  */
456 static inline void cdp_update_mac_id(void *psoc, uint8_t vdev_id,
457 				     uint8_t mac_id)
458 {
459 	ol_txrx_soc_handle soc = psoc;
460 
461 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
462 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
463 			"%s invalid instance", __func__);
464 		return;
465 	}
466 
467 	if (soc->ops->misc_ops->update_mac_id)
468 		return soc->ops->misc_ops->update_mac_id(soc, vdev_id, mac_id);
469 	return;
470 }
471 
472 /**
473  * cdp_flush_rx_frames() - flush cached rx frames
474  * @soc: data path soc handle
475  * @pdev_id: datapath pdev identifier
476  * @peer_mac: peer mac address
477  * @drop: set flag to drop frames
478  *
479  * Return: None
480  */
481 static inline void cdp_flush_rx_frames(ol_txrx_soc_handle soc, uint8_t pdev_id,
482 				       uint8_t *peer_mac, bool drop)
483 {
484 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
485 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
486 			"%s invalid instance", __func__);
487 		return;
488 	}
489 
490 	if (soc->ops->misc_ops->flush_rx_frames)
491 		return soc->ops->misc_ops->flush_rx_frames(soc, pdev_id,
492 							   peer_mac, drop);
493 	return;
494 }
495 
496 /*
497  * cdp_get_intra_bss_fwd_pkts_count() - to get the total tx and rx packets
498  *   that has been forwarded from txrx layer without going to upper layers.
499  * @soc: Datapath soc handle
500  * @vdev_id: vdev id
501  * @fwd_tx_packets: pointer to forwarded tx packets count parameter
502  * @fwd_rx_packets: pointer to forwarded rx packets count parameter
503  *
504  * Return: status -> A_OK - success, A_ERROR - failure
505  */
506 static inline A_STATUS cdp_get_intra_bss_fwd_pkts_count(
507 		ol_txrx_soc_handle soc, uint8_t vdev_id,
508 		uint64_t *fwd_tx_packets, uint64_t *fwd_rx_packets)
509 {
510 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
511 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
512 			"%s invalid instance", __func__);
513 		return 0;
514 	}
515 
516 	if (soc->ops->misc_ops->get_intra_bss_fwd_pkts_count)
517 		return soc->ops->misc_ops->get_intra_bss_fwd_pkts_count(
518 			soc, vdev_id, fwd_tx_packets, fwd_rx_packets);
519 
520 	return 0;
521 }
522 
523 /**
524  * cdp_pkt_log_init() - API to initialize packet log
525  * @soc: data path soc handle
526  * @pdev_id: id of data path pdev handle
527  * @scn: HIF context
528  *
529  * Return: void
530  */
531 static inline void cdp_pkt_log_init(ol_txrx_soc_handle soc,
532 				    uint8_t pdev_id, void *scn)
533 {
534 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
535 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
536 			"%s invalid instance", __func__);
537 		return;
538 	}
539 
540 	if (soc->ops->misc_ops->pkt_log_init)
541 		return soc->ops->misc_ops->pkt_log_init(soc, pdev_id, scn);
542 
543 	return;
544 }
545 
546 /**
547  * cdp_pkt_log_con_service() - API to connect packet log service
548  * @soc: data path soc handle
549  * @pdev_id: id of data path pdev handle
550  * @scn: HIF context
551  *
552  * Return: void
553  */
554 static inline void cdp_pkt_log_con_service(ol_txrx_soc_handle soc,
555 					   uint8_t pdev_id, void *scn)
556 {
557 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
558 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
559 			"%s invalid instance", __func__);
560 		return;
561 	}
562 
563 	if (soc->ops->misc_ops->pkt_log_con_service)
564 		return soc->ops->misc_ops->pkt_log_con_service(
565 						soc, pdev_id, scn);
566 
567 	return;
568 }
569 
570 /**
571  * cdp_get_num_rx_contexts() - API to get the number of RX contexts
572  * @soc: soc handle
573  *
574  * Return: number of RX contexts
575  */
576 static inline int cdp_get_num_rx_contexts(ol_txrx_soc_handle soc)
577 {
578 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
579 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
580 			  "%s invalid instance", __func__);
581 		return 0;
582 	}
583 
584 	if (soc->ops->misc_ops->get_num_rx_contexts)
585 		return soc->ops->misc_ops->get_num_rx_contexts(soc);
586 
587 	return 0;
588 }
589 
590 /**
591  * cdp_register_packetdump_cb() - API to register packetdump callback
592  *
593  * Register TX/RX callback for data packets, during connection. And per packet
594  * stats will be passed to user-space by @tx_cb/@rx_cb.
595  *
596  * @soc: soc handle
597  * @pdev_id: id of data path pdev handle
598  * @tx_cb: tx packet callback
599  * @rx_cb: rx packet callback
600  *
601  * Return: void
602  */
603 static inline void cdp_register_packetdump_cb(ol_txrx_soc_handle soc,
604 					      uint8_t pdev_id,
605 					      ol_txrx_pktdump_cb tx_cb,
606 					      ol_txrx_pktdump_cb rx_cb)
607 {
608 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
609 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
610 			  "%s invalid instance", __func__);
611 		return;
612 	}
613 
614 	if (soc->ops->misc_ops->register_pktdump_cb)
615 		return soc->ops->misc_ops->register_pktdump_cb(
616 						soc, pdev_id, tx_cb, rx_cb);
617 }
618 
619 /**
620  * cdp_deregister_packetdump_cb() - API to unregister packetdump callback
621  *
622  * Deregister callback for TX/RX data packets.
623  *
624  * @soc: soc handle
625  * @pdev_id: id of data path pdev handle
626  *
627  * Return: void
628  */
629 static inline void cdp_deregister_packetdump_cb(ol_txrx_soc_handle soc,
630 						uint8_t pdev_id)
631 {
632 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
633 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
634 			  "%s invalid instance", __func__);
635 		return;
636 	}
637 
638 	if (soc->ops->misc_ops->unregister_pktdump_cb)
639 		return soc->ops->misc_ops->unregister_pktdump_cb(soc, pdev_id);
640 }
641 
642 typedef void (*rx_mic_error_callback)(struct cdp_ctrl_objmgr_psoc *psoc,
643 				uint8_t pdev_id,
644 				struct cdp_rx_mic_err_info *info);
645 
646 /**
647  * cdp_register_rx_mic_error_ind_handler() - API to register mic error
648  *                                           indication handler
649  *
650  * @soc: soc handle
651  * @rx_mic_cb: rx mic error indication callback
652  *
653  * Return: void
654  */
655 static inline void
656 cdp_register_rx_mic_error_ind_handler(ol_txrx_soc_handle soc,
657 				      rx_mic_error_callback rx_mic_cb)
658 {
659 	if (!soc || !soc->ol_ops) {
660 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
661 			  "%s invalid instance", __func__);
662 		return;
663 	}
664 
665 	soc->ol_ops->rx_mic_error = rx_mic_cb;
666 }
667 
668 typedef void (*rx_refill_thread_sched_cb)(ol_txrx_soc_handle soc);
669 
670 /**
671  * cdp_register_rx_refill_thread_sched_handler() - API to register RX refill
672  *                                                 thread schedule handler
673  *
674  * @soc: soc handle
675  *
676  * Return: void
677  */
678 static inline void
679 cdp_register_rx_refill_thread_sched_handler(ol_txrx_soc_handle soc,
680 					    rx_refill_thread_sched_cb rx_sched_cb)
681 {
682 	if (!soc || !soc->ol_ops) {
683 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
684 			  "%s invalid instance", __func__);
685 		return;
686 	}
687 
688 	soc->ol_ops->dp_rx_sched_refill_thread = rx_sched_cb;
689 }
690 
691 /**
692  * cdp_pdev_reset_driver_del_ack() - reset driver TCP delayed ack flag
693  * @soc: data path soc handle
694  * @pdev_id: pdev id
695  *
696  * Return: none
697  */
698 static inline void cdp_pdev_reset_driver_del_ack(void *psoc,
699 						 uint8_t pdev_id)
700 {
701 	ol_txrx_soc_handle soc = psoc;
702 
703 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
704 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
705 			  "%s invalid instance", __func__);
706 		return;
707 	}
708 
709 	if (soc->ops->misc_ops->pdev_reset_driver_del_ack)
710 		return soc->ops->misc_ops->pdev_reset_driver_del_ack(soc,
711 								     pdev_id);
712 }
713 
714 /*
715  * cdp_vdev_set_driver_del_ack_enable() - set driver delayed ack enabled flag
716  * @soc: data path soc handle
717  * @vdev_id: vdev id
718  * @rx_packets: number of rx packets
719  * @time_in_ms: time in ms
720  * @high_th: high threshold
721  * @low_th: low threshold
722  *
723  * Return: none
724  */
725 static inline void cdp_vdev_set_driver_del_ack_enable(ol_txrx_soc_handle soc,
726 						      uint8_t vdev_id,
727 						      unsigned long rx_packets,
728 						      uint32_t time_in_ms,
729 						      uint32_t high_th,
730 						      uint32_t low_th)
731 {
732 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
733 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
734 			  "%s invalid instance", __func__);
735 		return;
736 	}
737 
738 	if (soc->ops->misc_ops->vdev_set_driver_del_ack_enable)
739 		return soc->ops->misc_ops->vdev_set_driver_del_ack_enable(
740 			soc, vdev_id, rx_packets, time_in_ms, high_th, low_th);
741 }
742 
743 static inline void cdp_vdev_set_bundle_require_flag(ol_txrx_soc_handle soc,
744 						    uint8_t vdev_id,
745 						    unsigned long tx_bytes,
746 						    uint32_t time_in_ms,
747 						    uint32_t high_th,
748 						    uint32_t low_th)
749 {
750 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
751 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
752 			  "%s invalid instance", __func__);
753 		return;
754 	}
755 
756 	if (soc->ops->misc_ops->vdev_set_bundle_require_flag)
757 		return soc->ops->misc_ops->vdev_set_bundle_require_flag(
758 			vdev_id, tx_bytes, time_in_ms, high_th, low_th);
759 }
760 
761 static inline void cdp_pdev_reset_bundle_require_flag(ol_txrx_soc_handle soc,
762 						      uint8_t pdev_id)
763 {
764 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
765 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
766 			  "%s invalid instance", __func__);
767 		return;
768 	}
769 
770 	if (soc->ops->misc_ops->pdev_reset_bundle_require_flag)
771 		return soc->ops->misc_ops->pdev_reset_bundle_require_flag(
772 								soc, pdev_id);
773 }
774 
775 /**
776  * cdp_txrx_ext_stats_request(): request dp tx and rx extended stats
777  * @soc: soc handle
778  * @pdev_id: pdev id
779  * @req: stats request structure to fill
780  *
781  * return: status
782  */
783 static inline QDF_STATUS
784 cdp_txrx_ext_stats_request(ol_txrx_soc_handle soc, uint8_t pdev_id,
785 			   struct cdp_txrx_ext_stats *req)
786 {
787 	if (!soc || !soc->ops || !soc->ops->misc_ops || !req) {
788 		dp_cdp_debug("Invalid Instance:");
789 		return QDF_STATUS_E_INVAL;
790 	}
791 
792 	if (soc->ops->misc_ops->txrx_ext_stats_request)
793 		return soc->ops->misc_ops->txrx_ext_stats_request(soc, pdev_id,
794 								  req);
795 
796 	return QDF_STATUS_SUCCESS;
797 }
798 
799 /**
800  * cdp_request_rx_hw_stats(): request rx hw stats
801  * @soc: soc handle
802  * @vdev_id: vdev id
803  *
804  * return: none
805  */
806 static inline QDF_STATUS
807 cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
808 {
809 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
810 		dp_cdp_debug("Invalid Instance:");
811 		return QDF_STATUS_E_INVAL;
812 	}
813 
814 	if (soc->ops->misc_ops->request_rx_hw_stats)
815 		return soc->ops->misc_ops->request_rx_hw_stats(soc, vdev_id);
816 
817 	return QDF_STATUS_SUCCESS;
818 }
819 
820 /**
821  * cdp_vdev_inform_ll_conn() - Inform DP about the low latency connection
822  * @soc: soc handle
823  * @vdev_id: vdev id
824  * @action: Action to be performed (Add/Delete)
825  *
826  * Returns: QDF_STATUS
827  */
828 static inline QDF_STATUS
829 cdp_vdev_inform_ll_conn(ol_txrx_soc_handle soc, uint8_t vdev_id,
830 			enum vdev_ll_conn_actions action)
831 {
832 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
833 		dp_cdp_debug("Invalid Instance:");
834 		return QDF_STATUS_E_INVAL;
835 	}
836 
837 	if (soc->ops->misc_ops->vdev_inform_ll_conn)
838 		return soc->ops->misc_ops->vdev_inform_ll_conn(soc, vdev_id,
839 							       action);
840 
841 	return QDF_STATUS_SUCCESS;
842 }
843 
844 /**
845  * cdp_soc_set_swlm_enable() - Enable or disable software latency manager
846  * @soc: soc handle
847  * @value: value (enable/disable)
848  *
849  * Returns: QDF_STATUS
850  */
851 static inline QDF_STATUS
852 cdp_soc_set_swlm_enable(ol_txrx_soc_handle soc, uint8_t value)
853 {
854 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
855 		dp_cdp_debug("Invalid Instance:");
856 		return QDF_STATUS_E_INVAL;
857 	}
858 
859 	if (soc->ops->misc_ops->set_swlm_enable)
860 		return soc->ops->misc_ops->set_swlm_enable(soc, value);
861 
862 	return QDF_STATUS_SUCCESS;
863 }
864 
865 /**
866  * cdp_soc_is_swlm_enabled() - Check if the software latency manager is
867  *			       enabled or not
868  * @soc: soc handle
869  *
870  * Returns: 1 if enabled, 0 if disabled
871  */
872 static inline uint8_t
873 cdp_soc_is_swlm_enabled(ol_txrx_soc_handle soc)
874 {
875 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
876 		dp_cdp_debug("Invalid Instance:");
877 		return 0;
878 	}
879 
880 	if (soc->ops->misc_ops->is_swlm_enabled)
881 		return soc->ops->misc_ops->is_swlm_enabled(soc);
882 
883 	return 0;
884 }
885 
886 /**
887  * cdp_display_txrx_hw_info() - Dump the DP rings info
888  * @soc: soc handle
889  *
890  * Return: none
891  */
892 static inline void
893 cdp_display_txrx_hw_info(ol_txrx_soc_handle soc)
894 {
895 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
896 		dp_cdp_debug("Invalid Instance:");
897 		return;
898 	}
899 
900 	if (soc->ops->misc_ops->display_txrx_hw_info)
901 		return soc->ops->misc_ops->display_txrx_hw_info(soc);
902 }
903 #endif /* _CDP_TXRX_MISC_H_ */
904