1 /*
2  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022 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: wlan_interop_issues_ap_api.h
22  *
23  * This header file provide API declarations required for interop issues
24  * ap global context specific to offload
25  */
26 
27 #ifndef __WLAN_INTEROP_ISSUES_AP_API_H__
28 #define __WLAN_INTEROP_ISSUES_AP_API_H__
29 
30 #ifdef WLAN_FEATURE_INTEROP_ISSUES_AP
31 #include <qdf_types.h>
32 #include <wlan_objmgr_cmn.h>
33 #include <wlan_objmgr_global_obj.h>
34 #include <wlan_objmgr_psoc_obj.h>
35 #include <wlan_interop_issues_ap_public_structs.h>
36 
37 #define interop_issues_ap_debug(args ...) \
38 	QDF_TRACE_DEBUG(QDF_MODULE_ID_INTEROP_ISSUES_AP, ## args)
39 #define interop_issues_ap_err(args ...) \
40 	QDF_TRACE_ERROR(QDF_MODULE_ID_INTEROP_ISSUES_AP, ## args)
41 
42 /**
43  * struct interop_issues_ap_psoc_priv_obj - psoc private object
44  * @lock: qdf spin lock
45  * @soc: pointer to psoc object
46  * @cbs: interop issues ap ps event callbacks
47  * @tx_ops: interop issues ap ps tx ops
48  */
49 struct interop_issues_ap_psoc_priv_obj {
50 	qdf_spinlock_t lock;
51 	struct wlan_objmgr_psoc *soc;
52 	struct wlan_interop_issues_ap_callbacks cbs;
53 	struct wlan_interop_issues_ap_tx_ops tx_ops;
54 };
55 
56 /**
57  * wlan_interop_issues_ap_psoc_enable() - interop issues ap psoc enable
58  * @psoc: the pointer to psoc object
59  *
60  * Return: QDF_STATUS
61  */
62 QDF_STATUS wlan_interop_issues_ap_psoc_enable(struct wlan_objmgr_psoc *psoc);
63 
64 /**
65  * wlan_interop_issues_ap_psoc_disable() - interop issues ap psoc disable
66  * @psoc: the pointer to psoc object
67  *
68  * Return: QDF_STATUS
69  */
70 QDF_STATUS wlan_interop_issues_ap_psoc_disable(struct wlan_objmgr_psoc *psoc);
71 
72 /**
73  * wlan_interop_issues_ap_init() - API to init component
74  *
75  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
76  */
77 QDF_STATUS wlan_interop_issues_ap_init(void);
78 
79 /**
80  * wlan_interop_issues_ap_deinit() - API to deinit component
81  *
82  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
83  */
84 QDF_STATUS wlan_interop_issues_ap_deinit(void);
85 
86 /**
87  * interop_issues_ap_get_psoc_priv_obj() - get priv object from psoc object
88  * @psoc: pointer to psoc object
89  *
90  * Return: pointer to interop issues ap psoc private object
91  */
92 static inline
interop_issues_ap_get_psoc_priv_obj(struct wlan_objmgr_psoc * psoc)93 struct interop_issues_ap_psoc_priv_obj *interop_issues_ap_get_psoc_priv_obj(
94 						struct wlan_objmgr_psoc *psoc)
95 {
96 	struct interop_issues_ap_psoc_priv_obj *obj;
97 
98 	if (!psoc)
99 		return NULL;
100 
101 	obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
102 					WLAN_UMAC_COMP_INTEROP_ISSUES_AP);
103 
104 	return obj;
105 }
106 
107 /**
108  * interop_issues_ap_psoc_get_tx_ops() - get TX ops from the private object
109  * @psoc: pointer to psoc object
110  *
111  * Return: pointer to TX op callback
112  */
113 static inline
interop_issues_ap_psoc_get_tx_ops(struct wlan_objmgr_psoc * psoc)114 struct wlan_interop_issues_ap_tx_ops *interop_issues_ap_psoc_get_tx_ops(
115 						struct wlan_objmgr_psoc *psoc)
116 {
117 	struct interop_issues_ap_psoc_priv_obj *interop_issues_ap_priv;
118 
119 	if (!psoc)
120 		return NULL;
121 
122 	interop_issues_ap_priv = interop_issues_ap_get_psoc_priv_obj(psoc);
123 	if (!interop_issues_ap_priv) {
124 		interop_issues_ap_err("psoc private object is null");
125 		return NULL;
126 	}
127 
128 	return &interop_issues_ap_priv->tx_ops;
129 }
130 
131 /**
132  * interop_issues_ap_psoc_get_cbs() - get RX ops from private object
133  * @psoc: pointer to psoc object
134  *
135  * Return: pointer to RX op callback
136  */
137 static inline
interop_issues_ap_psoc_get_cbs(struct wlan_objmgr_psoc * psoc)138 struct wlan_interop_issues_ap_callbacks *interop_issues_ap_psoc_get_cbs(
139 						struct wlan_objmgr_psoc *psoc)
140 {
141 	struct interop_issues_ap_psoc_priv_obj *interop_issues_ap_priv;
142 
143 	if (!psoc)
144 		return NULL;
145 
146 	interop_issues_ap_priv = interop_issues_ap_get_psoc_priv_obj(psoc);
147 	if (!interop_issues_ap_priv) {
148 		interop_issues_ap_err("psoc private object is null");
149 		return NULL;
150 	}
151 
152 	return &interop_issues_ap_priv->cbs;
153 }
154 #endif
155 #endif
156