1 /*
2  * Copyright (c) 2018-2019, 2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /**
19  * DOC: Implements VDEV MLME public APIs
20  */
21 
22 #include <wlan_objmgr_vdev_obj.h>
23 #include <wlan_mlme_dbg.h>
24 #include "include/wlan_vdev_mlme.h"
25 #include "../../core/src/vdev_mlme_sm.h"
26 #include <wlan_vdev_mlme_api.h>
27 #include <include/wlan_mlme_cmn.h>
28 #include <qdf_module.h>
29 #include "wlan_objmgr_vdev_obj.h"
30 
wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev * vdev)31 struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev)
32 {
33 	struct vdev_mlme_obj *vdev_mlme;
34 
35 	if (!vdev) {
36 		mlme_err("vdev is NULL");
37 		return NULL;
38 	}
39 
40 	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
41 							  WLAN_UMAC_COMP_MLME);
42 	if (!vdev_mlme) {
43 		mlme_err(" MLME component object is NULL");
44 		return NULL;
45 	}
46 
47 	return vdev_mlme;
48 }
49 
50 qdf_export_symbol(wlan_vdev_mlme_get_cmpt_obj);
51 
wlan_vdev_mlme_set_ext_hdl(struct wlan_objmgr_vdev * vdev,mlme_vdev_ext_t * ext_hdl)52 void wlan_vdev_mlme_set_ext_hdl(struct wlan_objmgr_vdev *vdev,
53 				mlme_vdev_ext_t *ext_hdl)
54 {
55 	struct vdev_mlme_obj *vdev_mlme;
56 
57 	if (!ext_hdl) {
58 		mlme_err("Invalid input");
59 		return;
60 	}
61 
62 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
63 	if (vdev_mlme)
64 		vdev_mlme->ext_vdev_ptr = ext_hdl;
65 }
66 
67 qdf_export_symbol(wlan_vdev_mlme_set_ext_hdl);
68 
wlan_vdev_mlme_get_ext_hdl(struct wlan_objmgr_vdev * vdev)69 mlme_vdev_ext_t *wlan_vdev_mlme_get_ext_hdl(struct wlan_objmgr_vdev *vdev)
70 {
71 	struct vdev_mlme_obj *vdev_mlme;
72 
73 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
74 	if (vdev_mlme)
75 		return vdev_mlme->ext_vdev_ptr;
76 
77 	return NULL;
78 }
79 
80 qdf_export_symbol(wlan_vdev_mlme_get_ext_hdl);
81 
wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev * vdev,enum wlan_vdev_sm_evt event,uint16_t event_data_len,void * event_data)82 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
83 					 enum wlan_vdev_sm_evt event,
84 					 uint16_t event_data_len,
85 					 void *event_data)
86 {
87 	struct vdev_mlme_obj *vdev_mlme;
88 	QDF_STATUS status;
89 	enum wlan_vdev_state state_entry, state_exit;
90 	enum wlan_vdev_state substate_entry, substate_exit;
91 
92 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
93 	if (!vdev_mlme) {
94 		mlme_err("vdev component object is NULL");
95 		return QDF_STATUS_E_FAILURE;
96 	}
97 
98 	mlme_vdev_sm_spin_lock(vdev_mlme);
99 
100 	/* store entry state and sub state for prints */
101 	state_entry = wlan_vdev_mlme_get_state(vdev);
102 	substate_entry = wlan_vdev_mlme_get_substate(vdev);
103 	mlme_vdev_sm_print_state_event(vdev_mlme, event);
104 
105 	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
106 					    event_data);
107 	/* Take exit state, exit substate for prints */
108 	state_exit = wlan_vdev_mlme_get_state(vdev);
109 	substate_exit = wlan_vdev_mlme_get_substate(vdev);
110 	/* If no state and substate change, don't print */
111 	if (!((state_entry == state_exit) && (substate_entry == substate_exit)))
112 		mlme_vdev_sm_print_state(vdev_mlme);
113 	mlme_vdev_sm_spin_unlock(vdev_mlme);
114 
115 	return status;
116 }
117 
118 qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt);
119 
wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev * vdev,enum wlan_vdev_sm_evt event,uint16_t event_data_len,void * event_data)120 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev *vdev,
121 					      enum wlan_vdev_sm_evt event,
122 					      uint16_t event_data_len,
123 					      void *event_data)
124 {
125 	struct vdev_mlme_obj *vdev_mlme;
126 	QDF_STATUS status;
127 
128 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
129 	if (!vdev_mlme) {
130 		mlme_err("vdev component object is NULL");
131 		return QDF_STATUS_E_FAILURE;
132 	}
133 
134 	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
135 					    event_data);
136 
137 	return status;
138 }
139 
140 qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt_sync);
141 
142 #ifdef SM_ENG_HIST_ENABLE
wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev * vdev)143 void wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev *vdev)
144 {
145 	struct vdev_mlme_obj *vdev_mlme;
146 
147 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
148 	if (!vdev_mlme) {
149 		mlme_err("vdev component object is NULL");
150 		return;
151 	}
152 
153 	mlme_vdev_sm_history_print(vdev_mlme);
154 }
155 #endif
156 
wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev * vdev)157 QDF_STATUS wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev *vdev)
158 {
159 	enum wlan_vdev_state state;
160 	enum wlan_vdev_state substate;
161 
162 	state = wlan_vdev_mlme_get_state(vdev);
163 	substate = wlan_vdev_mlme_get_substate(vdev);
164 	if ((state == WLAN_VDEV_S_UP && substate == WLAN_VDEV_SS_UP_ACTIVE) ||
165 	    ((state == WLAN_VDEV_S_SUSPEND) &&
166 	     (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)))
167 		return QDF_STATUS_SUCCESS;
168 
169 	return QDF_STATUS_E_FAILURE;
170 }
171 
wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev * vdev)172 QDF_STATUS wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev *vdev)
173 {
174 	enum wlan_vdev_state state;
175 
176 	state = wlan_vdev_mlme_get_state(vdev);
177 	if ((state == WLAN_VDEV_S_UP) ||  (state == WLAN_VDEV_S_DFS_CAC_WAIT) ||
178 	    (state == WLAN_VDEV_S_SUSPEND))
179 		return QDF_STATUS_SUCCESS;
180 
181 	return QDF_STATUS_E_FAILURE;
182 }
183 
184 qdf_export_symbol(wlan_vdev_mlme_is_active);
185 
wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev * vdev)186 QDF_STATUS wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev *vdev)
187 {
188 	enum wlan_vdev_state state;
189 	enum wlan_vdev_state substate;
190 
191 	state = wlan_vdev_mlme_get_state(vdev);
192 	substate = wlan_vdev_mlme_get_substate(vdev);
193 	if (!((state == WLAN_VDEV_S_INIT) || (state == WLAN_VDEV_S_STOP)))
194 		return QDF_STATUS_SUCCESS;
195 
196 	return QDF_STATUS_E_FAILURE;
197 }
198 
199 qdf_export_symbol(wlan_vdev_chan_config_valid);
200 
wlan_vdev_mlme_is_csa_restart(struct wlan_objmgr_vdev * vdev)201 QDF_STATUS wlan_vdev_mlme_is_csa_restart(struct wlan_objmgr_vdev *vdev)
202 {
203 	enum wlan_vdev_state state;
204 	enum wlan_vdev_state substate;
205 
206 	state = wlan_vdev_mlme_get_state(vdev);
207 	substate = wlan_vdev_mlme_get_substate(vdev);
208 	if ((state == WLAN_VDEV_S_SUSPEND) &&
209 	    (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART))
210 		return QDF_STATUS_SUCCESS;
211 
212 	return QDF_STATUS_E_FAILURE;
213 }
214 
215 qdf_export_symbol(wlan_vdev_mlme_is_csa_restart);
216 
wlan_vdev_is_going_down(struct wlan_objmgr_vdev * vdev)217 QDF_STATUS wlan_vdev_is_going_down(struct wlan_objmgr_vdev *vdev)
218 {
219 	enum wlan_vdev_state state;
220 	enum wlan_vdev_state substate;
221 
222 	state = wlan_vdev_mlme_get_state(vdev);
223 	substate = wlan_vdev_mlme_get_substate(vdev);
224 	if ((state == WLAN_VDEV_S_STOP) ||
225 	    ((state == WLAN_VDEV_S_SUSPEND) &&
226 	     (substate == WLAN_VDEV_SS_SUSPEND_SUSPEND_DOWN)))
227 		return QDF_STATUS_SUCCESS;
228 
229 	return QDF_STATUS_E_FAILURE;
230 }
231 
wlan_vdev_is_mlo_peer_create_allowed(struct wlan_objmgr_vdev * vdev)232 QDF_STATUS wlan_vdev_is_mlo_peer_create_allowed(struct wlan_objmgr_vdev *vdev)
233 {
234 	enum wlan_vdev_state state;
235 	enum wlan_vdev_state substate;
236 	bool acs_in_progress;
237 	QDF_STATUS ret;
238 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
239 
240 	if (!vdev) {
241 		mlme_err("vdev is null");
242 		return status;
243 	}
244 
245 	state = wlan_vdev_mlme_get_state(vdev);
246 	substate = wlan_vdev_mlme_get_substate(vdev);
247 
248 	acs_in_progress = false;
249 	ret = mlme_ext_hdl_get_acs_in_progress(vdev, &acs_in_progress);
250 	if (ret != QDF_STATUS_SUCCESS) {
251 		mlme_err("Unable to get ACS in progress status");
252 		return status;
253 	}
254 
255 	if (!acs_in_progress)
256 		if ((state == WLAN_VDEV_S_UP) ||
257 		    ((state == WLAN_VDEV_S_SUSPEND) &&
258 		     (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)) ||
259 		    (state == WLAN_VDEV_S_DFS_CAC_WAIT))
260 			status = QDF_STATUS_SUCCESS;
261 
262 	/* with link rejection feature, this check can be removed */
263 	if (wlan_vdev_mlme_op_flags_get(vdev, WLAN_VDEV_OP_MLO_STOP_LINK_DEL) ||
264 	    wlan_vdev_mlme_op_flags_get(vdev,
265 					WLAN_VDEV_OP_MLO_LINK_TBTT_COMPLETE))
266 		status = QDF_STATUS_E_FAILURE;
267 
268 	return status;
269 }
270 
wlan_vdev_is_restart_progress(struct wlan_objmgr_vdev * vdev)271 QDF_STATUS wlan_vdev_is_restart_progress(struct wlan_objmgr_vdev *vdev)
272 {
273 	enum wlan_vdev_state state;
274 	enum wlan_vdev_state substate;
275 
276 	state = wlan_vdev_mlme_get_state(vdev);
277 	substate = wlan_vdev_mlme_get_substate(vdev);
278 	if ((state == WLAN_VDEV_S_START) &&
279 	    (substate == WLAN_VDEV_SS_START_RESTART_PROGRESS))
280 		return QDF_STATUS_SUCCESS;
281 
282 	return QDF_STATUS_E_FAILURE;
283 }
284 
wlan_vdev_is_dfs_cac_wait(struct wlan_objmgr_vdev * vdev)285 QDF_STATUS wlan_vdev_is_dfs_cac_wait(struct wlan_objmgr_vdev *vdev)
286 {
287 	if (wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_DFS_CAC_WAIT)
288 		return QDF_STATUS_SUCCESS;
289 
290 	return QDF_STATUS_E_FAILURE;
291 }
292 
wlan_vdev_mlme_cmd_lock(struct wlan_objmgr_vdev * vdev)293 void wlan_vdev_mlme_cmd_lock(struct wlan_objmgr_vdev *vdev)
294 {
295 	struct vdev_mlme_obj *vdev_mlme;
296 
297 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
298 	if (!vdev_mlme) {
299 		mlme_err("vdev component object is NULL");
300 		return;
301 	}
302 
303 	mlme_vdev_cmd_mutex_acquire(vdev_mlme);
304 }
305 
wlan_vdev_mlme_cmd_unlock(struct wlan_objmgr_vdev * vdev)306 void wlan_vdev_mlme_cmd_unlock(struct wlan_objmgr_vdev *vdev)
307 {
308 	struct vdev_mlme_obj *vdev_mlme;
309 
310 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
311 	if (!vdev_mlme) {
312 		mlme_err("vdev component object is NULL");
313 		return;
314 	}
315 
316 	mlme_vdev_cmd_mutex_release(vdev_mlme);
317 }
318 
wlan_vdev_mlme_is_scan_allowed(struct wlan_objmgr_vdev * vdev)319 QDF_STATUS wlan_vdev_mlme_is_scan_allowed(struct wlan_objmgr_vdev *vdev)
320 {
321 	enum wlan_vdev_state state;
322 	enum wlan_vdev_state substate;
323 
324 	state = wlan_vdev_mlme_get_state(vdev);
325 	substate = wlan_vdev_mlme_get_substate(vdev);
326 	if ((state == WLAN_VDEV_S_INIT) ||
327 	    (state == WLAN_VDEV_S_UP && substate == WLAN_VDEV_SS_UP_ACTIVE) ||
328 	    (state == WLAN_VDEV_S_STOP))
329 		return QDF_STATUS_SUCCESS;
330 
331 	return QDF_STATUS_E_FAILURE;
332 }
333 
wlan_vdev_mlme_is_init_state(struct wlan_objmgr_vdev * vdev)334 QDF_STATUS wlan_vdev_mlme_is_init_state(struct wlan_objmgr_vdev *vdev)
335 {
336 	enum wlan_vdev_state state;
337 
338 	state = wlan_vdev_mlme_get_state(vdev);
339 	if (state == WLAN_VDEV_S_INIT)
340 		return QDF_STATUS_SUCCESS;
341 
342 	return QDF_STATUS_E_FAILURE;
343 }
344 
wlan_vdev_is_up_active_state(struct wlan_objmgr_vdev * vdev)345 QDF_STATUS wlan_vdev_is_up_active_state(struct wlan_objmgr_vdev *vdev)
346 {
347 	enum wlan_vdev_state state;
348 	enum wlan_vdev_state substate;
349 
350 	state = wlan_vdev_mlme_get_state(vdev);
351 	substate = wlan_vdev_mlme_get_substate(vdev);
352 	if (state == WLAN_VDEV_S_UP && substate == WLAN_VDEV_SS_UP_ACTIVE)
353 		return QDF_STATUS_SUCCESS;
354 
355 	return QDF_STATUS_E_FAILURE;
356 }
357 
358 qdf_export_symbol(wlan_vdev_is_up_active_state);
359 
360 #ifdef WLAN_FEATURE_11BE_MLO
361 bool
wlan_vdev_mlme_get_is_mlo_link(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)362 wlan_vdev_mlme_get_is_mlo_link(struct wlan_objmgr_psoc *psoc,
363 			       uint8_t vdev_id)
364 {
365 	struct wlan_objmgr_vdev *vdev;
366 	bool is_link = false;
367 
368 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
369 						    WLAN_MLME_OBJMGR_ID);
370 	if (!vdev) {
371 		mlme_err("vdev object is NULL for vdev %d", vdev_id);
372 		return is_link;
373 	}
374 
375 	if (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
376 	    wlan_vdev_mlme_is_mlo_link_vdev(vdev))
377 		is_link = true;
378 
379 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
380 
381 	return is_link;
382 }
383 
384 bool
wlan_vdev_mlme_get_is_mlo_vdev(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)385 wlan_vdev_mlme_get_is_mlo_vdev(struct wlan_objmgr_psoc *psoc,
386 			       uint8_t vdev_id)
387 {
388 	struct wlan_objmgr_vdev *vdev;
389 	bool is_mlo_vdev = false;
390 
391 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
392 						    WLAN_MLME_OBJMGR_ID);
393 	if (!vdev) {
394 		mlme_err("vdev object is NULL for vdev %d", vdev_id);
395 		return is_mlo_vdev;
396 	}
397 
398 	if (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
399 	    !wlan_vdev_mlme_is_mlo_link_vdev(vdev))
400 		is_mlo_vdev = true;
401 
402 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
403 
404 	return is_mlo_vdev;
405 }
406 #endif
407 #ifdef WLAN_FEATURE_SR
408 void
wlan_mlme_update_sr_data(struct wlan_objmgr_vdev * vdev,int * val,int32_t srg_pd_threshold,int32_t non_srg_pd_threshold,bool is_sr_enable)409 wlan_mlme_update_sr_data(struct wlan_objmgr_vdev *vdev, int *val,
410 			 int32_t srg_pd_threshold, int32_t non_srg_pd_threshold,
411 			 bool is_sr_enable)
412 {
413 	int8_t ap_non_srg_pd_threshold = 0;
414 	uint8_t ap_srg_min_pd_threshold_offset = 0;
415 	uint8_t ap_srg_max_pd_threshold_offset = 0;
416 	uint8_t sr_ctrl;
417 
418 	sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);
419 	if (!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED)) {
420 		/*
421 		 * Configure default non_srg_pd_threshold value for non-srg
422 		 * when AP, doesn't send SRPS IE or non-srg offset value is
423 		 * not present in SRPS IE.
424 		 */
425 		if (!sr_ctrl || !(sr_ctrl & NON_SRG_OFFSET_PRESENT))
426 			ap_non_srg_pd_threshold = SR_PD_THRESHOLD_MAX;
427 		else if (sr_ctrl & NON_SRG_OFFSET_PRESENT)
428 			ap_non_srg_pd_threshold =
429 				wlan_vdev_mlme_get_non_srg_pd_offset(vdev) +
430 				SR_PD_THRESHOLD_MIN;
431 
432 		/*
433 		 * Update non_srg_pd_threshold with provided
434 		 * non_srg_pd_threshold for non-srg, if pd threshold is
435 		 * within the range else keep the same as advertised by AP.
436 		 */
437 		if (!non_srg_pd_threshold ||
438 		    (non_srg_pd_threshold > ap_non_srg_pd_threshold))
439 			non_srg_pd_threshold = ap_non_srg_pd_threshold;
440 		else if (non_srg_pd_threshold < SR_PD_THRESHOLD_MIN)
441 			non_srg_pd_threshold = SR_PD_THRESHOLD_MIN;
442 		if (non_srg_pd_threshold > SR_PD_THRESHOLD_MAX)
443 			non_srg_pd_threshold = SR_PD_THRESHOLD_MAX;
444 
445 		/* 31st BIT - Enable/Disable Non-SRG based spatial reuse. */
446 		*val |= is_sr_enable << NON_SRG_SPR_ENABLE_POS;
447 	}
448 
449 	if (sr_ctrl & SRG_INFO_PRESENT) {
450 		wlan_vdev_mlme_get_srg_pd_offset(
451 					vdev, &ap_srg_max_pd_threshold_offset,
452 					&ap_srg_min_pd_threshold_offset);
453 		/*
454 		 * Update srg_pd_threshold with provide
455 		 * srg_pd_threshold, if pd threshold is with in the
456 		 * SRG range else keep the max of advertised by AP.
457 		 */
458 		if (!srg_pd_threshold ||
459 		    (srg_pd_threshold > (ap_srg_max_pd_threshold_offset +
460 					SR_PD_THRESHOLD_MIN) ||
461 		    srg_pd_threshold < (ap_srg_min_pd_threshold_offset +
462 					SR_PD_THRESHOLD_MIN)))
463 			srg_pd_threshold = ap_srg_max_pd_threshold_offset +
464 					   SR_PD_THRESHOLD_MIN;
465 
466 		/* 30th BIT - Enable/Disable SRG based spatial reuse. */
467 		*val |= is_sr_enable << SRG_SPR_ENABLE_POS;
468 	}
469 	/* bit    | purpose
470 	 * -----------------
471 	 * 0  - 7 | Param Value for non-SRG based Spatial Reuse
472 	 * 8  - 15| Param value for SRG based Spatial Reuse
473 	 * 29     | Param value is in dBm units rather than dB units
474 	 */
475 	QDF_SET_BITS(*val, NON_SRG_MAX_PD_OFFSET_POS, SR_PADDING_BYTE,
476 		     (uint8_t)non_srg_pd_threshold);
477 	QDF_SET_BITS(*val, SRG_THRESHOLD_MAX_PD_POS, SR_PADDING_BYTE,
478 		     (uint8_t)srg_pd_threshold);
479 	*val |= SR_PARAM_VAL_DBM_UNIT << SR_PARAM_VAL_DBM_POS;
480 	wlan_vdev_mlme_set_current_non_srg_pd_threshold(vdev,
481 							non_srg_pd_threshold);
482 	wlan_vdev_mlme_set_current_srg_pd_threshold(vdev, srg_pd_threshold);
483 }
484 #endif
485 
wlan_mlme_disable_fd_in_6ghz_band(struct wlan_objmgr_vdev * vdev,bool disable_fd)486 void wlan_mlme_disable_fd_in_6ghz_band(struct wlan_objmgr_vdev *vdev,
487 				       bool disable_fd)
488 {
489 	struct vdev_mlme_obj *vdev_mlme;
490 
491 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
492 	if (!vdev_mlme)
493 		return;
494 
495 	vdev_mlme->mgmt.generic.disable_fd_in_6ghz_band = disable_fd;
496 }
497 
wlan_mlme_is_fd_disabled_in_6ghz_band(struct wlan_objmgr_vdev * vdev)498 bool wlan_mlme_is_fd_disabled_in_6ghz_band(struct wlan_objmgr_vdev *vdev)
499 {
500 	struct vdev_mlme_obj *vdev_mlme;
501 
502 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
503 	if (!vdev_mlme)
504 		return false;
505 
506 	return vdev_mlme->mgmt.generic.disable_fd_in_6ghz_band;
507 }
508