xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c (revision bea437e2293c3d4fb1b5704fcf633aedac996962)
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 <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 #ifdef FEATURE_VDEV_RSP_WAKELOCK
203 static struct psoc_mlme_wakelock *
204 tgt_psoc_get_wakelock_info(struct wlan_objmgr_psoc *psoc)
205 {
206 	struct psoc_mlme_obj *psoc_mlme;
207 
208 	psoc_mlme = mlme_psoc_get_priv(psoc);
209 	if (!psoc_mlme) {
210 		mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(psoc));
211 		return NULL;
212 	}
213 
214 	return &psoc_mlme->psoc_wakelock;
215 }
216 
217 static inline void
218 tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops
219 				     *mlme_rx_ops)
220 {
221 	mlme_rx_ops->psoc_get_wakelock_info =
222 		tgt_psoc_get_wakelock_info;
223 }
224 #else
225 static inline void
226 tgt_psoc_reg_wakelock_info_rx_op(struct wlan_lmac_if_mlme_rx_ops
227 				     *mlme_rx_ops)
228 {
229 }
230 #endif
231 
232 void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
233 {
234 	struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops;
235 
236 	mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle =
237 		tgt_vdev_mgr_offload_bcn_tx_status_event_handler;
238 	mlme_rx_ops->vdev_mgr_tbttoffset_update_handle =
239 		tgt_vdev_mgr_tbttoffset_update_handler;
240 	mlme_rx_ops->vdev_mgr_start_response =
241 		tgt_vdev_mgr_start_response_handler;
242 	mlme_rx_ops->vdev_mgr_stop_response =
243 		tgt_vdev_mgr_stop_response_handler;
244 	mlme_rx_ops->vdev_mgr_delete_response =
245 		tgt_vdev_mgr_delete_response_handler;
246 	mlme_rx_ops->vdev_mgr_peer_delete_all_response =
247 		tgt_vdev_mgr_peer_delete_all_response_handler;
248 	mlme_rx_ops->psoc_get_vdev_response_timer_info =
249 		tgt_vdev_mgr_get_response_timer_info;
250 	tgt_psoc_reg_wakelock_info_rx_op(&rx_ops->mops);
251 }
252