xref: /wlan-dirver/qca-wifi-host-cmn/umac/twt/core/src/wlan_twt_objmgr.c (revision d0c05845839e5f2ba5a8dcebe0cd3e4cd4e8dfcf)
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_objmgr.c
20  * This file defines the APIs of TWT component.
21  */
22 #include "wlan_twt_common.h"
23 #include "wlan_twt_priv.h"
24 #include "wlan_twt_objmgr_handler.h"
25 #include "wlan_objmgr_peer_obj.h"
26 #include "include/wlan_mlme_cmn.h"
27 
28 QDF_STATUS
29 wlan_twt_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, void *arg)
30 {
31 	QDF_STATUS status;
32 	struct twt_psoc_priv_obj *twt_psoc_obj;
33 
34 	twt_psoc_obj = qdf_mem_malloc(sizeof(*twt_psoc_obj));
35 	if (!twt_psoc_obj)
36 		return QDF_STATUS_E_NOMEM;
37 
38 	twt_psoc_obj->enable_context.context = NULL;
39 	twt_psoc_obj->disable_context.context = NULL;
40 
41 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
42 						       WLAN_UMAC_COMP_TWT,
43 						       (void *)twt_psoc_obj,
44 						       QDF_STATUS_SUCCESS);
45 
46 	if (QDF_IS_STATUS_ERROR(status)) {
47 		qdf_mem_free(twt_psoc_obj);
48 		twt_err("Failed to attach twt psoc priv object");
49 		return status;
50 	}
51 
52 	twt_debug("twt psoc priv obj attach successful");
53 	return status;
54 }
55 
56 QDF_STATUS
57 wlan_twt_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc, void *arg)
58 {
59 	QDF_STATUS status;
60 	struct twt_psoc_priv_obj *twt_psoc_obj;
61 
62 	twt_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
63 						WLAN_UMAC_COMP_TWT);
64 	if (!twt_psoc_obj) {
65 		twt_err("Failed to get twt obj in psoc");
66 		return QDF_STATUS_E_FAILURE;
67 	}
68 
69 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
70 						       WLAN_UMAC_COMP_TWT,
71 						       twt_psoc_obj);
72 
73 	if (QDF_IS_STATUS_ERROR(status))
74 		twt_err("Failed to detach twt psoc priv object");
75 
76 	qdf_mem_free(twt_psoc_obj);
77 
78 	return status;
79 }
80 
81 QDF_STATUS
82 wlan_twt_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, void *arg)
83 {
84 	QDF_STATUS status;
85 	struct twt_vdev_priv_obj *twt_vdev_obj;
86 
87 	twt_vdev_obj = qdf_mem_malloc(sizeof(*twt_vdev_obj));
88 	if (!twt_vdev_obj)
89 		return QDF_STATUS_E_NOMEM;
90 
91 	twt_vdev_obj->twt_wait_for_notify = false;
92 
93 	status = wlan_objmgr_vdev_component_obj_attach(vdev,
94 						       WLAN_UMAC_COMP_TWT,
95 						       twt_vdev_obj,
96 						       QDF_STATUS_SUCCESS);
97 
98 	if (QDF_IS_STATUS_ERROR(status)) {
99 		qdf_mem_free(twt_vdev_obj);
100 		twt_err("Failed to attach twt vdev priv object");
101 		return status;
102 	}
103 
104 	twt_debug("twt vdev priv obj attach successful");
105 
106 	status = mlme_twt_vdev_create_notification(vdev);
107 
108 	if (QDF_IS_STATUS_ERROR(status)) {
109 		twt_err("vdev create notification failed");
110 		return status;
111 	}
112 
113 	return status;
114 }
115 
116 QDF_STATUS
117 wlan_twt_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, void *arg)
118 {
119 	QDF_STATUS status;
120 	struct twt_vdev_priv_obj *twt_vdev_obj;
121 
122 	status = mlme_twt_vdev_destroy_notification(vdev);
123 	if (QDF_IS_STATUS_ERROR(status)) {
124 		twt_err("vdev destroy notification failed");
125 		return status;
126 	}
127 
128 	twt_vdev_obj = wlan_objmgr_vdev_get_comp_private_obj(vdev,
129 							    WLAN_UMAC_COMP_TWT);
130 	if (!twt_vdev_obj) {
131 		twt_err("Failed to get twt obj in vdev");
132 		return QDF_STATUS_E_FAILURE;
133 	}
134 
135 	status = wlan_objmgr_vdev_component_obj_detach(vdev,
136 						       WLAN_UMAC_COMP_TWT,
137 						       twt_vdev_obj);
138 
139 	if (QDF_IS_STATUS_ERROR(status))
140 		twt_err("Failed to detach twt vdev priv object");
141 
142 	qdf_mem_free(twt_vdev_obj);
143 
144 	return status;
145 }
146 
147 QDF_STATUS
148 wlan_twt_peer_obj_create_handler(struct wlan_objmgr_peer *peer, void *arg)
149 {
150 	struct twt_peer_priv_obj *twt_peer_obj = NULL;
151 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
152 
153 	if (!peer) {
154 		twt_err("peer is NULL");
155 		return QDF_STATUS_E_FAILURE;
156 	}
157 
158 	twt_peer_obj = qdf_mem_malloc(sizeof(*twt_peer_obj));
159 	if (!twt_peer_obj)
160 		return QDF_STATUS_E_NOMEM;
161 
162 	twt_lock_create(&twt_peer_obj->twt_peer_lock);
163 
164 	status = wlan_objmgr_peer_component_obj_attach(peer,
165 						       WLAN_UMAC_COMP_TWT,
166 						       twt_peer_obj,
167 						       QDF_STATUS_SUCCESS);
168 
169 	if (QDF_IS_STATUS_ERROR(status)) {
170 		twt_lock_destroy(&twt_peer_obj->twt_peer_lock);
171 		qdf_mem_free(twt_peer_obj);
172 		twt_err("peer twt object attach failed");
173 		return QDF_STATUS_E_FAILURE;
174 	}
175 
176 	twt_debug("twt peer priv obj attach successful");
177 	return status;
178 }
179 
180 QDF_STATUS
181 wlan_twt_peer_obj_destroy_handler(struct wlan_objmgr_peer *peer, void *arg)
182 {
183 	struct twt_peer_priv_obj *twt_peer_obj;
184 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
185 
186 	if (!peer) {
187 		twt_err("peer is NULL");
188 		return QDF_STATUS_E_INVAL;
189 	}
190 
191 	twt_peer_obj = wlan_objmgr_peer_get_comp_private_obj(peer,
192 						WLAN_UMAC_COMP_TWT);
193 	if (!twt_peer_obj) {
194 		twt_err("twt_peer_obj is NULL");
195 		return QDF_STATUS_E_INVAL;
196 	}
197 
198 	twt_lock_destroy(&twt_peer_obj->twt_peer_lock);
199 
200 	status = wlan_objmgr_peer_component_obj_detach(peer, WLAN_UMAC_COMP_TWT,
201 						       twt_peer_obj);
202 	if (QDF_IS_STATUS_ERROR(status))
203 		twt_warn("Failed to detach twt peer priv object");
204 
205 	qdf_mem_free(twt_peer_obj);
206 	twt_debug("peer twt object detached");
207 	return QDF_STATUS_SUCCESS;
208 }
209 
210