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