1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wlan_tdls_ucfg_api.c
22  *
23  * TDLS north bound interface definitions
24  */
25 
26 #include <wlan_tdls_ucfg_api.h>
27 #include <wlan_tdls_tgt_api.h>
28 #include "../../core/src/wlan_tdls_main.h"
29 #include "../../core/src/wlan_tdls_cmds_process.h"
30 #include "../../core/src/wlan_tdls_ct.h"
31 #include "../../core/src/wlan_tdls_mgmt.h"
32 #include <wlan_objmgr_global_obj.h>
33 #include <wlan_objmgr_cmn.h>
34 #include "wlan_policy_mgr_api.h"
35 #include "wlan_scan_ucfg_api.h"
36 #include "cfg_tdls.h"
37 #include "wlan_mlo_mgr_sta.h"
38 #include "cfg_ucfg_api.h"
39 #include "wlan_tdls_api.h"
40 
ucfg_tdls_init(void)41 QDF_STATUS ucfg_tdls_init(void)
42 {
43 	QDF_STATUS status;
44 
45 	tdls_notice("tdls module dispatcher init");
46 	status = wlan_objmgr_register_psoc_create_handler(WLAN_UMAC_COMP_TDLS,
47 		tdls_psoc_obj_create_notification, NULL);
48 
49 	if (QDF_IS_STATUS_ERROR(status)) {
50 		tdls_err("Failed to register psoc create handler for tdls");
51 		return status;
52 	}
53 
54 	status = wlan_objmgr_register_psoc_destroy_handler(WLAN_UMAC_COMP_TDLS,
55 		tdls_psoc_obj_destroy_notification, NULL);
56 
57 	if (QDF_IS_STATUS_ERROR(status)) {
58 		tdls_err("Failed to register psoc delete handler for tdls");
59 		goto fail_delete_psoc;
60 	}
61 
62 	status = wlan_objmgr_register_vdev_create_handler(WLAN_UMAC_COMP_TDLS,
63 		tdls_vdev_obj_create_notification, NULL);
64 
65 	if (QDF_IS_STATUS_ERROR(status)) {
66 		tdls_err("Failed to register vdev create handler for tdls");
67 		goto fail_create_vdev;
68 	}
69 
70 	status = wlan_objmgr_register_vdev_destroy_handler(WLAN_UMAC_COMP_TDLS,
71 		tdls_vdev_obj_destroy_notification, NULL);
72 
73 	if (QDF_IS_STATUS_ERROR(status)) {
74 		tdls_err("Failed to register vdev create handler for tdls");
75 		goto fail_delete_vdev;
76 	}
77 	tdls_notice("tdls module dispatcher init done");
78 
79 	return status;
80 fail_delete_vdev:
81 	wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_TDLS,
82 		tdls_vdev_obj_create_notification, NULL);
83 
84 fail_create_vdev:
85 	wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_TDLS,
86 		tdls_psoc_obj_destroy_notification, NULL);
87 
88 fail_delete_psoc:
89 	wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_TDLS,
90 		tdls_psoc_obj_create_notification, NULL);
91 
92 	return status;
93 }
94 
ucfg_tdls_deinit(void)95 QDF_STATUS ucfg_tdls_deinit(void)
96 {
97 	QDF_STATUS ret;
98 
99 	tdls_notice("tdls module dispatcher deinit");
100 	ret = wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_TDLS,
101 				tdls_psoc_obj_create_notification, NULL);
102 	if (QDF_IS_STATUS_ERROR(ret))
103 		tdls_err("Failed to unregister psoc create handler");
104 
105 	ret = wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_TDLS,
106 				tdls_psoc_obj_destroy_notification, NULL);
107 	if (QDF_IS_STATUS_ERROR(ret))
108 		tdls_err("Failed to unregister psoc delete handler");
109 
110 	ret = wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_TDLS,
111 				tdls_vdev_obj_create_notification, NULL);
112 	if (QDF_IS_STATUS_ERROR(ret))
113 		tdls_err("Failed to unregister vdev create handler");
114 
115 	ret = wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_TDLS,
116 				tdls_vdev_obj_destroy_notification, NULL);
117 
118 	if (QDF_IS_STATUS_ERROR(ret))
119 		tdls_err("Failed to unregister vdev delete handler");
120 
121 	return ret;
122 }
123 
124 /**
125  * tdls_update_feature_flag() - update tdls feature flag
126  * @tdls_soc_obj:   pointer to tdls psoc object
127  *
128  * This function updates tdls feature flag
129  */
130 static void
tdls_update_feature_flag(struct tdls_soc_priv_obj * tdls_soc_obj)131 tdls_update_feature_flag(struct tdls_soc_priv_obj *tdls_soc_obj)
132 {
133 	tdls_soc_obj->tdls_configs.tdls_feature_flags =
134 		((tdls_soc_obj->tdls_configs.tdls_off_chan_enable ?
135 		  1 << TDLS_FEATURE_OFF_CHANNEL : 0) |
136 		 (tdls_soc_obj->tdls_configs.tdls_wmm_mode_enable ?
137 		  1 << TDLS_FEATURE_WMM : 0) |
138 		 (tdls_soc_obj->tdls_configs.tdls_buffer_sta_enable ?
139 		  1 << TDLS_FEATURE_BUFFER_STA : 0) |
140 		 (tdls_soc_obj->tdls_configs.tdls_sleep_sta_enable ?
141 		  1 << TDLS_FEATURE_SLEEP_STA : 0) |
142 		 (tdls_soc_obj->tdls_configs.tdls_scan_enable ?
143 		  1 << TDLS_FEATURE_SCAN : 0) |
144 		 (tdls_soc_obj->tdls_configs.tdls_support_enable ?
145 		  1 << TDLS_FEATURE_ENABLE : 0) |
146 		 (tdls_soc_obj->tdls_configs.tdls_implicit_trigger_enable ?
147 		  1 << TDLS_FEAUTRE_IMPLICIT_TRIGGER : 0) |
148 		 (tdls_soc_obj->tdls_configs.tdls_external_control &
149 		  TDLS_STRICT_EXTERNAL_CONTROL ?
150 		  1 << TDLS_FEATURE_EXTERNAL_CONTROL : 0) |
151 		 (tdls_soc_obj->tdls_configs.tdls_external_control &
152 		  TDLS_LIBERAL_EXTERNAL_CONTROL ?
153 		  1 << TDLS_FEATURE_LIBERAL_EXTERNAL_CONTROL : 0));
154 }
155 
156 /**
157  * tdls_object_init_params() - init parameters for tdls object
158  * @tdls_soc_obj: pointer to tdls psoc object
159  *
160  * This function init parameters for tdls object
161  */
tdls_object_init_params(struct tdls_soc_priv_obj * tdls_soc_obj)162 static QDF_STATUS tdls_object_init_params(
163 	struct tdls_soc_priv_obj *tdls_soc_obj)
164 {
165 	struct wlan_objmgr_psoc *psoc;
166 
167 	if (!tdls_soc_obj) {
168 		tdls_err("invalid param");
169 		return QDF_STATUS_E_INVAL;
170 	}
171 
172 	psoc = tdls_soc_obj->soc;
173 	if (!psoc) {
174 		tdls_err("invalid psoc object");
175 		return QDF_STATUS_E_INVAL;
176 	}
177 
178 	tdls_soc_obj->tdls_configs.tdls_tx_states_period =
179 			cfg_get(psoc, CFG_TDLS_TX_STATS_PERIOD);
180 	tdls_soc_obj->tdls_configs.tdls_tx_pkt_threshold =
181 			cfg_get(psoc, CFG_TDLS_TX_PACKET_THRESHOLD);
182 	tdls_soc_obj->tdls_configs.tdls_rx_pkt_threshold =
183 			cfg_get(psoc, CFG_TDLS_RX_FRAME_THRESHOLD);
184 	tdls_soc_obj->tdls_configs.tdls_max_discovery_attempt =
185 			cfg_get(psoc, CFG_TDLS_MAX_DISCOVERY_ATTEMPT);
186 	tdls_soc_obj->tdls_configs.tdls_idle_timeout =
187 			cfg_get(psoc, CFG_TDLS_IDLE_TIMEOUT);
188 	tdls_soc_obj->tdls_configs.tdls_idle_pkt_threshold =
189 			cfg_get(psoc, CFG_TDLS_IDLE_PACKET_THRESHOLD);
190 	tdls_soc_obj->tdls_configs.tdls_rssi_trigger_threshold =
191 			cfg_get(psoc, CFG_TDLS_RSSI_TRIGGER_THRESHOLD);
192 	tdls_soc_obj->tdls_configs.tdls_rssi_teardown_threshold =
193 			cfg_get(psoc, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD);
194 	tdls_soc_obj->tdls_configs.tdls_rssi_delta =
195 			cfg_get(psoc, CFG_TDLS_RSSI_DELTA);
196 	tdls_soc_obj->tdls_configs.tdls_uapsd_mask =
197 			cfg_get(psoc, CFG_TDLS_QOS_WMM_UAPSD_MASK);
198 	tdls_soc_obj->tdls_configs.tdls_uapsd_inactivity_time =
199 			cfg_get(psoc, CFG_TDLS_PUAPSD_INACT_TIME);
200 	tdls_soc_obj->tdls_configs.tdls_uapsd_pti_window =
201 			cfg_get(psoc, CFG_TDLS_PUAPSD_PEER_TRAFFIC_IND_WINDOW);
202 	tdls_soc_obj->tdls_configs.tdls_uapsd_ptr_timeout =
203 			cfg_get(psoc, CFG_TDLS_PUAPSD_PEER_TRAFFIC_RSP_TIMEOUT);
204 	tdls_soc_obj->tdls_configs.tdls_pre_off_chan_num =
205 			cfg_get(psoc, CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM);
206 	tdls_soc_obj->tdls_configs.tdls_pre_off_chan_freq_6g =
207 			cfg_get(psoc, CFG_TDLS_PREFERRED_OFF_CHANNEL_FREQ_6G);
208 	tdls_soc_obj->tdls_configs.tdls_pre_off_chan_bw =
209 			cfg_get(psoc, CFG_TDLS_PREFERRED_OFF_CHANNEL_BW);
210 	tdls_soc_obj->tdls_configs.tdls_peer_kickout_threshold =
211 			cfg_get(psoc, CFG_TDLS_PEER_KICKOUT_THRESHOLD);
212 	tdls_soc_obj->tdls_configs.tdls_discovery_wake_timeout =
213 			cfg_get(psoc, CFG_TDLS_DISCOVERY_WAKE_TIMEOUT);
214 	tdls_soc_obj->tdls_configs.delayed_trig_framint =
215 			cfg_get(psoc, CFG_TL_DELAYED_TRGR_FRM_INTERVAL);
216 	tdls_soc_obj->tdls_configs.tdls_wmm_mode_enable =
217 			cfg_get(psoc,  CFG_TDLS_WMM_MODE_ENABLE);
218 	tdls_soc_obj->tdls_configs.tdls_off_chan_enable =
219 			cfg_get(psoc, CFG_TDLS_OFF_CHANNEL_ENABLED);
220 	tdls_soc_obj->tdls_configs.tdls_buffer_sta_enable =
221 			cfg_get(psoc, CFG_TDLS_BUF_STA_ENABLED);
222 	tdls_soc_obj->tdls_configs.tdls_scan_enable =
223 			cfg_get(psoc, CFG_TDLS_SCAN_ENABLE);
224 	tdls_soc_obj->tdls_configs.tdls_support_enable =
225 			cfg_get(psoc, CFG_TDLS_SUPPORT_ENABLE);
226 	tdls_soc_obj->tdls_configs.tdls_implicit_trigger_enable =
227 			cfg_get(psoc, CFG_TDLS_IMPLICIT_TRIGGER);
228 	tdls_soc_obj->tdls_configs.tdls_external_control =
229 			cfg_get(psoc, CFG_TDLS_EXTERNAL_CONTROL);
230 	tdls_soc_obj->max_num_tdls_sta =
231 			cfg_get(psoc, CFG_TDLS_MAX_PEER_COUNT);
232 
233 	tdls_update_feature_flag(tdls_soc_obj);
234 
235 	return QDF_STATUS_SUCCESS;
236 }
237 
238 #ifdef TDLS_WOW_ENABLED
239 /**
240  * tdls_wow_init() - Create/init wake lock for TDLS
241  * @soc_obj: TDLS private soc object
242  *
243  * Create/init wake lock for TDLS if DVR isn't supported
244  *
245  * Return None
246  */
tdls_wow_init(struct tdls_soc_priv_obj * soc_obj)247 static void tdls_wow_init(struct tdls_soc_priv_obj *soc_obj)
248 {
249 	soc_obj->is_prevent_suspend = false;
250 	soc_obj->is_drv_supported = qdf_is_drv_supported();
251 	if (!soc_obj->is_drv_supported) {
252 		qdf_wake_lock_create(&soc_obj->wake_lock, "wlan_tdls");
253 		qdf_runtime_lock_init(&soc_obj->runtime_lock);
254 	}
255 }
256 
257 /**
258  * tdls_wow_deinit() - Destroy/deinit wake lock for TDLS
259  * @soc_obj: TDLS private soc object
260  *
261  * Destroy/deinit wake lock for TDLS if DVR isn't supported
262  *
263  * Return None
264  */
tdls_wow_deinit(struct tdls_soc_priv_obj * soc_obj)265 static void tdls_wow_deinit(struct tdls_soc_priv_obj *soc_obj)
266 {
267 	if (!soc_obj->is_drv_supported) {
268 		qdf_runtime_lock_deinit(&soc_obj->runtime_lock);
269 		qdf_wake_lock_destroy(&soc_obj->wake_lock);
270 	}
271 }
272 #else
tdls_wow_init(struct tdls_soc_priv_obj * soc_obj)273 static void tdls_wow_init(struct tdls_soc_priv_obj *soc_obj)
274 {
275 }
276 
tdls_wow_deinit(struct tdls_soc_priv_obj * soc_obj)277 static void tdls_wow_deinit(struct tdls_soc_priv_obj *soc_obj)
278 {
279 }
280 #endif
281 
tdls_global_init(struct tdls_soc_priv_obj * soc_obj)282 static QDF_STATUS tdls_global_init(struct tdls_soc_priv_obj *soc_obj)
283 {
284 	tdls_object_init_params(soc_obj);
285 	soc_obj->connected_peer_count = 0;
286 	soc_obj->tdls_nss_switch_in_progress = false;
287 	soc_obj->tdls_teardown_peers_cnt = 0;
288 	soc_obj->tdls_nss_teardown_complete = false;
289 	soc_obj->tdls_nss_transition_mode = TDLS_NSS_TRANSITION_S_UNKNOWN;
290 	soc_obj->enable_tdls_connection_tracker = false;
291 	soc_obj->tdls_external_peer_count = 0;
292 	soc_obj->is_user_tdls_enable = true;
293 
294 	qdf_spinlock_create(&soc_obj->tdls_ct_spinlock);
295 	tdls_wow_init(soc_obj);
296 
297 	return QDF_STATUS_SUCCESS;
298 }
299 
tdls_global_deinit(struct tdls_soc_priv_obj * soc_obj)300 static QDF_STATUS tdls_global_deinit(struct tdls_soc_priv_obj *soc_obj)
301 {
302 	tdls_wow_deinit(soc_obj);
303 	qdf_spinlock_destroy(&soc_obj->tdls_ct_spinlock);
304 
305 	return QDF_STATUS_SUCCESS;
306 }
307 
ucfg_tdls_psoc_open(struct wlan_objmgr_psoc * psoc)308 QDF_STATUS ucfg_tdls_psoc_open(struct wlan_objmgr_psoc *psoc)
309 {
310 	QDF_STATUS status;
311 	struct tdls_soc_priv_obj *soc_obj;
312 
313 	tdls_debug("tdls psoc open");
314 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
315 							WLAN_UMAC_COMP_TDLS);
316 	if (!soc_obj) {
317 		tdls_err("Failed to get tdls psoc component");
318 		return QDF_STATUS_E_FAILURE;
319 	}
320 
321 	status = tdls_global_init(soc_obj);
322 
323 	return status;
324 }
325 
ucfg_tdls_update_fw_wideband_capability(struct wlan_objmgr_psoc * psoc,bool is_fw_tdls_wideband_capable)326 void ucfg_tdls_update_fw_wideband_capability(struct wlan_objmgr_psoc *psoc,
327 					     bool is_fw_tdls_wideband_capable)
328 {
329 	struct tdls_soc_priv_obj *soc_obj;
330 
331 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
332 							WLAN_UMAC_COMP_TDLS);
333 	if (!soc_obj) {
334 		tdls_err("Failed to get tdls psoc component");
335 		return;
336 	}
337 
338 	soc_obj->fw_tdls_wideband_capability = is_fw_tdls_wideband_capable;
339 }
340 
ucfg_tdls_is_fw_wideband_capable(struct wlan_objmgr_psoc * psoc)341 bool ucfg_tdls_is_fw_wideband_capable(struct wlan_objmgr_psoc *psoc)
342 {
343 	struct tdls_soc_priv_obj *soc_obj;
344 
345 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
346 							WLAN_UMAC_COMP_TDLS);
347 	if (!soc_obj) {
348 		tdls_err("Failed to get tdls psoc component");
349 		return false;
350 	}
351 
352 	tdls_debug("FW wideband capability %d",
353 		   soc_obj->fw_tdls_wideband_capability);
354 
355 	return soc_obj->fw_tdls_wideband_capability;
356 }
357 
358 #ifdef WLAN_FEATURE_11BE
ucfg_tdls_update_fw_mlo_capability(struct wlan_objmgr_psoc * psoc,bool is_fw_tdls_mlo_capable)359 void ucfg_tdls_update_fw_mlo_capability(struct wlan_objmgr_psoc *psoc,
360 					bool is_fw_tdls_mlo_capable)
361 {
362 	struct tdls_soc_priv_obj *soc_obj;
363 
364 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
365 							WLAN_UMAC_COMP_TDLS);
366 	if (!soc_obj) {
367 		tdls_err("Failed to get tdls psoc component");
368 		return;
369 	}
370 
371 	soc_obj->fw_tdls_mlo_capable = is_fw_tdls_mlo_capable;
372 }
373 #endif
374 
375 #ifdef WLAN_FEATURE_11AX
ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc * psoc,bool is_fw_tdls_11ax_capable)376 void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
377 					 bool is_fw_tdls_11ax_capable)
378 {
379 	struct tdls_soc_priv_obj *soc_obj;
380 
381 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
382 							WLAN_UMAC_COMP_TDLS);
383 	if (!soc_obj) {
384 		tdls_err("Failed to get tdls psoc component");
385 		return;
386 	}
387 
388 	soc_obj->fw_tdls_11ax_capability = is_fw_tdls_11ax_capable;
389 }
390 
ucfg_update_fw_tdls_6g_capability(struct wlan_objmgr_psoc * psoc,bool is_fw_tdls_6g_capable)391 void ucfg_update_fw_tdls_6g_capability(struct wlan_objmgr_psoc *psoc,
392 				       bool is_fw_tdls_6g_capable)
393 {
394 	struct tdls_soc_priv_obj *soc_obj;
395 
396 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
397 							WLAN_UMAC_COMP_TDLS);
398 	if (!soc_obj) {
399 		tdls_err("Failed to get tdls psoc component");
400 		return;
401 	}
402 
403 	soc_obj->fw_tdls_6g_capability = is_fw_tdls_6g_capable;
404 }
405 
ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc * psoc)406 bool  ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc)
407 {
408 	struct tdls_soc_priv_obj *soc_obj;
409 
410 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
411 							WLAN_UMAC_COMP_TDLS);
412 	if (!soc_obj) {
413 		tdls_err("Failed to get tdls psoc component");
414 		return false;
415 	}
416 	tdls_debug("FW 11AX capability %d", soc_obj->fw_tdls_11ax_capability);
417 
418 	return soc_obj->fw_tdls_11ax_capability;
419 }
420 
ucfg_tdls_is_fw_6g_capable(struct wlan_objmgr_psoc * psoc)421 bool  ucfg_tdls_is_fw_6g_capable(struct wlan_objmgr_psoc *psoc)
422 {
423 	struct tdls_soc_priv_obj *soc_obj;
424 
425 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
426 							WLAN_UMAC_COMP_TDLS);
427 	if (!soc_obj) {
428 		tdls_err("Failed to get tdls psoc component");
429 		return false;
430 	}
431 	tdls_debug("FW 6g capability %d", soc_obj->fw_tdls_6g_capability);
432 
433 	return soc_obj->fw_tdls_6g_capability;
434 }
435 #endif
436 
ucfg_tdls_update_config(struct wlan_objmgr_psoc * psoc,struct tdls_start_params * req)437 QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc,
438 				   struct tdls_start_params *req)
439 {
440 	struct tdls_soc_priv_obj *soc_obj;
441 	uint32_t tdls_feature_flags;
442 	struct policy_mgr_tdls_cbacks tdls_pm_call_backs;
443 	uint8_t sta_idx;
444 
445 	tdls_debug("tdls update config ");
446 	if (!psoc || !req) {
447 		tdls_err("psoc: 0x%pK, req: 0x%pK", psoc, req);
448 		return QDF_STATUS_E_FAILURE;
449 	}
450 
451 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
452 							WLAN_UMAC_COMP_TDLS);
453 	if (!soc_obj) {
454 		tdls_err("Failed to get tdls psoc component");
455 		return QDF_STATUS_E_FAILURE;
456 	}
457 
458 	soc_obj->tdls_rx_cb = req->tdls_rx_cb;
459 	soc_obj->tdls_rx_cb_data = req->tdls_rx_cb_data;
460 
461 	soc_obj->tdls_wmm_cb = req->tdls_wmm_cb;
462 	soc_obj->tdls_wmm_cb_data = req->tdls_wmm_cb_data;
463 
464 	soc_obj->tdls_event_cb = req->tdls_event_cb;
465 	soc_obj->tdls_evt_cb_data = req->tdls_evt_cb_data;
466 
467 	/* Save callbacks to register/deregister TDLS sta with datapath */
468 	soc_obj->tdls_reg_peer = req->tdls_reg_peer;
469 	soc_obj->tdls_peer_context = req->tdls_peer_context;
470 
471 	/* Save legacy PE/WMA commands in TDLS soc object */
472 	soc_obj->tdls_send_mgmt_req = req->tdls_send_mgmt_req;
473 	soc_obj->tdls_add_sta_req = req->tdls_add_sta_req;
474 	soc_obj->tdls_del_sta_req = req->tdls_del_sta_req;
475 	soc_obj->tdls_update_peer_state = req->tdls_update_peer_state;
476 	soc_obj->tdls_del_all_peers = req->tdls_del_all_peers;
477 	soc_obj->tdls_update_dp_vdev_flags = req->tdls_update_dp_vdev_flags;
478 	soc_obj->tdls_dp_vdev_update = req->tdls_dp_vdev_update;
479 	soc_obj->tdls_osif_init_cb = req->tdls_osif_init_cb;
480 	soc_obj->tdls_osif_deinit_cb = req->tdls_osif_deinit_cb;
481 	soc_obj->tdls_osif_update_cb.tdls_osif_conn_update =
482 	       req->tdls_osif_update_cb.tdls_osif_conn_update;
483 	soc_obj->tdls_osif_update_cb.tdls_osif_disconn_update =
484 	       req->tdls_osif_update_cb.tdls_osif_disconn_update;
485 	tdls_pm_call_backs.tdls_notify_increment_session =
486 			tdls_notify_increment_session;
487 
488 	tdls_pm_call_backs.tdls_notify_decrement_session =
489 			tdls_notify_decrement_session;
490 	if (QDF_STATUS_SUCCESS != policy_mgr_register_tdls_cb(
491 		psoc, &tdls_pm_call_backs)) {
492 		tdls_err("policy manager callback registration failed ");
493 		return QDF_STATUS_E_FAILURE;
494 	}
495 
496 	tdls_update_feature_flag(soc_obj);
497 	tdls_feature_flags = soc_obj->tdls_configs.tdls_feature_flags;
498 
499 	if (!TDLS_IS_IMPLICIT_TRIG_ENABLED(tdls_feature_flags))
500 		soc_obj->tdls_current_mode = TDLS_SUPPORT_EXP_TRIG_ONLY;
501 	else if (TDLS_IS_EXTERNAL_CONTROL_ENABLED(tdls_feature_flags))
502 		soc_obj->tdls_current_mode = TDLS_SUPPORT_EXT_CONTROL;
503 	else
504 		soc_obj->tdls_current_mode = TDLS_SUPPORT_IMP_MODE;
505 
506 	soc_obj->tdls_last_mode = soc_obj->tdls_current_mode;
507 	if (TDLS_IS_BUFFER_STA_ENABLED(tdls_feature_flags) ||
508 	    TDLS_IS_SLEEP_STA_ENABLED(tdls_feature_flags))
509 		soc_obj->max_num_tdls_sta =
510 			WLAN_TDLS_STA_P_UAPSD_OFFCHAN_MAX_NUM;
511 
512 	for (sta_idx = 0; sta_idx < soc_obj->max_num_tdls_sta; sta_idx++) {
513 		soc_obj->tdls_conn_info[sta_idx].valid_entry = false;
514 		soc_obj->tdls_conn_info[sta_idx].index =
515 						INVALID_TDLS_PEER_INDEX;
516 		soc_obj->tdls_conn_info[sta_idx].session_id = 255;
517 		qdf_mem_zero(&soc_obj->tdls_conn_info[sta_idx].peer_mac,
518 			     QDF_MAC_ADDR_SIZE);
519 	}
520 	return QDF_STATUS_SUCCESS;
521 }
522 
ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev * vdev)523 bool ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev *vdev)
524 {
525 	struct wlan_objmgr_vdev *tdls_link_vdev;
526 
527 	tdls_link_vdev = tdls_mlo_get_tdls_link_vdev(vdev);
528 	if (!tdls_link_vdev) {
529 		wlan_vdev_mlme_feat_ext2_cap_set(vdev,
530 						 WLAN_VDEV_FEXT2_MLO_STA_TDLS);
531 		tdls_set_remain_links_unforce(vdev);
532 		return true;
533 	}
534 
535 	if (tdls_link_vdev && tdls_link_vdev != vdev) {
536 		tdls_debug("tdls vdev has been created on vdev %d",
537 			   wlan_vdev_get_id(tdls_link_vdev));
538 		return false;
539 	}
540 
541 	return true;
542 }
543 
544 struct wlan_objmgr_vdev *
ucfg_tdls_get_tdls_link_vdev(struct wlan_objmgr_vdev * vdev,wlan_objmgr_ref_dbgid dbg_id)545 ucfg_tdls_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
546 			     wlan_objmgr_ref_dbgid dbg_id)
547 {
548 	struct wlan_objmgr_vdev *link_vdev;
549 
550 	link_vdev = tdls_mlo_get_tdls_link_vdev(vdev);
551 	if (!link_vdev)
552 		return NULL;
553 
554 	if (wlan_objmgr_vdev_try_get_ref(link_vdev, dbg_id) !=
555 	    QDF_STATUS_SUCCESS)
556 		return NULL;
557 
558 	return link_vdev;
559 }
560 
ucfg_tdls_put_tdls_link_vdev(struct wlan_objmgr_vdev * vdev,wlan_objmgr_ref_dbgid dbg_id)561 void ucfg_tdls_put_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
562 				  wlan_objmgr_ref_dbgid dbg_id)
563 {
564 	wlan_objmgr_vdev_release_ref(vdev, dbg_id);
565 }
566 
ucfg_tdls_psoc_enable(struct wlan_objmgr_psoc * psoc)567 QDF_STATUS ucfg_tdls_psoc_enable(struct wlan_objmgr_psoc *psoc)
568 {
569 	QDF_STATUS status;
570 
571 	tdls_debug("psoc tdls enable: 0x%pK", psoc);
572 	if (!psoc) {
573 		tdls_err("NULL psoc");
574 		return QDF_STATUS_E_FAILURE;
575 	}
576 
577 	status = tgt_tdls_register_ev_handler(psoc);
578 
579 	if (status != QDF_STATUS_SUCCESS)
580 		return status;
581 
582 	status = wlan_serialization_register_comp_info_cb(psoc,
583 					WLAN_UMAC_COMP_TDLS,
584 					WLAN_SER_CMD_SCAN,
585 					tdls_scan_serialization_comp_info_cb);
586 	if (QDF_STATUS_SUCCESS != status) {
587 		tdls_err("Serialize scan cmd register failed ");
588 		return status;
589 	}
590 
591 	/* register callbacks with tx/rx mgmt */
592 	status = tdls_mgmt_rx_ops(psoc, true);
593 	if (status != QDF_STATUS_SUCCESS)
594 		tdls_err("Failed to register mgmt rx callback, status:%d",
595 			status);
596 	return status;
597 }
598 
ucfg_tdls_psoc_disable(struct wlan_objmgr_psoc * psoc)599 QDF_STATUS ucfg_tdls_psoc_disable(struct wlan_objmgr_psoc *psoc)
600 {
601 	QDF_STATUS status;
602 	struct tdls_soc_priv_obj *soc_obj = NULL;
603 
604 	tdls_debug("psoc tdls disable: 0x%pK", psoc);
605 	if (!psoc) {
606 		tdls_err("NULL psoc");
607 		return QDF_STATUS_E_FAILURE;
608 	}
609 
610 	status = tgt_tdls_unregister_ev_handler(psoc);
611 	if (QDF_IS_STATUS_ERROR(status))
612 		tdls_err("Failed to unregister tdls event handler");
613 
614 	status = tdls_mgmt_rx_ops(psoc, false);
615 	if (QDF_IS_STATUS_ERROR(status))
616 		tdls_err("Failed to unregister mgmt rx callback");
617 
618 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
619 							WLAN_UMAC_COMP_TDLS);
620 	if (!soc_obj) {
621 		tdls_err("Failed to get tdls psoc component");
622 		return QDF_STATUS_E_FAILURE;
623 	}
624 
625 	soc_obj->tdls_event_cb = NULL;
626 	soc_obj->tdls_evt_cb_data = NULL;
627 
628 	return status;
629 }
630 
ucfg_tdls_psoc_close(struct wlan_objmgr_psoc * psoc)631 QDF_STATUS ucfg_tdls_psoc_close(struct wlan_objmgr_psoc *psoc)
632 {
633 	QDF_STATUS status = QDF_STATUS_SUCCESS;
634 	struct tdls_soc_priv_obj *tdls_soc;
635 
636 	tdls_debug("tdls psoc close");
637 	tdls_soc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
638 							WLAN_UMAC_COMP_TDLS);
639 	if (!tdls_soc) {
640 		tdls_err("Failed to get tdls psoc component");
641 		return QDF_STATUS_E_FAILURE;
642 	}
643 
644 	status = tdls_global_deinit(tdls_soc);
645 
646 	return status;
647 }
648 
ucfg_tdls_post_msg_flush_cb(struct scheduler_msg * msg)649 static QDF_STATUS ucfg_tdls_post_msg_flush_cb(struct scheduler_msg *msg)
650 {
651 	void *ptr = msg->bodyptr;
652 	struct wlan_objmgr_vdev *vdev = NULL;
653 
654 	switch (msg->type) {
655 	case TDLS_NOTIFY_RESET_ADAPTERS:
656 		ptr = NULL;
657 		break;
658 	case TDLS_CMD_SET_TDLS_MODE:
659 		vdev = ((struct tdls_set_mode_params *)ptr)->vdev;
660 		break;
661 	case TDLS_CMD_TX_ACTION:
662 	case TDLS_CMD_SET_RESPONDER:
663 		break;
664 	case TDLS_CMD_ADD_STA:
665 		vdev = ((struct tdls_add_peer_request *)ptr)->vdev;
666 		break;
667 	case TDLS_CMD_CHANGE_STA:
668 		vdev = ((struct tdls_update_peer_request *)ptr)->vdev;
669 		break;
670 	case TDLS_CMD_ENABLE_LINK:
671 	case TDLS_CMD_DISABLE_LINK:
672 	case TDLS_CMD_REMOVE_FORCE_PEER:
673 	case TDLS_CMD_CONFIG_FORCE_PEER:
674 		vdev = ((struct tdls_oper_request *)ptr)->vdev;
675 		break;
676 	case TDLS_CMD_SET_OFFCHANNEL:
677 		vdev = ((struct tdls_set_offchannel *)ptr)->vdev;
678 		break;
679 	case TDLS_CMD_SET_OFFCHANMODE:
680 		vdev = ((struct tdls_set_offchanmode *)ptr)->vdev;
681 		break;
682 	case TDLS_CMD_SET_SECOFFCHANOFFSET:
683 		vdev = ((struct tdls_set_secoffchanneloffset *)ptr)->vdev;
684 		break;
685 	}
686 
687 	if (vdev)
688 		wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
689 
690 	if (ptr)
691 		qdf_mem_free(ptr);
692 
693 	msg->bodyptr = NULL;
694 
695 	return QDF_STATUS_SUCCESS;
696 }
697 
ucfg_tdls_add_peer(struct wlan_objmgr_vdev * vdev,struct tdls_add_peer_params * add_peer_req)698 QDF_STATUS ucfg_tdls_add_peer(struct wlan_objmgr_vdev *vdev,
699 			      struct tdls_add_peer_params *add_peer_req)
700 {
701 	struct scheduler_msg msg = {0, };
702 	struct tdls_add_peer_request *req;
703 	QDF_STATUS status;
704 
705 	if (!vdev || !add_peer_req) {
706 		tdls_err("vdev: %pK, req %pK", vdev, add_peer_req);
707 		return QDF_STATUS_E_NULL_VALUE;
708 	}
709 	tdls_debug("vdevid: %d, peertype: %d",
710 		   add_peer_req->vdev_id, add_peer_req->peer_type);
711 
712 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
713 	if (QDF_IS_STATUS_ERROR(status)) {
714 		tdls_err("can't get vdev");
715 		return status;
716 	}
717 
718 	req = qdf_mem_malloc(sizeof(*req));
719 	if (!req) {
720 		status = QDF_STATUS_E_NOMEM;
721 		goto dec_ref;
722 	}
723 
724 	qdf_mem_copy(&req->add_peer_req, add_peer_req, sizeof(*add_peer_req));
725 	req->vdev = vdev;
726 
727 	msg.bodyptr = req;
728 	msg.callback = tdls_process_cmd;
729 	msg.type = TDLS_CMD_ADD_STA;
730 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
731 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
732 					QDF_MODULE_ID_TDLS,
733 					QDF_MODULE_ID_OS_IF, &msg);
734 	if (QDF_IS_STATUS_ERROR(status)) {
735 		tdls_err("post add peer msg fail");
736 		qdf_mem_free(req);
737 		goto dec_ref;
738 	}
739 
740 	return status;
741 dec_ref:
742 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
743 	return status;
744 }
745 
ucfg_tdls_update_peer(struct wlan_objmgr_vdev * vdev,struct tdls_update_peer_params * update_peer)746 QDF_STATUS ucfg_tdls_update_peer(struct wlan_objmgr_vdev *vdev,
747 				 struct tdls_update_peer_params *update_peer)
748 {
749 	struct scheduler_msg msg = {0,};
750 	struct tdls_update_peer_request *req;
751 	QDF_STATUS status;
752 
753 	if (!vdev || !update_peer) {
754 		tdls_err("vdev: %pK, update_peer: %pK", vdev, update_peer);
755 		return QDF_STATUS_E_NULL_VALUE;
756 	}
757 
758 	tdls_debug("vdev_id: %d, peertype: %d",
759 		   update_peer->vdev_id, update_peer->peer_type);
760 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
761 	if (QDF_IS_STATUS_ERROR(status)) {
762 		tdls_err("can't get vdev");
763 		return status;
764 	}
765 	req = qdf_mem_malloc(sizeof(*req));
766 	if (!req) {
767 		status = QDF_STATUS_E_NOMEM;
768 		goto dec_ref;
769 	}
770 	qdf_mem_copy(&req->update_peer_req, update_peer, sizeof(*update_peer));
771 	req->vdev = vdev;
772 
773 	msg.bodyptr = req;
774 	msg.callback = tdls_process_cmd;
775 	msg.type = TDLS_CMD_CHANGE_STA;
776 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
777 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
778 					QDF_MODULE_ID_TDLS,
779 					QDF_MODULE_ID_OS_IF, &msg);
780 	if (QDF_IS_STATUS_ERROR(status)) {
781 		tdls_err("post update peer msg fail");
782 		qdf_mem_free(req);
783 		goto dec_ref;
784 	}
785 
786 	return status;
787 dec_ref:
788 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
789 	return status;
790 }
791 
tdls_get_oper_str(enum tdls_command_type cmd_type)792 static char *tdls_get_oper_str(enum tdls_command_type cmd_type)
793 {
794 	switch (cmd_type) {
795 	case TDLS_CMD_ENABLE_LINK:
796 		return "Enable_TDLS_LINK";
797 	case TDLS_CMD_DISABLE_LINK:
798 		return "DISABLE_TDLS_LINK";
799 	case TDLS_CMD_REMOVE_FORCE_PEER:
800 		return "REMOVE_FORCE_PEER";
801 	case TDLS_CMD_CONFIG_FORCE_PEER:
802 		return "CONFIG_FORCE_PEER";
803 	default:
804 		return "ERR:UNKNOWN OPER";
805 	}
806 }
807 
ucfg_tdls_oper(struct wlan_objmgr_vdev * vdev,const uint8_t * macaddr,enum tdls_command_type cmd)808 QDF_STATUS ucfg_tdls_oper(struct wlan_objmgr_vdev *vdev,
809 			  const uint8_t *macaddr, enum tdls_command_type cmd)
810 {
811 	struct scheduler_msg msg = {0,};
812 	struct tdls_oper_request *req;
813 	QDF_STATUS status;
814 
815 	if (!vdev || !macaddr) {
816 		tdls_err("vdev: %pK, mac %pK", vdev, macaddr);
817 		return QDF_STATUS_E_NULL_VALUE;
818 	}
819 
820 	tdls_debug("%s for peer " QDF_MAC_ADDR_FMT,
821 		   tdls_get_oper_str(cmd),
822 		   QDF_MAC_ADDR_REF(macaddr));
823 
824 	req = qdf_mem_malloc(sizeof(*req));
825 	if (!req)
826 		return QDF_STATUS_E_NOMEM;
827 
828 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
829 	if (QDF_IS_STATUS_ERROR(status)) {
830 		tdls_err("can't get vdev");
831 		goto error;
832 	}
833 
834 	qdf_mem_copy(req->peer_addr, macaddr, QDF_MAC_ADDR_SIZE);
835 	req->vdev = vdev;
836 
837 	msg.bodyptr = req;
838 	msg.callback = tdls_process_cmd;
839 	msg.type = cmd;
840 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
841 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
842 					QDF_MODULE_ID_TDLS,
843 					QDF_MODULE_ID_OS_IF, &msg);
844 	if (QDF_IS_STATUS_ERROR(status)) {
845 		tdls_err("post msg for %s fail", tdls_get_oper_str(cmd));
846 		goto dec_ref;
847 	}
848 
849 	return status;
850 dec_ref:
851 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
852 error:
853 	qdf_mem_free(req);
854 	return status;
855 }
856 
ucfg_tdls_get_all_peers(struct wlan_objmgr_vdev * vdev,char * buf,int buflen)857 QDF_STATUS ucfg_tdls_get_all_peers(struct wlan_objmgr_vdev *vdev,
858 				   char *buf, int buflen)
859 {
860 	struct scheduler_msg msg = {0, };
861 	struct tdls_get_all_peers *tdls_peers;
862 	QDF_STATUS status;
863 
864 	tdls_peers = qdf_mem_malloc(sizeof(*tdls_peers));
865 	if (!tdls_peers)
866 		return QDF_STATUS_E_NOMEM;
867 
868 	tdls_peers->vdev = vdev;
869 	tdls_peers->buf_len = buflen;
870 	tdls_peers->buf = buf;
871 
872 	msg.bodyptr = tdls_peers;
873 	msg.callback = tdls_process_cmd;
874 	msg.type = TDLS_CMD_GET_ALL_PEERS;
875 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
876 					QDF_MODULE_ID_TDLS,
877 					QDF_MODULE_ID_OS_IF, &msg);
878 
879 	if (status != QDF_STATUS_SUCCESS)
880 		qdf_mem_free(tdls_peers);
881 
882 	return QDF_STATUS_SUCCESS;
883 }
884 
tdls_send_mgmt_frame_flush_callback(struct scheduler_msg * msg)885 static QDF_STATUS tdls_send_mgmt_frame_flush_callback(struct scheduler_msg *msg)
886 {
887 	struct tdls_action_frame_request *req;
888 
889 	if (!msg || !msg->bodyptr) {
890 		tdls_err("msg or msg->bodyptr is NULL");
891 		return QDF_STATUS_E_NULL_VALUE;
892 	}
893 	req = msg->bodyptr;
894 	if (req->vdev)
895 		wlan_objmgr_vdev_release_ref(req->vdev, WLAN_TDLS_NB_ID);
896 
897 	qdf_mem_free(req);
898 	return QDF_STATUS_SUCCESS;
899 }
900 
ucfg_tdls_send_mgmt_frame(struct tdls_action_frame_request * req)901 QDF_STATUS ucfg_tdls_send_mgmt_frame(
902 				struct tdls_action_frame_request *req)
903 {
904 	struct scheduler_msg msg = {0, };
905 	struct tdls_action_frame_request *mgmt_req;
906 	QDF_STATUS status;
907 
908 	if (!req || !req->vdev) {
909 		tdls_err("Invalid mgmt req params %pK", req);
910 		return QDF_STATUS_E_NULL_VALUE;
911 	}
912 
913 	mgmt_req = qdf_mem_malloc(sizeof(*mgmt_req) +
914 					req->len);
915 	if (!mgmt_req)
916 		return QDF_STATUS_E_NOMEM;
917 
918 	qdf_mem_copy(mgmt_req, req, sizeof(*req));
919 
920 	/*populate the additional IE's */
921 	if ((0 != req->len) && (req->cmd_buf)) {
922 		qdf_mem_copy(mgmt_req->tdls_mgmt.buf, req->cmd_buf,
923 				req->len);
924 		mgmt_req->tdls_mgmt.len = req->len;
925 	} else {
926 		mgmt_req->tdls_mgmt.len = 0;
927 	}
928 
929 	tdls_debug("vdev id: %d, session id : %d, action %d", mgmt_req->vdev_id,
930 		   mgmt_req->session_id, req->chk_frame.action_code);
931 	status = wlan_objmgr_vdev_try_get_ref(req->vdev, WLAN_TDLS_NB_ID);
932 
933 	if (QDF_IS_STATUS_ERROR(status)) {
934 		tdls_err("Unable to get vdev reference for tdls module");
935 		goto mem_free;
936 	}
937 
938 	msg.bodyptr = mgmt_req;
939 	msg.callback = tdls_process_cmd;
940 	msg.flush_callback = tdls_send_mgmt_frame_flush_callback;
941 	msg.type = TDLS_CMD_TX_ACTION;
942 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
943 					QDF_MODULE_ID_TDLS,
944 					QDF_MODULE_ID_OS_IF, &msg);
945 	if (QDF_IS_STATUS_ERROR(status))
946 		goto release_ref;
947 
948 	return status;
949 
950 release_ref:
951 	wlan_objmgr_vdev_release_ref(req->vdev, WLAN_TDLS_NB_ID);
952 mem_free:
953 	qdf_mem_free(mgmt_req);
954 	return status;
955 }
956 
ucfg_tdls_responder(struct tdls_set_responder_req * req)957 QDF_STATUS ucfg_tdls_responder(struct tdls_set_responder_req *req)
958 {
959 	struct scheduler_msg msg = {0, };
960 	struct tdls_set_responder_req *msg_req;
961 	QDF_STATUS status;
962 
963 	if (!req || !req->vdev) {
964 		tdls_err("invalid input %pK", req);
965 		return QDF_STATUS_E_NULL_VALUE;
966 	}
967 
968 	msg_req = qdf_mem_malloc(sizeof(*msg_req));
969 	if (!msg_req)
970 		return QDF_STATUS_E_NULL_VALUE;
971 
972 	msg_req->responder = req->responder;
973 	msg_req->vdev = req->vdev;
974 	qdf_mem_copy(msg_req->peer_mac, req->peer_mac, QDF_MAC_ADDR_SIZE);
975 
976 	msg.bodyptr = msg_req;
977 	msg.callback = tdls_process_cmd;
978 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
979 	msg.type = TDLS_CMD_SET_RESPONDER;
980 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
981 					QDF_MODULE_ID_TDLS,
982 					QDF_MODULE_ID_OS_IF, &msg);
983 	if (QDF_IS_STATUS_ERROR(status))
984 		qdf_mem_free(msg_req);
985 
986 	return status;
987 }
988 
ucfg_tdls_teardown_links_sync(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)989 void ucfg_tdls_teardown_links_sync(struct wlan_objmgr_psoc *psoc,
990 				   struct wlan_objmgr_vdev *vdev)
991 {
992 	return wlan_tdls_check_and_teardown_links_sync(psoc, vdev);
993 }
994 
ucfg_tdls_teardown_links(struct wlan_objmgr_psoc * psoc)995 QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_psoc *psoc)
996 {
997 	return wlan_tdls_teardown_links(psoc);
998 }
999 
ucfg_tdls_notify_reset_adapter(struct wlan_objmgr_vdev * vdev)1000 QDF_STATUS ucfg_tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev)
1001 {
1002 	QDF_STATUS status;
1003 	struct scheduler_msg msg = {0, };
1004 
1005 	if (!vdev) {
1006 		tdls_err("vdev is NULL ");
1007 		return QDF_STATUS_E_NULL_VALUE;
1008 	}
1009 	tdls_debug("Enter ");
1010 	msg.bodyptr = vdev;
1011 	msg.callback = tdls_process_cmd;
1012 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
1013 	msg.type = TDLS_NOTIFY_RESET_ADAPTERS;
1014 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
1015 					QDF_MODULE_ID_TDLS,
1016 					QDF_MODULE_ID_OS_IF, &msg);
1017 	return status;
1018 }
1019 
ucfg_tdls_set_operating_mode(struct tdls_set_mode_params * set_mode_params)1020 QDF_STATUS ucfg_tdls_set_operating_mode(
1021 			struct tdls_set_mode_params *set_mode_params)
1022 {
1023 	struct scheduler_msg msg = {0, };
1024 	struct tdls_set_mode_params *set_mode;
1025 	QDF_STATUS status;
1026 
1027 	if (!set_mode_params || !set_mode_params->vdev) {
1028 		tdls_err("set_mode_params %pK", set_mode_params);
1029 		return QDF_STATUS_E_NULL_VALUE;
1030 	}
1031 
1032 	tdls_debug("Enter ");
1033 
1034 	set_mode = qdf_mem_malloc(sizeof(*set_mode));
1035 	if (!set_mode)
1036 		return QDF_STATUS_E_NULL_VALUE;
1037 
1038 	status = wlan_objmgr_vdev_try_get_ref(set_mode->vdev, WLAN_TDLS_NB_ID);
1039 	if (QDF_IS_STATUS_ERROR(status)) {
1040 		tdls_err("failed to get vdev ref");
1041 		qdf_mem_free(set_mode);
1042 		return status;
1043 	}
1044 
1045 	set_mode->source = set_mode_params->source;
1046 	set_mode->tdls_mode = set_mode_params->tdls_mode;
1047 	set_mode->update_last = set_mode_params->update_last;
1048 	set_mode->vdev = set_mode_params->vdev;
1049 
1050 	msg.bodyptr = set_mode;
1051 	msg.callback = tdls_process_cmd;
1052 	msg.type = TDLS_CMD_SET_TDLS_MODE;
1053 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
1054 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
1055 					QDF_MODULE_ID_TDLS,
1056 					QDF_MODULE_ID_OS_IF, &msg);
1057 	if (QDF_IS_STATUS_ERROR(status)) {
1058 		wlan_objmgr_vdev_release_ref(set_mode->vdev, WLAN_TDLS_NB_ID);
1059 		qdf_mem_free(set_mode);
1060 	}
1061 
1062 	tdls_debug("Exit ");
1063 
1064 	return QDF_STATUS_SUCCESS;
1065 }
1066 
ucfg_tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mac_addr,struct qdf_mac_addr * dest_mac_addr)1067 void ucfg_tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
1068 				 struct qdf_mac_addr *mac_addr,
1069 				 struct qdf_mac_addr *dest_mac_addr)
1070 {
1071 	tdls_update_rx_pkt_cnt(vdev, mac_addr, dest_mac_addr);
1072 
1073 }
1074 
ucfg_tdls_update_tx_pkt_cnt(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mac_addr)1075 void ucfg_tdls_update_tx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
1076 				 struct qdf_mac_addr *mac_addr)
1077 {
1078 	tdls_update_tx_pkt_cnt(vdev, mac_addr);
1079 }
1080 
ucfg_tdls_antenna_switch(struct wlan_objmgr_vdev * vdev,uint32_t mode)1081 QDF_STATUS ucfg_tdls_antenna_switch(struct wlan_objmgr_vdev *vdev,
1082 				    uint32_t mode)
1083 {
1084 	QDF_STATUS status;
1085 	struct tdls_antenna_switch_request *req;
1086 	struct scheduler_msg msg = {0, };
1087 
1088 	req = qdf_mem_malloc(sizeof(*req));
1089 	if (!req)
1090 		return QDF_STATUS_E_NOMEM;
1091 
1092 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
1093 	if (QDF_IS_STATUS_ERROR(status)) {
1094 		tdls_err("can't get vdev");
1095 		goto error;
1096 	}
1097 
1098 	req->vdev = vdev;
1099 	req->mode = mode;
1100 
1101 	msg.bodyptr = req;
1102 	msg.callback = tdls_process_cmd;
1103 	msg.flush_callback = tdls_antenna_switch_flush_callback;
1104 	msg.type = TDLS_CMD_ANTENNA_SWITCH;
1105 	status = scheduler_post_message(QDF_MODULE_ID_HDD,
1106 					QDF_MODULE_ID_TDLS,
1107 					QDF_MODULE_ID_OS_IF, &msg);
1108 	if (QDF_IS_STATUS_ERROR(status)) {
1109 		tdls_err("post antenna switch msg fail");
1110 		goto dec_ref;
1111 	}
1112 
1113 	return status;
1114 
1115 dec_ref:
1116 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
1117 error:
1118 	qdf_mem_free(req);
1119 	return status;
1120 }
1121 
ucfg_set_tdls_offchannel(struct wlan_objmgr_vdev * vdev,int offchannel)1122 QDF_STATUS ucfg_set_tdls_offchannel(struct wlan_objmgr_vdev *vdev,
1123 				    int offchannel)
1124 {
1125 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1126 	struct scheduler_msg msg = {0, };
1127 	struct tdls_set_offchannel *req;
1128 
1129 	req = qdf_mem_malloc(sizeof(*req));
1130 	if (!req)
1131 		return QDF_STATUS_E_NOMEM;
1132 
1133 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
1134 	if (QDF_IS_STATUS_ERROR(status)) {
1135 		tdls_err("can't get vdev");
1136 		goto free;
1137 	}
1138 
1139 	req->offchannel = offchannel;
1140 	req->vdev = vdev;
1141 	req->callback = wlan_tdls_offchan_parms_callback;
1142 	msg.bodyptr = req;
1143 	msg.callback = tdls_process_cmd;
1144 	msg.type = TDLS_CMD_SET_OFFCHANNEL;
1145 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
1146 	status = scheduler_post_message(QDF_MODULE_ID_HDD, QDF_MODULE_ID_TDLS,
1147 					QDF_MODULE_ID_OS_IF, &msg);
1148 	if (QDF_IS_STATUS_ERROR(status)) {
1149 		tdls_err("post set tdls offchannel msg fail");
1150 		goto dec_ref;
1151 	}
1152 
1153 	return status;
1154 
1155 dec_ref:
1156 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
1157 
1158 free:
1159 	qdf_mem_free(req);
1160 	return status;
1161 }
1162 
ucfg_set_tdls_offchan_mode(struct wlan_objmgr_vdev * vdev,int offchanmode)1163 QDF_STATUS ucfg_set_tdls_offchan_mode(struct wlan_objmgr_vdev *vdev,
1164 				      int offchanmode)
1165 {
1166 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1167 	struct scheduler_msg msg = {0, };
1168 	struct tdls_set_offchanmode *req;
1169 
1170 	req = qdf_mem_malloc(sizeof(*req));
1171 	if (!req)
1172 		return QDF_STATUS_E_NOMEM;
1173 
1174 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
1175 	if (QDF_IS_STATUS_ERROR(status)) {
1176 		tdls_err("can't get vdev");
1177 		goto free;
1178 	}
1179 
1180 	req->offchan_mode = offchanmode;
1181 	req->vdev = vdev;
1182 	req->callback = wlan_tdls_offchan_parms_callback;
1183 	msg.bodyptr = req;
1184 	msg.callback = tdls_process_cmd;
1185 	msg.type = TDLS_CMD_SET_OFFCHANMODE;
1186 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
1187 	status = scheduler_post_message(QDF_MODULE_ID_HDD, QDF_MODULE_ID_TDLS,
1188 					QDF_MODULE_ID_OS_IF, &msg);
1189 	if (QDF_IS_STATUS_ERROR(status)) {
1190 		tdls_err("post set offchanmode msg fail");
1191 		goto dec_ref;
1192 	}
1193 
1194 	return status;
1195 
1196 dec_ref:
1197 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
1198 
1199 free:
1200 	qdf_mem_free(req);
1201 	return status;
1202 }
1203 
ucfg_set_tdls_secoffchanneloffset(struct wlan_objmgr_vdev * vdev,int offchanoffset)1204 QDF_STATUS ucfg_set_tdls_secoffchanneloffset(struct wlan_objmgr_vdev *vdev,
1205 					     int offchanoffset)
1206 {
1207 	int status = QDF_STATUS_SUCCESS;
1208 	struct scheduler_msg msg = {0, };
1209 	struct tdls_set_secoffchanneloffset *req;
1210 
1211 	req = qdf_mem_malloc(sizeof(*req));
1212 	if (!req)
1213 		return QDF_STATUS_E_NOMEM;
1214 
1215 	status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
1216 	if (QDF_IS_STATUS_ERROR(status)) {
1217 		tdls_err("can't get vdev");
1218 		goto free;
1219 	}
1220 
1221 	req->offchan_offset = offchanoffset;
1222 	req->vdev = vdev;
1223 	req->callback = wlan_tdls_offchan_parms_callback;
1224 	msg.bodyptr = req;
1225 	msg.callback = tdls_process_cmd;
1226 	msg.type = TDLS_CMD_SET_SECOFFCHANOFFSET;
1227 	msg.flush_callback = ucfg_tdls_post_msg_flush_cb;
1228 	status = scheduler_post_message(QDF_MODULE_ID_HDD, QDF_MODULE_ID_TDLS,
1229 					QDF_MODULE_ID_OS_IF, &msg);
1230 	if (QDF_IS_STATUS_ERROR(status)) {
1231 		tdls_err("post set secoffchan offset msg fail");
1232 		goto dec_ref;
1233 	}
1234 	return status;
1235 
1236 dec_ref:
1237 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
1238 
1239 free:
1240 	qdf_mem_free(req);
1241 	return status;
1242 }
1243 
ucfg_tdls_get_mlo_vdev(struct wlan_objmgr_vdev * vdev,uint8_t index,wlan_objmgr_ref_dbgid dbg_id)1244 struct wlan_objmgr_vdev *ucfg_tdls_get_mlo_vdev(struct wlan_objmgr_vdev *vdev,
1245 						uint8_t index,
1246 						wlan_objmgr_ref_dbgid dbg_id)
1247 {
1248 	return wlan_tdls_get_mlo_vdev(vdev, index, dbg_id);
1249 }
1250 
ucfg_tdls_release_mlo_vdev(struct wlan_objmgr_vdev * vdev,wlan_objmgr_ref_dbgid dbg_id)1251 void ucfg_tdls_release_mlo_vdev(struct wlan_objmgr_vdev *vdev,
1252 				wlan_objmgr_ref_dbgid dbg_id)
1253 {
1254 	return wlan_tdls_release_mlo_vdev(vdev, dbg_id);
1255 }
1256 
ucfg_tdls_discovery_on_going(struct wlan_objmgr_vdev * vdev)1257 bool ucfg_tdls_discovery_on_going(struct wlan_objmgr_vdev *vdev)
1258 {
1259 	struct tdls_soc_priv_obj *tdls_soc;
1260 	uint8_t count;
1261 
1262 	tdls_soc = wlan_vdev_get_tdls_soc_obj(vdev);
1263 	if (!tdls_soc)
1264 		return false;
1265 	count = qdf_atomic_read(&tdls_soc->timer_cnt);
1266 	tdls_debug("discovery req timer count %d", count);
1267 
1268 	return count ? true : false;
1269 }
1270 
ucfg_tdls_set_rssi(struct wlan_objmgr_vdev * vdev,uint8_t * mac,int8_t rssi)1271 QDF_STATUS ucfg_tdls_set_rssi(struct wlan_objmgr_vdev *vdev,
1272 			      uint8_t *mac, int8_t rssi)
1273 {
1274 	return tdls_set_rssi(vdev, mac, rssi);
1275 }
1276 
ucfg_tdls_notify_connect_failure(struct wlan_objmgr_psoc * psoc)1277 void ucfg_tdls_notify_connect_failure(struct wlan_objmgr_psoc *psoc)
1278 {
1279 	return tdls_notify_decrement_session(psoc);
1280 }
1281 
ucfg_get_tdls_conn_peer_count(struct wlan_objmgr_vdev * vdev)1282 uint16_t ucfg_get_tdls_conn_peer_count(struct wlan_objmgr_vdev *vdev)
1283 {
1284 	return tdls_get_connected_peer_count_from_vdev(vdev);
1285 }
1286 
ucfg_get_tdls_vdev(struct wlan_objmgr_psoc * psoc,wlan_objmgr_ref_dbgid dbg_id)1287 struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc,
1288 					    wlan_objmgr_ref_dbgid dbg_id)
1289 {
1290 	return tdls_get_vdev(psoc, dbg_id);
1291 }
1292 
ucfg_tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev * vdev)1293 bool ucfg_tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev)
1294 {
1295 	return tdls_check_is_tdls_allowed(vdev);
1296 }
1297 
ucfg_tdls_set_user_tdls_enable(struct wlan_objmgr_vdev * vdev,bool is_user_tdls_enable)1298 void ucfg_tdls_set_user_tdls_enable(struct wlan_objmgr_vdev *vdev,
1299 				    bool is_user_tdls_enable)
1300 {
1301 	return tdls_set_user_tdls_enable(vdev, is_user_tdls_enable);
1302 }
1303