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