xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
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 	struct vdev_response_timer *vdev_rsp;
54 	struct wlan_lmac_if_mlme_tx_ops *tx_ops;
55 
56 	if (!rsp || !psoc) {
57 		mlme_err("Invalid input");
58 		return QDF_STATUS_E_INVAL;
59 	}
60 
61 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id,
62 						    WLAN_VDEV_TARGET_IF_ID);
63 	if (!vdev) {
64 		mlme_err("VDEV is NULL");
65 		return QDF_STATUS_E_FAILURE;
66 	}
67 
68 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
69 	if (!vdev_mlme) {
70 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
71 		goto tgt_vdev_mgr_start_response_handler_end;
72 	}
73 
74 	vdev_rsp = &vdev_mlme->vdev_rt;
75 	if (!vdev_rsp) {
76 		mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
77 		goto tgt_vdev_mgr_start_response_handler_end;
78 	}
79 
80 	tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
81 	if (rsp->resp_type == RESTART_RESPONSE)
82 		status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
83 							 RESTART_RESPONSE_BIT);
84 	else
85 		status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
86 							 START_RESPONSE_BIT);
87 	if (QDF_IS_STATUS_ERROR(status)) {
88 		mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
89 		goto tgt_vdev_mgr_start_response_handler_end;
90 	}
91 
92 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_start_rsp)
93 		status = vdev_mlme->ops->mlme_vdev_ext_start_rsp(
94 								vdev_mlme,
95 								rsp);
96 tgt_vdev_mgr_start_response_handler_end:
97 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
98 	return status;
99 }
100 
101 static QDF_STATUS tgt_vdev_mgr_stop_response_handler(
102 					struct wlan_objmgr_psoc *psoc,
103 					struct vdev_stop_response *rsp)
104 {
105 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
106 	struct vdev_mlme_obj *vdev_mlme;
107 	struct wlan_objmgr_vdev *vdev;
108 	struct vdev_response_timer *vdev_rsp;
109 	struct wlan_lmac_if_mlme_tx_ops *tx_ops;
110 
111 	if (!rsp || !psoc) {
112 		mlme_err("Invalid input");
113 		return QDF_STATUS_E_INVAL;
114 	}
115 
116 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp->vdev_id,
117 						    WLAN_VDEV_TARGET_IF_ID);
118 	if (!vdev) {
119 		mlme_err("VDEV is NULL");
120 		return QDF_STATUS_E_FAILURE;
121 	}
122 
123 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
124 	if (!vdev_mlme) {
125 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
126 		goto tgt_vdev_mgr_stop_response_handler_end;
127 	}
128 
129 	vdev_rsp = &vdev_mlme->vdev_rt;
130 	if (!vdev_rsp) {
131 		mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
132 		goto tgt_vdev_mgr_stop_response_handler_end;
133 	}
134 
135 	tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
136 	status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
137 						 STOP_RESPONSE_BIT);
138 	if (QDF_IS_STATUS_ERROR(status)) {
139 		mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
140 		goto tgt_vdev_mgr_stop_response_handler_end;
141 	}
142 
143 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_ext_stop_rsp)
144 		status = vdev_mlme->ops->mlme_vdev_ext_stop_rsp(
145 								vdev_mlme,
146 								rsp);
147 tgt_vdev_mgr_stop_response_handler_end:
148 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
149 	return status;
150 }
151 
152 QDF_STATUS tgt_vdev_mgr_delete_response_handler(
153 					struct wlan_objmgr_psoc *psoc,
154 					struct vdev_delete_response *rsp)
155 {
156 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
157 	struct vdev_mlme_obj *vdev_mlme;
158 	struct wlan_objmgr_vdev *vdev;
159 	struct vdev_response_timer *vdev_rsp;
160 	struct wlan_lmac_if_mlme_tx_ops *tx_ops;
161 
162 	if (!rsp || !psoc) {
163 		mlme_err("Invalid input");
164 		return QDF_STATUS_E_INVAL;
165 	}
166 
167 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
168 						    rsp->vdev_id,
169 						    WLAN_VDEV_TARGET_IF_ID);
170 	if (!vdev) {
171 		mlme_err("VDEV is NULL");
172 		return QDF_STATUS_E_FAILURE;
173 	}
174 
175 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
176 	if (!vdev_mlme) {
177 		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
178 		goto tgt_vdev_mgr_delete_response_handler_end;
179 	}
180 
181 	vdev_rsp = &vdev_mlme->vdev_rt;
182 	if (!vdev_rsp) {
183 		mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
184 		goto tgt_vdev_mgr_delete_response_handler_end;
185 	}
186 
187 	tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
188 	status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
189 						 DELETE_RESPONSE_BIT);
190 	if (QDF_IS_STATUS_ERROR(status)) {
191 		mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
192 		goto tgt_vdev_mgr_delete_response_handler_end;
193 	}
194 
195 	if ((vdev_mlme->ops) &&
196 	    vdev_mlme->ops->mlme_vdev_ext_delete_rsp)
197 		status = vdev_mlme->ops->mlme_vdev_ext_delete_rsp(
198 								vdev_mlme,
199 								rsp);
200 
201 tgt_vdev_mgr_delete_response_handler_end:
202 	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
203 	return status;
204 }
205 
206 static QDF_STATUS
207 tgt_vdev_mgr_offload_bcn_tx_status_event_handler(uint32_t vdev_id,
208 						 uint32_t tx_status)
209 {
210 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
211 
212 	return status;
213 }
214 
215 static QDF_STATUS
216 tgt_vdev_mgr_tbttoffset_update_handler(uint32_t num_vdevs, bool is_ext)
217 {
218 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
219 
220 	return status;
221 }
222 
223 static QDF_STATUS
224 tgt_vdev_mgr_ext_tbttoffset_update_handle(uint32_t num_vdevs, bool is_ext)
225 {
226 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
227 
228 	return status;
229 }
230 
231 void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
232 {
233 	struct wlan_lmac_if_mlme_rx_ops *mlme_rx_ops = &rx_ops->mops;
234 
235 	mlme_rx_ops->vdev_mgr_offload_bcn_tx_status_event_handle =
236 		tgt_vdev_mgr_offload_bcn_tx_status_event_handler;
237 	mlme_rx_ops->vdev_mgr_tbttoffset_update_handle =
238 		tgt_vdev_mgr_tbttoffset_update_handler;
239 	mlme_rx_ops->vdev_mgr_start_response =
240 		tgt_vdev_mgr_start_response_handler;
241 	mlme_rx_ops->vdev_mgr_stop_response =
242 		tgt_vdev_mgr_stop_response_handler;
243 	mlme_rx_ops->vdev_mgr_delete_response =
244 		tgt_vdev_mgr_delete_response_handler;
245 	mlme_rx_ops->vdev_mgr_get_response_timer_info =
246 		tgt_vdev_mgr_get_response_timer_info;
247 }
248