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