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