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