xref: /wlan-dirver/qca-wifi-host-cmn/umac/twt/dispatcher/src/wlan_twt_api.c (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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  * DOC: wlan_twt_api.c
20  * This file defines the APIs of TWT component.
21  */
22 #include <wlan_twt_api.h>
23 #include "twt/core/src/wlan_twt_objmgr_handler.h"
24 #include "twt/core/src/wlan_twt_common.h"
25 
26 struct wlan_lmac_if_twt_tx_ops *
27 wlan_twt_get_tx_ops(struct wlan_objmgr_psoc *psoc)
28 {
29 	struct wlan_lmac_if_tx_ops *tx_ops;
30 
31 	if (!psoc) {
32 		twt_err("psoc is null");
33 		return NULL;
34 	}
35 
36 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
37 	if (!tx_ops) {
38 		twt_err("tx_ops is NULL");
39 		return NULL;
40 	}
41 
42 	return &tx_ops->twt_tx_ops;
43 }
44 
45 struct wlan_lmac_if_twt_rx_ops *
46 wlan_twt_get_rx_ops(struct wlan_objmgr_psoc *psoc)
47 {
48 	struct wlan_lmac_if_rx_ops *rx_ops;
49 
50 	if (!psoc) {
51 		twt_err("psoc is null");
52 		return NULL;
53 	}
54 
55 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
56 	if (!rx_ops) {
57 		twt_err("rx_ops is NULL");
58 		return NULL;
59 	}
60 
61 	return &rx_ops->twt_rx_ops;
62 }
63 
64 struct twt_psoc_priv_obj*
65 wlan_twt_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc)
66 {
67 	struct twt_psoc_priv_obj *twt_psoc;
68 
69 	twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
70 							WLAN_UMAC_COMP_TWT);
71 	if (!twt_psoc) {
72 		twt_err("TWT PSOC component object is NULL");
73 		return NULL;
74 	}
75 
76 	return twt_psoc;
77 }
78 
79 QDF_STATUS wlan_twt_init(void)
80 {
81 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
82 
83 	status = wlan_objmgr_register_psoc_create_handler
84 				(WLAN_UMAC_COMP_TWT,
85 				 wlan_twt_psoc_obj_create_handler,
86 				 NULL);
87 	if (QDF_IS_STATUS_ERROR(status)) {
88 		twt_err("Failed to register psoc create handler");
89 		goto wlan_twt_psoc_init_fail1;
90 	}
91 
92 	status = wlan_objmgr_register_psoc_destroy_handler
93 				(WLAN_UMAC_COMP_TWT,
94 				 wlan_twt_psoc_obj_destroy_handler,
95 				 NULL);
96 	if (QDF_IS_STATUS_ERROR(status)) {
97 		twt_err("Failed to register psoc destroy handler");
98 		goto wlan_twt_psoc_init_fail2;
99 	}
100 
101 	status = wlan_objmgr_register_vdev_create_handler
102 				(WLAN_UMAC_COMP_TWT,
103 				 wlan_twt_vdev_obj_create_handler,
104 				 NULL);
105 	if (QDF_IS_STATUS_ERROR(status)) {
106 		twt_err("Failed to register vdev create handler");
107 		goto wlan_twt_vdev_init_fail1;
108 	}
109 
110 	status = wlan_objmgr_register_vdev_destroy_handler
111 				(WLAN_UMAC_COMP_TWT,
112 				 wlan_twt_vdev_obj_destroy_handler,
113 				 NULL);
114 	if (QDF_IS_STATUS_ERROR(status)) {
115 		twt_err("Failed to register vdev destroy handler");
116 		goto wlan_twt_vdev_init_fail2;
117 	}
118 
119 	status = wlan_objmgr_register_peer_create_handler
120 				(WLAN_UMAC_COMP_TWT,
121 				 wlan_twt_peer_obj_create_handler,
122 				 NULL);
123 	if (QDF_IS_STATUS_ERROR(status)) {
124 		twt_err("Failed to register peer create handler");
125 		goto wlan_twt_peer_init_fail1;
126 	}
127 
128 	status = wlan_objmgr_register_peer_destroy_handler
129 				(WLAN_UMAC_COMP_TWT,
130 				 wlan_twt_peer_obj_destroy_handler,
131 				 NULL);
132 	if (QDF_IS_STATUS_ERROR(status)) {
133 		twt_err("Failed to register peer destroy handler");
134 		goto wlan_twt_peer_init_fail2;
135 	}
136 
137 	return QDF_STATUS_SUCCESS;
138 
139 wlan_twt_peer_init_fail2:
140 	wlan_objmgr_unregister_peer_create_handler
141 		(WLAN_UMAC_COMP_TWT,
142 		 wlan_twt_peer_obj_create_handler,
143 		 NULL);
144 wlan_twt_peer_init_fail1:
145 	wlan_objmgr_unregister_vdev_destroy_handler
146 		(WLAN_UMAC_COMP_TWT,
147 		wlan_twt_vdev_obj_destroy_handler,
148 		NULL);
149 wlan_twt_vdev_init_fail2:
150 	wlan_objmgr_unregister_vdev_create_handler
151 		(WLAN_UMAC_COMP_TWT,
152 		wlan_twt_vdev_obj_create_handler,
153 		NULL);
154 wlan_twt_vdev_init_fail1:
155 	wlan_objmgr_unregister_psoc_destroy_handler
156 		(WLAN_UMAC_COMP_TWT,
157 		 wlan_twt_psoc_obj_destroy_handler,
158 		 NULL);
159 wlan_twt_psoc_init_fail2:
160 	wlan_objmgr_unregister_psoc_create_handler
161 		(WLAN_UMAC_COMP_TWT,
162 		 wlan_twt_psoc_obj_create_handler,
163 		 NULL);
164 wlan_twt_psoc_init_fail1:
165 	return status;
166 }
167 
168 QDF_STATUS wlan_twt_deinit(void)
169 {
170 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
171 
172 	status = wlan_objmgr_unregister_psoc_create_handler
173 				(WLAN_UMAC_COMP_TWT,
174 				 wlan_twt_psoc_obj_create_handler,
175 				 NULL);
176 	if (QDF_IS_STATUS_ERROR(status))
177 		twt_err("Failed to unregister psoc create handler");
178 
179 	status = wlan_objmgr_unregister_psoc_destroy_handler
180 				(WLAN_UMAC_COMP_TWT,
181 				 wlan_twt_psoc_obj_destroy_handler,
182 				 NULL);
183 	if (QDF_IS_STATUS_ERROR(status))
184 		twt_err("Failed to unregister psoc destroy handler");
185 
186 	status = wlan_objmgr_unregister_vdev_create_handler
187 				(WLAN_UMAC_COMP_TWT,
188 				 wlan_twt_vdev_obj_create_handler,
189 				 NULL);
190 	if (QDF_IS_STATUS_ERROR(status))
191 		twt_err("Failed to unregister vdev create handler");
192 
193 	status = wlan_objmgr_unregister_vdev_destroy_handler
194 				(WLAN_UMAC_COMP_TWT,
195 				 wlan_twt_vdev_obj_destroy_handler,
196 				 NULL);
197 	if (QDF_IS_STATUS_ERROR(status))
198 		twt_err("Failed to unregister vdev destroy handler");
199 
200 	status = wlan_objmgr_unregister_peer_create_handler
201 				(WLAN_UMAC_COMP_TWT,
202 				 wlan_twt_peer_obj_create_handler,
203 				 NULL);
204 	if (QDF_IS_STATUS_ERROR(status))
205 		twt_err("Failed to unregister peer create handler");
206 
207 	status = wlan_objmgr_unregister_peer_destroy_handler
208 				(WLAN_UMAC_COMP_TWT,
209 				 wlan_twt_peer_obj_destroy_handler,
210 				 NULL);
211 	if (QDF_IS_STATUS_ERROR(status))
212 		twt_err("Failed to unregister peer destroy handler");
213 
214 	return status;
215 }
216 
217 QDF_STATUS twt_psoc_enable(struct wlan_objmgr_psoc *psoc)
218 {
219 	QDF_STATUS status = QDF_STATUS_E_NULL_VALUE;
220 	struct wlan_lmac_if_twt_tx_ops *tx_ops;
221 
222 	tx_ops = wlan_twt_get_tx_ops(psoc);
223 	if (!tx_ops) {
224 		twt_err("tx_ops is null");
225 		return QDF_STATUS_E_NULL_VALUE;
226 	}
227 
228 	if (tx_ops->register_events) {
229 		status = tx_ops->register_events(psoc);
230 
231 		if (QDF_IS_STATUS_ERROR(status))
232 			twt_err("twt_register_events failed (status=%d)",
233 				status);
234 	}
235 
236 	return status;
237 }
238 
239 QDF_STATUS twt_psoc_disable(struct wlan_objmgr_psoc *psoc)
240 {
241 	QDF_STATUS status = QDF_STATUS_E_NULL_VALUE;
242 	struct wlan_lmac_if_twt_tx_ops *tx_ops;
243 
244 	tx_ops = wlan_twt_get_tx_ops(psoc);
245 	if (!tx_ops) {
246 		twt_err("tx_ops is null");
247 		return QDF_STATUS_E_NULL_VALUE;
248 	}
249 
250 	if (tx_ops->deregister_events) {
251 		status = tx_ops->deregister_events(psoc);
252 
253 		if (QDF_IS_STATUS_ERROR(status))
254 			twt_err("twt_deregister_events failed (status=%d)",
255 				status);
256 	}
257 	return status;
258 }
259 
260 QDF_STATUS
261 wlan_set_peer_twt_capabilities(struct wlan_objmgr_psoc *psoc,
262 			       struct qdf_mac_addr *peer_mac,
263 			       uint8_t peer_cap)
264 {
265 	return wlan_twt_set_peer_capabilities(psoc, peer_mac, peer_cap);
266 }
267