xref: /wlan-dirver/qca-wifi-host-cmn/dp/inc/cdp_txrx_peer_ops.h (revision 11f5a63a6cbdda84849a730de22f0a71e635d58c)
1 /*
2  * Copyright (c) 2016-2019 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_peer.h
21  * @brief Define the host data path peer API functions
22  * called by the host control SW and the OS interface module
23  */
24 #ifndef _CDP_TXRX_PEER_H_
25 #define _CDP_TXRX_PEER_H_
26 #include <cdp_txrx_ops.h>
27 #include "cdp_txrx_handle.h"
28 
29 /**
30  * cdp_peer_register() - Register peer into physical device
31  * @soc - data path soc handle
32  * @pdev - data path device instance
33  * @sta_desc - peer description
34  *
35  * Register peer into physical device
36  *
37  * Return: QDF_STATUS_SUCCESS registration success
38  *         QDF_STATUS_E_NOSUPPORT not support this feature
39  */
40 static inline QDF_STATUS
41 cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
42 		struct ol_txrx_desc_type *sta_desc)
43 {
44 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
45 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
46 			"%s invalid instance", __func__);
47 		return QDF_STATUS_E_INVAL;
48 	}
49 
50 	if (soc->ops->peer_ops->register_peer)
51 		return soc->ops->peer_ops->register_peer(pdev, sta_desc);
52 
53 	return QDF_STATUS_E_NOSUPPORT;
54 }
55 
56 /**
57  * cdp_clear_peer() - remove peer from physical device
58  * @soc - data path soc handle
59  * @pdev - data path device instance
60  * @peer_addr - peer mac address
61  *
62  * remove peer from physical device
63  *
64  * Return: QDF_STATUS_SUCCESS registration success
65  *         QDF_STATUS_E_NOSUPPORT not support this feature
66  */
67 static inline QDF_STATUS
68 cdp_clear_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
69 	       struct qdf_mac_addr peer_addr)
70 {
71 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
72 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
73 			"%s invalid instance", __func__);
74 		return QDF_STATUS_E_INVAL;
75 	}
76 
77 	if (soc->ops->peer_ops->clear_peer)
78 		return soc->ops->peer_ops->clear_peer(pdev, peer_addr);
79 
80 	return QDF_STATUS_E_NOSUPPORT;
81 }
82 
83 /**
84  * cdp_peer_register_ocb_peer() - register ocb peer from physical device
85  * @soc - data path soc handle
86  * @cds_ctx - cds void context
87  * @mac_addr - mac address for ocb self peer
88  * @peer_id - local peer id
89  *
90  * register ocb peer from physical device
91  *
92  * Return: QDF_STATUS_SUCCESS registration success
93  *         QDF_STATUS_E_NOSUPPORT not support this feature
94  */
95 static inline QDF_STATUS
96 cdp_peer_register_ocb_peer(ol_txrx_soc_handle soc,
97 		uint8_t *mac_addr, uint8_t *peer_id)
98 {
99 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
100 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
101 			"%s invalid instance", __func__);
102 		return QDF_STATUS_E_INVAL;
103 	}
104 
105 	if (soc->ops->peer_ops->register_ocb_peer)
106 		return soc->ops->peer_ops->register_ocb_peer(mac_addr, peer_id);
107 
108 	return QDF_STATUS_E_NOSUPPORT;
109 }
110 
111 /**
112  * cdp_peer_remove_for_vdev() - remove peer instance from virtual interface
113  * @soc - data path soc handle
114  * @vdev - virtual interface instance
115  * @callback - remove done notification callback function pointer
116  * @callback_context - callback caller context
117  * @remove_last_peer - removed peer is last peer or not
118  *
119  * remove peer instance from virtual interface
120  *
121  * Return: NONE
122  */
123 static inline void
124 cdp_peer_remove_for_vdev(ol_txrx_soc_handle soc,
125 		struct cdp_vdev *vdev, ol_txrx_vdev_peer_remove_cb callback,
126 		void *callback_context, bool remove_last_peer)
127 {
128 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
129 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
130 			"%s invalid instance", __func__);
131 		return;
132 	}
133 
134 	if (soc->ops->peer_ops->remove_peers_for_vdev)
135 		return soc->ops->peer_ops->remove_peers_for_vdev(
136 			vdev, callback, callback_context, remove_last_peer);
137 
138 	return;
139 }
140 
141 /**
142  * cdp_peer_remove_for_vdev_no_lock() - remove peer instance from vdev
143  * @soc - data path soc handle
144  * @vdev - virtual interface instance
145  * @callback - remove done notification callback function pointer
146  * @callback_context - callback caller context
147  *
148  * remove peer instance from virtual interface without lock
149  *
150  * Return: NONE
151  */
152 static inline void
153 cdp_peer_remove_for_vdev_no_lock(ol_txrx_soc_handle soc,
154 				 struct cdp_vdev *vdev,
155 				 ol_txrx_vdev_peer_remove_cb callback,
156 				 void *callback_context)
157 {
158 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
159 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
160 			  "%s invalid instance", __func__);
161 		return;
162 	}
163 
164 	if (soc->ops->peer_ops->remove_peers_for_vdev_no_lock)
165 		return soc->ops->peer_ops->remove_peers_for_vdev_no_lock(
166 			vdev, callback, callback_context);
167 }
168 
169 /**
170  * cdp_peer_get_ref_by_addr() - Find peer by peer mac address and inc peer ref
171  * @soc - data path soc handle
172  * @pdev - data path device instance
173  * @peer_addr - peer mac address
174  * @peer_id - local peer id with target mac address
175  * @debug_id - debug_id to track caller
176  *
177  * To release the peer ref, cdp_peer_release_ref needs to be called.
178  *
179  * Return: peer instance void pointer
180  *         NULL cannot find target peer
181  */
182 static inline void
183 *cdp_peer_get_ref_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
184 			  uint8_t *peer_addr, uint8_t *peer_id,
185 			  enum peer_debug_id_type debug_id)
186 {
187 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
188 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
189 			  "%s invalid instance", __func__);
190 		return NULL;
191 	}
192 
193 	if (soc->ops->peer_ops->peer_get_ref_by_addr)
194 		return soc->ops->peer_ops->peer_get_ref_by_addr(
195 			pdev, peer_addr, peer_id, debug_id);
196 
197 	return NULL;
198 }
199 
200 /**
201  * cdp_peer_release_ref() - Release peer reference
202  * @soc - data path soc handle
203  * @peer - peer pointer
204  * @debug_id - debug_id to track caller
205  *
206  * Return:void
207  */
208 static inline void
209 cdp_peer_release_ref(ol_txrx_soc_handle soc, void *peer,
210 		     enum peer_debug_id_type debug_id)
211 {
212 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
213 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
214 			  "%s invalid instance", __func__);
215 		return;
216 	}
217 
218 	if (soc->ops->peer_ops->peer_release_ref)
219 		soc->ops->peer_ops->peer_release_ref(peer, debug_id);
220 }
221 
222 /**
223  * cdp_peer_find_by_addr() - Find peer by peer mac address
224  * @soc - data path soc handle
225  * @pdev - data path device instance
226  * @peer_addr - peer mac address
227  * @peer_id - local peer id with target mac address
228  *
229  * Find peer and local peer id by peer mac address
230  *
231  * Return: peer instance void pointer
232  *         NULL cannot find target peer
233  */
234 static inline void
235 *cdp_peer_find_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
236 		uint8_t *peer_addr, uint8_t *peer_id)
237 {
238 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
239 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
240 			"%s invalid instance", __func__);
241 		return NULL;
242 	}
243 
244 	if (soc->ops->peer_ops->find_peer_by_addr)
245 		return soc->ops->peer_ops->find_peer_by_addr(
246 			pdev, peer_addr, peer_id);
247 
248 	return NULL;
249 }
250 
251 /**
252  * cdp_peer_find_by_addr_and_vdev() - Find peer by peer mac address within vdev
253  * @soc - data path soc handle
254  * @pdev - data path device instance
255  * @vdev - virtual interface instance
256  * @peer_addr - peer mac address
257  * @peer_id - local peer id with target mac address
258  *
259  * Find peer by peer mac address within vdev
260  *
261  * Return: peer instance void pointer
262  *         NULL cannot find target peer
263  */
264 static inline void
265 *cdp_peer_find_by_addr_and_vdev(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
266 		struct cdp_vdev *vdev, uint8_t *peer_addr, uint8_t *peer_id)
267 {
268 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
269 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
270 			"%s invalid instance", __func__);
271 		return NULL;
272 	}
273 
274 	if (soc->ops->peer_ops->find_peer_by_addr_and_vdev)
275 		return soc->ops->peer_ops->find_peer_by_addr_and_vdev(
276 			pdev, vdev, peer_addr, peer_id);
277 
278 	return NULL;
279 }
280 
281 /**
282  * cdp_peer_find_by_local_id() - Find peer by local peer id
283  * @soc - data path soc handle
284  * @pdev - data path device instance
285  * @local_peer_id - local peer id want to find
286  *
287  * Find peer by local peer id within physical device
288  *
289  * Return: peer instance void pointer
290  *         NULL cannot find target peer
291  */
292 static inline void
293 *cdp_peer_find_by_local_id(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
294 		uint8_t local_peer_id)
295 {
296 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
297 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
298 			"%s invalid instance", __func__);
299 		return NULL;
300 	}
301 
302 	if (soc->ops->peer_ops->peer_find_by_local_id)
303 		return soc->ops->peer_ops->peer_find_by_local_id(
304 			pdev, local_peer_id);
305 
306 	return NULL;
307 }
308 
309 /**
310  * cdp_peer_state_update() - update peer local state
311  * @soc - data path soc handle
312  * @pdev - data path device instance
313  * @peer_addr - peer mac address
314  * @state - new peer local state
315  *
316  * update peer local state
317  *
318  * Return: QDF_STATUS_SUCCESS registration success
319  *         QDF_STATUS_E_NOSUPPORT not support this feature
320  */
321 static inline QDF_STATUS
322 cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
323 		uint8_t *peer_addr, enum ol_txrx_peer_state state)
324 {
325 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
326 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
327 			"%s invalid instance", __func__);
328 		return QDF_STATUS_E_INVAL;
329 	}
330 
331 	if (soc->ops->peer_ops->peer_state_update)
332 		return soc->ops->peer_ops->peer_state_update(
333 			pdev, peer_addr, state);
334 
335 	return QDF_STATUS_E_NOSUPPORT;
336 }
337 
338 /**
339  * cdp_peer_state_get() - Get local peer state
340  * @soc - data path soc handle
341  * @peer - peer instance
342  *
343  * Get local peer state
344  *
345  * Return: peer status
346  */
347 static inline int
348 cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer)
349 {
350 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
351 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
352 			"%s invalid instance", __func__);
353 		return 0;
354 	}
355 
356 	if (soc->ops->peer_ops->get_peer_state)
357 		return soc->ops->peer_ops->get_peer_state(peer);
358 
359 	return 0;
360 }
361 
362 /**
363  * cdp_peer_get_local_peer_id() - Find local peer id within peer instance
364  * @soc - data path soc handle
365  * @peer - peer instance
366  *
367  * Find local peer id within peer instance
368  *
369  * Return: local peer id
370  *         HTT_INVALID_PEER Invalid peer
371  */
372 static inline uint16_t
373 cdp_peer_get_local_peer_id(ol_txrx_soc_handle soc, void *peer)
374 {
375 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
376 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
377 			"%s invalid instance", __func__);
378 		return HTT_INVALID_PEER;
379 	}
380 
381 	if (soc->ops->peer_ops->local_peer_id)
382 		return soc->ops->peer_ops->local_peer_id(peer);
383 
384 	return HTT_INVALID_PEER;
385 }
386 
387 /**
388  * cdp_peer_get_vdevid() - Get virtual interface id which peer registered
389  * @soc - data path soc handle
390  * @peer - peer instance
391  * @vdev_id - virtual interface id which peer registered
392  *
393  * Get virtual interface id which peer registered
394  *
395  * Return: QDF_STATUS_SUCCESS registration success
396  *         QDF_STATUS_E_NOSUPPORT not support this feature
397  */
398 static inline QDF_STATUS
399 cdp_peer_get_vdevid(ol_txrx_soc_handle soc, void *peer, uint8_t *vdev_id)
400 {
401 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
402 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
403 			"%s invalid instance", __func__);
404 		return QDF_STATUS_E_INVAL;
405 	}
406 
407 	if (soc->ops->peer_ops->get_vdevid)
408 		return soc->ops->peer_ops->get_vdevid(peer, vdev_id);
409 
410 	return QDF_STATUS_E_NOSUPPORT;
411 }
412 
413 /**
414  * cdp_peer_get_vdev_by_sta_id() - Get vdev instance by local peer id
415  * @soc - data path soc handle
416  * @pdev - data path device instance
417  * @peer_addr - peer mac address
418  *
419  * Get virtual interface id by local peer id
420  *
421  * Return: Virtual interface instance
422  *         NULL in case cannot find
423  */
424 static inline struct cdp_vdev
425 *cdp_peer_get_vdev_by_peer_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
426 				struct qdf_mac_addr peer_addr)
427 {
428 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
429 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
430 			"%s invalid instance", __func__);
431 		return NULL;
432 	}
433 
434 	if (soc->ops->peer_ops->get_vdev_by_peer_addr)
435 		return soc->ops->peer_ops->get_vdev_by_peer_addr(pdev,
436 								 peer_addr);
437 
438 	return NULL;
439 }
440 
441 /**
442  * cdp_peer_get_peer_mac_addr() - Get peer mac address
443  * @soc - data path soc handle
444  * @peer - peer instance
445  *
446  * Get peer mac address
447  *
448  * Return: peer mac address pointer
449  *         NULL in case cannot find
450  */
451 static inline uint8_t
452 *cdp_peer_get_peer_mac_addr(ol_txrx_soc_handle soc, void *peer)
453 {
454 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
455 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
456 			"%s invalid instance", __func__);
457 		return NULL;
458 	}
459 
460 	if (soc->ops->peer_ops->peer_get_peer_mac_addr)
461 		return soc->ops->peer_ops->peer_get_peer_mac_addr(peer);
462 
463 	return NULL;
464 }
465 
466 /**
467  * cdp_peer_get_vdev() - Get virtual interface instance which peer belongs
468  * @soc - data path soc handle
469  * @peer - peer instance
470  *
471  * Get virtual interface instance which peer belongs
472  *
473  * Return: virtual interface instance pointer
474  *         NULL in case cannot find
475  */
476 static inline struct cdp_vdev
477 *cdp_peer_get_vdev(ol_txrx_soc_handle soc, void *peer)
478 {
479 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
480 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
481 			"%s invalid instance", __func__);
482 		return NULL;
483 	}
484 
485 	if (soc->ops->peer_ops->get_vdev_for_peer)
486 		return soc->ops->peer_ops->get_vdev_for_peer(peer);
487 
488 	return NULL;
489 }
490 
491 /**
492  * cdp_peer_update_ibss_add_peer_num_of_vdev() - update number of peer
493  * @soc - data path soc handle
494  * @vdev - virtual interface instance
495  * @peer_num_delta - number of peer should be updated
496  *
497  * update number of peer
498  *
499  * Return: updated number of peer
500  *         0 fail
501  */
502 static inline int16_t
503 cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc,
504 		struct cdp_vdev *vdev, int16_t peer_num_delta)
505 {
506 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
507 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
508 			"%s invalid instance", __func__);
509 		return 0;
510 	}
511 
512 	if (soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev)
513 		return soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev(
514 			vdev, peer_num_delta);
515 
516 	return 0;
517 }
518 
519 /**
520  * cdp_peer_copy_mac_addr_raw() - copy peer mac address
521  * @soc - data path soc handle
522  * @vdev - virtual interface instance
523  * @bss_addr - mac address should be copied
524  *
525  * copy peer mac address
526  *
527  * Return: none
528  */
529 static inline void
530 cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc,
531 		struct cdp_vdev *vdev, uint8_t *bss_addr)
532 {
533 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
534 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
535 			"%s invalid instance", __func__);
536 		return;
537 	}
538 
539 	if (soc->ops->peer_ops->copy_mac_addr_raw)
540 		return soc->ops->peer_ops->copy_mac_addr_raw(vdev, bss_addr);
541 
542 	return;
543 }
544 
545 /**
546  * cdp_peer_add_last_real_peer() - Add peer with last peer marking
547  * @soc - data path soc handle
548  * @pdev - data path device instance
549  * @vdev - virtual interface instance
550  * @peer_id - local peer id
551  *
552  * copy peer mac address
553  *
554  * Return: none
555  */
556 static inline void
557 cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc,
558 		struct cdp_pdev *pdev, struct cdp_vdev *vdev, uint8_t *peer_id)
559 {
560 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
561 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
562 			"%s invalid instance", __func__);
563 		return;
564 	}
565 
566 	if (soc->ops->peer_ops->add_last_real_peer)
567 		return soc->ops->peer_ops->add_last_real_peer(
568 			pdev, vdev, peer_id);
569 	return;
570 }
571 
572 /**
573  * cdp_peer_is_vdev_restore_last_peer() - restore last peer
574  * @soc - data path soc handle
575  * @peer - peer instance pointer
576  *
577  * restore last peer
578  *
579  * Return: true, restore success
580  *         fasle, restore fail
581  */
582 static inline bool
583 cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer)
584 {
585 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
586 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
587 			"%s invalid instance", __func__);
588 		return false;
589 	}
590 
591 	if (soc->ops->peer_ops->is_vdev_restore_last_peer)
592 		return soc->ops->peer_ops->is_vdev_restore_last_peer(peer);
593 
594 	return false;
595 }
596 
597 /**
598  * cdp_peer_update_last_real_peer() - update last real peer
599  * @soc - data path soc handle
600  * @pdev - data path device instance
601  * @peer - peer instance pointer
602  * @peer_id - local peer id
603  * @restore_last_peer - restore last peer or not
604  *
605  * update last real peer
606  *
607  * Return: none
608  */
609 static inline void
610 cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
611 		void *vdev, uint8_t *peer_id, bool restore_last_peer)
612 {
613 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
614 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
615 			"%s invalid instance", __func__);
616 		return;
617 	}
618 
619 	if (soc->ops->peer_ops->update_last_real_peer)
620 		return soc->ops->peer_ops->update_last_real_peer(pdev, vdev,
621 			peer_id, restore_last_peer);
622 
623 	return;
624 }
625 
626 /**
627  * ol_txrx_peer_detach_force_delete() - Detach and delete a peer's data object
628  * @peer - the object to detach
629  *
630  * Detach a peer and force the peer object to be removed. It is called during
631  * roaming scenario when the firmware has already deleted a peer.
632  * Peer object is freed immediately to avoid duplicate peers during roam sync
633  * indication processing.
634  *
635  * Return: None
636  */
637 static inline void cdp_peer_detach_force_delete(ol_txrx_soc_handle soc,
638 		void *peer)
639 {
640 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
641 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
642 			"%s invalid instance", __func__);
643 		return;
644 	}
645 
646 	if (soc->ops->peer_ops->peer_detach_force_delete)
647 		return soc->ops->peer_ops->peer_detach_force_delete(peer);
648 
649 	return;
650 }
651 
652 /**
653  * is_cdp_peer_detach_force_delete_supported() - To check if force delete
654  *						 operation is supported
655  * @soc: pointer to SOC handle
656  *
657  * Some of the platforms support force delete operation and some of them
658  * don't. This API returns true if API which handles force delete operation
659  * is registered and false otherwise.
660  *
661  * Return: true if API which handles force delete operation is registered
662  *	   false in all other cases
663  */
664 static inline bool
665 is_cdp_peer_detach_force_delete_supported(ol_txrx_soc_handle soc)
666 {
667 	if (!soc || !soc->ops || !soc->ops->peer_ops) {
668 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
669 			  "%s invalid instance", __func__);
670 		return false;
671 	}
672 
673 	if (soc->ops->peer_ops->peer_detach_force_delete)
674 		return true;
675 
676 	return false;
677 }
678 #endif /* _CDP_TXRX_PEER_H_ */
679