xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c (revision 11f5a63a6cbdda84849a730de22f0a71e635d58c)
1 /*
2  * Copyright (c) 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  * DOC: wlan_vdev_mgr_tgt_if_rx_api.c
21  *
22  * This file provide definition for APIs registered for LMAC MLME Rx Ops
23  */
24 #include <qdf_types.h>
25 #include <wlan_vdev_mgr_tgt_if_rx_defs.h>
26 #include <wlan_vdev_mgr_tgt_if_rx_api.h>
27 #include <include/wlan_vdev_mlme.h>
28 #include <wlan_mlme_dbg.h>
29 #include <wlan_vdev_mlme_api.h>
30 #include <target_if_vdev_mgr_tx_ops.h>
31 
32 static struct vdev_response_timer *
33 tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_vdev *vdev)
34 {
35 	struct vdev_mlme_obj *vdev_mlme;
36 
37 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
38 	if (!vdev_mlme) {
39 		mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev));
40 		return NULL;
41 	}
42 
43 	return &vdev_mlme->vdev_rt;
44 }
45 
46 static QDF_STATUS tgt_vdev_mgr_start_response_handler(
47 					struct wlan_objmgr_psoc *psoc,
48 					struct vdev_start_response *rsp)
49 {
50 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
51 	struct vdev_mlme_obj *vdev_mlme;
52 	struct wlan_objmgr_vdev *vdev;
53 
54 	if (!rsp || !psoc) {
55 		mlme_err("Invalid input");
56 		return QDF_STATUS_E_INVAL;
57 	}
58 
59 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id,
60 						    WLAN_VDEV_TARGET_IF_ID);
61 	if (!vdev) {
62 		mlme_err("VDEV is NULL");
63 		return QDF_STATUS_E_FAILURE;
64 	}
65 
66 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
67 	if (!vdev_mlme) {
68 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
69 		goto tgt_vdev_mgr_start_response_handler_end;
70 	}
71 
72 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_start_rsp)
73 		status = vdev_mlme->ops->mlme_vdev_ext_start_rsp(
74 								vdev_mlme,
75 								rsp);
76 
77 tgt_vdev_mgr_start_response_handler_end:
78 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
79 	return status;
80 }
81 
82 static QDF_STATUS tgt_vdev_mgr_stop_response_handler(
83 					struct wlan_objmgr_psoc *psoc,
84 					struct vdev_stop_response *rsp)
85 {
86 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
87 	struct vdev_mlme_obj *vdev_mlme;
88 	struct wlan_objmgr_vdev *vdev;
89 
90 	if (!rsp || !psoc) {
91 		mlme_err("Invalid input");
92 		return QDF_STATUS_E_INVAL;
93 	}
94 
95 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id,
96 						    WLAN_VDEV_TARGET_IF_ID);
97 	if (!vdev) {
98 		mlme_err("VDEV is NULL");
99 		return QDF_STATUS_E_FAILURE;
100 	}
101 
102 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
103 	if (!vdev_mlme) {
104 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
105 		goto tgt_vdev_mgr_stop_response_handler_end;
106 	}
107 
108 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_stop_rsp)
109 		status = vdev_mlme->ops->mlme_vdev_ext_stop_rsp(
110 								vdev_mlme,
111 								rsp);
112 
113 tgt_vdev_mgr_stop_response_handler_end:
114 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
115 	return status;
116 }
117 
118 static QDF_STATUS tgt_vdev_mgr_delete_response_handler(
119 					struct wlan_objmgr_psoc *psoc,
120 					struct vdev_delete_response *rsp)
121 {
122 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
123 	struct vdev_mlme_obj *vdev_mlme;
124 	struct wlan_objmgr_vdev *vdev;
125 
126 	if (!rsp || !psoc) {
127 		mlme_err("Invalid input");
128 		return QDF_STATUS_E_INVAL;
129 	}
130 
131 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
132 						    rsp->vdev_id,
133 						    WLAN_VDEV_TARGET_IF_ID);
134 	if (!vdev) {
135 		mlme_err("VDEV is NULL");
136 		return QDF_STATUS_E_FAILURE;
137 	}
138 
139 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
140 	if (!vdev_mlme) {
141 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
142 		goto tgt_vdev_mgr_delete_response_handler_end;
143 	}
144 
145 	if ((vdev_mlme->ops) &&
146 	    vdev_mlme->ops->mlme_vdev_ext_delete_rsp)
147 		status = vdev_mlme->ops->mlme_vdev_ext_delete_rsp(
148 								vdev_mlme,
149 								rsp);
150 
151 tgt_vdev_mgr_delete_response_handler_end:
152 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
153 	return status;
154 }
155 
156 static QDF_STATUS tgt_vdev_mgr_peer_delete_all_response_handler(
157 					struct wlan_objmgr_psoc *psoc,
158 					struct peer_delete_all_response *rsp)
159 {
160 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
161 	struct vdev_mlme_obj *vdev_mlme;
162 	struct wlan_objmgr_vdev *vdev;
163 
164 	if (!rsp || !psoc) {
165 		mlme_err("Invalid input");
166 		return QDF_STATUS_E_INVAL;
167 	}
168 
169 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
170 						    rsp->vdev_id,
171 						    WLAN_VDEV_TARGET_IF_ID);
172 	if (!vdev) {
173 		mlme_err("VDEV is NULL");
174 		return QDF_STATUS_E_FAILURE;
175 	}
176 
177 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
178 	if (!vdev_mlme) {
179 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
180 		goto tgt_vdev_mgr_peer_delete_all_response_handler_end;
181 	}
182 
183 	if ((vdev_mlme->ops) &&
184 	    vdev_mlme->ops->mlme_vdev_ext_peer_delete_all_rsp)
185 		status = vdev_mlme->ops->mlme_vdev_ext_peer_delete_all_rsp(
186 								vdev_mlme,
187 								rsp);
188 
189 tgt_vdev_mgr_peer_delete_all_response_handler_end:
190 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
191 	return status;
192 }
193 
194 static QDF_STATUS
195 tgt_vdev_mgr_offload_bcn_tx_status_event_handler(uint32_t vdev_id,
196 						 uint32_t tx_status)
197 {
198 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
199 
200 	return status;
201 }
202 
203 static QDF_STATUS
204 tgt_vdev_mgr_tbttoffset_update_handler(uint32_t num_vdevs, bool is_ext)
205 {
206 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
207 
208 	return status;
209 }
210 
211 QDF_STATUS
212 tgt_vdev_mgr_ext_tbttoffset_update_handle(uint32_t num_vdevs, bool is_ext)
213 {
214 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
215 
216 	return status;
217 }
218 
219 #ifdef FEATURE_VDEV_RSP_WAKELOCK
220 static struct vdev_mlme_wakelock *
221 tgt_vdev_mgr_get_wakelock_info(struct wlan_objmgr_vdev *vdev)
222 {
223 	struct vdev_mlme_obj *vdev_mlme;
224 
225 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
226 	if (!vdev_mlme) {
227 		mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev));
228 		return NULL;
229 	}
230 
231 	return &vdev_mlme->vdev_wakelock;
232 }
233 
234 static inline void
235 tgt_vdev_mgr_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops
236 				     *mlme_rx_ops)
237 {
238 	mlme_rx_ops->vdev_mgr_get_wakelock_info =
239 		tgt_vdev_mgr_get_wakelock_info;
240 }
241 #else
242 static inline void
243 tgt_vdev_mgr_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops
244 				     *mlme_rx_ops)
245 {
246 }
247 #endif
248 
249 void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
250 {
251 	struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops;
252 
253 	mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle =
254 		tgt_vdev_mgr_offload_bcn_tx_status_event_handler;
255 	mlme_rx_ops->vdev_mgr_tbttoffset_update_handle =
256 		tgt_vdev_mgr_tbttoffset_update_handler;
257 	mlme_rx_ops->vdev_mgr_start_response =
258 		tgt_vdev_mgr_start_response_handler;
259 	mlme_rx_ops->vdev_mgr_stop_response =
260 		tgt_vdev_mgr_stop_response_handler;
261 	mlme_rx_ops->vdev_mgr_delete_response =
262 		tgt_vdev_mgr_delete_response_handler;
263 	mlme_rx_ops->vdev_mgr_peer_delete_all_response =
264 		tgt_vdev_mgr_peer_delete_all_response_handler;
265 	mlme_rx_ops->vdev_mgr_get_response_timer_info =
266 		tgt_vdev_mgr_get_response_timer_info;
267 
268 	tgt_vdev_mgr_reg_wakelock_info_rx_op(&rx_ops->mops);
269 }
270