1  /*
2   * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
3   *
4   * Permission to use, copy, modify, and/or distribute this software for any
5   * purpose with or without fee is hereby granted, provided that the above
6   * copyright notice and this permission notice appear in all copies.
7   *
8   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15   */
16  
17  /**
18   * DOC: This file contains various object manager related wrappers and helpers
19   */
20  
21  #ifndef __WLAN_DP_OBJMGR_H
22  #define __WLAN_DP_OBJMGR_H
23  
24  #include "wlan_cmn.h"
25  #include "wlan_objmgr_cmn.h"
26  #include "wlan_objmgr_peer_obj.h"
27  #include "wlan_objmgr_vdev_obj.h"
28  #include "wlan_objmgr_pdev_obj.h"
29  #include "wlan_objmgr_psoc_obj.h"
30  #include "wlan_utility.h"
31  
32  struct wlan_dp_intf;
33  struct wlan_dp_link;
34  
35  /* Get/Put Ref */
36  
37  #define dp_comp_peer_get_ref(peer) wlan_objmgr_peer_try_get_ref(peer, WLAN_DP_ID)
38  #define dp_comp_peer_put_ref(peer) wlan_objmgr_peer_release_ref(peer, WLAN_DP_ID)
39  
40  #define dp_comp_vdev_get_ref(vdev) wlan_objmgr_vdev_try_get_ref(vdev, WLAN_DP_ID)
41  #define dp_comp_vdev_put_ref(vdev) wlan_objmgr_vdev_release_ref(vdev, WLAN_DP_ID)
42  
43  #define dp_comp_pdev_get_ref(pdev) wlan_objmgr_pdev_try_get_ref(pdev, WLAN_DP_ID)
44  #define dp_comp_pdev_put_ref(pdev) wlan_objmgr_pdev_release_ref(pdev, WLAN_DP_ID)
45  
46  #define dp_comp_psoc_get_ref(psoc) wlan_objmgr_psoc_try_get_ref(psoc, WLAN_DP_ID)
47  #define dp_comp_psoc_put_ref(psoc) wlan_objmgr_psoc_release_ref(psoc, WLAN_DP_ID)
48  
49  /**
50   * dp_get_peer_priv_obj: get DP priv object from peer object
51   * @peer: pointer to peer object
52   *
53   * Return: pointer to DP peer private object
54   */
55  static inline struct wlan_dp_sta_info *
dp_get_peer_priv_obj(struct wlan_objmgr_peer * peer)56  dp_get_peer_priv_obj(struct wlan_objmgr_peer *peer)
57  {
58  	struct wlan_dp_sta_info *peer_info;
59  
60  	peer_info = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_COMP_DP);
61  	if (!peer_info) {
62  		dp_err("peer is null");
63  		return NULL;
64  	}
65  
66  	return peer_info;
67  }
68  
69  /**
70   * dp_get_vdev_priv_obj() - Wrapper to retrieve vdev priv obj
71   * @vdev: vdev pointer
72   *
73   * Return: DP vdev private object
74   */
75  static inline struct wlan_dp_link *
dp_get_vdev_priv_obj(struct wlan_objmgr_vdev * vdev)76  dp_get_vdev_priv_obj(struct wlan_objmgr_vdev *vdev)
77  {
78  	struct wlan_dp_link *obj;
79  
80  	if (!vdev) {
81  		dp_err("vdev is null");
82  		return NULL;
83  	}
84  
85  	obj = wlan_objmgr_vdev_get_comp_private_obj(vdev, WLAN_COMP_DP);
86  
87  	return obj;
88  }
89  
90  /**
91   * dp_psoc_get_priv() - Wrapper to retrieve psoc priv obj
92   * @psoc: psoc pointer
93   *
94   * Return: DP psoc private object
95   */
96  static inline struct wlan_dp_psoc_context *
dp_psoc_get_priv(struct wlan_objmgr_psoc * psoc)97  dp_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
98  {
99  	struct wlan_dp_psoc_context *dp_ctx;
100  
101  	dp_ctx = wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_COMP_DP);
102  	QDF_BUG(dp_ctx);
103  
104  	return dp_ctx;
105  }
106  
107  /**
108   * dp_objmgr_get_vdev_by_user() - Get reference of vdev from dp_link
109   *  with user id
110   * @dp_link: DP link handle
111   * @dbgid: reference count dbg id
112   *
113   * Return: pointer to vdev object for success, NULL for failure
114   */
115  #ifdef WLAN_OBJMGR_REF_ID_TRACE
116  #define dp_objmgr_get_vdev_by_user(dp_link, dbgid) \
117  	__dp_objmgr_get_vdev_by_user(dp_link, dbgid, __func__, __LINE__)
118  struct wlan_objmgr_vdev *
119  __dp_objmgr_get_vdev_by_user(struct wlan_dp_link *dp_link,
120  			     wlan_objmgr_ref_dbgid id,
121  			     const char *func,
122  			     int line);
123  #else
124  #define dp_objmgr_get_vdev_by_user(dp_link, dbgid) \
125  	__dp_objmgr_get_vdev_by_user(dp_link, dbgid, __func__)
126  struct wlan_objmgr_vdev *
127  __dp_objmgr_get_vdev_by_user(struct wlan_dp_link *dp_link,
128  			     wlan_objmgr_ref_dbgid id,
129  			     const char *func);
130  #endif
131  
132  /**
133   * dp_objmgr_put_vdev_by_user() - Release reference of vdev object with
134   *  user id
135   * @vdev: pointer to vdev object
136   * @dbgid: reference count dbg id
137   *
138   * This API releases vdev object reference which was acquired using
139   * dp_objmgr_get_vdev_by_user().
140   *
141   * Return: void
142   */
143  #ifdef WLAN_OBJMGR_REF_ID_TRACE
144  #define dp_objmgr_put_vdev_by_user(vdev, dbgid) \
145  	__dp_objmgr_put_vdev_by_user(vdev, dbgid, __func__, __LINE__)
146  void
147  __dp_objmgr_put_vdev_by_user(struct wlan_objmgr_vdev *vdev,
148  			     wlan_objmgr_ref_dbgid id, const char *func,
149  			     int line);
150  #else
151  #define dp_objmgr_put_vdev_by_user(vdev, dbgid) \
152  	__dp_objmgr_put_vdev_by_user(vdev, dbgid, __func__)
153  void
154  __dp_objmgr_put_vdev_by_user(struct wlan_objmgr_vdev *vdev,
155  			     wlan_objmgr_ref_dbgid id, const char *func);
156  #endif
157  
158  #endif /* __WLAN_DP_OBJMGR_H */
159