1  /*
2   * Copyright (c) 2018-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
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  /**
20   * DOC: define internal APIs related to the mlme component
21   */
22  
23  #include "wlan_mlme_main.h"
24  #include "include/wlan_vdev_mlme.h"
25  #include "cfg_ucfg_api.h"
26  #include "wmi_unified.h"
27  #include "wlan_scan_public_structs.h"
28  #include "wlan_psoc_mlme_api.h"
29  #include "wlan_vdev_mlme_api.h"
30  #include "wlan_mlme_api.h"
31  #include <wlan_crypto_global_api.h>
32  #include <wlan_mlo_mgr_cmn.h>
33  #include "wlan_mlme_ucfg_api.h"
34  #include "wifi_pos_ucfg_i.h"
35  #include "wlan_mlo_mgr_sta.h"
36  #include "twt/core/src/wlan_twt_cfg.h"
37  #include "wlan_scan_api.h"
38  #include "wlan_mlme_vdev_mgr_interface.h"
39  #include "wlan_vdev_mgr_utils_api.h"
40  #include <wmi_unified_priv.h>
41  #include <target_if.h>
42  
43  #define NUM_OF_SOUNDING_DIMENSIONS     1 /*Nss - 1, (Nss = 2 for 2x2)*/
44  
45  /* Time to passive scan dwell for scan to get channel stats, in milliseconds */
46  #define MLME_GET_CHAN_STATS_PASSIVE_SCAN_TIME 40
47  #define MLME_GET_CHAN_STATS_WIDE_BAND_PASSIVE_SCAN_TIME 110
48  
49  struct wlan_mlme_rx_ops *
mlme_get_rx_ops(struct wlan_objmgr_psoc * psoc)50  mlme_get_rx_ops(struct wlan_objmgr_psoc *psoc)
51  {
52  	struct wlan_mlme_psoc_ext_obj *psoc_ext_priv;
53  
54  	if (!psoc) {
55  		mlme_err("psoc object is NULL");
56  		return NULL;
57  	}
58  	psoc_ext_priv = wlan_psoc_mlme_get_ext_hdl(psoc);
59  	if (!psoc_ext_priv) {
60  		mlme_err("psoc legacy private object is NULL");
61  		return NULL;
62  	}
63  
64  	return &psoc_ext_priv->mlme_rx_ops;
65  }
66  
wlan_mlme_register_rx_ops(struct wlan_mlme_rx_ops * rx_ops)67  void wlan_mlme_register_rx_ops(struct wlan_mlme_rx_ops *rx_ops)
68  {
69  	rx_ops->peer_oper_mode_eventid = wlan_mlme_set_peer_indicated_ch_width;
70  }
71  
mlme_get_psoc_ext_obj_fl(struct wlan_objmgr_psoc * psoc,const char * func,uint32_t line)72  struct wlan_mlme_psoc_ext_obj *mlme_get_psoc_ext_obj_fl(
73  			       struct wlan_objmgr_psoc *psoc,
74  			       const char *func, uint32_t line)
75  {
76  
77  	return wlan_psoc_mlme_get_ext_hdl(psoc);
78  }
79  
mlme_get_dynamic_vdev_config(struct wlan_objmgr_vdev * vdev)80  struct wlan_mlme_nss_chains *mlme_get_dynamic_vdev_config(
81  				struct wlan_objmgr_vdev *vdev)
82  {
83  	struct mlme_legacy_priv *mlme_priv;
84  
85  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
86  	if (!mlme_priv) {
87  		mlme_legacy_err("vdev legacy private object is NULL");
88  		return NULL;
89  	}
90  
91  	return &mlme_priv->dynamic_cfg;
92  }
93  
94  /* Buffer len size to consider the 4 char freq, and a space, Total 5 */
95  #define MLME_CHAN_WEIGHT_CHAR_LEN 5
96  #define MLME_MAX_CHAN_TO_PRINT 39
97  
98  /**
99   * mlme_fill_freq_in_scan_start_request() - Fill frequencies in scan req
100   * @vdev: vdev common object
101   * @req: pointer to scan request
102   *
103   * Return: QDF_STATUS
104   */
105  static QDF_STATUS
mlme_fill_freq_in_scan_start_request(struct wlan_objmgr_vdev * vdev,struct scan_start_request * req)106  mlme_fill_freq_in_scan_start_request(struct wlan_objmgr_vdev *vdev,
107  				     struct scan_start_request *req)
108  {
109  	const struct bonded_channel_freq *range;
110  	struct mlme_legacy_priv *mlme_priv;
111  	enum phy_ch_width associated_ch_width;
112  	uint8_t i;
113  	struct chan_list *scan_chan_list;
114  	qdf_freq_t first_freq, operation_chan_freq, sec_2g_freq;
115  	char *chan_buff = NULL;
116  	uint32_t buff_len, buff_num = 0, chan_count = 0;
117  
118  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
119  	if (!mlme_priv)
120  		return QDF_STATUS_E_FAILURE;
121  
122  	operation_chan_freq = wlan_get_operation_chan_freq(vdev);
123  	associated_ch_width =
124  			mlme_priv->connect_info.assoc_chan_info.assoc_ch_width;
125  	if (associated_ch_width == CH_WIDTH_INVALID) {
126  		mlme_debug("vdev %d : Invalid associated ch width for freq %d",
127  			   req->scan_req.vdev_id, operation_chan_freq);
128  		return QDF_STATUS_E_FAILURE;
129  	}
130  
131  	req->scan_req.dwell_time_passive =
132  			MLME_GET_CHAN_STATS_PASSIVE_SCAN_TIME;
133  	req->scan_req.dwell_time_passive_6g =
134  			MLME_GET_CHAN_STATS_PASSIVE_SCAN_TIME;
135  
136  	if (associated_ch_width == CH_WIDTH_20MHZ) {
137  		mlme_debug("vdev %d :Trigger scan for associated freq %d bw %d",
138  			   req->scan_req.vdev_id, operation_chan_freq,
139  			   associated_ch_width);
140  		req->scan_req.chan_list.num_chan = 1;
141  		req->scan_req.chan_list.chan[0].freq = operation_chan_freq;
142  		return QDF_STATUS_SUCCESS;
143  	}
144  
145  	if (wlan_reg_is_24ghz_ch_freq(operation_chan_freq) &&
146  	    associated_ch_width == CH_WIDTH_40MHZ) {
147  		sec_2g_freq =
148  			mlme_priv->connect_info.assoc_chan_info.sec_2g_freq;
149  		if (!sec_2g_freq) {
150  			mlme_debug("vdev %d : Invalid sec 2g freq for freq: %d",
151  				   req->scan_req.vdev_id, operation_chan_freq);
152  			return QDF_STATUS_E_FAILURE;
153  		}
154  
155  		if (operation_chan_freq > sec_2g_freq) {
156  			req->scan_req.chan_list.chan[0].freq = sec_2g_freq;
157  			req->scan_req.chan_list.chan[1].freq =
158  							operation_chan_freq;
159  		} else {
160  			req->scan_req.chan_list.chan[0].freq =
161  							operation_chan_freq;
162  			req->scan_req.chan_list.chan[1].freq = sec_2g_freq;
163  		}
164  
165  		req->scan_req.chan_list.num_chan = 2;
166  		return QDF_STATUS_SUCCESS;
167  	}
168  
169  	range = wlan_reg_get_bonded_chan_entry(operation_chan_freq,
170  					       associated_ch_width, 0);
171  	if (!range) {
172  		mlme_debug("vdev %d: Invalid freq range for freq: %d bw: %d",
173  			   req->scan_req.vdev_id, operation_chan_freq,
174  			   associated_ch_width);
175  		return QDF_STATUS_E_FAILURE;
176  	}
177  
178  	scan_chan_list = qdf_mem_malloc(sizeof(*scan_chan_list));
179  	if (!scan_chan_list)
180  		return QDF_STATUS_E_NOMEM;
181  
182  	scan_chan_list->num_chan = 0;
183  	first_freq  = range->start_freq;
184  	for (; first_freq <= range->end_freq; first_freq += BW_20_MHZ) {
185  		scan_chan_list->chan[scan_chan_list->num_chan].freq =
186  								first_freq;
187  		scan_chan_list->num_chan++;
188  	}
189  
190  	req->scan_req.chan_list.num_chan = scan_chan_list->num_chan;
191  
192  	mlme_debug("vdev %d : freq %d bw %d, range [%d-%d], Total freq %d",
193  		   req->scan_req.vdev_id, operation_chan_freq,
194  		   associated_ch_width, range->start_freq,
195  		   range->end_freq, req->scan_req.chan_list.num_chan);
196  
197  	buff_len = (QDF_MIN(req->scan_req.chan_list.num_chan,
198  		    MLME_MAX_CHAN_TO_PRINT) * MLME_CHAN_WEIGHT_CHAR_LEN) + 1;
199  
200  	chan_buff = qdf_mem_malloc(buff_len);
201  	if (!chan_buff) {
202  		qdf_mem_free(scan_chan_list);
203  		return QDF_STATUS_E_NOMEM;
204  	}
205  	for (i = 0; i < req->scan_req.chan_list.num_chan; i++) {
206  		req->scan_req.chan_list.chan[i].freq =
207  					scan_chan_list->chan[i].freq;
208  		buff_num += qdf_scnprintf(chan_buff + buff_num,
209  					  buff_len - buff_num, " %d",
210  					  req->scan_req.chan_list.chan[i].freq);
211  		chan_count++;
212  		if (chan_count >= MLME_MAX_CHAN_TO_PRINT) {
213  			mlme_debug("Freq list: %s", chan_buff);
214  			buff_num = 0;
215  			chan_count = 0;
216  		}
217  	}
218  
219  	if (buff_num)
220  		mlme_debug("Freq list: %s", chan_buff);
221  
222  	qdf_mem_free(chan_buff);
223  	qdf_mem_free(scan_chan_list);
224  
225  	return QDF_STATUS_SUCCESS;
226  }
227  
228  #ifdef WLAN_FEATURE_11BE
mlme_get_scan_phy_mode(void)229  static enum scan_phy_mode mlme_get_scan_phy_mode(void)
230  {
231  	return SCAN_PHY_MODE_11BE_EHT160;
232  }
233  
234  static enum scan_phy_mode
wlan_scan_get_11be_scan_phy_mode(enum wlan_phymode ch_phymode)235  wlan_scan_get_11be_scan_phy_mode(enum wlan_phymode ch_phymode)
236  {
237  	enum scan_phy_mode scan_phymode;
238  
239  	switch (ch_phymode) {
240  	case WLAN_PHYMODE_11BEA_EHT20:
241  		scan_phymode = SCAN_PHY_MODE_11BE_EHT20;
242  		break;
243  	case WLAN_PHYMODE_11BEG_EHT20:
244  		scan_phymode = SCAN_PHY_MODE_11BE_EHT20_2G;
245  		break;
246  	case WLAN_PHYMODE_11BEA_EHT40:
247  		scan_phymode = SCAN_PHY_MODE_11BE_EHT40;
248  		break;
249  	case WLAN_PHYMODE_11BEG_EHT40:
250  		scan_phymode = SCAN_PHY_MODE_11BE_EHT40_2G;
251  		break;
252  	case WLAN_PHYMODE_11BEA_EHT80:
253  		scan_phymode = SCAN_PHY_MODE_11BE_EHT80;
254  		break;
255  	case WLAN_PHYMODE_11BEG_EHT80:
256  		scan_phymode = SCAN_PHY_MODE_11BE_EHT80_2G;
257  		break;
258  	case WLAN_PHYMODE_11BEA_EHT160:
259  		scan_phymode = SCAN_PHY_MODE_11BE_EHT160;
260  		break;
261  	case WLAN_PHYMODE_11BEA_EHT320:
262  		scan_phymode = SCAN_PHY_MODE_11BE_EHT320;
263  		break;
264  	default:
265  		scan_phymode = SCAN_PHY_MODE_UNKNOWN;
266  		break;
267  	}
268  
269  	return scan_phymode;
270  }
271  #else
mlme_get_scan_phy_mode(void)272  static inline enum scan_phy_mode mlme_get_scan_phy_mode(void)
273  {
274  	return SCAN_PHY_MODE_UNKNOWN;
275  }
276  
277  static inline enum scan_phy_mode
wlan_scan_get_11be_scan_phy_mode(enum wlan_phymode ch_phymode)278  wlan_scan_get_11be_scan_phy_mode(enum wlan_phymode ch_phymode)
279  {
280  	return SCAN_PHY_MODE_UNKNOWN;
281  }
282  #endif
283  
284  /**
285   * wlan_scan_get_scan_phy_mode() - get scan phymode from channel phy mode
286   * @vdev: vdev common object
287   * @op_freq: operational frequency
288   * @vdev_id: vdev id
289   *
290   * Return: enum scan_phy_mode
291   */
292  static enum scan_phy_mode
wlan_scan_get_scan_phy_mode(struct wlan_objmgr_vdev * vdev,qdf_freq_t op_freq,uint32_t vdev_id)293  wlan_scan_get_scan_phy_mode(struct wlan_objmgr_vdev *vdev, qdf_freq_t op_freq,
294  			    uint32_t vdev_id)
295  {
296  	struct wlan_channel *des_chan;
297  	enum scan_phy_mode scan_phymode = SCAN_PHY_MODE_UNKNOWN;
298  
299  	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
300  	if (!des_chan) {
301  		mlme_debug("vdev %d : des_chan is null", vdev_id);
302  		return scan_phymode;
303  	}
304  
305  	switch (des_chan->ch_phymode) {
306  	case WLAN_PHYMODE_11A:
307  		scan_phymode = SCAN_PHY_MODE_11A;
308  		break;
309  	case WLAN_PHYMODE_11B:
310  		scan_phymode = SCAN_PHY_MODE_11B;
311  		break;
312  	case WLAN_PHYMODE_11G:
313  		scan_phymode = SCAN_PHY_MODE_11G;
314  		break;
315  	case WLAN_PHYMODE_11G_ONLY:
316  		scan_phymode = SCAN_PHY_MODE_11GONLY;
317  		break;
318  	case WLAN_PHYMODE_11NA_HT20:
319  		scan_phymode = SCAN_PHY_MODE_11NA_HT20;
320  		break;
321  	case WLAN_PHYMODE_11NG_HT20:
322  		scan_phymode = SCAN_PHY_MODE_11NG_HT20;
323  		break;
324  	case WLAN_PHYMODE_11NA_HT40:
325  		scan_phymode = SCAN_PHY_MODE_11NA_HT40;
326  		break;
327  	case WLAN_PHYMODE_11NG_HT40:
328  		scan_phymode = SCAN_PHY_MODE_11NG_HT40;
329  		break;
330  	case WLAN_PHYMODE_11AC_VHT20:
331  		scan_phymode = SCAN_PHY_MODE_11AC_VHT20;
332  		break;
333  	case WLAN_PHYMODE_11AC_VHT40:
334  		scan_phymode = SCAN_PHY_MODE_11AC_VHT40;
335  		break;
336  	case WLAN_PHYMODE_11AC_VHT80:
337  		scan_phymode = SCAN_PHY_MODE_11AC_VHT80;
338  		break;
339  	case WLAN_PHYMODE_11AC_VHT20_2G:
340  		scan_phymode = SCAN_PHY_MODE_11AC_VHT20_2G;
341  		break;
342  	case WLAN_PHYMODE_11AC_VHT40_2G:
343  		scan_phymode = SCAN_PHY_MODE_11AC_VHT40_2G;
344  		break;
345  	case WLAN_PHYMODE_11AC_VHT80_2G:
346  		scan_phymode = SCAN_PHY_MODE_11AC_VHT80_2G;
347  		break;
348  	case WLAN_PHYMODE_11AC_VHT80_80:
349  		scan_phymode = SCAN_PHY_MODE_11AC_VHT80_80;
350  		break;
351  	case WLAN_PHYMODE_11AC_VHT160:
352  		scan_phymode = SCAN_PHY_MODE_11AC_VHT160;
353  		break;
354  	case WLAN_PHYMODE_11AXA_HE20:
355  		scan_phymode = SCAN_PHY_MODE_11AX_HE20;
356  		break;
357  	case WLAN_PHYMODE_11AXG_HE20:
358  		scan_phymode = SCAN_PHY_MODE_11AX_HE20_2G;
359  		break;
360  	case WLAN_PHYMODE_11AXA_HE40:
361  		scan_phymode = SCAN_PHY_MODE_11AX_HE40;
362  		break;
363  	case WLAN_PHYMODE_11AXG_HE40:
364  		scan_phymode = SCAN_PHY_MODE_11AX_HE40_2G;
365  		break;
366  	case WLAN_PHYMODE_11AXA_HE80:
367  		scan_phymode = SCAN_PHY_MODE_11AX_HE80;
368  		break;
369  	case WLAN_PHYMODE_11AXG_HE80:
370  		scan_phymode = SCAN_PHY_MODE_11AX_HE80_2G;
371  		break;
372  	case WLAN_PHYMODE_11AXA_HE80_80:
373  		scan_phymode = SCAN_PHY_MODE_11AX_HE80_80;
374  		break;
375  	case WLAN_PHYMODE_11AXA_HE160:
376  		scan_phymode = SCAN_PHY_MODE_11AX_HE160;
377  		break;
378  	default:
379  		scan_phymode = SCAN_PHY_MODE_UNKNOWN;
380  		break;
381  	}
382  
383  	if (scan_phymode != SCAN_PHY_MODE_UNKNOWN)
384  		return scan_phymode;
385  
386  	scan_phymode = wlan_scan_get_11be_scan_phy_mode(des_chan->ch_phymode);
387  
388  	return scan_phymode;
389  }
390  
391  #ifdef WLAN_FEATURE_11BE
392  /**
393   * mlme_get_scan_phy_mode_for_chan_load() - get scan phymode from ch width
394   * @scan_ch_width: channel width
395   *
396   * Return: enum scan_phy_mode
397   */
398  static enum scan_phy_mode
mlme_get_scan_phy_mode_for_chan_load(enum phy_ch_width scan_ch_width)399  mlme_get_scan_phy_mode_for_chan_load(enum phy_ch_width scan_ch_width)
400  {
401  	enum scan_phy_mode scan_phymode = SCAN_PHY_MODE_UNKNOWN;
402  
403  	switch (scan_ch_width) {
404  	case CH_WIDTH_20MHZ:
405  		scan_phymode = SCAN_PHY_MODE_11BE_EHT20;
406  		break;
407  	case CH_WIDTH_40MHZ:
408  		scan_phymode = SCAN_PHY_MODE_11BE_EHT40;
409  		break;
410  	case CH_WIDTH_80MHZ:
411  		scan_phymode = SCAN_PHY_MODE_11BE_EHT80;
412  		break;
413  	case CH_WIDTH_160MHZ:
414  		scan_phymode = SCAN_PHY_MODE_11BE_EHT160;
415  		break;
416  	default:
417  		mlme_debug("Invalid scan_ch_width:%d", scan_ch_width);
418  		break;
419  	}
420  
421  	return scan_phymode;
422  }
423  #else
424  static inline enum scan_phy_mode
mlme_get_scan_phy_mode_for_chan_load(enum phy_ch_width scan_ch_width)425  mlme_get_scan_phy_mode_for_chan_load(enum phy_ch_width scan_ch_width)
426  {
427  	return SCAN_PHY_MODE_UNKNOWN;
428  }
429  #endif
430  
431  QDF_STATUS
mlme_update_freq_in_scan_start_req(struct wlan_objmgr_vdev * vdev,struct scan_start_request * req,enum phy_ch_width scan_ch_width,qdf_freq_t scan_freq,qdf_freq_t cen320_freq)432  mlme_update_freq_in_scan_start_req(struct wlan_objmgr_vdev *vdev,
433  				   struct scan_start_request *req,
434  				   enum phy_ch_width scan_ch_width,
435  				   qdf_freq_t scan_freq,
436  				   qdf_freq_t cen320_freq)
437  {
438  	const struct bonded_channel_freq *range;
439  	uint8_t num_chan;
440  	qdf_freq_t op_freq, center_20_freq, start_freq, end_freq;
441  	enum scan_phy_mode phymode = SCAN_PHY_MODE_UNKNOWN;
442  	uint8_t vdev_id = vdev->vdev_objmgr.vdev_id;
443  
444  	if (scan_freq != INVALID_CHANNEL)
445  		op_freq = scan_freq;
446  	else
447  		op_freq = wlan_get_operation_chan_freq(vdev);
448  
449  	mlme_debug("vdev %d :op_freq:%d, cen320_freq:%d, scan_ch_width: %d",
450  		   vdev_id, op_freq, cen320_freq, scan_ch_width);
451  
452  	if (scan_ch_width == CH_WIDTH_320MHZ) {
453  		if (!cen320_freq)
454  			return QDF_STATUS_E_FAILURE;
455  		range = wlan_reg_get_bonded_chan_entry(op_freq,
456  						       scan_ch_width,
457  						       cen320_freq);
458  		if (!range) {
459  			mlme_debug("vdev %d : range is null for freq %d",
460  				   vdev_id, op_freq);
461  			return QDF_STATUS_E_FAILURE;
462  		}
463  
464  		phymode = mlme_get_scan_phy_mode();
465  		if (phymode == SCAN_PHY_MODE_UNKNOWN) {
466  			mlme_debug("vdev %d : invalid scan phymode for freq %d",
467  				   vdev_id, op_freq);
468  			return QDF_STATUS_E_FAILURE;
469  		}
470  
471  		start_freq = range->start_freq;
472  		end_freq = range->end_freq;
473  
474  		/* fill connected 6 GHz ML link freq in wide band scan list */
475  		center_20_freq = start_freq + (7 * BW_20_MHZ);
476  		if (op_freq > center_20_freq)
477  			end_freq = op_freq;
478  		else
479  			start_freq = op_freq;
480  
481  		num_chan = req->scan_req.chan_list.num_chan;
482  		req->scan_req.chan_list.chan[num_chan].freq = start_freq;
483  		req->scan_req.chan_list.chan[num_chan].phymode = phymode;
484  		num_chan += 1;
485  		req->scan_req.chan_list.chan[num_chan].freq = end_freq;
486  		req->scan_req.chan_list.chan[num_chan].phymode = phymode;
487  		num_chan += 1;
488  		req->scan_req.chan_list.num_chan = num_chan;
489  	} else {
490  		if (scan_freq != INVALID_CHANNEL)
491  			phymode = mlme_get_scan_phy_mode_for_chan_load(scan_ch_width);
492  		else
493  			phymode = wlan_scan_get_scan_phy_mode(vdev, op_freq, vdev_id);
494  
495  		if (phymode == SCAN_PHY_MODE_UNKNOWN) {
496  			mlme_debug("vdev %d : invalid scan phymode for freq %d",
497  				   vdev_id, op_freq);
498  			return QDF_STATUS_E_FAILURE;
499  		}
500  
501  		num_chan = req->scan_req.chan_list.num_chan;
502  		req->scan_req.chan_list.chan[num_chan].freq = op_freq;
503  		req->scan_req.chan_list.chan[num_chan].phymode = phymode;
504  		req->scan_req.chan_list.num_chan += 1;
505  	}
506  
507  	return QDF_STATUS_SUCCESS;
508  }
509  
510  #ifdef WLAN_FEATURE_11BE_MLO
511  /**
512   * mlme_update_freq_from_link_ctx() - This API updates scan request from
513   * link context
514   * @links_info: pointer to MLO link info
515   * @req: pointer to scan request
516   *
517   * Return: QDF_STATUS
518   */
519  static QDF_STATUS
mlme_update_freq_from_link_ctx(struct mlo_link_info * links_info,struct scan_start_request * req)520  mlme_update_freq_from_link_ctx(struct mlo_link_info *links_info,
521  			       struct scan_start_request *req)
522  {
523  	const struct bonded_channel_freq *range;
524  	uint8_t num_chan;
525  	qdf_freq_t op_freq, center_20_freq, start_freq, end_freq;
526  	enum scan_phy_mode phymode;
527  	enum phy_ch_width scan_ch_width;
528  	struct wlan_channel *link_chan_info = links_info->link_chan_info;
529  
530  	if (!link_chan_info) {
531  		mlme_err("link chan info is null");
532  		return QDF_STATUS_E_NULL_VALUE;
533  	}
534  
535  	op_freq = link_chan_info->ch_freq;
536  	phymode = wlan_scan_get_11be_scan_phy_mode(link_chan_info->ch_phymode);
537  	if (phymode == SCAN_PHY_MODE_UNKNOWN) {
538  		mlme_err("invalid scan phymode for freq %d", op_freq);
539  		return QDF_STATUS_E_INVAL;
540  	}
541  
542  	scan_ch_width = wlan_mlme_get_ch_width_from_phymode(
543  						link_chan_info->ch_phymode);
544  
545  	if (scan_ch_width == CH_WIDTH_320MHZ) {
546  		range = wlan_reg_get_bonded_chan_entry(op_freq, scan_ch_width,
547  						link_chan_info->ch_cfreq2);
548  		if (!range) {
549  			mlme_err("range is null for freq %d center freq %d",
550  				 op_freq, link_chan_info->ch_cfreq2);
551  			return QDF_STATUS_E_NULL_VALUE;
552  		}
553  
554  		start_freq = range->start_freq;
555  		end_freq = range->end_freq;
556  
557  		/* fill connected 6 GHz ML link freq in wide band scan list */
558  		center_20_freq = start_freq + (7 * BW_20_MHZ);
559  		if (op_freq > center_20_freq)
560  			end_freq = op_freq;
561  		else
562  			start_freq = op_freq;
563  
564  		mlme_debug("op_freq:%d, c_freq:%d, start_freq:%d, end_freq:%d",
565  			   op_freq, center_20_freq, start_freq, end_freq);
566  
567  		num_chan = req->scan_req.chan_list.num_chan;
568  		req->scan_req.chan_list.chan[num_chan].freq = start_freq;
569  		req->scan_req.chan_list.chan[num_chan].phymode = phymode;
570  		num_chan += 1;
571  		req->scan_req.chan_list.chan[num_chan].freq = end_freq;
572  		req->scan_req.chan_list.chan[num_chan].phymode = phymode;
573  		num_chan += 1;
574  		req->scan_req.chan_list.num_chan = num_chan;
575  	} else {
576  		num_chan = req->scan_req.chan_list.num_chan;
577  		req->scan_req.chan_list.chan[num_chan].freq = op_freq;
578  		req->scan_req.chan_list.chan[num_chan].phymode = phymode;
579  		req->scan_req.chan_list.num_chan += 1;
580  	}
581  
582  	return QDF_STATUS_SUCCESS;
583  }
584  
585  /**
586   * mlme_fill_freq_in_mlo_wide_band_scan_start_req() - Fill frequencies in wide
587   * band scan req for mlo connection
588   * @vdev: vdev common object
589   * @req: pointer to scan request
590   *
591   * Return: QDF_STATUS
592   */
593  static QDF_STATUS
mlme_fill_freq_in_mlo_wide_band_scan_start_req(struct wlan_objmgr_vdev * vdev,struct scan_start_request * req)594  mlme_fill_freq_in_mlo_wide_band_scan_start_req(struct wlan_objmgr_vdev *vdev,
595  					struct scan_start_request *req)
596  {
597  	struct wlan_mlo_dev_context *mlo_dev_ctx;
598  	uint8_t i;
599  	QDF_STATUS status;
600  	struct mlo_link_switch_context *link_ctx;
601  
602  	mlo_dev_ctx = vdev->mlo_dev_ctx;
603  	if (!mlo_dev_ctx) {
604  		mlme_err("vdev %d :mlo_dev_ctx is NULL", req->scan_req.vdev_id);
605  		return QDF_STATUS_E_NULL_VALUE;
606  	}
607  
608  	link_ctx = mlo_dev_ctx->link_ctx;
609  	if (!link_ctx) {
610  		mlme_err("vdev %d :mlo_link_ctx is NULL",
611  			 req->scan_req.vdev_id);
612  		return QDF_STATUS_E_NULL_VALUE;
613  	}
614  
615  	for (i = 0; i < WLAN_MAX_ML_BSS_LINKS  &&
616  	     link_ctx->links_info[i].link_id != WLAN_INVALID_LINK_ID; i++) {
617  		status = mlme_update_freq_from_link_ctx(
618  						&link_ctx->links_info[i], req);
619  		if (QDF_IS_STATUS_ERROR(status)) {
620  			mlme_debug("freq update fails for link id %d",
621  				   link_ctx->links_info[i].link_id);
622  			return status;
623  		}
624  	}
625  
626  	mlme_debug("vdev %d :trigger wide band scan for mlo conn, num freq %d",
627  		   req->scan_req.vdev_id, req->scan_req.chan_list.num_chan);
628  	return QDF_STATUS_SUCCESS;
629  }
630  #else
631  static inline QDF_STATUS
mlme_fill_freq_in_mlo_wide_band_scan_start_req(struct wlan_objmgr_vdev * vdev,struct scan_start_request * req)632  mlme_fill_freq_in_mlo_wide_band_scan_start_req(struct wlan_objmgr_vdev *vdev,
633  					struct scan_start_request *req)
634  {
635  	return QDF_STATUS_E_FAILURE;
636  }
637  #endif
638  
639  /**
640   * mlme_fill_freq_in_wide_scan_start_request() - Fill frequencies in wide band
641   * scan req
642   * @vdev: vdev common object
643   * @req: pointer to scan request
644   *
645   * Return: QDF_STATUS
646   */
647  static QDF_STATUS
mlme_fill_freq_in_wide_scan_start_request(struct wlan_objmgr_vdev * vdev,struct scan_start_request * req)648  mlme_fill_freq_in_wide_scan_start_request(struct wlan_objmgr_vdev *vdev,
649  					  struct scan_start_request *req)
650  {
651  	struct mlme_legacy_priv *mlme_priv;
652  	enum phy_ch_width associated_ch_width;
653  	QDF_STATUS status;
654  	qdf_freq_t assoc_cen320_freq = 0;
655  
656  	req->scan_req.chan_list.num_chan = 0;
657  
658  	if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
659  		status = mlme_fill_freq_in_mlo_wide_band_scan_start_req(vdev,
660  						req);
661  		if (QDF_IS_STATUS_ERROR(status))
662  			return QDF_STATUS_E_FAILURE;
663  		goto update_param;
664  	}
665  
666  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
667  	if (!mlme_priv)
668  		return QDF_STATUS_E_FAILURE;
669  
670  	associated_ch_width =
671  		mlme_priv->connect_info.assoc_chan_info.assoc_ch_width;
672  	if (associated_ch_width == CH_WIDTH_INVALID) {
673  		mlme_debug("vdev %d :Invalid associated ch_width",
674  			   req->scan_req.vdev_id);
675  		return QDF_STATUS_E_FAILURE;
676  	}
677  
678  	/* Set center frequency of complete 320MHz */
679  	assoc_cen320_freq = mlme_priv->connect_info.assoc_chan_info.cen320_freq;
680  
681  	status = mlme_update_freq_in_scan_start_req(vdev, req,
682  						    associated_ch_width,
683  						    INVALID_CHANNEL,
684  						    assoc_cen320_freq);
685  	if (QDF_IS_STATUS_ERROR(status))
686  		return QDF_STATUS_E_FAILURE;
687  
688  	mlme_debug("vdev %d :trigger wide band scan, num freq %d",
689  		   req->scan_req.vdev_id, req->scan_req.chan_list.num_chan);
690  
691  update_param:
692  	req->scan_req.dwell_time_passive =
693  			MLME_GET_CHAN_STATS_WIDE_BAND_PASSIVE_SCAN_TIME;
694  	req->scan_req.dwell_time_passive_6g =
695  			MLME_GET_CHAN_STATS_WIDE_BAND_PASSIVE_SCAN_TIME;
696  
697  	req->scan_req.scan_f_wide_band = true;
698  	/*
699  	 * FW report CCA busy for each possible 20Mhz subbands of the
700  	 * wideband scan channel if below flag is true
701  	 */
702  	req->scan_req.scan_f_report_cca_busy_for_each_20mhz = true;
703  
704  	return QDF_STATUS_SUCCESS;
705  }
706  
mlme_connected_chan_stats_request(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)707  QDF_STATUS mlme_connected_chan_stats_request(struct wlan_objmgr_psoc *psoc,
708  					     uint8_t vdev_id)
709  {
710  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
711  	QDF_STATUS status;
712  	struct wlan_objmgr_vdev *vdev;
713  	struct scan_start_request *req;
714  
715  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
716  	if (!mlme_obj) {
717  		mlme_debug("vdev %d : NULL mlme psoc object", vdev_id);
718  		return QDF_STATUS_E_FAILURE;
719  	}
720  
721  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
722  						    WLAN_MLME_NB_ID);
723  	if (!vdev) {
724  		mlme_debug("vdev %d : NULL vdev object", vdev_id);
725  		return QDF_STATUS_E_FAILURE;
726  	}
727  
728  	req = qdf_mem_malloc(sizeof(*req));
729  	if (!req) {
730  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
731  		return QDF_STATUS_E_NOMEM;
732  	}
733  
734  	status = wlan_scan_init_default_params(vdev, req);
735  	if (QDF_IS_STATUS_ERROR(status))
736  		goto release;
737  
738  	req->scan_req.scan_id = wlan_scan_get_scan_id(psoc);
739  	req->scan_req.scan_req_id = mlme_obj->scan_requester_id;
740  	req->scan_req.vdev_id = vdev_id;
741  
742  	req->scan_req.scan_type = SCAN_TYPE_DEFAULT;
743  
744  	/* Fill channel list as per fw capability */
745  	if (wlan_psoc_nif_fw_ext2_cap_get(psoc,
746  			WLAN_CCA_BUSY_INFO_FOREACH_20MHZ)) {
747  		status = mlme_fill_freq_in_wide_scan_start_request(vdev, req);
748  		if (QDF_IS_STATUS_ERROR(status))
749  			goto release;
750  	} else {
751  		status = mlme_fill_freq_in_scan_start_request(vdev, req);
752  		if (QDF_IS_STATUS_ERROR(status))
753  			goto release;
754  	}
755  
756  	/* disable adatptive dwell time */
757  	req->scan_req.adaptive_dwell_time_mode = SCAN_DWELL_MODE_STATIC;
758  	/* to disable early 6Ghz scan bail out */
759  	req->scan_req.min_dwell_time_6g = 0;
760  	/* passive scan for CCA measurement */
761  	req->scan_req.scan_f_passive = true;
762  	/* Fw pause home channel when scan channel is same as home channel */
763  	req->scan_req.scan_f_pause_home_channel = true;
764  
765  	status = wlan_scan_start(req);
766  	if (QDF_IS_STATUS_ERROR(status)) {
767  		mlme_debug("vdev %d :Failed to send scan req, status %d",
768  			   vdev_id, status);
769  		goto release;
770  	}
771  
772  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
773  	return status;
774  release:
775  	qdf_mem_free(req);
776  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
777  	return status;
778  }
779  
mlme_get_vdev_he_ops(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)780  uint32_t mlme_get_vdev_he_ops(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
781  {
782  	struct vdev_mlme_obj *mlme_obj;
783  	uint32_t he_ops = 0;
784  	struct wlan_objmgr_vdev *vdev;
785  
786  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
787  						    WLAN_MLME_NB_ID);
788  	if (!vdev)
789  		return he_ops;
790  
791  	mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev);
792  	if (!mlme_obj) {
793  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
794  		mlme_legacy_err("Failed to get vdev MLME Obj");
795  		return he_ops;
796  	}
797  
798  	he_ops = mlme_obj->proto.he_ops_info.he_ops;
799  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
800  
801  	return he_ops;
802  }
803  
mlme_get_ini_vdev_config(struct wlan_objmgr_vdev * vdev)804  struct wlan_mlme_nss_chains *mlme_get_ini_vdev_config(
805  				struct wlan_objmgr_vdev *vdev)
806  {
807  	struct mlme_legacy_priv *mlme_priv;
808  
809  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
810  	if (!mlme_priv) {
811  		mlme_legacy_err("vdev legacy private object is NULL");
812  		return NULL;
813  	}
814  
815  	return &mlme_priv->ini_cfg;
816  }
817  
mlme_get_dynamic_oce_flags(struct wlan_objmgr_vdev * vdev)818  uint8_t *mlme_get_dynamic_oce_flags(struct wlan_objmgr_vdev *vdev)
819  {
820  	struct mlme_legacy_priv *mlme_priv;
821  
822  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
823  	if (!mlme_priv) {
824  		mlme_legacy_err("vdev legacy private object is NULL");
825  		return NULL;
826  	}
827  
828  	return &mlme_priv->sta_dynamic_oce_value;
829  }
830  
mlme_init_rate_config(struct vdev_mlme_obj * vdev_mlme)831  QDF_STATUS mlme_init_rate_config(struct vdev_mlme_obj *vdev_mlme)
832  {
833  	struct mlme_legacy_priv *mlme_priv;
834  
835  	mlme_priv = vdev_mlme->ext_vdev_ptr;
836  	if (!mlme_priv) {
837  		mlme_legacy_err("vdev legacy private object is NULL");
838  		return QDF_STATUS_E_FAILURE;
839  	}
840  
841  	mlme_priv->opr_rate_set.max_len =
842  		QDF_MIN(CFG_OPERATIONAL_RATE_SET_LEN, CFG_STR_DATA_LEN);
843  	mlme_priv->opr_rate_set.len = 0;
844  	mlme_priv->ext_opr_rate_set.max_len =
845  		QDF_MIN(CFG_EXTENDED_OPERATIONAL_RATE_SET_LEN,
846  			CFG_STR_DATA_LEN);
847  	mlme_priv->ext_opr_rate_set.len = 0;
848  	mlme_priv->mcs_rate_set.max_len =
849  		QDF_MIN(CFG_SUPPORTED_MCS_SET_LEN, CFG_STR_DATA_LEN);
850  	mlme_priv->mcs_rate_set.len = 0;
851  
852  	return QDF_STATUS_SUCCESS;
853  }
854  
mlme_init_connect_chan_info_config(struct vdev_mlme_obj * vdev_mlme)855  QDF_STATUS mlme_init_connect_chan_info_config(struct vdev_mlme_obj *vdev_mlme)
856  {
857  	struct mlme_legacy_priv *mlme_priv;
858  
859  	mlme_priv = vdev_mlme->ext_vdev_ptr;
860  	if (!mlme_priv) {
861  		mlme_legacy_err("vdev legacy private object is NULL");
862  		return QDF_STATUS_E_FAILURE;
863  	}
864  
865  	mlme_priv->connect_info.assoc_chan_info.assoc_ch_width =
866  							CH_WIDTH_INVALID;
867  	mlme_priv->connect_info.assoc_chan_info.omn_ie_ch_width =
868  							CH_WIDTH_INVALID;
869  	mlme_priv->connect_info.assoc_chan_info.sec_2g_freq = 0;
870  	mlme_priv->connect_info.assoc_chan_info.cen320_freq = 0;
871  
872  	return QDF_STATUS_SUCCESS;
873  }
874  
mlme_get_peer_mic_len(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * peer_mac,uint8_t * mic_len,uint8_t * mic_hdr_len)875  QDF_STATUS mlme_get_peer_mic_len(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
876  				 uint8_t *peer_mac, uint8_t *mic_len,
877  				 uint8_t *mic_hdr_len)
878  {
879  	struct wlan_objmgr_peer *peer;
880  	int32_t key_cipher;
881  
882  	if (!psoc || !mic_len || !mic_hdr_len || !peer_mac) {
883  		mlme_legacy_debug("psoc/mic_len/mic_hdr_len/peer_mac null");
884  		return QDF_STATUS_E_NULL_VALUE;
885  	}
886  
887  	peer = wlan_objmgr_get_peer(psoc, pdev_id,
888  				    peer_mac, WLAN_LEGACY_MAC_ID);
889  	if (!peer) {
890  		mlme_legacy_debug("Peer of peer_mac "QDF_MAC_ADDR_FMT" not found",
891  				  QDF_MAC_ADDR_REF(peer_mac));
892  		return QDF_STATUS_E_INVAL;
893  	}
894  
895  	key_cipher =
896  		wlan_crypto_get_peer_param(peer,
897  					   WLAN_CRYPTO_PARAM_UCAST_CIPHER);
898  
899  	wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
900  
901  	if (key_cipher < 0) {
902  		mlme_legacy_err("Invalid mgmt cipher");
903  		return QDF_STATUS_E_INVAL;
904  	}
905  
906  	if (key_cipher & (1 << WLAN_CRYPTO_CIPHER_AES_GCM) ||
907  	    key_cipher & (1 << WLAN_CRYPTO_CIPHER_AES_GCM_256)) {
908  		*mic_hdr_len = WLAN_IEEE80211_GCMP_HEADERLEN;
909  		*mic_len = WLAN_IEEE80211_GCMP_MICLEN;
910  	} else {
911  		*mic_hdr_len = IEEE80211_CCMP_HEADERLEN;
912  		*mic_len = IEEE80211_CCMP_MICLEN;
913  	}
914  	mlme_legacy_debug("peer "QDF_MAC_ADDR_FMT" hdr_len %d mic_len %d key_cipher 0x%x",
915  			  QDF_MAC_ADDR_REF(peer_mac),
916  			  *mic_hdr_len, *mic_len, key_cipher);
917  
918  	return QDF_STATUS_SUCCESS;
919  }
920  
921  void
wlan_acquire_peer_key_wakelock(struct wlan_objmgr_pdev * pdev,uint8_t * mac_addr)922  wlan_acquire_peer_key_wakelock(struct wlan_objmgr_pdev *pdev, uint8_t *mac_addr)
923  {
924  	uint8_t pdev_id;
925  	struct wlan_objmgr_peer *peer;
926  	struct peer_mlme_priv_obj *peer_priv;
927  	struct wlan_objmgr_psoc *psoc;
928  
929  	psoc = wlan_pdev_get_psoc(pdev);
930  	if (!psoc)
931  		return;
932  
933  	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
934  	peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
935  				    WLAN_LEGACY_MAC_ID);
936  	if (!peer)
937  		return;
938  
939  	peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
940  							  WLAN_UMAC_COMP_MLME);
941  	if (!peer_priv) {
942  		wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
943  		return;
944  	}
945  
946  	if (peer_priv->is_key_wakelock_set) {
947  		wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
948  		return;
949  	}
950  
951  	mlme_debug(QDF_MAC_ADDR_FMT ": Acquire set key wake lock for %d ms",
952  		   QDF_MAC_ADDR_REF(mac_addr),
953  		   MLME_PEER_SET_KEY_WAKELOCK_TIMEOUT);
954  	qdf_wake_lock_timeout_acquire(&peer_priv->peer_set_key_wakelock,
955  				      MLME_PEER_SET_KEY_WAKELOCK_TIMEOUT);
956  	qdf_runtime_pm_prevent_suspend(
957  			&peer_priv->peer_set_key_runtime_wakelock);
958  	peer_priv->is_key_wakelock_set = true;
959  
960  	wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
961  }
962  
963  void
wlan_release_peer_key_wakelock(struct wlan_objmgr_pdev * pdev,uint8_t * mac_addr)964  wlan_release_peer_key_wakelock(struct wlan_objmgr_pdev *pdev, uint8_t *mac_addr)
965  {
966  	uint8_t pdev_id;
967  	struct wlan_objmgr_peer *peer;
968  	struct peer_mlme_priv_obj *peer_priv;
969  	struct wlan_objmgr_psoc *psoc;
970  
971  	psoc = wlan_pdev_get_psoc(pdev);
972  	if (!psoc)
973  		return;
974  
975  	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
976  	peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
977  				    WLAN_LEGACY_MAC_ID);
978  	if (!peer)
979  		return;
980  
981  	peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
982  							  WLAN_UMAC_COMP_MLME);
983  	if (!peer_priv) {
984  		wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
985  		return;
986  	}
987  
988  	if (!peer_priv->is_key_wakelock_set) {
989  		wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
990  		return;
991  	}
992  
993  	peer_priv->is_key_wakelock_set = false;
994  	mlme_debug(QDF_MAC_ADDR_FMT ": Release set key wake lock",
995  		   QDF_MAC_ADDR_REF(mac_addr));
996  	qdf_wake_lock_release(&peer_priv->peer_set_key_wakelock,
997  			      WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
998  	qdf_runtime_pm_allow_suspend(
999  			&peer_priv->peer_set_key_runtime_wakelock);
1000  
1001  	wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
1002  }
1003  
1004  QDF_STATUS
mlme_peer_object_created_notification(struct wlan_objmgr_peer * peer,void * arg)1005  mlme_peer_object_created_notification(struct wlan_objmgr_peer *peer,
1006  				      void *arg)
1007  {
1008  	struct peer_mlme_priv_obj *peer_priv;
1009  	QDF_STATUS status;
1010  
1011  	if (!peer) {
1012  		mlme_legacy_err(" peer is NULL");
1013  		return QDF_STATUS_E_FAILURE;
1014  	}
1015  
1016  	peer_priv = qdf_mem_malloc(sizeof(*peer_priv));
1017  	if (!peer_priv)
1018  		return QDF_STATUS_E_NOMEM;
1019  
1020  	status = wlan_objmgr_peer_component_obj_attach(peer,
1021  						       WLAN_UMAC_COMP_MLME,
1022  						       (void *)peer_priv,
1023  						       QDF_STATUS_SUCCESS);
1024  
1025  	if (QDF_IS_STATUS_ERROR(status)) {
1026  		mlme_legacy_err("unable to attach peer_priv obj to peer obj");
1027  		qdf_mem_free(peer_priv);
1028  		return status;
1029  	}
1030  
1031  	qdf_wake_lock_create(&peer_priv->peer_set_key_wakelock, "peer_set_key");
1032  	qdf_runtime_lock_init(&peer_priv->peer_set_key_runtime_wakelock);
1033  	peer_priv->is_key_wakelock_set = false;
1034  	peer_priv->peer_ind_bw = CH_WIDTH_INVALID;
1035  
1036  	return status;
1037  }
1038  
1039  QDF_STATUS
mlme_peer_object_destroyed_notification(struct wlan_objmgr_peer * peer,void * arg)1040  mlme_peer_object_destroyed_notification(struct wlan_objmgr_peer *peer,
1041  					void *arg)
1042  {
1043  	struct peer_mlme_priv_obj *peer_priv;
1044  	QDF_STATUS status;
1045  
1046  	if (!peer) {
1047  		mlme_legacy_err(" peer is NULL");
1048  		return QDF_STATUS_E_FAILURE;
1049  	}
1050  
1051  	peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
1052  							  WLAN_UMAC_COMP_MLME);
1053  	if (!peer_priv) {
1054  		mlme_legacy_err(" peer MLME component object is NULL");
1055  		return QDF_STATUS_E_FAILURE;
1056  	}
1057  
1058  	peer_priv->is_key_wakelock_set = false;
1059  	qdf_runtime_lock_deinit(&peer_priv->peer_set_key_runtime_wakelock);
1060  	qdf_wake_lock_destroy(&peer_priv->peer_set_key_wakelock);
1061  
1062  	status = wlan_objmgr_peer_component_obj_detach(peer,
1063  						       WLAN_UMAC_COMP_MLME,
1064  						       peer_priv);
1065  
1066  	if (QDF_IS_STATUS_ERROR(status))
1067  		mlme_legacy_err("unable to detach peer_priv obj to peer obj");
1068  
1069  	mlme_free_peer_assoc_rsp_ie(peer_priv);
1070  	qdf_mem_free(peer_priv);
1071  
1072  	return status;
1073  }
1074  
mlme_init_chainmask_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_chainmask * chainmask_info)1075  static void mlme_init_chainmask_cfg(struct wlan_objmgr_psoc *psoc,
1076  				    struct wlan_mlme_chainmask *chainmask_info)
1077  {
1078  	chainmask_info->txchainmask1x1 =
1079  		cfg_get(psoc, CFG_VHT_ENABLE_1x1_TX_CHAINMASK);
1080  
1081  	chainmask_info->rxchainmask1x1 =
1082  		cfg_get(psoc, CFG_VHT_ENABLE_1x1_RX_CHAINMASK);
1083  
1084  	chainmask_info->tx_chain_mask_cck =
1085  		cfg_get(psoc, CFG_TX_CHAIN_MASK_CCK);
1086  
1087  	chainmask_info->tx_chain_mask_1ss =
1088  		cfg_get(psoc, CFG_TX_CHAIN_MASK_1SS);
1089  
1090  	chainmask_info->num_11b_tx_chains =
1091  		cfg_get(psoc, CFG_11B_NUM_TX_CHAIN);
1092  
1093  	chainmask_info->num_11ag_tx_chains =
1094  		cfg_get(psoc, CFG_11AG_NUM_TX_CHAIN);
1095  
1096  	chainmask_info->tx_chain_mask_2g =
1097  		cfg_get(psoc, CFG_TX_CHAIN_MASK_2G);
1098  
1099  	chainmask_info->rx_chain_mask_2g =
1100  		cfg_get(psoc, CFG_RX_CHAIN_MASK_2G);
1101  
1102  	chainmask_info->tx_chain_mask_5g =
1103  		cfg_get(psoc, CFG_TX_CHAIN_MASK_5G);
1104  
1105  	chainmask_info->rx_chain_mask_5g =
1106  		cfg_get(psoc, CFG_RX_CHAIN_MASK_5G);
1107  
1108  	chainmask_info->enable_bt_chain_separation =
1109  		cfg_get(psoc, CFG_ENABLE_BT_CHAIN_SEPARATION);
1110  }
1111  
mlme_init_ratemask_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_ratemask * ratemask_cfg)1112  static void mlme_init_ratemask_cfg(struct wlan_objmgr_psoc *psoc,
1113  				   struct wlan_mlme_ratemask *ratemask_cfg)
1114  {
1115  	uint32_t masks[CFG_MLME_RATE_MASK_LEN] = { 0 };
1116  	qdf_size_t len = 0;
1117  	QDF_STATUS status;
1118  
1119  	ratemask_cfg->type = cfg_get(psoc, CFG_RATEMASK_TYPE);
1120  	if ((ratemask_cfg->type <= WLAN_MLME_RATEMASK_TYPE_NO_MASK) ||
1121  	    (ratemask_cfg->type >= WLAN_MLME_RATEMASK_TYPE_MAX)) {
1122  		mlme_legacy_debug("Ratemask disabled");
1123  		return;
1124  	}
1125  
1126  	status = qdf_uint32_array_parse(cfg_get(psoc, CFG_RATEMASK_SET),
1127  					masks,
1128  					CFG_MLME_RATE_MASK_LEN,
1129  					&len);
1130  
1131  	if (status != QDF_STATUS_SUCCESS || len != CFG_MLME_RATE_MASK_LEN) {
1132  		/* Do not enable ratemask if config is invalid */
1133  		ratemask_cfg->type = WLAN_MLME_RATEMASK_TYPE_NO_MASK;
1134  		mlme_legacy_err("Failed to parse ratemask");
1135  		return;
1136  	}
1137  
1138  	ratemask_cfg->lower32 = masks[0];
1139  	ratemask_cfg->higher32 = masks[1];
1140  	ratemask_cfg->lower32_2 = masks[2];
1141  	ratemask_cfg->higher32_2 = masks[3];
1142  	mlme_legacy_debug("Ratemask type: %d, masks:0x%x, 0x%x, 0x%x, 0x%x",
1143  			  ratemask_cfg->type, ratemask_cfg->lower32,
1144  			  ratemask_cfg->higher32, ratemask_cfg->lower32_2,
1145  			  ratemask_cfg->higher32_2);
1146  }
1147  
mlme_init_pmf_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1148  static void mlme_init_pmf_cfg(struct wlan_objmgr_psoc *psoc,
1149  			      struct wlan_mlme_generic *gen)
1150  {
1151  	gen->pmf_sa_query_max_retries =
1152  		cfg_get(psoc, CFG_PMF_SA_QUERY_MAX_RETRIES);
1153  	gen->pmf_sa_query_retry_interval =
1154  		cfg_get(psoc, CFG_PMF_SA_QUERY_RETRY_INTERVAL);
1155  }
1156  
1157  #ifdef WLAN_FEATURE_11BE
mlme_init_oem_eht_mlo_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1158  static inline void mlme_init_oem_eht_mlo_cfg(struct wlan_objmgr_psoc *psoc,
1159  					     struct wlan_mlme_generic *gen)
1160  {
1161  	gen->oem_eht_mlo_crypto_bitmap =
1162  				cfg_get(psoc, CFG_OEM_EHT_MLO_CRYPTO_BITMAP);
1163  }
1164  #else
mlme_init_oem_eht_mlo_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1165  static inline void mlme_init_oem_eht_mlo_cfg(struct wlan_objmgr_psoc *psoc,
1166  					     struct wlan_mlme_generic *gen)
1167  {
1168  }
1169  #endif /* WLAN_FEATURE_11BE */
1170  
1171  #ifdef WLAN_FEATURE_LPSS
1172  static inline void
mlme_init_lpass_support_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1173  mlme_init_lpass_support_cfg(struct wlan_objmgr_psoc *psoc,
1174  			    struct wlan_mlme_generic *gen)
1175  {
1176  	gen->lpass_support = cfg_get(psoc, CFG_ENABLE_LPASS_SUPPORT);
1177  }
1178  #else
1179  static inline void
mlme_init_lpass_support_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1180  mlme_init_lpass_support_cfg(struct wlan_objmgr_psoc *psoc,
1181  			    struct wlan_mlme_generic *gen)
1182  {
1183  	gen->lpass_support = cfg_default(CFG_ENABLE_LPASS_SUPPORT);
1184  }
1185  #endif
1186  
1187  #ifdef FEATURE_WDS
1188  /**
1189   * mlme_init_wds_config_cfg() - initialize wds_mode flag
1190   * @psoc: Pointer to PSOC
1191   * @gen: pointer to generic CFG items
1192   *
1193   * Return: None
1194   */
mlme_init_wds_config_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1195  static void mlme_init_wds_config_cfg(struct wlan_objmgr_psoc *psoc,
1196  				     struct wlan_mlme_generic *gen)
1197  {
1198  	gen->wds_mode = cfg_get(psoc, CFG_WDS_MODE);
1199  }
1200  #else
mlme_init_wds_config_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1201  static void mlme_init_wds_config_cfg(struct wlan_objmgr_psoc *psoc,
1202  				     struct wlan_mlme_generic *gen)
1203  {
1204  }
1205  #endif
1206  
1207  #ifdef CONFIG_BAND_6GHZ
1208  /**
1209   * mlme_init_disable_vlp_sta_conn_to_sp_ap() - initialize disable vlp STA
1210   *                                             connection to sp AP flag
1211   * @psoc: Pointer to PSOC
1212   * @gen: pointer to generic CFG items
1213   *
1214   * Return: None
1215   */
mlme_init_disable_vlp_sta_conn_to_sp_ap(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1216  static void mlme_init_disable_vlp_sta_conn_to_sp_ap(
1217  						struct wlan_objmgr_psoc *psoc,
1218  						struct wlan_mlme_generic *gen)
1219  {
1220  	gen->disable_vlp_sta_conn_to_sp_ap =
1221  		cfg_default(CFG_DISABLE_VLP_STA_CONN_TO_SP_AP);
1222  }
1223  #else
mlme_init_disable_vlp_sta_conn_to_sp_ap(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1224  static void mlme_init_disable_vlp_sta_conn_to_sp_ap(
1225  						struct wlan_objmgr_psoc *psoc,
1226  						struct wlan_mlme_generic *gen)
1227  {
1228  }
1229  #endif
1230  
1231  #ifdef CONFIG_BAND_6GHZ
1232  /**
1233   * mlme_init_standard_6ghz_conn_policy() - initialize standard 6GHz
1234   *                                         policy connection flag
1235   * @psoc: Pointer to PSOC
1236   * @gen: pointer to generic CFG items
1237   *
1238   * Return: None
1239   */
mlme_init_standard_6ghz_conn_policy(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1240  static void mlme_init_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
1241  						struct wlan_mlme_generic *gen)
1242  {
1243  	gen->std_6ghz_conn_policy =
1244  		cfg_get(psoc, CFG_6GHZ_STANDARD_CONNECTION_POLICY);
1245  }
1246  #else
mlme_init_standard_6ghz_conn_policy(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1247  static void mlme_init_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
1248  						struct wlan_mlme_generic *gen)
1249  {
1250  }
1251  #endif
1252  
1253  /**
1254   * mlme_init_mgmt_hw_tx_retry_count_cfg() - initialize mgmt hw tx retry count
1255   * @psoc: Pointer to PSOC
1256   * @gen: pointer to generic CFG items
1257   *
1258   * Return: None
1259   */
mlme_init_mgmt_hw_tx_retry_count_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1260  static void mlme_init_mgmt_hw_tx_retry_count_cfg(
1261  			struct wlan_objmgr_psoc *psoc,
1262  			struct wlan_mlme_generic *gen)
1263  {
1264  	uint32_t i;
1265  	qdf_size_t out_size = 0;
1266  	uint8_t count_array[MGMT_FRM_HW_TX_RETRY_COUNT_STR_LEN];
1267  
1268  	qdf_uint8_array_parse(cfg_get(psoc, CFG_MGMT_FRAME_HW_TX_RETRY_COUNT),
1269  			      count_array,
1270  			      MGMT_FRM_HW_TX_RETRY_COUNT_STR_LEN,
1271  			      &out_size);
1272  
1273  	for (i = 0; i + 1 < out_size; i += 2) {
1274  		if (count_array[i] >= CFG_FRAME_TYPE_MAX) {
1275  			mlme_legacy_debug("invalid frm type %d",
1276  					  count_array[i]);
1277  			continue;
1278  		}
1279  		if (count_array[i + 1] >= MAX_MGMT_HW_TX_RETRY_COUNT) {
1280  			mlme_legacy_debug("mgmt hw tx retry count %d for frm %d, limit to %d",
1281  					  count_array[i + 1],
1282  					  count_array[i],
1283  					  MAX_MGMT_HW_TX_RETRY_COUNT);
1284  			gen->mgmt_hw_tx_retry_count[count_array[i]] =
1285  						MAX_MGMT_HW_TX_RETRY_COUNT;
1286  		} else {
1287  			mlme_legacy_debug("mgmt hw tx retry count %d for frm %d",
1288  					  count_array[i + 1],
1289  					  count_array[i]);
1290  			gen->mgmt_hw_tx_retry_count[count_array[i]] =
1291  							count_array[i + 1];
1292  		}
1293  	}
1294  }
1295  
1296  #ifdef WLAN_FEATURE_11BE_MLO
1297  /**
1298   * mlme_init_emlsr_mode() - initialize emlsr mode enable flag
1299   * @psoc: Pointer to PSOC
1300   * @gen: pointer to generic CFG items
1301   *
1302   * Return: None
1303   */
mlme_init_emlsr_mode(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1304  static void mlme_init_emlsr_mode(struct wlan_objmgr_psoc *psoc,
1305  				 struct wlan_mlme_generic *gen)
1306  {
1307  	gen->enable_emlsr_mode = cfg_default(CFG_EMLSR_MODE_ENABLE);
1308  }
1309  
1310  /**
1311   * mlme_init_tl2m_negotiation_support() - initialize t2lm support
1312   * @psoc: Pointer to PSOC
1313   * @gen: pointer to generic CFG items
1314   *
1315   * Return: None
1316   */
mlme_init_tl2m_negotiation_support(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1317  static void mlme_init_tl2m_negotiation_support(struct wlan_objmgr_psoc *psoc,
1318  						 struct wlan_mlme_generic *gen)
1319  {
1320  	gen->t2lm_negotiation_support = cfg_get(psoc,
1321  						CFG_T2LM_NEGOTIATION_SUPPORT);
1322  }
1323  #else
mlme_init_emlsr_mode(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1324  static void mlme_init_emlsr_mode(struct wlan_objmgr_psoc *psoc,
1325  				 struct wlan_mlme_generic *gen)
1326  {
1327  }
1328  
mlme_init_tl2m_negotiation_support(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1329  static void mlme_init_tl2m_negotiation_support(struct wlan_objmgr_psoc *psoc,
1330  						 struct wlan_mlme_generic *gen)
1331  {
1332  }
1333  #endif
1334  
1335  #if defined(WLAN_FEATURE_SR)
1336  /**
1337   * mlme_init_sr_ini_cfg() - initialize SR(Spatial Reuse) ini
1338   * @psoc: Pointer to PSOC
1339   * @gen: pointer to generic CFG items
1340   *
1341   * Return: None
1342   */
mlme_init_sr_ini_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1343  static void mlme_init_sr_ini_cfg(struct wlan_objmgr_psoc *psoc,
1344  				 struct wlan_mlme_generic *gen)
1345  {
1346  	gen->sr_enable_modes = cfg_get(psoc, CFG_SR_ENABLE_MODES);
1347  }
1348  #else
mlme_init_sr_ini_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1349  static void mlme_init_sr_ini_cfg(struct wlan_objmgr_psoc *psoc,
1350  				 struct wlan_mlme_generic *gen)
1351  {}
1352  #endif
1353  
mlme_init_generic_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_generic * gen)1354  static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc,
1355  				  struct wlan_mlme_generic *gen)
1356  {
1357  	gen->rtt3_enabled = cfg_default(CFG_RTT3_ENABLE);
1358  	gen->rtt_mac_randomization =
1359  		cfg_get(psoc, CFG_ENABLE_RTT_MAC_RANDOMIZATION);
1360  	gen->band_capability =
1361  		cfg_get(psoc, CFG_BAND_CAPABILITY);
1362  	if (!gen->band_capability)
1363  		gen->band_capability = REG_BAND_MASK_ALL;
1364  	gen->band = gen->band_capability;
1365  	gen->select_5ghz_margin =
1366  		cfg_get(psoc, CFG_SELECT_5GHZ_MARGIN);
1367  	gen->sub_20_chan_width =
1368  		cfg_get(psoc, CFG_SUB_20_CHANNEL_WIDTH);
1369  	gen->ito_repeat_count =
1370  		cfg_get(psoc, CFG_ITO_REPEAT_COUNT);
1371  	gen->dropped_pkt_disconnect_thresh =
1372  		cfg_get(psoc, CFG_DROPPED_PKT_DISCONNECT_THRESHOLD);
1373  	gen->prevent_link_down =
1374  		cfg_get(psoc, CFG_PREVENT_LINK_DOWN);
1375  	gen->memory_deep_sleep =
1376  		cfg_get(psoc, CFG_ENABLE_MEM_DEEP_SLEEP);
1377  	gen->cck_tx_fir_override =
1378  		cfg_get(psoc, CFG_ENABLE_CCK_TX_FIR_OVERRIDE);
1379  	gen->crash_inject =
1380  		cfg_get(psoc, CFG_ENABLE_CRASH_INJECT);
1381  	gen->self_recovery =
1382  		cfg_get(psoc, CFG_ENABLE_SELF_RECOVERY);
1383  	gen->sap_dot11mc =
1384  		cfg_get(psoc, CFG_SAP_DOT11MC);
1385  	gen->fatal_event_trigger =
1386  		cfg_get(psoc, CFG_ENABLE_FATAL_EVENT_TRIGGER);
1387  	gen->optimize_ca_event =
1388  		cfg_get(psoc, CFG_OPTIMIZE_CA_EVENT);
1389  	gen->fw_timeout_crash =
1390  		cfg_get(psoc, CFG_CRASH_FW_TIMEOUT);
1391  	gen->debug_packet_log = cfg_get(psoc, CFG_ENABLE_DEBUG_PACKET_LOG);
1392  	gen->enable_deauth_to_disassoc_map =
1393  		cfg_get(psoc, CFG_ENABLE_DEAUTH_TO_DISASSOC_MAP);
1394  	gen->wls_6ghz_capable = cfg_get(psoc, CFG_WLS_6GHZ_CAPABLE);
1395  	mlme_init_pmf_cfg(psoc, gen);
1396  	mlme_init_oem_eht_mlo_cfg(psoc, gen);
1397  	mlme_init_lpass_support_cfg(psoc, gen);
1398  	gen->enabled_rf_test_mode = cfg_default(CFG_RF_TEST_MODE_SUPP_ENABLED);
1399  	gen->enabled_11h = cfg_get(psoc, CFG_11H_SUPPORT_ENABLED);
1400  	gen->enabled_11d = cfg_get(psoc, CFG_11D_SUPPORT_ENABLED);
1401  	gen->enable_beacon_reception_stats =
1402  		cfg_get(psoc, CFG_ENABLE_BEACON_RECEPTION_STATS);
1403  	gen->disable_4way_hs_offload =
1404  		cfg_get(psoc, CFG_DISABLE_4WAY_HS_OFFLOAD);
1405  	gen->mgmt_retry_max = cfg_get(psoc, CFG_MGMT_RETRY_MAX);
1406  	gen->bmiss_skip_full_scan = cfg_get(psoc, CFG_BMISS_SKIP_FULL_SCAN);
1407  	gen->enable_ring_buffer = cfg_get(psoc, CFG_ENABLE_RING_BUFFER);
1408  	gen->enable_peer_unmap_conf_support =
1409  		cfg_get(psoc, CFG_DP_ENABLE_PEER_UMAP_CONF_SUPPORT);
1410  	gen->dfs_chan_ageout_time =
1411  		cfg_get(psoc, CFG_DFS_CHAN_AGEOUT_TIME);
1412  	gen->sae_connect_retries =
1413  		cfg_get(psoc, CFG_SAE_CONNECION_RETRIES);
1414  	gen->monitor_mode_concurrency =
1415  		cfg_get(psoc, CFG_MONITOR_MODE_CONCURRENCY);
1416  	gen->tx_retry_multiplier = cfg_get(psoc, CFG_TX_RETRY_MULTIPLIER);
1417  	gen->enable_he_mcs0_for_6ghz_mgmt =
1418  		cfg_get(psoc, CFG_ENABLE_HE_MCS0_MGMT_6GHZ);
1419  	mlme_init_sr_ini_cfg(psoc, gen);
1420  	mlme_init_wds_config_cfg(psoc, gen);
1421  	mlme_init_mgmt_hw_tx_retry_count_cfg(psoc, gen);
1422  	mlme_init_emlsr_mode(psoc, gen);
1423  	mlme_init_tl2m_negotiation_support(psoc, gen);
1424  	mlme_init_standard_6ghz_conn_policy(psoc, gen);
1425  	mlme_init_disable_vlp_sta_conn_to_sp_ap(psoc, gen);
1426  }
1427  
mlme_init_edca_ani_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_edca_params * edca_params)1428  static void mlme_init_edca_ani_cfg(struct wlan_objmgr_psoc *psoc,
1429  				   struct wlan_mlme_edca_params *edca_params)
1430  {
1431  	/* initialize the max allowed array length for read/write */
1432  	edca_params->ani_acbe_l.max_len = CFG_EDCA_DATA_LEN;
1433  	edca_params->ani_acbk_l.max_len = CFG_EDCA_DATA_LEN;
1434  	edca_params->ani_acvi_l.max_len = CFG_EDCA_DATA_LEN;
1435  	edca_params->ani_acvo_l.max_len = CFG_EDCA_DATA_LEN;
1436  
1437  	edca_params->ani_acbe_b.max_len = CFG_EDCA_DATA_LEN;
1438  	edca_params->ani_acbk_b.max_len = CFG_EDCA_DATA_LEN;
1439  	edca_params->ani_acvi_b.max_len = CFG_EDCA_DATA_LEN;
1440  	edca_params->ani_acvo_b.max_len = CFG_EDCA_DATA_LEN;
1441  
1442  	/* parse the ETSI edca parameters from cfg string for BK,BE,VI,VO ac */
1443  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACBK_LOCAL),
1444  			      edca_params->ani_acbk_l.data,
1445  			      CFG_EDCA_DATA_LEN,
1446  			      &edca_params->ani_acbk_l.len);
1447  
1448  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACBE_LOCAL),
1449  			      edca_params->ani_acbe_l.data,
1450  			      CFG_EDCA_DATA_LEN,
1451  			      &edca_params->ani_acbe_l.len);
1452  
1453  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACVI_LOCAL),
1454  			      edca_params->ani_acvi_l.data,
1455  			      CFG_EDCA_DATA_LEN,
1456  			      &edca_params->ani_acvi_l.len);
1457  
1458  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACVO_LOCAL),
1459  			      edca_params->ani_acvo_l.data,
1460  			      CFG_EDCA_DATA_LEN,
1461  			      &edca_params->ani_acvo_l.len);
1462  
1463  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACBK),
1464  			      edca_params->ani_acbk_b.data,
1465  			      CFG_EDCA_DATA_LEN,
1466  			      &edca_params->ani_acbk_b.len);
1467  
1468  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACBE),
1469  			      edca_params->ani_acbe_b.data,
1470  			      CFG_EDCA_DATA_LEN,
1471  			      &edca_params->ani_acbe_b.len);
1472  
1473  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACVI),
1474  			      edca_params->ani_acvi_b.data,
1475  			      CFG_EDCA_DATA_LEN,
1476  			      &edca_params->ani_acvi_b.len);
1477  
1478  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ANI_ACVO),
1479  			      edca_params->ani_acvo_b.data,
1480  			      CFG_EDCA_DATA_LEN,
1481  			      &edca_params->ani_acvo_b.len);
1482  }
1483  
mlme_init_edca_wme_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_edca_params * edca_params)1484  static void mlme_init_edca_wme_cfg(struct wlan_objmgr_psoc *psoc,
1485  				   struct wlan_mlme_edca_params *edca_params)
1486  {
1487  	/* initialize the max allowed array length for read/write */
1488  	edca_params->wme_acbk_l.max_len = CFG_EDCA_DATA_LEN;
1489  	edca_params->wme_acbe_l.max_len = CFG_EDCA_DATA_LEN;
1490  	edca_params->wme_acvi_l.max_len = CFG_EDCA_DATA_LEN;
1491  	edca_params->wme_acvo_l.max_len = CFG_EDCA_DATA_LEN;
1492  
1493  	edca_params->wme_acbk_b.max_len = CFG_EDCA_DATA_LEN;
1494  	edca_params->wme_acbe_b.max_len = CFG_EDCA_DATA_LEN;
1495  	edca_params->wme_acvi_b.max_len = CFG_EDCA_DATA_LEN;
1496  	edca_params->wme_acvo_b.max_len = CFG_EDCA_DATA_LEN;
1497  
1498  	/* parse the WME edca parameters from cfg string for BK,BE,VI,VO ac */
1499  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACBK_LOCAL),
1500  			      edca_params->wme_acbk_l.data,
1501  			      CFG_EDCA_DATA_LEN,
1502  			      &edca_params->wme_acbk_l.len);
1503  
1504  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACBE_LOCAL),
1505  			      edca_params->wme_acbe_l.data,
1506  			      CFG_EDCA_DATA_LEN,
1507  			      &edca_params->wme_acbe_l.len);
1508  
1509  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACVI_LOCAL),
1510  			      edca_params->wme_acvi_l.data,
1511  			      CFG_EDCA_DATA_LEN,
1512  			      &edca_params->wme_acvi_l.len);
1513  
1514  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACVO_LOCAL),
1515  			      edca_params->wme_acvo_l.data,
1516  			      CFG_EDCA_DATA_LEN,
1517  			      &edca_params->wme_acvo_l.len);
1518  
1519  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACBK),
1520  			      edca_params->wme_acbk_b.data,
1521  			      CFG_EDCA_DATA_LEN,
1522  			      &edca_params->wme_acbk_b.len);
1523  
1524  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACBE),
1525  			      edca_params->wme_acbe_b.data,
1526  			      CFG_EDCA_DATA_LEN,
1527  			      &edca_params->wme_acbe_b.len);
1528  
1529  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACVI),
1530  			      edca_params->wme_acvi_b.data,
1531  			      CFG_EDCA_DATA_LEN,
1532  			      &edca_params->wme_acvi_b.len);
1533  
1534  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_WME_ACVO),
1535  			      edca_params->wme_acvo_b.data,
1536  			      CFG_EDCA_DATA_LEN,
1537  			      &edca_params->wme_acvo_b.len);
1538  }
1539  
mlme_init_edca_etsi_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_edca_params * edca_params)1540  static void mlme_init_edca_etsi_cfg(struct wlan_objmgr_psoc *psoc,
1541  				    struct wlan_mlme_edca_params *edca_params)
1542  {
1543  	/* initialize the max allowed array length for read/write */
1544  	edca_params->etsi_acbe_l.max_len = CFG_EDCA_DATA_LEN;
1545  	edca_params->etsi_acbk_l.max_len = CFG_EDCA_DATA_LEN;
1546  	edca_params->etsi_acvi_l.max_len = CFG_EDCA_DATA_LEN;
1547  	edca_params->etsi_acvo_l.max_len = CFG_EDCA_DATA_LEN;
1548  
1549  	edca_params->etsi_acbe_b.max_len = CFG_EDCA_DATA_LEN;
1550  	edca_params->etsi_acbk_b.max_len = CFG_EDCA_DATA_LEN;
1551  	edca_params->etsi_acvi_b.max_len = CFG_EDCA_DATA_LEN;
1552  	edca_params->etsi_acvo_b.max_len = CFG_EDCA_DATA_LEN;
1553  
1554  	/* parse the ETSI edca parameters from cfg string for BK,BE,VI,VO ac */
1555  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACBK_LOCAL),
1556  			      edca_params->etsi_acbk_l.data,
1557  			      CFG_EDCA_DATA_LEN,
1558  			      &edca_params->etsi_acbk_l.len);
1559  
1560  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACBE_LOCAL),
1561  			      edca_params->etsi_acbe_l.data,
1562  			      CFG_EDCA_DATA_LEN,
1563  			      &edca_params->etsi_acbe_l.len);
1564  
1565  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACVI_LOCAL),
1566  			      edca_params->etsi_acvi_l.data,
1567  			      CFG_EDCA_DATA_LEN,
1568  			      &edca_params->etsi_acvi_l.len);
1569  
1570  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACVO_LOCAL),
1571  			      edca_params->etsi_acvo_l.data,
1572  			      CFG_EDCA_DATA_LEN,
1573  			      &edca_params->etsi_acvo_l.len);
1574  
1575  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACBK),
1576  			      edca_params->etsi_acbk_b.data,
1577  			      CFG_EDCA_DATA_LEN,
1578  			      &edca_params->etsi_acbk_b.len);
1579  
1580  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACBE),
1581  			      edca_params->etsi_acbe_b.data,
1582  			      CFG_EDCA_DATA_LEN,
1583  			      &edca_params->etsi_acbe_b.len);
1584  
1585  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACVI),
1586  			      edca_params->etsi_acvi_b.data,
1587  			      CFG_EDCA_DATA_LEN,
1588  			      &edca_params->etsi_acvi_b.len);
1589  
1590  	qdf_uint8_array_parse(cfg_get(psoc, CFG_EDCA_ETSI_ACVO),
1591  			      edca_params->etsi_acvo_b.data,
1592  			      CFG_EDCA_DATA_LEN,
1593  			      &edca_params->etsi_acvo_b.len);
1594  }
1595  
1596  static void
mlme_init_qos_edca_params(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_edca_params * edca_params)1597  mlme_init_qos_edca_params(struct wlan_objmgr_psoc *psoc,
1598  			  struct wlan_mlme_edca_params *edca_params)
1599  {
1600  	edca_params->enable_edca_params =
1601  			cfg_get(psoc, CFG_EDCA_ENABLE_PARAM);
1602  
1603  	edca_params->enable_wmm_txop =
1604  			cfg_get(psoc, CFG_ENABLE_WMM_TXOP);
1605  	edca_params->edca_ac_vo.vo_cwmin =
1606  			cfg_get(psoc, CFG_EDCA_VO_CWMIN);
1607  	edca_params->edca_ac_vo.vo_cwmax =
1608  			cfg_get(psoc, CFG_EDCA_VO_CWMAX);
1609  	edca_params->edca_ac_vo.vo_aifs =
1610  			cfg_get(psoc, CFG_EDCA_VO_AIFS);
1611  
1612  	edca_params->edca_ac_vi.vi_cwmin =
1613  			cfg_get(psoc, CFG_EDCA_VI_CWMIN);
1614  	edca_params->edca_ac_vi.vi_cwmax =
1615  			cfg_get(psoc, CFG_EDCA_VI_CWMAX);
1616  	edca_params->edca_ac_vi.vi_aifs =
1617  			cfg_get(psoc, CFG_EDCA_VI_AIFS);
1618  
1619  	edca_params->edca_ac_bk.bk_cwmin =
1620  			cfg_get(psoc, CFG_EDCA_BK_CWMIN);
1621  	edca_params->edca_ac_bk.bk_cwmax =
1622  			cfg_get(psoc, CFG_EDCA_BK_CWMAX);
1623  	edca_params->edca_ac_bk.bk_aifs =
1624  			cfg_get(psoc, CFG_EDCA_BK_AIFS);
1625  
1626  	edca_params->edca_ac_be.be_cwmin =
1627  			cfg_get(psoc, CFG_EDCA_BE_CWMIN);
1628  	edca_params->edca_ac_be.be_cwmax =
1629  			cfg_get(psoc, CFG_EDCA_BE_CWMAX);
1630  	edca_params->edca_ac_be.be_aifs =
1631  			cfg_get(psoc, CFG_EDCA_BE_AIFS);
1632  
1633  	edca_params->edca_param_type =
1634  			cfg_get(psoc, CFG_EDCA_PIFS_PARAM_TYPE);
1635  }
1636  
mlme_init_edca_params(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_edca_params * edca_params)1637  static void mlme_init_edca_params(struct wlan_objmgr_psoc *psoc,
1638  				  struct wlan_mlme_edca_params *edca_params)
1639  {
1640  	mlme_init_edca_ani_cfg(psoc, edca_params);
1641  	mlme_init_edca_wme_cfg(psoc, edca_params);
1642  	mlme_init_edca_etsi_cfg(psoc, edca_params);
1643  	mlme_init_qos_edca_params(psoc, edca_params);
1644  }
1645  
mlme_init_timeout_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_timeout * timeouts)1646  static void mlme_init_timeout_cfg(struct wlan_objmgr_psoc *psoc,
1647  				  struct wlan_mlme_timeout *timeouts)
1648  {
1649  	timeouts->join_failure_timeout =
1650  			cfg_get(psoc, CFG_JOIN_FAILURE_TIMEOUT);
1651  	timeouts->join_failure_timeout_ori = timeouts->join_failure_timeout;
1652  	timeouts->probe_req_retry_timeout = JOIN_PROBE_REQ_TIMER_MS;
1653  	timeouts->auth_failure_timeout =
1654  			cfg_get(psoc, CFG_AUTH_FAILURE_TIMEOUT);
1655  	timeouts->auth_rsp_timeout =
1656  			cfg_get(psoc, CFG_AUTH_RSP_TIMEOUT);
1657  	timeouts->assoc_failure_timeout =
1658  			cfg_get(psoc, CFG_ASSOC_FAILURE_TIMEOUT);
1659  	timeouts->reassoc_failure_timeout =
1660  			cfg_get(psoc, CFG_REASSOC_FAILURE_TIMEOUT);
1661  	timeouts->olbc_detect_timeout =
1662  			cfg_get(psoc, CFG_OLBC_DETECT_TIMEOUT);
1663  	timeouts->addts_rsp_timeout =
1664  			cfg_get(psoc, CFG_ADDTS_RSP_TIMEOUT);
1665  	timeouts->heart_beat_threshold =
1666  			cfg_get(psoc, CFG_HEART_BEAT_THRESHOLD);
1667  	timeouts->ap_keep_alive_timeout =
1668  			cfg_get(psoc, CFG_AP_KEEP_ALIVE_TIMEOUT);
1669  	timeouts->ap_link_monitor_timeout =
1670  			cfg_get(psoc, CFG_AP_LINK_MONITOR_TIMEOUT);
1671  	timeouts->wmi_wq_watchdog_timeout =
1672  			cfg_get(psoc, CFG_WMI_WQ_WATCHDOG);
1673  	timeouts->sae_auth_failure_timeout =
1674  			cfg_get(psoc, CFG_SAE_AUTH_FAILURE_TIMEOUT);
1675  }
1676  
mlme_init_ht_cap_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_ht_caps * ht_caps)1677  static void mlme_init_ht_cap_in_cfg(struct wlan_objmgr_psoc *psoc,
1678  				    struct wlan_mlme_ht_caps *ht_caps)
1679  {
1680  	union {
1681  		uint16_t val_16;
1682  		struct mlme_ht_capabilities_info ht_cap_info;
1683  	} u1;
1684  
1685  	union {
1686  		uint16_t val_16;
1687  		struct mlme_ht_ext_cap_info ext_cap_info;
1688  	} u2;
1689  
1690  	union {
1691  		uint8_t val_8;
1692  		struct mlme_ht_info_field_1 info_field_1;
1693  	} u3;
1694  
1695  	union {
1696  		uint16_t val_16;
1697  		struct mlme_ht_info_field_2 info_field_2;
1698  	} u4;
1699  
1700  	union {
1701  		uint16_t val_16;
1702  		struct mlme_ht_info_field_3 info_field_3;
1703  	} u5;
1704  
1705  	/* HT Capabilities - HT Caps Info Field */
1706  	u1.val_16 = (uint16_t)cfg_default(CFG_HT_CAP_INFO);
1707  	u1.ht_cap_info.adv_coding_cap =
1708  				cfg_get(psoc, CFG_RX_LDPC_ENABLE);
1709  	u1.ht_cap_info.rx_stbc = cfg_get(psoc, CFG_RX_STBC_ENABLE);
1710  	u1.ht_cap_info.tx_stbc = cfg_get(psoc, CFG_TX_STBC_ENABLE);
1711  	u1.ht_cap_info.short_gi_20_mhz =
1712  				cfg_get(psoc, CFG_SHORT_GI_20MHZ);
1713  	u1.ht_cap_info.short_gi_40_mhz =
1714  				cfg_get(psoc, CFG_SHORT_GI_40MHZ);
1715  	u1.ht_cap_info.mimo_power_save = cfg_get(psoc, CFG_HT_SMPS_MODE);
1716  	ht_caps->ht_cap_info = u1.ht_cap_info;
1717  
1718  	/* HT Capapabilties - AMPDU Params */
1719  	ht_caps->ampdu_params.max_rx_ampdu_factor =
1720  		cfg_get(psoc, CFG_MAX_RX_AMPDU_FACTOR);
1721  	ht_caps->ampdu_params.mpdu_density =
1722  		cfg_get(psoc, CFG_MPDU_DENSITY);
1723  	ht_caps->ampdu_params.reserved = 0;
1724  
1725  	/* HT Capabilities - Extended Capabilities field */
1726  	u2.val_16 = (uint16_t)cfg_default(CFG_EXT_HT_CAP_INFO);
1727  	ht_caps->ext_cap_info = u2.ext_cap_info;
1728  
1729  	/* HT Operation - Information subset 1 of 3 */
1730  	u3.val_8 = (uint8_t)cfg_default(CFG_HT_INFO_FIELD_1);
1731  	ht_caps->info_field_1 = u3.info_field_1;
1732  
1733  	/* HT Operation - Information subset 2 of 3 */
1734  	u4.val_16 = (uint16_t)cfg_default(CFG_HT_INFO_FIELD_2);
1735  	ht_caps->info_field_2 = u4.info_field_2;
1736  
1737  	/* HT Operation - Information subset 3 of 3 */
1738  	u5.val_16 = (uint16_t)cfg_default(CFG_HT_INFO_FIELD_3);
1739  	ht_caps->info_field_3 = u5.info_field_3;
1740  
1741  	ht_caps->short_preamble = cfg_get(psoc, CFG_SHORT_PREAMBLE);
1742  	ht_caps->enable_ampdu_ps = cfg_get(psoc, CFG_ENABLE_AMPDUPS);
1743  	ht_caps->enable_smps = cfg_get(psoc, CFG_ENABLE_HT_SMPS);
1744  	ht_caps->smps = cfg_get(psoc, CFG_HT_SMPS_MODE);
1745  	ht_caps->max_num_amsdu = cfg_get(psoc, CFG_MAX_AMSDU_NUM);
1746  	ht_caps->tx_ldpc_enable = cfg_get(psoc, CFG_TX_LDPC_ENABLE);
1747  	ht_caps->short_slot_time_enabled =
1748  		cfg_get(psoc, CFG_SHORT_SLOT_TIME_ENABLED);
1749  }
1750  
mlme_init_qos_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_qos * qos_aggr_params)1751  static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc,
1752  			      struct wlan_mlme_qos *qos_aggr_params)
1753  {
1754  	qos_aggr_params->tx_aggregation_size =
1755  				cfg_get(psoc, CFG_TX_AGGREGATION_SIZE);
1756  	qos_aggr_params->tx_aggregation_size_be =
1757  				cfg_get(psoc, CFG_TX_AGGREGATION_SIZEBE);
1758  	qos_aggr_params->tx_aggregation_size_bk =
1759  				cfg_get(psoc, CFG_TX_AGGREGATION_SIZEBK);
1760  	qos_aggr_params->tx_aggregation_size_vi =
1761  				cfg_get(psoc, CFG_TX_AGGREGATION_SIZEVI);
1762  	qos_aggr_params->tx_aggregation_size_vo =
1763  				cfg_get(psoc, CFG_TX_AGGREGATION_SIZEVO);
1764  	qos_aggr_params->rx_aggregation_size =
1765  				cfg_get(psoc, CFG_RX_AGGREGATION_SIZE);
1766  	qos_aggr_params->tx_aggr_sw_retry_threshold_be =
1767  				cfg_get(psoc, CFG_TX_AGGR_SW_RETRY_BE);
1768  	qos_aggr_params->tx_aggr_sw_retry_threshold_bk =
1769  				cfg_get(psoc, CFG_TX_AGGR_SW_RETRY_BK);
1770  	qos_aggr_params->tx_aggr_sw_retry_threshold_vi =
1771  				cfg_get(psoc, CFG_TX_AGGR_SW_RETRY_VI);
1772  	qos_aggr_params->tx_aggr_sw_retry_threshold_vo =
1773  				cfg_get(psoc, CFG_TX_AGGR_SW_RETRY_VO);
1774  	qos_aggr_params->tx_aggr_sw_retry_threshold =
1775  				cfg_get(psoc, CFG_TX_AGGR_SW_RETRY);
1776  	qos_aggr_params->tx_non_aggr_sw_retry_threshold_be =
1777  				cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_BE);
1778  	qos_aggr_params->tx_non_aggr_sw_retry_threshold_bk =
1779  				cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_BK);
1780  	qos_aggr_params->tx_non_aggr_sw_retry_threshold_vi =
1781  				cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_VI);
1782  	qos_aggr_params->tx_non_aggr_sw_retry_threshold_vo =
1783  				cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_VO);
1784  	qos_aggr_params->tx_non_aggr_sw_retry_threshold =
1785  				cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY);
1786  	qos_aggr_params->sap_max_inactivity_override =
1787  				cfg_get(psoc, CFG_SAP_MAX_INACTIVITY_OVERRIDE);
1788  	qos_aggr_params->sap_uapsd_enabled =
1789  				cfg_get(psoc, CFG_SAP_QOS_UAPSD);
1790  }
1791  
mlme_init_mbo_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_mbo * mbo_params)1792  static void mlme_init_mbo_cfg(struct wlan_objmgr_psoc *psoc,
1793  			      struct wlan_mlme_mbo *mbo_params)
1794  {
1795  	mbo_params->mbo_candidate_rssi_thres =
1796  			cfg_get(psoc, CFG_MBO_CANDIDATE_RSSI_THRESHOLD);
1797  	mbo_params->mbo_current_rssi_thres =
1798  			cfg_get(psoc, CFG_MBO_CURRENT_RSSI_THRESHOLD);
1799  	mbo_params->mbo_current_rssi_mcc_thres =
1800  			cfg_get(psoc, CFG_MBO_CUR_RSSI_MCC_THRESHOLD);
1801  	mbo_params->mbo_candidate_rssi_btc_thres =
1802  			cfg_get(psoc, CFG_MBO_CAND_RSSI_BTC_THRESHOLD);
1803  }
1804  
mlme_init_vht_cap_cfg(struct wlan_objmgr_psoc * psoc,struct mlme_vht_capabilities_info * vht_cap_info)1805  static void mlme_init_vht_cap_cfg(struct wlan_objmgr_psoc *psoc,
1806  				  struct mlme_vht_capabilities_info
1807  				  *vht_cap_info)
1808  {
1809  	vht_cap_info->supp_chan_width =
1810  			cfg_default(CFG_VHT_SUPP_CHAN_WIDTH);
1811  	vht_cap_info->num_soundingdim =
1812  			cfg_default(CFG_VHT_NUM_SOUNDING_DIMENSIONS);
1813  	vht_cap_info->htc_vhtc =
1814  			cfg_default(CFG_VHT_HTC_VHTC);
1815  	vht_cap_info->link_adap_cap =
1816  			cfg_default(CFG_VHT_LINK_ADAPTATION_CAP);
1817  	vht_cap_info->rx_antpattern =
1818  			cfg_default(CFG_VHT_RX_ANT_PATTERN);
1819  	vht_cap_info->tx_antpattern =
1820  			cfg_default(CFG_VHT_TX_ANT_PATTERN);
1821  	vht_cap_info->rx_supp_data_rate =
1822  			cfg_default(CFG_VHT_RX_SUPP_DATA_RATE);
1823  	vht_cap_info->tx_supp_data_rate =
1824  			cfg_default(CFG_VHT_TX_SUPP_DATA_RATE);
1825  	vht_cap_info->txop_ps =
1826  			cfg_default(CFG_VHT_TXOP_PS);
1827  	vht_cap_info->rx_mcs_map =
1828  			CFG_VHT_RX_MCS_MAP_STADEF;
1829  	vht_cap_info->tx_mcs_map =
1830  			CFG_VHT_TX_MCS_MAP_STADEF;
1831  	vht_cap_info->basic_mcs_set =
1832  			CFG_VHT_BASIC_MCS_SET_STADEF;
1833  
1834  	vht_cap_info->tx_bfee_ant_supp =
1835  			cfg_get(psoc, CFG_VHT_BEAMFORMEE_ANT_SUPP);
1836  
1837  	vht_cap_info->enable_txbf_20mhz =
1838  			cfg_get(psoc, CFG_VHT_ENABLE_TXBF_IN_20MHZ);
1839  	vht_cap_info->ampdu_len =
1840  			cfg_get(psoc, CFG_VHT_MPDU_LEN);
1841  
1842  	vht_cap_info->ldpc_coding_cap =
1843  			cfg_get(psoc, CFG_RX_LDPC_ENABLE);
1844  	vht_cap_info->short_gi_80mhz =
1845  			cfg_get(psoc, CFG_SHORT_GI_40MHZ);
1846  	vht_cap_info->short_gi_160mhz =
1847  			cfg_get(psoc, CFG_SHORT_GI_40MHZ);
1848  	vht_cap_info->tx_stbc =
1849  			cfg_get(psoc, CFG_TX_STBC_ENABLE);
1850  	vht_cap_info->rx_stbc =
1851  			cfg_get(psoc, CFG_RX_STBC_ENABLE);
1852  
1853  	vht_cap_info->su_bformee =
1854  		cfg_get(psoc, CFG_VHT_SU_BEAMFORMEE_CAP);
1855  
1856  	vht_cap_info->mu_bformer =
1857  			cfg_default(CFG_VHT_MU_BEAMFORMER_CAP);
1858  
1859  	vht_cap_info->enable_mu_bformee =
1860  			cfg_get(psoc, CFG_VHT_ENABLE_MU_BFORMEE_CAP_FEATURE);
1861  	vht_cap_info->ampdu_len_exponent =
1862  			cfg_get(psoc, CFG_VHT_AMPDU_LEN_EXPONENT);
1863  	vht_cap_info->channel_width =
1864  			cfg_get(psoc, CFG_VHT_CHANNEL_WIDTH);
1865  	vht_cap_info->rx_mcs =
1866  			cfg_get(psoc, CFG_VHT_ENABLE_RX_MCS_8_9);
1867  	vht_cap_info->tx_mcs =
1868  			cfg_get(psoc, CFG_VHT_ENABLE_TX_MCS_8_9);
1869  	vht_cap_info->rx_mcs2x2 =
1870  			cfg_get(psoc, CFG_VHT_ENABLE_RX_MCS2x2_8_9);
1871  	vht_cap_info->tx_mcs2x2 =
1872  			cfg_get(psoc, CFG_VHT_ENABLE_TX_MCS2x2_8_9);
1873  	vht_cap_info->enable_vht20_mcs9 =
1874  			cfg_get(psoc, CFG_ENABLE_VHT20_MCS9);
1875  	vht_cap_info->enable2x2 =
1876  			cfg_get(psoc, CFG_VHT_ENABLE_2x2_CAP_FEATURE);
1877  	vht_cap_info->enable_paid =
1878  			cfg_get(psoc, CFG_VHT_ENABLE_PAID_FEATURE);
1879  	vht_cap_info->enable_gid =
1880  			cfg_get(psoc, CFG_VHT_ENABLE_GID_FEATURE);
1881  	vht_cap_info->b24ghz_band =
1882  			cfg_get(psoc, CFG_ENABLE_VHT_FOR_24GHZ);
1883  	vht_cap_info->vendor_24ghz_band =
1884  			cfg_get(psoc, CFG_ENABLE_VENDOR_VHT_FOR_24GHZ);
1885  	vht_cap_info->tx_bfee_sap =
1886  			cfg_get(psoc, CFG_VHT_ENABLE_TXBF_SAP_MODE);
1887  	vht_cap_info->vendor_vhtie =
1888  			cfg_get(psoc, CFG_ENABLE_SUBFEE_IN_VENDOR_VHTIE);
1889  
1890  	if (vht_cap_info->enable2x2)
1891  		vht_cap_info->su_bformer =
1892  			cfg_get(psoc, CFG_VHT_ENABLE_TX_SU_BEAM_FORMER);
1893  
1894  	if (vht_cap_info->enable2x2 && vht_cap_info->su_bformer)
1895  		vht_cap_info->num_soundingdim = NUM_OF_SOUNDING_DIMENSIONS;
1896  
1897  	vht_cap_info->tx_bf_cap = cfg_default(CFG_TX_BF_CAP);
1898  	vht_cap_info->as_cap = cfg_default(CFG_AS_CAP);
1899  	vht_cap_info->disable_ldpc_with_txbf_ap =
1900  			cfg_get(psoc, CFG_DISABLE_LDPC_WITH_TXBF_AP);
1901  }
1902  
mlme_init_rates_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_rates * rates)1903  static void mlme_init_rates_in_cfg(struct wlan_objmgr_psoc *psoc,
1904  				   struct wlan_mlme_rates *rates)
1905  {
1906  	rates->cfp_period = cfg_default(CFG_CFP_PERIOD);
1907  	rates->cfp_max_duration = cfg_default(CFG_CFP_MAX_DURATION);
1908  	rates->max_htmcs_txdata = cfg_get(psoc, CFG_MAX_HT_MCS_FOR_TX_DATA);
1909  	rates->disable_abg_rate_txdata = cfg_get(psoc,
1910  					CFG_DISABLE_ABG_RATE_FOR_TX_DATA);
1911  	rates->sap_max_mcs_txdata = cfg_get(psoc,
1912  					CFG_SAP_MAX_MCS_FOR_TX_DATA);
1913  	rates->disable_high_ht_mcs_2x2 = cfg_get(psoc,
1914  					 CFG_DISABLE_HIGH_HT_RX_MCS_2x2);
1915  
1916  	rates->supported_11b.max_len = CFG_SUPPORTED_RATES_11B_LEN;
1917  	qdf_uint8_array_parse(cfg_default(CFG_SUPPORTED_RATES_11B),
1918  			      rates->supported_11b.data,
1919  			      sizeof(rates->supported_11b.data),
1920  			      &rates->supported_11b.len);
1921  	rates->supported_11a.max_len = CFG_SUPPORTED_RATES_11A_LEN;
1922  	qdf_uint8_array_parse(cfg_default(CFG_SUPPORTED_RATES_11A),
1923  			      rates->supported_11a.data,
1924  			      sizeof(rates->supported_11a.data),
1925  			      &rates->supported_11a.len);
1926  	rates->supported_mcs_set.max_len = CFG_SUPPORTED_MCS_SET_LEN;
1927  	qdf_uint8_array_parse(cfg_default(CFG_SUPPORTED_MCS_SET),
1928  			      rates->supported_mcs_set.data,
1929  			      sizeof(rates->supported_mcs_set.data),
1930  			      &rates->supported_mcs_set.len);
1931  	rates->basic_mcs_set.max_len = CFG_BASIC_MCS_SET_LEN;
1932  	qdf_uint8_array_parse(cfg_default(CFG_BASIC_MCS_SET),
1933  			      rates->basic_mcs_set.data,
1934  			      sizeof(rates->basic_mcs_set.data),
1935  			      &rates->basic_mcs_set.len);
1936  	rates->current_mcs_set.max_len = CFG_CURRENT_MCS_SET_LEN;
1937  	qdf_uint8_array_parse(cfg_default(CFG_CURRENT_MCS_SET),
1938  			      rates->current_mcs_set.data,
1939  			      sizeof(rates->current_mcs_set.data),
1940  			      &rates->current_mcs_set.len);
1941  }
1942  
mlme_init_dfs_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_dfs_cfg * dfs_cfg)1943  static void mlme_init_dfs_cfg(struct wlan_objmgr_psoc *psoc,
1944  			      struct wlan_mlme_dfs_cfg *dfs_cfg)
1945  {
1946  	dfs_cfg->dfs_ignore_cac = cfg_get(psoc, CFG_IGNORE_CAC);
1947  	dfs_cfg->dfs_master_capable =
1948  		cfg_get(psoc, CFG_ENABLE_DFS_MASTER_CAPABILITY);
1949  	dfs_cfg->dfs_disable_channel_switch =
1950  		cfg_get(psoc, CFG_DISABLE_DFS_CH_SWITCH);
1951  	dfs_cfg->dfs_filter_offload =
1952  		cfg_get(psoc, CFG_ENABLE_DFS_PHYERR_FILTEROFFLOAD);
1953  	dfs_cfg->dfs_prefer_non_dfs =
1954  		cfg_get(psoc, CFG_ENABLE_NON_DFS_CHAN_ON_RADAR);
1955  	dfs_cfg->dfs_beacon_tx_enhanced =
1956  		cfg_get(psoc, CFG_DFS_BEACON_TX_ENHANCED);
1957  	dfs_cfg->dfs_disable_japan_w53 =
1958  		cfg_get(psoc, CFG_DISABLE_DFS_JAPAN_W53);
1959  	dfs_cfg->sap_tx_leakage_threshold =
1960  		cfg_get(psoc, CFG_SAP_TX_LEAKAGE_THRESHOLD);
1961  	dfs_cfg->dfs_pri_multiplier =
1962  		cfg_get(psoc, CFG_DFS_RADAR_PRI_MULTIPLIER);
1963  }
1964  
mlme_init_feature_flag_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_feature_flag * feature_flags)1965  static void mlme_init_feature_flag_in_cfg(
1966  				struct wlan_objmgr_psoc *psoc,
1967  				struct wlan_mlme_feature_flag *feature_flags)
1968  {
1969  	feature_flags->accept_short_slot_assoc =
1970  				cfg_default(CFG_ACCEPT_SHORT_SLOT_ASSOC_ONLY);
1971  	feature_flags->enable_hcf = cfg_default(CFG_HCF_ENABLED);
1972  	feature_flags->enable_rsn = cfg_default(CFG_RSN_ENABLED);
1973  	feature_flags->enable_short_preamble_11g =
1974  				cfg_default(CFG_11G_SHORT_PREAMBLE_ENABLED);
1975  	feature_flags->enable_short_slot_time_11g =
1976  				cfg_default(CFG_11G_SHORT_SLOT_TIME_ENABLED);
1977  	feature_flags->channel_bonding_mode =
1978  				cfg_default(CFG_CHANNEL_BONDING_MODE);
1979  	feature_flags->enable_block_ack = cfg_default(CFG_BLOCK_ACK_ENABLED);
1980  	feature_flags->enable_ampdu = cfg_get(psoc, CFG_ENABLE_AMPDUPS);
1981  	feature_flags->mcc_rts_cts_prot = cfg_get(psoc,
1982  						  CFG_FW_MCC_RTS_CTS_PROT);
1983  	feature_flags->mcc_bcast_prob_rsp = cfg_get(psoc,
1984  						    CFG_FW_MCC_BCAST_PROB_RESP);
1985  	feature_flags->enable_mcc = cfg_get(psoc, CFG_MCC_FEATURE);
1986  	feature_flags->channel_bonding_mode_24ghz =
1987  			cfg_get(psoc, CFG_CHANNEL_BONDING_MODE_24GHZ);
1988  	feature_flags->channel_bonding_mode_5ghz =
1989  			cfg_get(psoc, CFG_CHANNEL_BONDING_MODE_5GHZ);
1990  	feature_flags->update_cw_allowed =
1991  			cfg_get(psoc, CFG_ALLOW_UPDATE_CHANNEL_WIDTH);
1992  }
1993  
mlme_init_sap_protection_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_sap_protection * sap_protection_params)1994  static void mlme_init_sap_protection_cfg(struct wlan_objmgr_psoc *psoc,
1995  					 struct wlan_mlme_sap_protection
1996  					 *sap_protection_params)
1997  {
1998  	sap_protection_params->protection_enabled =
1999  				cfg_default(CFG_PROTECTION_ENABLED);
2000  	sap_protection_params->protection_force_policy =
2001  				cfg_default(CFG_FORCE_POLICY_PROTECTION);
2002  	sap_protection_params->ignore_peer_ht_opmode =
2003  				cfg_get(psoc, CFG_IGNORE_PEER_HT_MODE);
2004  	sap_protection_params->enable_ap_obss_protection =
2005  				cfg_get(psoc, CFG_AP_OBSS_PROTECTION_ENABLE);
2006  	sap_protection_params->is_ap_prot_enabled =
2007  				cfg_get(psoc, CFG_AP_ENABLE_PROTECTION_MODE);
2008  	sap_protection_params->ap_protection_mode =
2009  				cfg_get(psoc, CFG_AP_PROTECTION_MODE);
2010  }
2011  
2012  #ifdef WLAN_FEATURE_11AX
2013  
2014  #define HE_MCS12_13_24G_INDEX 0
2015  #define HE_MCS12_13_5G_INDEX 1
2016  #define HE_MCS12_13_BITS 16
2017  
mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg * mlme_cfg)2018  static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc,
2019  				    struct wlan_mlme_cfg *mlme_cfg)
2020  {
2021  	uint32_t chan_width, mcs_12_13;
2022  	uint16_t value = 0;
2023  	struct wlan_mlme_he_caps *he_caps = &mlme_cfg->he_caps;
2024  	bool is_twt_enabled = false;
2025  
2026  	he_caps->dot11_he_cap.htc_he = cfg_default(CFG_HE_CONTROL);
2027  	he_caps->dot11_he_cap.twt_request =
2028  			cfg_get(psoc, CFG_TWT_REQUESTOR);
2029  	he_caps->dot11_he_cap.twt_responder =
2030  			cfg_get(psoc, CFG_TWT_RESPONDER);
2031  	/*
2032  	 * Broadcast TWT capability will be filled in
2033  	 * populate_dot11f_he_caps() based on STA/SAP
2034  	 * role and "twt_bcast_req_resp_config" ini
2035  	 */
2036  	he_caps->dot11_he_cap.broadcast_twt = 0;
2037  
2038  	is_twt_enabled = wlan_twt_cfg_is_twt_enabled(psoc);
2039  
2040  	if (is_twt_enabled)
2041  		he_caps->dot11_he_cap.flex_twt_sched =
2042  			cfg_default(CFG_HE_FLEX_TWT_SCHED);
2043  	he_caps->dot11_he_cap.fragmentation =
2044  			cfg_default(CFG_HE_FRAGMENTATION);
2045  	he_caps->dot11_he_cap.max_num_frag_msdu_amsdu_exp =
2046  			cfg_default(CFG_HE_MAX_FRAG_MSDU);
2047  	he_caps->dot11_he_cap.min_frag_size = cfg_default(CFG_HE_MIN_FRAG_SIZE);
2048  	he_caps->dot11_he_cap.trigger_frm_mac_pad =
2049  		cfg_default(CFG_HE_TRIG_PAD);
2050  	he_caps->dot11_he_cap.multi_tid_aggr_rx_supp =
2051  		cfg_default(CFG_HE_MTID_AGGR_RX);
2052  	he_caps->dot11_he_cap.he_link_adaptation =
2053  		cfg_default(CFG_HE_LINK_ADAPTATION);
2054  	he_caps->dot11_he_cap.all_ack = cfg_default(CFG_HE_ALL_ACK);
2055  	he_caps->dot11_he_cap.trigd_rsp_sched =
2056  			cfg_default(CFG_HE_TRIGD_RSP_SCHEDULING);
2057  	he_caps->dot11_he_cap.a_bsr = cfg_default(CFG_HE_BUFFER_STATUS_RPT);
2058  	he_caps->dot11_he_cap.ba_32bit_bitmap = cfg_default(CFG_HE_BA_32BIT);
2059  	he_caps->dot11_he_cap.mu_cascade = cfg_default(CFG_HE_MU_CASCADING);
2060  	he_caps->dot11_he_cap.ack_enabled_multitid =
2061  			cfg_default(CFG_HE_MULTI_TID);
2062  	he_caps->dot11_he_cap.omi_a_ctrl = cfg_default(CFG_HE_OMI);
2063  	he_caps->dot11_he_cap.ofdma_ra = cfg_default(CFG_HE_OFDMA_RA);
2064  	he_caps->dot11_he_cap.max_ampdu_len_exp_ext =
2065  			cfg_default(CFG_HE_MAX_AMPDU_LEN);
2066  	he_caps->dot11_he_cap.amsdu_frag = cfg_default(CFG_HE_AMSDU_FRAG);
2067  
2068  	he_caps->dot11_he_cap.rx_ctrl_frame = cfg_default(CFG_HE_RX_CTRL);
2069  	he_caps->dot11_he_cap.bsrp_ampdu_aggr =
2070  			cfg_default(CFG_HE_BSRP_AMPDU_AGGR);
2071  	he_caps->dot11_he_cap.qtp = cfg_default(CFG_HE_QTP);
2072  	he_caps->dot11_he_cap.a_bqr = cfg_default(CFG_HE_A_BQR);
2073  	he_caps->dot11_he_cap.spatial_reuse_param_rspder =
2074  			cfg_default(CFG_HE_SR_RESPONDER);
2075  	he_caps->dot11_he_cap.ndp_feedback_supp =
2076  			cfg_default(CFG_HE_NDP_FEEDBACK_SUPP);
2077  	he_caps->dot11_he_cap.ops_supp = cfg_default(CFG_HE_OPS_SUPP);
2078  	he_caps->dot11_he_cap.amsdu_in_ampdu =
2079  			cfg_default(CFG_HE_AMSDU_IN_AMPDU);
2080  
2081  	chan_width = cfg_default(CFG_HE_CHAN_WIDTH);
2082  	he_caps->dot11_he_cap.chan_width_0 = HE_CH_WIDTH_GET_BIT(chan_width, 0);
2083  	he_caps->dot11_he_cap.chan_width_1 = HE_CH_WIDTH_GET_BIT(chan_width, 1);
2084  	he_caps->dot11_he_cap.chan_width_2 = HE_CH_WIDTH_GET_BIT(chan_width, 2);
2085  	he_caps->dot11_he_cap.chan_width_3 = HE_CH_WIDTH_GET_BIT(chan_width, 3);
2086  	he_caps->dot11_he_cap.chan_width_4 = HE_CH_WIDTH_GET_BIT(chan_width, 4);
2087  	he_caps->dot11_he_cap.chan_width_5 = HE_CH_WIDTH_GET_BIT(chan_width, 5);
2088  	he_caps->dot11_he_cap.chan_width_6 = HE_CH_WIDTH_GET_BIT(chan_width, 6);
2089  
2090  	he_caps->dot11_he_cap.multi_tid_aggr_tx_supp =
2091  			cfg_default(CFG_HE_MTID_AGGR_TX);
2092  	he_caps->dot11_he_cap.he_sub_ch_sel_tx_supp =
2093  			cfg_default(CFG_HE_SUB_CH_SEL_TX);
2094  	he_caps->dot11_he_cap.ul_2x996_tone_ru_supp =
2095  			cfg_default(CFG_HE_UL_2X996_RU);
2096  	he_caps->dot11_he_cap.om_ctrl_ul_mu_data_dis_rx =
2097  			cfg_default(CFG_HE_OM_CTRL_UL_MU_DIS_RX);
2098  	he_caps->dot11_he_cap.he_dynamic_smps =
2099  			cfg_default(CFG_HE_DYNAMIC_SMPS);
2100  	he_caps->dot11_he_cap.punctured_sounding_supp =
2101  			cfg_default(CFG_HE_PUNCTURED_SOUNDING);
2102  	he_caps->dot11_he_cap.ht_vht_trg_frm_rx_supp =
2103  			cfg_default(CFG_HE_HT_VHT_TRG_FRM_RX);
2104  	he_caps->dot11_he_cap.rx_pream_puncturing =
2105  			cfg_get(psoc, CFG_HE_RX_PREAM_PUNC);
2106  	he_caps->dot11_he_cap.device_class =
2107  			cfg_default(CFG_HE_CLASS_OF_DEVICE);
2108  	he_caps->dot11_he_cap.ldpc_coding = cfg_default(CFG_HE_LDPC);
2109  	he_caps->dot11_he_cap.he_1x_ltf_800_gi_ppdu =
2110  			cfg_default(CFG_HE_LTF_PPDU);
2111  	he_caps->dot11_he_cap.midamble_tx_rx_max_nsts =
2112  			cfg_default(CFG_HE_MIDAMBLE_RX_MAX_NSTS);
2113  	he_caps->dot11_he_cap.he_4x_ltf_3200_gi_ndp =
2114  			cfg_default(CFG_HE_LTF_NDP);
2115  	he_caps->dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz =
2116  			cfg_default(CFG_HE_TX_STBC_LT80);
2117  	he_caps->dot11_he_cap.rx_stbc_lt_80mhz =
2118  			cfg_default(CFG_HE_RX_STBC_LT80);
2119  	he_caps->dot11_he_cap.doppler = cfg_default(CFG_HE_DOPPLER);
2120  	he_caps->dot11_he_cap.ul_mu =
2121  			cfg_get(psoc, CFG_HE_UL_MUMIMO);
2122  	he_caps->dot11_he_cap.dcm_enc_tx = cfg_default(CFG_HE_DCM_TX);
2123  	he_caps->dot11_he_cap.dcm_enc_rx = cfg_default(CFG_HE_DCM_RX);
2124  	he_caps->dot11_he_cap.ul_he_mu = cfg_default(CFG_HE_MU_PPDU);
2125  	he_caps->dot11_he_cap.su_beamformer = cfg_default(CFG_HE_SU_BEAMFORMER);
2126  	he_caps->dot11_he_cap.su_beamformee = cfg_default(CFG_HE_SU_BEAMFORMEE);
2127  	he_caps->dot11_he_cap.mu_beamformer = cfg_default(CFG_HE_MU_BEAMFORMER);
2128  	he_caps->dot11_he_cap.bfee_sts_lt_80 =
2129  			cfg_default(CFG_HE_BFEE_STS_LT80);
2130  	he_caps->dot11_he_cap.bfee_sts_gt_80 =
2131  			cfg_default(CFG_HE_BFEE_STS_GT80);
2132  	he_caps->dot11_he_cap.num_sounding_lt_80 =
2133  			cfg_default(CFG_HE_NUM_SOUND_LT80);
2134  	he_caps->dot11_he_cap.num_sounding_gt_80 =
2135  			cfg_default(CFG_HE_NUM_SOUND_GT80);
2136  	he_caps->dot11_he_cap.su_feedback_tone16 =
2137  			cfg_default(CFG_HE_SU_FEED_TONE16);
2138  	he_caps->dot11_he_cap.mu_feedback_tone16 =
2139  			cfg_default(CFG_HE_MU_FEED_TONE16);
2140  	he_caps->dot11_he_cap.codebook_su = cfg_default(CFG_HE_CODEBOOK_SU);
2141  	he_caps->dot11_he_cap.codebook_mu = cfg_default(CFG_HE_CODEBOOK_MU);
2142  	he_caps->dot11_he_cap.beamforming_feedback =
2143  			cfg_default(CFG_HE_BFRM_FEED);
2144  	he_caps->dot11_he_cap.he_er_su_ppdu = cfg_default(CFG_HE_ER_SU_PPDU);
2145  	he_caps->dot11_he_cap.dl_mu_mimo_part_bw =
2146  			cfg_default(CFG_HE_DL_PART_BW);
2147  	he_caps->dot11_he_cap.ppet_present = cfg_default(CFG_HE_PPET_PRESENT);
2148  	he_caps->dot11_he_cap.srp = cfg_default(CFG_HE_SRP);
2149  	he_caps->dot11_he_cap.power_boost = cfg_default(CFG_HE_POWER_BOOST);
2150  	he_caps->dot11_he_cap.he_ltf_800_gi_4x = cfg_default(CFG_HE_4x_LTF_GI);
2151  	he_caps->dot11_he_cap.max_nc = cfg_default(CFG_HE_MAX_NC);
2152  	he_caps->dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz =
2153  			cfg_default(CFG_HE_TX_STBC_GT80);
2154  	he_caps->dot11_he_cap.rx_stbc_gt_80mhz =
2155  			cfg_default(CFG_HE_RX_STBC_GT80);
2156  	he_caps->dot11_he_cap.er_he_ltf_800_gi_4x =
2157  			cfg_default(CFG_HE_ER_4x_LTF_GI);
2158  	he_caps->dot11_he_cap.he_ppdu_20_in_40Mhz_2G =
2159  			cfg_default(CFG_HE_PPDU_20_IN_40MHZ_2G);
2160  	he_caps->dot11_he_cap.he_ppdu_20_in_160_80p80Mhz =
2161  			cfg_default(CFG_HE_PPDU_20_IN_160_80P80MHZ);
2162  	he_caps->dot11_he_cap.he_ppdu_80_in_160_80p80Mhz =
2163  			cfg_default(CFG_HE_PPDU_80_IN_160_80P80MHZ);
2164  		he_caps->dot11_he_cap.er_1x_he_ltf_gi =
2165  			cfg_default(CFG_HE_ER_1X_HE_LTF_GI);
2166  	he_caps->dot11_he_cap.midamble_tx_rx_1x_he_ltf =
2167  			cfg_default(CFG_HE_MIDAMBLE_TXRX_1X_HE_LTF);
2168  	he_caps->dot11_he_cap.dcm_max_bw = cfg_default(CFG_HE_DCM_MAX_BW);
2169  	he_caps->dot11_he_cap.longer_than_16_he_sigb_ofdm_sym =
2170  			cfg_default(CFG_HE_LONGER_16_SIGB_OFDM_SYM);
2171  	he_caps->dot11_he_cap.non_trig_cqi_feedback =
2172  			cfg_default(CFG_HE_NON_TRIG_CQI_FEEDBACK);
2173  	he_caps->dot11_he_cap.tx_1024_qam_lt_242_tone_ru =
2174  			cfg_default(CFG_HE_TX_1024_QAM_LT_242_RU);
2175  	he_caps->dot11_he_cap.rx_1024_qam_lt_242_tone_ru =
2176  			cfg_default(CFG_HE_RX_1024_QAM_LT_242_RU);
2177  	he_caps->dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb =
2178  			cfg_default(CFG_HE_RX_FULL_BW_MU_CMPR_SIGB);
2179  	he_caps->dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb =
2180  			cfg_default(CFG_HE_RX_FULL_BW_MU_NON_CMPR_SIGB);
2181  	he_caps->dot11_he_cap.rx_he_mcs_map_lt_80 =
2182  			cfg_get(psoc, CFG_HE_RX_MCS_MAP_LT_80);
2183  	he_caps->dot11_he_cap.tx_he_mcs_map_lt_80 =
2184  			cfg_get(psoc, CFG_HE_TX_MCS_MAP_LT_80);
2185  	value = cfg_get(psoc, CFG_HE_RX_MCS_MAP_160);
2186  	qdf_mem_copy(he_caps->dot11_he_cap.rx_he_mcs_map_160, &value,
2187  		     sizeof(uint16_t));
2188  	value = cfg_get(psoc, CFG_HE_TX_MCS_MAP_160);
2189  	qdf_mem_copy(he_caps->dot11_he_cap.tx_he_mcs_map_160, &value,
2190  		     sizeof(uint16_t));
2191  	value = cfg_default(CFG_HE_RX_MCS_MAP_80_80);
2192  	qdf_mem_copy(he_caps->dot11_he_cap.rx_he_mcs_map_80_80, &value,
2193  		     sizeof(uint16_t));
2194  	value = cfg_default(CFG_HE_TX_MCS_MAP_80_80);
2195  	qdf_mem_copy(he_caps->dot11_he_cap.tx_he_mcs_map_80_80, &value,
2196  		     sizeof(uint16_t));
2197  	he_caps->he_ops_basic_mcs_nss = cfg_default(CFG_HE_OPS_BASIC_MCS_NSS);
2198  	he_caps->he_dynamic_fragmentation =
2199  			cfg_get(psoc, CFG_HE_DYNAMIC_FRAGMENTATION);
2200  	he_caps->enable_ul_mimo =
2201  			cfg_get(psoc, CFG_ENABLE_UL_MIMO);
2202  	he_caps->enable_ul_ofdm =
2203  			cfg_get(psoc, CFG_ENABLE_UL_OFDMA);
2204  	he_caps->he_sta_obsspd =
2205  			cfg_get(psoc, CFG_HE_STA_OBSSPD);
2206  	qdf_mem_zero(he_caps->he_ppet_2g, MLME_HE_PPET_LEN);
2207  	qdf_mem_zero(he_caps->he_ppet_5g, MLME_HE_PPET_LEN);
2208  
2209  	mcs_12_13 = cfg_get(psoc, CFG_HE_MCS_12_13_SUPPORT);
2210  	/* Get 2.4Ghz and 5Ghz value */
2211  	mlme_cfg->he_caps.he_mcs_12_13_supp_2g =
2212  		QDF_GET_BITS(mcs_12_13,
2213  			     HE_MCS12_13_24G_INDEX * HE_MCS12_13_BITS,
2214  			     HE_MCS12_13_BITS);
2215  	mlme_cfg->he_caps.he_mcs_12_13_supp_5g =
2216  		QDF_GET_BITS(mcs_12_13,
2217  			     HE_MCS12_13_5G_INDEX * HE_MCS12_13_BITS,
2218  			     HE_MCS12_13_BITS);
2219  
2220  	mlme_cfg->he_caps.disable_sap_mcs_12_13 = cfg_get(psoc,
2221  						CFG_DISABLE_MCS_12_13_SAP);
2222  }
2223  #else
mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg * mlme_cfg)2224  static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc,
2225  				    struct wlan_mlme_cfg *mlme_cfg)
2226  {
2227  }
2228  #endif
2229  
2230  #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
2231  /**
2232   * mlme_init_disable_twt_info() - initialize disable twt info
2233   * @psoc: Pointer to PSOC
2234   * @twt_cfg: Pointer to twt_cfg
2235   *
2236   * Return: None
2237   */
mlme_init_disable_twt_info(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg_twt * twt_cfg)2238  static void mlme_init_disable_twt_info(struct wlan_objmgr_psoc *psoc,
2239  				       struct wlan_mlme_cfg_twt *twt_cfg)
2240  {
2241  	twt_cfg->disable_twt_info_frame = cfg_get(psoc,
2242  						  CFG_DISABLE_TWT_INFO_FRAME);
2243  }
2244  #elif defined(WLAN_SUPPORT_TWT)
mlme_init_disable_twt_info(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg_twt * twt_cfg)2245  static void mlme_init_disable_twt_info(struct wlan_objmgr_psoc *psoc,
2246  				       struct wlan_mlme_cfg_twt *twt_cfg)
2247  {
2248  }
2249  
2250  #endif
2251  
2252  #ifdef WLAN_SUPPORT_TWT
mlme_init_twt_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg_twt * twt_cfg)2253  static void mlme_init_twt_cfg(struct wlan_objmgr_psoc *psoc,
2254  			      struct wlan_mlme_cfg_twt *twt_cfg)
2255  {
2256  	uint32_t bcast_conf = cfg_get(psoc, CFG_BCAST_TWT_REQ_RESP);
2257  
2258  	twt_cfg->is_twt_enabled = cfg_get(psoc, CFG_ENABLE_TWT);
2259  	twt_cfg->twt_congestion_timeout = cfg_get(psoc, CFG_TWT_CONGESTION_TIMEOUT);
2260  	twt_cfg->enable_twt_24ghz = cfg_get(psoc, CFG_ENABLE_TWT_24GHZ);
2261  	twt_cfg->is_bcast_requestor_enabled = CFG_TWT_GET_BCAST_REQ(bcast_conf);
2262  	twt_cfg->is_bcast_responder_enabled = CFG_TWT_GET_BCAST_RES(bcast_conf);
2263  	mlme_init_disable_twt_info(psoc, twt_cfg);
2264  }
2265  #else
mlme_init_twt_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg_twt * twt_cfg)2266  static void mlme_init_twt_cfg(struct wlan_objmgr_psoc *psoc,
2267  			      struct wlan_mlme_cfg_twt *twt_cfg)
2268  {
2269  }
2270  #endif
2271  
2272  #ifdef WLAN_FEATURE_11BE
mlme_init_eht_cap_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg * mlme_cfg)2273  static void mlme_init_eht_cap_in_cfg(struct wlan_objmgr_psoc *psoc,
2274  				     struct wlan_mlme_cfg *mlme_cfg)
2275  {
2276  	struct wlan_mlme_eht_caps *eht_caps = &mlme_cfg->eht_caps;
2277  
2278  	eht_caps->dot11_eht_cap.su_beamformer =
2279  			cfg_default(CFG_EHT_SU_BEAMFORMER);
2280  	eht_caps->dot11_eht_cap.su_beamformee =
2281  			cfg_default(CFG_EHT_SU_BEAMFORMEE);
2282  	eht_caps->dot11_eht_cap.mu_bformer_le_80mhz =
2283  			cfg_default(CFG_EHT_MU_BFORMER_LE_80MHZ);
2284  	eht_caps->dot11_eht_cap.mu_bformer_160mhz =
2285  			cfg_default(CFG_EHT_MU_BFORMER_160MHZ);
2286  	eht_caps->dot11_eht_cap.mu_bformer_320mhz =
2287  			cfg_default(CFG_EHT_MU_BFORMER_320MHZ);
2288  	eht_caps->dot11_eht_cap.bfee_ss_le_80mhz =
2289  			cfg_default(CFG_EHT_BFEE_SS_LE_80MHZ);
2290  	eht_caps->dot11_eht_cap.bfee_ss_160mhz =
2291  			cfg_default(CFG_EHT_BFEE_SS_160MHZ);
2292  	eht_caps->dot11_eht_cap.bfee_ss_320mhz =
2293  			cfg_default(CFG_EHT_BFEE_SS_320MHZ);
2294  	eht_caps->dot11_eht_cap.num_sounding_dim_le_80mhz =
2295  			cfg_default(CFG_EHT_NUM_SOUNDING_DIM_LE_80MHZ);
2296  	eht_caps->dot11_eht_cap.num_sounding_dim_160mhz =
2297  			cfg_default(CFG_EHT_NUM_SOUNDING_DIM_160MHZ);
2298  	eht_caps->dot11_eht_cap.num_sounding_dim_320mhz =
2299  			cfg_default(CFG_EHT_NUM_SOUNDING_DIM_320MHZ);
2300  }
2301  #else
mlme_init_eht_cap_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg * mlme_cfg)2302  static void mlme_init_eht_cap_in_cfg(struct wlan_objmgr_psoc *psoc,
2303  				     struct wlan_mlme_cfg *mlme_cfg)
2304  {
2305  }
2306  #endif
2307  
2308  #ifdef WLAN_FEATURE_SAE
is_sae_sap_enabled(struct wlan_objmgr_psoc * psoc)2309  static bool is_sae_sap_enabled(struct wlan_objmgr_psoc *psoc)
2310  {
2311  	return cfg_get(psoc, CFG_IS_SAP_SAE_ENABLED);
2312  }
2313  
wlan_vdev_is_sae_auth_type(struct wlan_objmgr_vdev * vdev)2314  bool wlan_vdev_is_sae_auth_type(struct wlan_objmgr_vdev *vdev)
2315  {
2316  	int32_t auth_mode;
2317  
2318  	auth_mode = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_AUTH_MODE);
2319  
2320  	if (auth_mode == -1)
2321  		return false;
2322  
2323  	if (QDF_HAS_PARAM(auth_mode, WLAN_CRYPTO_AUTH_SAE))
2324  		return true;
2325  
2326  	return false;
2327  }
2328  #else
is_sae_sap_enabled(struct wlan_objmgr_psoc * psoc)2329  static bool is_sae_sap_enabled(struct wlan_objmgr_psoc *psoc)
2330  {
2331  	return false;
2332  }
2333  #endif
wlan_get_rand_from_lst_for_freq(uint16_t * freq_lst,uint8_t num_chan)2334  uint16_t wlan_get_rand_from_lst_for_freq(uint16_t *freq_lst,
2335  					 uint8_t num_chan)
2336  {
2337  	uint8_t i;
2338  	uint32_t rand_byte = 0;
2339  
2340  	if (!num_chan || !freq_lst) {
2341  		mlme_legacy_debug("invalid param freq_lst %pK, num_chan = %d",
2342  				  freq_lst, num_chan);
2343  		return 0;
2344  	}
2345  
2346  	get_random_bytes((uint8_t *)&rand_byte, 1);
2347  	i = (rand_byte + qdf_mc_timer_get_system_ticks()) % num_chan;
2348  
2349  	return freq_lst[i];
2350  }
2351  
mlme_init_sap_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg_sap * sap_cfg)2352  static void mlme_init_sap_cfg(struct wlan_objmgr_psoc *psoc,
2353  			      struct wlan_mlme_cfg_sap *sap_cfg)
2354  {
2355  	sap_cfg->beacon_interval = cfg_get(psoc, CFG_BEACON_INTERVAL);
2356  	sap_cfg->dtim_interval = cfg_default(CFG_DTIM_PERIOD);
2357  	sap_cfg->listen_interval = cfg_default(CFG_LISTEN_INTERVAL);
2358  	sap_cfg->sap_11g_policy = cfg_default(CFG_11G_ONLY_POLICY);
2359  	sap_cfg->assoc_sta_limit = cfg_default(CFG_ASSOC_STA_LIMIT);
2360  	sap_cfg->enable_lte_coex = cfg_get(psoc, CFG_ENABLE_LTE_COEX);
2361  	sap_cfg->rate_tx_mgmt = cfg_get(psoc, CFG_RATE_FOR_TX_MGMT);
2362  	sap_cfg->rate_tx_mgmt_2g = cfg_get(psoc, CFG_RATE_FOR_TX_MGMT_2G);
2363  	sap_cfg->rate_tx_mgmt_5g = cfg_get(psoc, CFG_RATE_FOR_TX_MGMT_5G);
2364  	sap_cfg->tele_bcn_wakeup_en = cfg_get(psoc, CFG_TELE_BCN_WAKEUP_EN);
2365  	sap_cfg->tele_bcn_max_li = cfg_get(psoc, CFG_TELE_BCN_MAX_LI);
2366  	sap_cfg->sap_get_peer_info = cfg_get(psoc, CFG_SAP_GET_PEER_INFO);
2367  	sap_cfg->sap_allow_all_chan_param_name =
2368  			cfg_get(psoc, CFG_SAP_ALLOW_ALL_CHANNEL_PARAM);
2369  	sap_cfg->sap_max_no_peers = cfg_get(psoc, CFG_SAP_MAX_NO_PEERS);
2370  	sap_cfg->sap_max_offload_peers =
2371  			cfg_get(psoc, CFG_SAP_MAX_OFFLOAD_PEERS);
2372  	sap_cfg->sap_max_offload_reorder_buffs =
2373  			cfg_get(psoc, CFG_SAP_MAX_OFFLOAD_REORDER_BUFFS);
2374  	sap_cfg->sap_ch_switch_beacon_cnt =
2375  			cfg_get(psoc, CFG_SAP_CH_SWITCH_BEACON_CNT);
2376  	sap_cfg->sap_ch_switch_mode = cfg_get(psoc, CFG_SAP_CH_SWITCH_MODE);
2377  	sap_cfg->sap_internal_restart =
2378  			cfg_get(psoc, CFG_SAP_INTERNAL_RESTART);
2379  	sap_cfg->chan_switch_hostapd_rate_enabled_name =
2380  		cfg_get(psoc, CFG_CHAN_SWITCH_HOSTAPD_RATE_ENABLED_NAME);
2381  	sap_cfg->reduced_beacon_interval =
2382  		cfg_get(psoc, CFG_REDUCED_BEACON_INTERVAL);
2383  	sap_cfg->max_li_modulated_dtim_time =
2384  		cfg_get(psoc, CFG_MAX_LI_MODULATED_DTIM);
2385  	sap_cfg->country_code_priority =
2386  		cfg_get(psoc, CFG_COUNTRY_CODE_PRIORITY);
2387  	sap_cfg->sap_pref_chan_location =
2388  		cfg_get(psoc, CFG_SAP_PREF_CHANNEL_LOCATION);
2389  	sap_cfg->sap_force_11n_for_11ac =
2390  		cfg_get(psoc, CFG_SAP_FORCE_11N_FOR_11AC);
2391  	sap_cfg->go_force_11n_for_11ac =
2392  		cfg_get(psoc, CFG_GO_FORCE_11N_FOR_11AC);
2393  	sap_cfg->ap_random_bssid_enable =
2394  		cfg_get(psoc, CFG_AP_ENABLE_RANDOM_BSSID);
2395  	sap_cfg->sap_mcc_chnl_avoid =
2396  		cfg_get(psoc, CFG_SAP_MCC_CHANNEL_AVOIDANCE);
2397  	sap_cfg->sap_11ac_override =
2398  		cfg_get(psoc, CFG_SAP_11AC_OVERRIDE);
2399  	sap_cfg->go_11ac_override =
2400  		cfg_get(psoc, CFG_GO_11AC_OVERRIDE);
2401  	sap_cfg->sap_sae_enabled = is_sae_sap_enabled(psoc);
2402  	sap_cfg->is_sap_bcast_deauth_enabled =
2403  		cfg_get(psoc, CFG_IS_SAP_BCAST_DEAUTH_ENABLED);
2404  	sap_cfg->is_6g_sap_fd_enabled =
2405  		cfg_get(psoc, CFG_6G_SAP_FILS_DISCOVERY_ENABLED);
2406  	sap_cfg->disable_bcn_prot =
2407  		cfg_get(psoc, CFG_DISABLE_SAP_BCN_PROT);
2408  	sap_cfg->sap_ps_with_twt_enable =
2409  		cfg_get(psoc, CFG_SAP_PS_WITH_TWT);
2410  }
2411  
mlme_init_obss_ht40_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_obss_ht40 * obss_ht40)2412  static void mlme_init_obss_ht40_cfg(struct wlan_objmgr_psoc *psoc,
2413  				    struct wlan_mlme_obss_ht40 *obss_ht40)
2414  {
2415  	obss_ht40->active_dwelltime =
2416  		cfg_get(psoc, CFG_OBSS_HT40_SCAN_ACTIVE_DWELL_TIME);
2417  	obss_ht40->passive_dwelltime =
2418  		cfg_get(psoc, CFG_OBSS_HT40_SCAN_PASSIVE_DWELL_TIME);
2419  	obss_ht40->width_trigger_interval =
2420  		cfg_get(psoc, CFG_OBSS_HT40_SCAN_WIDTH_TRIGGER_INTERVAL);
2421  	obss_ht40->passive_per_channel = (uint32_t)
2422  		cfg_default(CFG_OBSS_HT40_SCAN_PASSIVE_TOTAL_PER_CHANNEL);
2423  	obss_ht40->active_per_channel = (uint32_t)
2424  		cfg_default(CFG_OBSS_HT40_SCAN_ACTIVE_TOTAL_PER_CHANNEL);
2425  	obss_ht40->width_trans_delay = (uint32_t)
2426  		cfg_default(CFG_OBSS_HT40_WIDTH_CH_TRANSITION_DELAY);
2427  	obss_ht40->scan_activity_threshold = (uint32_t)
2428  		cfg_default(CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD);
2429  	obss_ht40->is_override_ht20_40_24g =
2430  		cfg_get(psoc, CFG_OBSS_HT40_OVERRIDE_HT40_20_24GHZ);
2431  	obss_ht40->obss_detection_offload_enabled =
2432  		(bool)cfg_default(CFG_OBSS_DETECTION_OFFLOAD);
2433  	obss_ht40->obss_color_collision_offload_enabled =
2434  		(bool)cfg_default(CFG_OBSS_COLOR_COLLISION_OFFLOAD);
2435  	obss_ht40->bss_color_collision_det_sta =
2436  		cfg_get(psoc, CFG_BSS_CLR_COLLISION_DETCN_STA);
2437  }
2438  
mlme_init_threshold_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_threshold * threshold)2439  static void mlme_init_threshold_cfg(struct wlan_objmgr_psoc *psoc,
2440  				    struct wlan_mlme_threshold *threshold)
2441  {
2442  	threshold->rts_threshold = cfg_get(psoc, CFG_RTS_THRESHOLD);
2443  	threshold->frag_threshold = cfg_get(psoc, CFG_FRAG_THRESHOLD);
2444  }
2445  
2446  static bool
mlme_is_freq_present_in_list(struct acs_weight * normalize_weight_chan_list,uint8_t num_freq,uint32_t freq,uint8_t * index)2447  mlme_is_freq_present_in_list(struct acs_weight *normalize_weight_chan_list,
2448  			     uint8_t num_freq, uint32_t freq, uint8_t *index)
2449  {
2450  	uint8_t i;
2451  
2452  	for (i = 0; i < num_freq && i < NUM_CHANNELS; i++) {
2453  		if (normalize_weight_chan_list[i].chan_freq == freq) {
2454  			*index = i;
2455  			return true;
2456  		}
2457  	}
2458  
2459  	return false;
2460  }
2461  
2462  static void
mlme_acs_parse_weight_list(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_acs * acs)2463  mlme_acs_parse_weight_list(struct wlan_objmgr_psoc *psoc,
2464  			   struct wlan_mlme_acs *acs)
2465  {
2466  	char *acs_weight, *str1, *str2 = NULL, *acs_weight_temp, is_range = '-';
2467  	int freq1, freq2, normalize_factor;
2468  	uint8_t num_acs_weight = 0, num_acs_weight_range = 0, index = 0;
2469  	struct acs_weight *weight_list = acs->normalize_weight_chan;
2470  	struct acs_weight_range *range_list = acs->normalize_weight_range;
2471  
2472  	if (!qdf_str_len(cfg_get(psoc, CFG_NORMALIZE_ACS_WEIGHT)))
2473  		return;
2474  
2475  	acs_weight = qdf_mem_malloc(ACS_WEIGHT_MAX_STR_LEN);
2476  	if (!acs_weight)
2477  		return;
2478  
2479  	qdf_mem_copy(acs_weight, cfg_get(psoc, CFG_NORMALIZE_ACS_WEIGHT),
2480  		     ACS_WEIGHT_MAX_STR_LEN);
2481  	acs_weight_temp = acs_weight;
2482  
2483  	while(acs_weight_temp) {
2484  		str1 = strsep(&acs_weight_temp, ",");
2485  		if (!str1)
2486  			goto end;
2487  		freq1 = 0;
2488  		freq2 = 0;
2489  		if (strchr(str1, is_range)) {
2490  			str2 = strsep(&str1, "-");
2491  			sscanf(str2, "%d", &freq1);
2492  			sscanf(str1, "%d", &freq2);
2493  			strsep(&str1, "=");
2494  			if (!str1)
2495  				goto end;
2496  			sscanf(str1, "%d", &normalize_factor);
2497  
2498  			if (num_acs_weight_range == MAX_ACS_WEIGHT_RANGE)
2499  				continue;
2500  			range_list[num_acs_weight_range].normalize_weight =
2501  							normalize_factor;
2502  			range_list[num_acs_weight_range].start_freq = freq1;
2503  			range_list[num_acs_weight_range++].end_freq = freq2;
2504  		} else {
2505  			sscanf(str1, "%d", &freq1);
2506  			strsep(&str1, "=");
2507  			if (!str1 || !weight_list)
2508  				goto end;
2509  			sscanf(str1, "%d", &normalize_factor);
2510  			if (mlme_is_freq_present_in_list(weight_list,
2511  							 num_acs_weight, freq1,
2512  							 &index)) {
2513  				weight_list[index].normalize_weight =
2514  							normalize_factor;
2515  			} else {
2516  				if (num_acs_weight == NUM_CHANNELS)
2517  					continue;
2518  
2519  				weight_list[num_acs_weight].chan_freq = freq1;
2520  				weight_list[num_acs_weight++].normalize_weight =
2521  							normalize_factor;
2522  			}
2523  		}
2524  	}
2525  
2526  	acs->normalize_weight_num_chan = num_acs_weight;
2527  	acs->num_weight_range = num_acs_weight_range;
2528  
2529  end:
2530  	qdf_mem_free(acs_weight);
2531  }
2532  
mlme_init_acs_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_acs * acs)2533  static void mlme_init_acs_cfg(struct wlan_objmgr_psoc *psoc,
2534  			      struct wlan_mlme_acs *acs)
2535  {
2536  	acs->is_acs_with_more_param =
2537  		cfg_get(psoc, CFG_ACS_WITH_MORE_PARAM);
2538  	acs->auto_channel_select_weight =
2539  		cfg_get(psoc, CFG_AUTO_CHANNEL_SELECT_WEIGHT);
2540  	acs->is_vendor_acs_support =
2541  		cfg_get(psoc, CFG_USER_AUTO_CHANNEL_SELECTION);
2542  	acs->force_sap_start =
2543  		cfg_get(psoc, CFG_ACS_FORCE_START_SAP);
2544  	acs->is_acs_support_for_dfs_ltecoex =
2545  		cfg_get(psoc, CFG_USER_ACS_DFS_LTE);
2546  	acs->is_external_acs_policy =
2547  		cfg_get(psoc, CFG_EXTERNAL_ACS_POLICY);
2548  	acs->np_chan_weightage = cfg_get(psoc, CFG_ACS_NP_CHAN_WEIGHT);
2549  	acs->acs_prefer_6ghz_psc = cfg_default(CFG_ACS_PREFER_6GHZ_PSC);
2550  	mlme_acs_parse_weight_list(psoc, acs);
2551  }
2552  
2553  static void
mlme_init_product_details_cfg(struct wlan_mlme_product_details_cfg * product_details)2554  mlme_init_product_details_cfg(struct wlan_mlme_product_details_cfg
2555  			      *product_details)
2556  {
2557  	qdf_str_lcopy(product_details->manufacturer_name,
2558  		      cfg_default(CFG_MFR_NAME),
2559  		      sizeof(product_details->manufacturer_name));
2560  	qdf_str_lcopy(product_details->manufacture_product_name,
2561  		      cfg_default(CFG_MFR_PRODUCT_NAME),
2562  		      sizeof(product_details->manufacture_product_name));
2563  	qdf_str_lcopy(product_details->manufacture_product_version,
2564  		      cfg_default(CFG_MFR_PRODUCT_VERSION),
2565  		      sizeof(product_details->manufacture_product_version));
2566  	qdf_str_lcopy(product_details->model_name,
2567  		      cfg_default(CFG_MODEL_NAME),
2568  		      sizeof(product_details->model_name));
2569  	qdf_str_lcopy(product_details->model_number,
2570  		      cfg_default(CFG_MODEL_NUMBER),
2571  		      sizeof(product_details->model_number));
2572  }
2573  
2574  #ifdef WLAN_FEATURE_11BE_MLO
mlme_init_sta_mlo_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_sta_cfg * sta)2575  static void mlme_init_sta_mlo_cfg(struct wlan_objmgr_psoc *psoc,
2576  				  struct wlan_mlme_sta_cfg *sta)
2577  {
2578  	sta->mlo_support_link_num =
2579  		cfg_get(psoc, CFG_MLO_SUPPORT_LINK_NUM);
2580  	sta->mlo_support_link_band =
2581  		cfg_get(psoc, CFG_MLO_SUPPORT_LINK_BAND);
2582  	sta->mlo_max_simultaneous_links =
2583  		cfg_default(CFG_MLO_MAX_SIMULTANEOUS_LINKS);
2584  	sta->mlo_prefer_percentage =
2585  		cfg_get(psoc, CFG_MLO_PREFER_PERCENTAGE);
2586  	sta->mlo_same_link_mld_address =
2587  		cfg_default(CFG_MLO_SAME_LINK_MLD_ADDR);
2588  	sta->mlo_5gl_5gh_mlsr =
2589  		cfg_get(psoc, CFG_MLO_MLO_5GL_5GH_MLSR);
2590  	sta->epcs_capability =
2591  		cfg_get(psoc, CFG_MLO_EPCS_SUPPORT_ENABLE);
2592  
2593  	mlme_debug("mlo_support_link_num: %d, mlo_support_link_band: 0x%x",
2594  		   sta->mlo_support_link_num, sta->mlo_support_link_band);
2595  }
2596  
2597  static bool
wlan_get_vdev_link_removed_flag(struct wlan_objmgr_vdev * vdev)2598  wlan_get_vdev_link_removed_flag(struct wlan_objmgr_vdev *vdev)
2599  {
2600  	bool is_mlo_link_removed = false;
2601  	uint8_t link_id;
2602  	struct mlo_link_info *link_info;
2603  
2604  	if (!mlo_is_mld_sta(vdev))
2605  		return false;
2606  
2607  	link_id = wlan_vdev_get_link_id(vdev);
2608  	link_info = mlo_mgr_get_ap_link_by_link_id(vdev->mlo_dev_ctx, link_id);
2609  	if (link_info)
2610  		is_mlo_link_removed =
2611  			!!qdf_atomic_test_bit(LS_F_AP_REMOVAL_BIT,
2612  					      &link_info->link_status_flags);
2613  	else
2614  		mlme_legacy_err("link info null, id %d", link_id);
2615  
2616  	return is_mlo_link_removed;
2617  }
2618  
wlan_get_vdev_link_removed_flag_by_vdev_id(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)2619  bool wlan_get_vdev_link_removed_flag_by_vdev_id(struct wlan_objmgr_psoc *psoc,
2620  						uint8_t vdev_id)
2621  {
2622  	struct wlan_objmgr_vdev *vdev;
2623  	bool is_mlo_link_removed;
2624  
2625  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
2626  						    WLAN_MLME_OBJMGR_ID);
2627  	if (!vdev) {
2628  		mlme_legacy_err("get vdev failed for id %d", vdev_id);
2629  		return false;
2630  	}
2631  
2632  	is_mlo_link_removed = wlan_get_vdev_link_removed_flag(vdev);
2633  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2634  
2635  	return is_mlo_link_removed;
2636  }
2637  
2638  static QDF_STATUS
wlan_set_vdev_link_removed_flag(struct wlan_objmgr_vdev * vdev,bool removed)2639  wlan_set_vdev_link_removed_flag(struct wlan_objmgr_vdev *vdev, bool removed)
2640  {
2641  	uint8_t link_id;
2642  	struct mlo_link_info *link_info;
2643  	bool is_mlo_link_removed;
2644  
2645  	if (!vdev) {
2646  		mlme_legacy_err("vdev NULL");
2647  		return QDF_STATUS_E_INVAL;
2648  	}
2649  
2650  	if (!mlo_is_mld_sta(vdev)) {
2651  		mlme_legacy_debug("vdev not mld sta");
2652  		return QDF_STATUS_E_INVAL;
2653  	}
2654  
2655  	link_id = wlan_vdev_get_link_id(vdev);
2656  	link_info = mlo_mgr_get_ap_link_by_link_id(vdev->mlo_dev_ctx, link_id);
2657  	if (!link_info) {
2658  		mlme_legacy_err("link info null, id %d", link_id);
2659  		return QDF_STATUS_E_INVAL;
2660  	}
2661  	is_mlo_link_removed =
2662  		!!qdf_atomic_test_bit(LS_F_AP_REMOVAL_BIT,
2663  				      &link_info->link_status_flags);
2664  	if (removed == is_mlo_link_removed)
2665  		return QDF_STATUS_SUCCESS;
2666  
2667  	mlme_legacy_debug("mlo sta vdev %d link %d link removed flag %d",
2668  			  wlan_vdev_get_id(vdev), link_id, removed);
2669  	if (removed)
2670  		qdf_atomic_set_bit(LS_F_AP_REMOVAL_BIT,
2671  				   &link_info->link_status_flags);
2672  	else
2673  		qdf_atomic_clear_bit(LS_F_AP_REMOVAL_BIT,
2674  				     &link_info->link_status_flags);
2675  
2676  	return QDF_STATUS_SUCCESS;
2677  }
2678  
2679  QDF_STATUS
wlan_set_vdev_link_removed_flag_by_vdev_id(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool removed)2680  wlan_set_vdev_link_removed_flag_by_vdev_id(struct wlan_objmgr_psoc *psoc,
2681  					   uint8_t vdev_id, bool removed)
2682  {
2683  	struct wlan_objmgr_vdev *vdev;
2684  	QDF_STATUS status;
2685  
2686  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
2687  						    WLAN_MLME_OBJMGR_ID);
2688  	if (!vdev) {
2689  		mlme_legacy_err("vdev null for id %d", vdev_id);
2690  		return QDF_STATUS_E_INVAL;
2691  	}
2692  
2693  	if (!mlo_is_mld_sta(vdev)) {
2694  		mlme_legacy_debug("vdev %d not mld sta", vdev_id);
2695  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2696  		return QDF_STATUS_E_INVAL;
2697  	}
2698  
2699  	status = wlan_set_vdev_link_removed_flag(vdev, removed);
2700  
2701  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2702  
2703  	return status;
2704  }
2705  
wlan_clear_mlo_sta_link_removed_flag(struct wlan_objmgr_vdev * vdev)2706  void wlan_clear_mlo_sta_link_removed_flag(struct wlan_objmgr_vdev *vdev)
2707  {
2708  	uint8_t i;
2709  	struct mlo_link_info *link_info;
2710  
2711  	if (!vdev || !mlo_is_mld_sta(vdev))
2712  		return;
2713  
2714  	link_info = mlo_mgr_get_ap_link(vdev);
2715  	if (!link_info)
2716  		return;
2717  
2718  	for (i = 0; i < WLAN_MAX_ML_BSS_LINKS; i++)
2719  		qdf_atomic_clear_bit(LS_F_AP_REMOVAL_BIT,
2720  				     &link_info[i].link_status_flags);
2721  }
2722  
wlan_get_mlo_link_agnostic_flag(struct wlan_objmgr_vdev * vdev,uint8_t * dest_addr)2723  bool wlan_get_mlo_link_agnostic_flag(struct wlan_objmgr_vdev *vdev,
2724  				     uint8_t *dest_addr)
2725  {
2726  	struct wlan_objmgr_peer *bss_peer = NULL;
2727  	bool mlo_link_agnostic = false;
2728  	uint8_t *peer_mld_addr = NULL;
2729  
2730  	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
2731  		return mlo_link_agnostic;
2732  
2733  	bss_peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_MLME_OBJMGR_ID);
2734  	if (bss_peer) {
2735  		peer_mld_addr = wlan_peer_mlme_get_mldaddr(bss_peer);
2736  		if (!qdf_mem_cmp(bss_peer->macaddr, dest_addr,
2737  				 QDF_MAC_ADDR_SIZE) ||
2738  		    (peer_mld_addr && !qdf_mem_cmp(peer_mld_addr, dest_addr,
2739  						   QDF_MAC_ADDR_SIZE))) {
2740  			mlme_legacy_debug("dest address" QDF_MAC_ADDR_FMT "bss peer address"
2741  					  QDF_MAC_ADDR_FMT "mld addr" QDF_MAC_ADDR_FMT,
2742  					  QDF_MAC_ADDR_REF(dest_addr),
2743  					  QDF_MAC_ADDR_REF(bss_peer->macaddr),
2744  					  QDF_MAC_ADDR_REF(peer_mld_addr));
2745  			mlo_link_agnostic = true;
2746  		}
2747  		wlan_objmgr_peer_release_ref(bss_peer, WLAN_MLME_OBJMGR_ID);
2748  	}
2749  	return mlo_link_agnostic;
2750  }
2751  
wlan_drop_mgmt_frame_on_link_removal(struct wlan_objmgr_vdev * vdev)2752  bool wlan_drop_mgmt_frame_on_link_removal(struct wlan_objmgr_vdev *vdev)
2753  {
2754  	if (!vdev || !mlo_is_mld_sta(vdev))
2755  		return false;
2756  
2757  	return wlan_get_vdev_link_removed_flag(vdev);
2758  }
2759  #else
mlme_init_sta_mlo_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_sta_cfg * sta)2760  static void mlme_init_sta_mlo_cfg(struct wlan_objmgr_psoc *psoc,
2761  				  struct wlan_mlme_sta_cfg *sta)
2762  {
2763  }
2764  #endif
2765  
mlme_init_sta_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_sta_cfg * sta)2766  static void mlme_init_sta_cfg(struct wlan_objmgr_psoc *psoc,
2767  			      struct wlan_mlme_sta_cfg *sta)
2768  {
2769  	sta->sta_keep_alive_period =
2770  		cfg_get(psoc, CFG_INFRA_STA_KEEP_ALIVE_PERIOD);
2771  	sta->bss_max_idle_period =
2772  		cfg_get(psoc, CFG_STA_BSS_MAX_IDLE_PERIOD);
2773  	sta->tgt_gtx_usr_cfg =
2774  		cfg_get(psoc, CFG_TGT_GTX_USR_CFG);
2775  	sta->pmkid_modes =
2776  		cfg_get(psoc, CFG_PMKID_MODES);
2777  	sta->ignore_peer_erp_info =
2778  		cfg_get(psoc, CFG_IGNORE_PEER_ERP_INFO);
2779  	sta->sta_prefer_80mhz_over_160mhz =
2780  		cfg_get(psoc, CFG_STA_PREFER_80MHZ_OVER_160MHZ);
2781  	sta->enable_5g_ebt =
2782  		cfg_get(psoc, CFG_PPS_ENABLE_5G_EBT);
2783  	sta->deauth_before_connection =
2784  		cfg_get(psoc, CFG_ENABLE_DEAUTH_BEFORE_CONNECTION);
2785  	sta->dot11p_mode =
2786  		cfg_get(psoc, CFG_DOT11P_MODE);
2787  	sta->enable_go_cts2self_for_sta =
2788  		cfg_get(psoc, CFG_ENABLE_GO_CTS2SELF_FOR_STA);
2789  	sta->qcn_ie_support =
2790  		cfg_get(psoc, CFG_QCN_IE_SUPPORT);
2791  	sta->fils_max_chan_guard_time =
2792  		cfg_get(psoc, CFG_FILS_MAX_CHAN_GUARD_TIME);
2793  	sta->deauth_retry_cnt = cfg_get(psoc, CFG_DEAUTH_RETRY_CNT);
2794  	sta->single_tid =
2795  		cfg_get(psoc, CFG_SINGLE_TID_RC);
2796  	sta->sta_miracast_mcc_rest_time =
2797  		cfg_get(psoc, CFG_STA_MCAST_MCC_REST_TIME);
2798  	sta->wait_cnf_timeout =
2799  		(uint32_t)cfg_default(CFG_WT_CNF_TIMEOUT);
2800  	sta->current_rssi =
2801  		(uint32_t)cfg_default(CFG_CURRENT_RSSI);
2802  	sta->allow_tpc_from_ap = cfg_get(psoc, CFG_TX_POWER_CTRL);
2803  	sta->sta_keepalive_method =
2804  		cfg_get(psoc, CFG_STA_KEEPALIVE_METHOD);
2805  	sta->max_li_modulated_dtim_time_ms =
2806  		cfg_get(psoc, CFG_MAX_LI_MODULATED_DTIM_MS);
2807  
2808  	mlme_init_sta_mlo_cfg(psoc, sta);
2809  	wlan_mlme_set_epcs_capability(psoc,
2810  				      wlan_mlme_get_epcs_capability(psoc));
2811  	wlan_mlme_set_usr_disable_sta_eht(psoc, false);
2812  	wlan_mlme_set_eht_disable_punct_in_us_lpi(psoc,
2813  						  cfg_default(CFG_EHT_DISABLE_PUNCT_IN_US_LPI));
2814  }
2815  
mlme_init_stats_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_stats_cfg * stats)2816  static void mlme_init_stats_cfg(struct wlan_objmgr_psoc *psoc,
2817  				struct wlan_mlme_stats_cfg *stats)
2818  {
2819  	stats->stats_periodic_display_time =
2820  		cfg_get(psoc, CFG_PERIODIC_STATS_DISPLAY_TIME);
2821  	stats->stats_link_speed_rssi_high =
2822  		cfg_get(psoc, CFG_LINK_SPEED_RSSI_HIGH);
2823  	stats->stats_link_speed_rssi_med =
2824  		cfg_get(psoc, CFG_LINK_SPEED_RSSI_MID);
2825  	stats->stats_link_speed_rssi_low =
2826  		cfg_get(psoc, CFG_LINK_SPEED_RSSI_LOW);
2827  	stats->stats_report_max_link_speed_rssi =
2828  		cfg_get(psoc, CFG_REPORT_MAX_LINK_SPEED);
2829  }
2830  
2831  #ifdef WLAN_ADAPTIVE_11R
2832  /**
2833   * mlme_init_adaptive_11r_cfg() - initialize enable_adaptive_11r
2834   * flag
2835   * @psoc: Pointer to PSOC
2836   * @lfr:  pointer to mlme lfr config
2837   *
2838   * Return: None
2839   */
2840  static void
mlme_init_adaptive_11r_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2841  mlme_init_adaptive_11r_cfg(struct wlan_objmgr_psoc *psoc,
2842  			   struct wlan_mlme_lfr_cfg *lfr)
2843  {
2844  	lfr->enable_adaptive_11r = cfg_get(psoc, CFG_ADAPTIVE_11R);
2845  }
2846  
2847  #else
2848  static inline void
mlme_init_adaptive_11r_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2849  mlme_init_adaptive_11r_cfg(struct wlan_objmgr_psoc *psoc,
2850  			   struct wlan_mlme_lfr_cfg *lfr)
2851  {
2852  }
2853  #endif
2854  
2855  #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
2856  /**
2857   * mlme_init_sae_single_pmk_cfg() - initialize sae_same_pmk_config
2858   * flag
2859   * @psoc: Pointer to PSOC
2860   * @lfr:  pointer to mlme lfr config
2861   *
2862   * Return: None
2863   */
2864  static void
mlme_init_sae_single_pmk_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2865  mlme_init_sae_single_pmk_cfg(struct wlan_objmgr_psoc *psoc,
2866  			     struct wlan_mlme_lfr_cfg *lfr)
2867  {
2868  	lfr->sae_single_pmk_feature_enabled = cfg_get(psoc, CFG_SAE_SINGLE_PMK);
2869  }
2870  
2871  #else
2872  static inline void
mlme_init_sae_single_pmk_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2873  mlme_init_sae_single_pmk_cfg(struct wlan_objmgr_psoc *psoc,
2874  			     struct wlan_mlme_lfr_cfg *lfr)
2875  {
2876  }
2877  #endif
2878  
2879  #ifdef WLAN_FEATURE_ROAM_OFFLOAD
mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2880  static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc,
2881  				       struct wlan_mlme_lfr_cfg *lfr)
2882  {
2883  	bool val = false;
2884  
2885  	lfr->lfr3_roaming_offload =
2886  		cfg_get(psoc, CFG_LFR3_ROAMING_OFFLOAD);
2887  	lfr->lfr3_dual_sta_roaming_enabled =
2888  		cfg_get(psoc, CFG_ENABLE_DUAL_STA_ROAM_OFFLOAD);
2889  	lfr->enable_self_bss_roam = cfg_get(psoc, CFG_LFR3_ENABLE_SELF_BSS_ROAM);
2890  	lfr->enable_roam_reason_vsie =
2891  		cfg_get(psoc, CFG_ENABLE_ROAM_REASON_VSIE);
2892  	lfr->enable_disconnect_roam_offload =
2893  		cfg_get(psoc, CFG_LFR_ENABLE_DISCONNECT_ROAM);
2894  	lfr->enable_idle_roam =
2895  		cfg_get(psoc, CFG_LFR_ENABLE_IDLE_ROAM);
2896  	lfr->idle_roam_rssi_delta =
2897  		cfg_get(psoc, CFG_LFR_IDLE_ROAM_RSSI_DELTA);
2898  	lfr->roam_info_stats_num =
2899  		cfg_get(psoc, CFG_LFR3_ROAM_INFO_STATS_NUM);
2900  
2901  	ucfg_mlme_get_connection_roaming_ini_present(psoc, &val);
2902  	if (val) {
2903  		lfr->idle_roam_inactive_time =
2904  			cfg_get(psoc, CFG_ROAM_IDLE_INACTIVE_TIME) * 1000;
2905  	} else {
2906  		lfr->idle_roam_inactive_time =
2907  			cfg_get(psoc, CFG_LFR_IDLE_ROAM_INACTIVE_TIME);
2908  	}
2909  
2910  	lfr->idle_data_packet_count =
2911  		cfg_get(psoc, CFG_LFR_IDLE_ROAM_PACKET_COUNT);
2912  	lfr->idle_roam_min_rssi = cfg_get(psoc, CFG_LFR_IDLE_ROAM_MIN_RSSI);
2913  	lfr->roam_trigger_bitmap =
2914  		cfg_get(psoc, CFG_ROAM_TRIGGER_BITMAP);
2915  	lfr->vendor_btm_param.user_roam_reason = DISABLE_VENDOR_BTM_CONFIG;
2916  
2917  	lfr->idle_roam_band = cfg_get(psoc, CFG_LFR_IDLE_ROAM_BAND);
2918  	lfr->sta_roam_disable = cfg_get(psoc, CFG_STA_DISABLE_ROAM);
2919  	mlme_init_sae_single_pmk_cfg(psoc, lfr);
2920  	qdf_mem_zero(&lfr->roam_rt_stats, sizeof(lfr->roam_rt_stats));
2921  }
2922  
2923  void
wlan_mlme_defer_pmk_set_in_roaming(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool set_pmk_pending)2924  wlan_mlme_defer_pmk_set_in_roaming(struct wlan_objmgr_psoc *psoc,
2925  				   uint8_t vdev_id, bool set_pmk_pending)
2926  {
2927  	struct wlan_objmgr_vdev *vdev;
2928  	struct mlme_legacy_priv *mlme_priv;
2929  
2930  	if (set_pmk_pending && !MLME_IS_ROAM_SYNCH_IN_PROGRESS(psoc, vdev_id))
2931  		return;
2932  
2933  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
2934  						    WLAN_MLME_OBJMGR_ID);
2935  
2936  	if (!vdev) {
2937  		mlme_err("get vdev failed");
2938  		return;
2939  	}
2940  
2941  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
2942  
2943  	if (!mlme_priv) {
2944  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2945  		mlme_legacy_err("vdev legacy private object is NULL");
2946  		return;
2947  	}
2948  
2949  	mlme_priv->mlme_roam.set_pmk_pending = set_pmk_pending;
2950  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2951  }
2952  
2953  bool
wlan_mlme_is_pmk_set_deferred(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)2954  wlan_mlme_is_pmk_set_deferred(struct wlan_objmgr_psoc *psoc,
2955  			      uint8_t vdev_id)
2956  {
2957  	struct wlan_objmgr_vdev *vdev;
2958  	struct mlme_legacy_priv *mlme_priv;
2959  	bool set_pmk_pending;
2960  
2961  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
2962  						    WLAN_MLME_OBJMGR_ID);
2963  
2964  	if (!vdev) {
2965  		mlme_err("get vdev failed");
2966  		return false;
2967  	}
2968  
2969  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
2970  
2971  	if (!mlme_priv) {
2972  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2973  		mlme_legacy_err("vdev legacy private object is NULL");
2974  		return false;
2975  	}
2976  
2977  	set_pmk_pending = mlme_priv->mlme_roam.set_pmk_pending;
2978  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
2979  
2980  	return set_pmk_pending;
2981  }
2982  #else
mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2983  static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc,
2984  				       struct wlan_mlme_lfr_cfg *lfr)
2985  {
2986  }
2987  
2988  #endif
2989  
2990  #ifdef FEATURE_WLAN_ESE
mlme_init_ese_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2991  static void mlme_init_ese_cfg(struct wlan_objmgr_psoc *psoc,
2992  			      struct wlan_mlme_lfr_cfg *lfr)
2993  {
2994  	lfr->ese_enabled = cfg_get(psoc, CFG_LFR_ESE_FEATURE_ENABLED);
2995  }
2996  #else
mlme_init_ese_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)2997  static void mlme_init_ese_cfg(struct wlan_objmgr_psoc *psoc,
2998  			      struct wlan_mlme_lfr_cfg *lfr)
2999  {
3000  }
3001  #endif
3002  
3003  #ifdef FEATURE_LFR_SUBNET_DETECTION
mlme_init_subnet_detection(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)3004  static void mlme_init_subnet_detection(struct wlan_objmgr_psoc *psoc,
3005  				       struct wlan_mlme_lfr_cfg *lfr)
3006  {
3007  	lfr->enable_lfr_subnet_detection =
3008  		cfg_get(psoc, CFG_LFR3_ENABLE_SUBNET_DETECTION);
3009  }
3010  #else
mlme_init_subnet_detection(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)3011  static void mlme_init_subnet_detection(struct wlan_objmgr_psoc *psoc,
3012  				       struct wlan_mlme_lfr_cfg *lfr)
3013  {
3014  }
3015  #endif
3016  
3017  static void
mlme_init_bss_load_trigger_params(struct wlan_objmgr_psoc * psoc,struct bss_load_trigger * bss_load_trig)3018  mlme_init_bss_load_trigger_params(struct wlan_objmgr_psoc *psoc,
3019  				  struct bss_load_trigger *bss_load_trig)
3020  {
3021  	bool val = false;
3022  
3023  	bss_load_trig->enabled =
3024  		cfg_get(psoc, CFG_ENABLE_BSS_LOAD_TRIGGERED_ROAM);
3025  	bss_load_trig->threshold = cfg_get(psoc, CFG_BSS_LOAD_THRESHOLD);
3026  
3027  	ucfg_mlme_get_connection_roaming_ini_present(psoc, &val);
3028  	if (val)
3029  		bss_load_trig->sample_time =
3030  				cfg_get(psoc, CFG_ROAM_CU_MONITOR_TIME) * 1000;
3031  	else
3032  		bss_load_trig->sample_time = cfg_get(psoc,
3033  						     CFG_BSS_LOAD_SAMPLE_TIME);
3034  
3035  	bss_load_trig->rssi_threshold_6ghz =
3036  			cfg_get(psoc, CFG_BSS_LOAD_TRIG_6G_RSSI_THRES);
3037  	bss_load_trig->rssi_threshold_5ghz =
3038  			cfg_get(psoc, CFG_BSS_LOAD_TRIG_5G_RSSI_THRES);
3039  	bss_load_trig->rssi_threshold_24ghz =
3040  			cfg_get(psoc, CFG_BSS_LOAD_TRIG_2G_RSSI_THRES);
3041  }
3042  
mlme_reinit_control_config_lfr_params(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)3043  void mlme_reinit_control_config_lfr_params(struct wlan_objmgr_psoc *psoc,
3044  					   struct wlan_mlme_lfr_cfg *lfr)
3045  {
3046  	/* Restore the params set through SETDFSSCANMODE */
3047  	lfr->roaming_dfs_channel =
3048  		cfg_get(psoc, CFG_LFR_ROAMING_DFS_CHANNEL);
3049  
3050  	/* Restore the params set through SETWESMODE */
3051  	lfr->wes_mode_enabled = cfg_get(psoc, CFG_LFR_ENABLE_WES_MODE);
3052  }
3053  
3054  #ifdef CONNECTION_ROAMING_CFG
3055  /**
3056   * mlme_init_bmiss_timeout() - Init bmiss timeout
3057   * @psoc: Pointer to psoc
3058   * @lfr: Pointer to lfr config
3059   *
3060   * Return: None
3061   */
mlme_init_bmiss_timeout(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)3062  static void mlme_init_bmiss_timeout(struct wlan_objmgr_psoc *psoc,
3063  				    struct wlan_mlme_lfr_cfg *lfr)
3064  {
3065  	lfr->beaconloss_timeout_onwakeup =
3066  		cfg_get(psoc, CFG_LFR_BEACONLOSS_TIMEOUT_ON_WAKEUP) / 2;
3067  	lfr->beaconloss_timeout_onsleep =
3068  		cfg_get(psoc, CFG_LFR_BEACONLOSS_TIMEOUT_ON_SLEEP) / 2;
3069  }
3070  #else
mlme_init_bmiss_timeout(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)3071  static void mlme_init_bmiss_timeout(struct wlan_objmgr_psoc *psoc,
3072  				    struct wlan_mlme_lfr_cfg *lfr)
3073  {
3074  	lfr->beaconloss_timeout_onwakeup =
3075  		cfg_get(psoc, CFG_LFR_BEACONLOSS_TIMEOUT_ON_WAKEUP);
3076  	lfr->beaconloss_timeout_onsleep =
3077  		cfg_get(psoc, CFG_LFR_BEACONLOSS_TIMEOUT_ON_SLEEP);
3078  }
3079  #endif
3080  
mlme_init_lfr_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_lfr_cfg * lfr)3081  static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc,
3082  			      struct wlan_mlme_lfr_cfg *lfr)
3083  {
3084  	qdf_size_t neighbor_scan_chan_list_num = 0;
3085  	bool val = false;
3086  
3087  	lfr->mawc_roam_enabled =
3088  		cfg_get(psoc, CFG_LFR_MAWC_ROAM_ENABLED);
3089  	lfr->enable_fast_roam_in_concurrency =
3090  		cfg_get(psoc, CFG_LFR_ENABLE_FAST_ROAM_IN_CONCURRENCY);
3091  	lfr->early_stop_scan_enable =
3092  		cfg_get(psoc, CFG_LFR_EARLY_STOP_SCAN_ENABLE);
3093  	lfr->enable_5g_band_pref =
3094  		cfg_get(psoc, CFG_LFR_ENABLE_5G_BAND_PREF);
3095  	lfr->lfr_enabled = cfg_get(psoc, CFG_LFR_FEATURE_ENABLED);
3096  	lfr->mawc_enabled = cfg_get(psoc, CFG_LFR_MAWC_FEATURE_ENABLED);
3097  	lfr->fast_transition_enabled =
3098  		cfg_get(psoc, CFG_LFR_FAST_TRANSITION_ENABLED);
3099  	lfr->wes_mode_enabled = cfg_get(psoc, CFG_LFR_ENABLE_WES_MODE);
3100  	lfr->mawc_roam_traffic_threshold =
3101  		cfg_get(psoc, CFG_LFR_MAWC_ROAM_TRAFFIC_THRESHOLD);
3102  	lfr->mawc_roam_ap_rssi_threshold =
3103  		cfg_get(psoc, CFG_LFR_MAWC_ROAM_AP_RSSI_THRESHOLD);
3104  	lfr->mawc_roam_rssi_high_adjust =
3105  		cfg_get(psoc, CFG_LFR_MAWC_ROAM_RSSI_HIGH_ADJUST);
3106  	lfr->mawc_roam_rssi_low_adjust =
3107  		cfg_get(psoc, CFG_LFR_MAWC_ROAM_RSSI_LOW_ADJUST);
3108  	lfr->roam_rssi_abs_threshold =
3109  		cfg_get(psoc, CFG_LFR_ROAM_RSSI_ABS_THRESHOLD);
3110  	lfr->rssi_threshold_offset_5g =
3111  		cfg_get(psoc, CFG_LFR_5G_RSSI_THRESHOLD_OFFSET);
3112  	lfr->early_stop_scan_min_threshold =
3113  		cfg_get(psoc, CFG_LFR_EARLY_STOP_SCAN_MIN_THRESHOLD);
3114  	lfr->early_stop_scan_max_threshold =
3115  		cfg_get(psoc, CFG_LFR_EARLY_STOP_SCAN_MAX_THRESHOLD);
3116  	lfr->roam_dense_traffic_threshold =
3117  		cfg_get(psoc, CFG_LFR_ROAM_DENSE_TRAFFIC_THRESHOLD);
3118  	lfr->roam_dense_rssi_thre_offset =
3119  		cfg_get(psoc, CFG_LFR_ROAM_DENSE_RSSI_THRE_OFFSET);
3120  	lfr->roam_dense_min_aps =
3121  		cfg_get(psoc, CFG_LFR_ROAM_DENSE_MIN_APS);
3122  	lfr->roam_bg_scan_bad_rssi_threshold =
3123  		cfg_get(psoc, CFG_LFR_ROAM_BG_SCAN_BAD_RSSI_THRESHOLD);
3124  	lfr->roam_bg_scan_client_bitmap =
3125  		cfg_get(psoc, CFG_LFR_ROAM_BG_SCAN_CLIENT_BITMAP);
3126  	lfr->roam_bg_scan_bad_rssi_offset_2g =
3127  		cfg_get(psoc, CFG_LFR_ROAM_BG_SCAN_BAD_RSSI_OFFSET_2G);
3128  	lfr->roam_data_rssi_threshold_triggers =
3129  		cfg_get(psoc, CFG_ROAM_DATA_RSSI_THRESHOLD_TRIGGERS);
3130  	lfr->roam_data_rssi_threshold =
3131  		cfg_get(psoc, CFG_ROAM_DATA_RSSI_THRESHOLD);
3132  	lfr->rx_data_inactivity_time =
3133  		cfg_get(psoc, CFG_RX_DATA_INACTIVITY_TIME);
3134  	lfr->adaptive_roamscan_dwell_mode =
3135  		cfg_get(psoc, CFG_LFR_ADAPTIVE_ROAMSCAN_DWELL_MODE);
3136  	lfr->per_roam_enable =
3137  		cfg_get(psoc, CFG_LFR_PER_ROAM_ENABLE);
3138  	lfr->per_roam_config_high_rate_th =
3139  		cfg_get(psoc, CFG_LFR_PER_ROAM_CONFIG_HIGH_RATE_TH);
3140  	lfr->per_roam_config_low_rate_th =
3141  		cfg_get(psoc, CFG_LFR_PER_ROAM_CONFIG_LOW_RATE_TH);
3142  	lfr->per_roam_config_rate_th_percent =
3143  		cfg_get(psoc, CFG_LFR_PER_ROAM_CONFIG_RATE_TH_PERCENT);
3144  	lfr->per_roam_rest_time =
3145  		cfg_get(psoc, CFG_LFR_PER_ROAM_REST_TIME);
3146  	lfr->per_roam_monitor_time =
3147  		cfg_get(psoc, CFG_LFR_PER_ROAM_MONITOR_TIME);
3148  	lfr->per_roam_min_candidate_rssi =
3149  		cfg_get(psoc, CFG_LFR_PER_ROAM_MIN_CANDIDATE_RSSI);
3150  	lfr->lfr3_disallow_duration =
3151  		cfg_get(psoc, CFG_LFR3_ROAM_DISALLOW_DURATION);
3152  	lfr->lfr3_rssi_channel_penalization =
3153  		cfg_get(psoc, CFG_LFR3_ROAM_RSSI_CHANNEL_PENALIZATION);
3154  	lfr->lfr3_num_disallowed_aps =
3155  		cfg_get(psoc, CFG_LFR3_ROAM_NUM_DISALLOWED_APS);
3156  
3157  	if (lfr->enable_5g_band_pref) {
3158  		lfr->rssi_boost_threshold_5g =
3159  			cfg_get(psoc, CFG_LFR_5G_RSSI_BOOST_THRESHOLD);
3160  		lfr->rssi_boost_factor_5g =
3161  			cfg_get(psoc, CFG_LFR_5G_RSSI_BOOST_FACTOR);
3162  		lfr->max_rssi_boost_5g =
3163  			cfg_get(psoc, CFG_LFR_5G_MAX_RSSI_BOOST);
3164  		lfr->rssi_penalize_threshold_5g =
3165  			cfg_get(psoc, CFG_LFR_5G_RSSI_PENALIZE_THRESHOLD);
3166  		lfr->rssi_penalize_factor_5g =
3167  			cfg_get(psoc, CFG_LFR_5G_RSSI_PENALIZE_FACTOR);
3168  		lfr->max_rssi_penalize_5g =
3169  			cfg_get(psoc, CFG_LFR_5G_MAX_RSSI_PENALIZE);
3170  	}
3171  
3172  	lfr->max_num_pre_auth = (uint32_t)
3173  		cfg_default(CFG_LFR_MAX_NUM_PRE_AUTH);
3174  	lfr->roam_preauth_no_ack_timeout =
3175  		cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_NO_ACK_TIMEOUT);
3176  	lfr->roam_preauth_retry_count =
3177  		cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_RETRY_COUNT);
3178  	lfr->roam_rssi_diff = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF);
3179  	lfr->roam_rssi_diff_6ghz = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF_6GHZ);
3180  	lfr->bg_rssi_threshold = cfg_get(psoc, CFG_LFR_ROAM_BG_RSSI_TH);
3181  	lfr->roam_scan_offload_enabled =
3182  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
3183  	lfr->neighbor_scan_timer_period =
3184  		cfg_get(psoc, CFG_LFR_NEIGHBOR_SCAN_TIMER_PERIOD);
3185  	lfr->neighbor_scan_min_timer_period =
3186  		cfg_get(psoc, CFG_LFR_NEIGHBOR_SCAN_MIN_TIMER_PERIOD);
3187  	lfr->neighbor_lookup_rssi_threshold =
3188  		abs(cfg_get(psoc, CFG_LFR_NEIGHBOR_LOOKUP_RSSI_THRESHOLD));
3189  	lfr->opportunistic_scan_threshold_diff =
3190  		cfg_get(psoc, CFG_LFR_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF);
3191  	lfr->roam_rescan_rssi_diff =
3192  		cfg_get(psoc, CFG_LFR_ROAM_RESCAN_RSSI_DIFF);
3193  	lfr->neighbor_scan_min_chan_time =
3194  		cfg_get(psoc, CFG_LFR_NEIGHBOR_SCAN_MIN_CHAN_TIME);
3195  	lfr->neighbor_scan_max_chan_time =
3196  		cfg_get(psoc, CFG_LFR_NEIGHBOR_SCAN_MAX_CHAN_TIME);
3197  	lfr->passive_max_channel_time =
3198  		cfg_get(psoc, CFG_ROAM_PASSIVE_MAX_CHANNEL_TIME);
3199  	lfr->neighbor_scan_results_refresh_period =
3200  		cfg_get(psoc, CFG_LFR_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD);
3201  
3202  	ucfg_mlme_get_connection_roaming_ini_present(psoc, &val);
3203  	if (val)
3204  		lfr->empty_scan_refresh_period =
3205  			cfg_get(psoc, CFG_ROAM_SCAN_FIRST_TIMER) * 1000;
3206  	else
3207  		lfr->empty_scan_refresh_period =
3208  			cfg_get(psoc, CFG_LFR_EMPTY_SCAN_REFRESH_PERIOD);
3209  	lfr->roam_bmiss_first_bcnt =
3210  		cfg_get(psoc, CFG_LFR_ROAM_BMISS_FIRST_BCNT);
3211  	lfr->roam_bmiss_final_bcnt =
3212  		cfg_get(psoc, CFG_LFR_ROAM_BMISS_FINAL_BCNT);
3213  	lfr->roaming_dfs_channel =
3214  		cfg_get(psoc, CFG_LFR_ROAMING_DFS_CHANNEL);
3215  	lfr->roam_scan_hi_rssi_maxcount =
3216  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_HI_RSSI_MAXCOUNT);
3217  	lfr->roam_scan_hi_rssi_delta =
3218  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_HI_RSSI_DELTA);
3219  	lfr->roam_scan_hi_rssi_delay =
3220  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_HI_RSSI_DELAY);
3221  	lfr->roam_scan_hi_rssi_ub =
3222  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_HI_RSSI_UB);
3223  	lfr->roam_prefer_5ghz =
3224  		cfg_get(psoc, CFG_LFR_ROAM_PREFER_5GHZ);
3225  	lfr->roam_intra_band =
3226  		cfg_get(psoc, CFG_LFR_ROAM_INTRA_BAND);
3227  	lfr->roam_scan_home_away_time =
3228  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_HOME_AWAY_TIME);
3229  	lfr->roam_scan_n_probes =
3230  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_N_PROBES);
3231  	lfr->delay_before_vdev_stop =
3232  		cfg_get(psoc, CFG_LFR_DELAY_BEFORE_VDEV_STOP);
3233  	qdf_uint8_array_parse(cfg_get(psoc, CFG_LFR_NEIGHBOR_SCAN_CHANNEL_LIST),
3234  			      lfr->neighbor_scan_channel_list,
3235  			      CFG_VALID_CHANNEL_LIST_LEN,
3236  			      &neighbor_scan_chan_list_num);
3237  	lfr->neighbor_scan_channel_list_num =
3238  				(uint8_t)neighbor_scan_chan_list_num;
3239  	lfr->ho_delay_for_rx =
3240  		cfg_get(psoc, CFG_LFR3_ROAM_HO_DELAY_FOR_RX);
3241  	lfr->min_delay_btw_roam_scans =
3242  		cfg_get(psoc, CFG_LFR_MIN_DELAY_BTW_ROAM_SCAN);
3243  	lfr->roam_trigger_reason_bitmask =
3244  		cfg_get(psoc, CFG_LFR_ROAM_SCAN_TRIGGER_REASON_BITMASK);
3245  	lfr->enable_ftopen =
3246  		cfg_get(psoc, CFG_LFR_ROAM_FT_OPEN_ENABLE);
3247  	lfr->roam_force_rssi_trigger =
3248  		cfg_get(psoc, CFG_LFR_ROAM_FORCE_RSSI_TRIGGER);
3249  	lfr->roaming_scan_policy =
3250  		cfg_get(psoc, CFG_ROAM_SCAN_SCAN_POLICY);
3251  
3252  	if (val)
3253  		lfr->roam_scan_inactivity_time =
3254  			cfg_get(psoc, CFG_ROAM_SCAN_INACTIVE_TIMER) * 1000;
3255  	else
3256  		lfr->roam_scan_inactivity_time =
3257  			cfg_get(psoc, CFG_ROAM_SCAN_INACTIVITY_TIME);
3258  
3259  	lfr->roam_inactive_data_packet_count =
3260  		cfg_get(psoc, CFG_ROAM_INACTIVE_COUNT);
3261  
3262  	lfr->fw_akm_bitmap = 0;
3263  	lfr->enable_ft_im_roaming = cfg_get(psoc, CFG_FT_IM_ROAMING);
3264  	lfr->enable_ft_over_ds = !ENABLE_FT_OVER_DS;
3265  
3266  	mlme_init_roam_offload_cfg(psoc, lfr);
3267  	mlme_init_ese_cfg(psoc, lfr);
3268  	mlme_init_bss_load_trigger_params(psoc, &lfr->bss_load_trig);
3269  	mlme_init_adaptive_11r_cfg(psoc, lfr);
3270  	mlme_init_subnet_detection(psoc, lfr);
3271  	lfr->rso_user_config.cat_rssi_offset = DEFAULT_RSSI_DB_GAP;
3272  	mlme_init_bmiss_timeout(psoc, lfr);
3273  	lfr->hs20_btm_offload_disable = cfg_get(psoc,
3274  						CFG_HS_20_BTM_OFFLOAD_DISABLE);
3275  }
3276  
mlme_init_power_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_power * power)3277  static void mlme_init_power_cfg(struct wlan_objmgr_psoc *psoc,
3278  				struct wlan_mlme_power *power)
3279  {
3280  	power->tx_power_2g = cfg_get(psoc, CFG_SET_TXPOWER_LIMIT2G);
3281  	power->tx_power_5g = cfg_get(psoc, CFG_SET_TXPOWER_LIMIT5G);
3282  
3283  	power->max_tx_power_24_chan.max_len = CFG_MAX_TX_POWER_2_4_LEN;
3284  	qdf_uint8_array_parse(cfg_default(CFG_MAX_TX_POWER_2_4),
3285  			      power->max_tx_power_24_chan.data,
3286  			      sizeof(power->max_tx_power_24_chan.data),
3287  			      &power->max_tx_power_24_chan.len);
3288  
3289  	power->max_tx_power_5_chan.max_len = CFG_MAX_TX_POWER_5_LEN;
3290  	qdf_uint8_array_parse(cfg_default(CFG_MAX_TX_POWER_5),
3291  			      power->max_tx_power_5_chan.data,
3292  			      sizeof(power->max_tx_power_5_chan.data),
3293  			      &power->max_tx_power_5_chan.len);
3294  
3295  	power->power_usage.max_len = CFG_POWER_USAGE_MAX_LEN;
3296  	power->power_usage.len = CFG_POWER_USAGE_MAX_LEN;
3297  	qdf_mem_copy(power->power_usage.data, cfg_get(psoc, CFG_POWER_USAGE),
3298  		     power->power_usage.len);
3299  	power->current_tx_power_level =
3300  			(uint8_t)cfg_default(CFG_CURRENT_TX_POWER_LEVEL);
3301  	power->local_power_constraint =
3302  			(uint8_t)cfg_default(CFG_LOCAL_POWER_CONSTRAINT);
3303  	power->skip_tpe = cfg_get(psoc, CFG_SKIP_TPE_CONSIDERATION);
3304  }
3305  
mlme_init_roam_scoring_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_roam_scoring_cfg * scoring_cfg)3306  static void mlme_init_roam_scoring_cfg(struct wlan_objmgr_psoc *psoc,
3307  				struct wlan_mlme_roam_scoring_cfg *scoring_cfg)
3308  {
3309  	bool val = false;
3310  
3311  	scoring_cfg->enable_scoring_for_roam =
3312  		cfg_get(psoc, CFG_ENABLE_SCORING_FOR_ROAM);
3313  	scoring_cfg->roam_trigger_bitmap =
3314  			cfg_get(psoc, CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP);
3315  	scoring_cfg->roam_score_delta = cfg_get(psoc, CFG_ROAM_SCORE_DELTA);
3316  	scoring_cfg->apsd_enabled = (bool)cfg_default(CFG_APSD_ENABLED);
3317  
3318  	ucfg_mlme_get_connection_roaming_ini_present(psoc, &val);
3319  	if (val) {
3320  		scoring_cfg->min_roam_score_delta =
3321  			cfg_get(psoc, CFG_ROAM_COMMON_MIN_ROAM_DELTA) * 100;
3322  	} else {
3323  		scoring_cfg->min_roam_score_delta =
3324  			cfg_get(psoc, CFG_CAND_MIN_ROAM_SCORE_DELTA);
3325  	}
3326  }
3327  
mlme_init_oce_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_oce * oce)3328  static void mlme_init_oce_cfg(struct wlan_objmgr_psoc *psoc,
3329  			      struct wlan_mlme_oce *oce)
3330  {
3331  	uint8_t val;
3332  	bool rssi_assoc_reject_enabled;
3333  	bool probe_req_rate_enabled;
3334  	bool probe_resp_rate_enabled;
3335  	bool beacon_rate_enabled;
3336  	bool probe_req_deferral_enabled;
3337  	bool fils_discovery_sap_enabled;
3338  	bool esp_for_roam_enabled;
3339  
3340  	oce->enable_bcast_probe_rsp =
3341  		cfg_get(psoc, CFG_ENABLE_BCAST_PROBE_RESP);
3342  	oce->oce_sta_enabled = cfg_get(psoc, CFG_OCE_ENABLE_STA);
3343  	oce->oce_sap_enabled = cfg_get(psoc, CFG_OCE_ENABLE_SAP);
3344  	oce->fils_enabled = cfg_get(psoc, CFG_IS_FILS_ENABLED);
3345  
3346  	rssi_assoc_reject_enabled =
3347  		cfg_get(psoc, CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT);
3348  	probe_req_rate_enabled = cfg_get(psoc, CFG_OCE_PROBE_REQ_RATE);
3349  	probe_resp_rate_enabled = cfg_get(psoc, CFG_OCE_PROBE_RSP_RATE);
3350  	beacon_rate_enabled = cfg_get(psoc, CFG_OCE_BEACON_RATE);
3351  	probe_req_deferral_enabled =
3352  		cfg_get(psoc, CFG_ENABLE_PROBE_REQ_DEFERRAL);
3353  	fils_discovery_sap_enabled =
3354  		cfg_get(psoc, CFG_ENABLE_FILS_DISCOVERY_SAP);
3355  	esp_for_roam_enabled = cfg_get(psoc, CFG_ENABLE_ESP_FEATURE);
3356  
3357  	if (!rssi_assoc_reject_enabled ||
3358  	    !oce->enable_bcast_probe_rsp) {
3359  		oce->oce_sta_enabled = 0;
3360  	}
3361  
3362  	val = (probe_req_rate_enabled *
3363  	WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP) +
3364  	(probe_resp_rate_enabled *
3365  	WMI_VDEV_OCE_PROBE_RESPONSE_RATE_FEATURE_BITMAP) +
3366  	(beacon_rate_enabled *
3367  	WMI_VDEV_OCE_BEACON_RATE_FEATURE_BITMAP) +
3368  	(probe_req_deferral_enabled *
3369  	 WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP) +
3370  	(fils_discovery_sap_enabled *
3371  	 WMI_VDEV_OCE_FILS_DISCOVERY_FRAME_FEATURE_BITMAP) +
3372  	(esp_for_roam_enabled *
3373  	 WMI_VDEV_OCE_ESP_FEATURE_BITMAP) +
3374  	(rssi_assoc_reject_enabled *
3375  	 WMI_VDEV_OCE_REASSOC_REJECT_FEATURE_BITMAP);
3376  	oce->feature_bitmap = val;
3377  }
3378  
mlme_init_nss_chains(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_nss_chains * nss_chains)3379  static void mlme_init_nss_chains(struct wlan_objmgr_psoc *psoc,
3380  				 struct wlan_mlme_nss_chains *nss_chains)
3381  {
3382  	nss_chains->num_rx_chains[NSS_CHAINS_BAND_2GHZ] =
3383  					    cfg_get(psoc, CFG_NUM_RX_CHAINS_2G);
3384  	nss_chains->num_rx_chains[NSS_CHAINS_BAND_5GHZ] =
3385  					    cfg_get(psoc, CFG_NUM_RX_CHAINS_5G);
3386  	nss_chains->num_tx_chains[NSS_CHAINS_BAND_2GHZ] =
3387  					    cfg_get(psoc, CFG_NUM_TX_CHAINS_2G);
3388  	nss_chains->num_tx_chains[NSS_CHAINS_BAND_5GHZ] =
3389  					    cfg_get(psoc, CFG_NUM_TX_CHAINS_5G);
3390  
3391  	nss_chains->tx_nss[NSS_CHAINS_BAND_2GHZ] = cfg_get(psoc, CFG_TX_NSS_2G);
3392  	nss_chains->tx_nss[NSS_CHAINS_BAND_5GHZ] = cfg_get(psoc, CFG_TX_NSS_5G);
3393  	nss_chains->rx_nss[NSS_CHAINS_BAND_2GHZ] = cfg_get(psoc, CFG_RX_NSS_2G);
3394  	nss_chains->rx_nss[NSS_CHAINS_BAND_5GHZ] = cfg_get(psoc, CFG_RX_NSS_5G);
3395  
3396  	nss_chains->num_tx_chains_11b = cfg_get(psoc, CFG_NUM_TX_CHAINS_11b);
3397  	nss_chains->num_tx_chains_11g = cfg_get(psoc, CFG_NUM_TX_CHAINS_11g);
3398  	nss_chains->num_tx_chains_11a = cfg_get(psoc, CFG_NUM_TX_CHAINS_11a);
3399  
3400  	nss_chains->disable_rx_mrc[NSS_CHAINS_BAND_2GHZ] =
3401  					   cfg_get(psoc, CFG_DISABLE_RX_MRC_2G);
3402  	nss_chains->disable_rx_mrc[NSS_CHAINS_BAND_5GHZ] =
3403  					   cfg_get(psoc, CFG_DISABLE_RX_MRC_5G);
3404  	nss_chains->disable_tx_mrc[NSS_CHAINS_BAND_2GHZ] =
3405  					   cfg_get(psoc, CFG_DISABLE_TX_MRC_2G);
3406  	nss_chains->disable_tx_mrc[NSS_CHAINS_BAND_5GHZ] =
3407  					   cfg_get(psoc, CFG_DISABLE_TX_MRC_5G);
3408  	nss_chains->enable_dynamic_nss_chains_cfg =
3409  			cfg_get(psoc, CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG);
3410  	nss_chains->restart_sap_on_dyn_nss_chains_cfg =
3411  			cfg_get(psoc,
3412  				CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG);
3413  }
3414  
mlme_init_wep_cfg(struct wlan_mlme_wep_cfg * wep_params)3415  static void mlme_init_wep_cfg(struct wlan_mlme_wep_cfg *wep_params)
3416  {
3417  	wep_params->is_privacy_enabled = cfg_default(CFG_PRIVACY_ENABLED);
3418  	wep_params->auth_type = cfg_default(CFG_AUTHENTICATION_TYPE);
3419  	wep_params->is_shared_key_auth =
3420  			cfg_default(CFG_SHARED_KEY_AUTH_ENABLE);
3421  	wep_params->is_auth_open_system =
3422  			cfg_default(CFG_OPEN_SYSTEM_AUTH_ENABLE);
3423  
3424  	wep_params->wep_default_key_id = cfg_default(CFG_WEP_DEFAULT_KEYID);
3425  }
3426  
3427  #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
3428  static void
mlme_init_wifi_pos_11az_config(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wifi_pos_cfg * wifi_pos_cfg)3429  mlme_init_wifi_pos_11az_config(struct wlan_objmgr_psoc *psoc,
3430  			       struct wlan_mlme_wifi_pos_cfg *wifi_pos_cfg)
3431  {
3432  	bool rsta_sec_ltf_enabled =
3433  			cfg_get(psoc, CFG_RESPONDER_SECURE_LTF_SUPPORT);
3434  	uint32_t rsta_11az_ranging_enabled =
3435  				cfg_get(psoc, CFG_RESPONDER_11AZ_SUPPORT);
3436  
3437  	wifi_pos_set_rsta_11az_ranging_cap(rsta_11az_ranging_enabled);
3438  	wifi_pos_set_rsta_sec_ltf_cap(rsta_sec_ltf_enabled);
3439  }
3440  #else
3441  static inline void
mlme_init_wifi_pos_11az_config(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wifi_pos_cfg * wifi_pos_cfg)3442  mlme_init_wifi_pos_11az_config(struct wlan_objmgr_psoc *psoc,
3443  			       struct wlan_mlme_wifi_pos_cfg *wifi_pos_cfg)
3444  {}
3445  #endif
3446  
mlme_init_wifi_pos_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wifi_pos_cfg * wifi_pos_cfg)3447  static void mlme_init_wifi_pos_cfg(struct wlan_objmgr_psoc *psoc,
3448  				   struct wlan_mlme_wifi_pos_cfg *wifi_pos_cfg)
3449  {
3450  	wifi_pos_cfg->fine_time_meas_cap =
3451  		cfg_get(psoc, CFG_FINE_TIME_MEAS_CAPABILITY);
3452  	wifi_pos_cfg->oem_6g_support_disable =
3453  		cfg_get(psoc, CFG_OEM_SIXG_SUPPORT_DISABLE);
3454  
3455  	mlme_init_wifi_pos_11az_config(psoc, wifi_pos_cfg);
3456  }
3457  
3458  #ifdef FEATURE_WLAN_ESE
mlme_init_inactivity_intv(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wmm_params * wmm_params)3459  static void mlme_init_inactivity_intv(struct wlan_objmgr_psoc *psoc,
3460  				      struct wlan_mlme_wmm_params *wmm_params)
3461  {
3462  	wmm_params->wmm_tspec_element.inactivity_intv =
3463  		cfg_get(psoc, CFG_QOS_WMM_INACTIVITY_INTERVAL);
3464  }
3465  #else
3466  static inline void
mlme_init_inactivity_intv(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wmm_params * wmm_params)3467  mlme_init_inactivity_intv(struct wlan_objmgr_psoc *psoc,
3468  			  struct wlan_mlme_wmm_params *wmm_params)
3469  {
3470  }
3471  #endif /* FEATURE_WLAN_ESE */
3472  
mlme_init_wmm_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wmm_params * wmm_params)3473  static void mlme_init_wmm_in_cfg(struct wlan_objmgr_psoc *psoc,
3474  				 struct wlan_mlme_wmm_params *wmm_params)
3475  {
3476  	wmm_params->qos_enabled = cfg_default(CFG_QOS_ENABLED);
3477  	wmm_params->wme_enabled = cfg_default(CFG_WME_ENABLED);
3478  	wmm_params->max_sp_length = cfg_default(CFG_MAX_SP_LENGTH);
3479  	wmm_params->wsm_enabled = cfg_default(CFG_WSM_ENABLED);
3480  	wmm_params->edca_profile = cfg_default(CFG_EDCA_PROFILE);
3481  
3482  	wmm_params->ac_vo.dir_ac_vo = cfg_get(psoc, CFG_QOS_WMM_DIR_AC_VO);
3483  	wmm_params->ac_vo.nom_msdu_size_ac_vo =
3484  			cfg_get(psoc, CFG_QOS_WMM_NOM_MSDU_SIZE_AC_VO);
3485  	wmm_params->ac_vo.mean_data_rate_ac_vo =
3486  			cfg_get(psoc, CFG_QOS_WMM_MEAN_DATA_RATE_AC_VO);
3487  	wmm_params->ac_vo.min_phy_rate_ac_vo =
3488  			cfg_get(psoc, CFG_QOS_WMM_MIN_PHY_RATE_AC_VO);
3489  	wmm_params->ac_vo.sba_ac_vo = cfg_get(psoc, CFG_QOS_WMM_SBA_AC_VO);
3490  	wmm_params->ac_vo.uapsd_vo_srv_intv =
3491  			cfg_get(psoc, CFG_QOS_WMM_UAPSD_VO_SRV_INTV);
3492  	wmm_params->ac_vo.uapsd_vo_sus_intv =
3493  			cfg_get(psoc, CFG_QOS_WMM_UAPSD_VO_SUS_INTV);
3494  
3495  	wmm_params->ac_vi.dir_ac_vi =
3496  		cfg_get(psoc, CFG_QOS_WMM_DIR_AC_VI);
3497  	wmm_params->ac_vi.nom_msdu_size_ac_vi =
3498  		cfg_get(psoc, CFG_QOS_WMM_NOM_MSDU_SIZE_AC_VI);
3499  	wmm_params->ac_vi.mean_data_rate_ac_vi =
3500  		cfg_get(psoc, CFG_QOS_WMM_MEAN_DATA_RATE_AC_VI);
3501  	wmm_params->ac_vi.min_phy_rate_ac_vi =
3502  		cfg_get(psoc, CFG_QOS_WMM_MIN_PHY_RATE_AC_VI);
3503  	wmm_params->ac_vi.sba_ac_vi =
3504  		cfg_get(psoc, CFG_QOS_WMM_SBA_AC_VI);
3505  	wmm_params->ac_vi.uapsd_vi_srv_intv =
3506  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_VI_SRV_INTV);
3507  	wmm_params->ac_vi.uapsd_vi_sus_intv =
3508  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_VI_SUS_INTV);
3509  
3510  	wmm_params->ac_be.dir_ac_be =
3511  		cfg_get(psoc, CFG_QOS_WMM_DIR_AC_BE);
3512  	wmm_params->ac_be.nom_msdu_size_ac_be =
3513  		cfg_get(psoc, CFG_QOS_WMM_NOM_MSDU_SIZE_AC_BE);
3514  	wmm_params->ac_be.mean_data_rate_ac_be =
3515  		cfg_get(psoc, CFG_QOS_WMM_MEAN_DATA_RATE_AC_BE);
3516  	wmm_params->ac_be.min_phy_rate_ac_be =
3517  		cfg_get(psoc, CFG_QOS_WMM_MIN_PHY_RATE_AC_BE);
3518  	wmm_params->ac_be.sba_ac_be =
3519  		cfg_get(psoc, CFG_QOS_WMM_SBA_AC_BE);
3520  	wmm_params->ac_be.uapsd_be_srv_intv =
3521  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_BE_SRV_INTV);
3522  	wmm_params->ac_be.uapsd_be_sus_intv =
3523  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_BE_SUS_INTV);
3524  
3525  	wmm_params->ac_bk.dir_ac_bk =
3526  		cfg_get(psoc, CFG_QOS_WMM_DIR_AC_BK);
3527  	wmm_params->ac_bk.nom_msdu_size_ac_bk =
3528  		cfg_get(psoc, CFG_QOS_WMM_NOM_MSDU_SIZE_AC_BK);
3529  	wmm_params->ac_bk.mean_data_rate_ac_bk =
3530  		cfg_get(psoc, CFG_QOS_WMM_MEAN_DATA_RATE_AC_BK);
3531  	wmm_params->ac_bk.min_phy_rate_ac_bk =
3532  		cfg_get(psoc, CFG_QOS_WMM_MIN_PHY_RATE_AC_BK);
3533  	wmm_params->ac_bk.sba_ac_bk =
3534  		cfg_get(psoc, CFG_QOS_WMM_SBA_AC_BK);
3535  	wmm_params->ac_bk.uapsd_bk_srv_intv =
3536  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_BK_SRV_INTV);
3537  	wmm_params->ac_bk.uapsd_bk_sus_intv =
3538  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_BK_SUS_INTV);
3539  
3540  	wmm_params->wmm_config.wmm_mode =
3541  		cfg_get(psoc, CFG_QOS_WMM_MODE);
3542  	wmm_params->wmm_config.b80211e_is_enabled =
3543  		cfg_get(psoc, CFG_QOS_WMM_80211E_ENABLED);
3544  	wmm_params->wmm_config.uapsd_mask =
3545  		cfg_get(psoc, CFG_QOS_WMM_UAPSD_MASK);
3546  
3547  	mlme_init_inactivity_intv(psoc, wmm_params);
3548  	wmm_params->wmm_tspec_element.burst_size_def =
3549  		cfg_get(psoc, CFG_QOS_WMM_BURST_SIZE_DEFN);
3550  	wmm_params->wmm_tspec_element.ts_ack_policy =
3551  		cfg_get(psoc, CFG_QOS_WMM_TS_INFO_ACK_POLICY);
3552  	wmm_params->wmm_tspec_element.ts_acm_is_off =
3553  		cfg_get(psoc, CFG_QOS_ADDTS_WHEN_ACM_IS_OFF);
3554  	wmm_params->delayed_trigger_frm_int =
3555  		cfg_get(psoc, CFG_TL_DELAYED_TRGR_FRM_INTERVAL);
3556  
3557  }
3558  
mlme_init_wps_params_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_wps_params * wps_params)3559  static void mlme_init_wps_params_cfg(struct wlan_objmgr_psoc *psoc,
3560  				     struct wlan_mlme_wps_params *wps_params)
3561  {
3562  	wps_params->enable_wps = cfg_default(CFG_WPS_ENABLE);
3563  	wps_params->wps_cfg_method = cfg_default(CFG_WPS_CFG_METHOD);
3564  	wps_params->wps_device_password_id =
3565  				cfg_default(CFG_WPS_DEVICE_PASSWORD_ID);
3566  	wps_params->wps_device_sub_category =
3567  				cfg_default(CFG_WPS_DEVICE_SUB_CATEGORY);
3568  	wps_params->wps_primary_device_category =
3569  				cfg_default(CFG_WPS_PRIMARY_DEVICE_CATEGORY);
3570  	wps_params->wps_primary_device_oui =
3571  				cfg_default(CFG_WPS_PIMARY_DEVICE_OUI);
3572  	wps_params->wps_state = cfg_default(CFG_WPS_STATE);
3573  	wps_params->wps_version = cfg_default(CFG_WPS_VERSION);
3574  	wps_params->wps_uuid.max_len = MLME_CFG_WPS_UUID_MAX_LEN;
3575  	qdf_uint8_array_parse(cfg_default(CFG_WPS_UUID),
3576  			      wps_params->wps_uuid.data,
3577  			      MLME_CFG_WPS_UUID_MAX_LEN,
3578  			      &wps_params->wps_uuid.len);
3579  }
3580  
mlme_init_btm_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_btm * btm)3581  static void mlme_init_btm_cfg(struct wlan_objmgr_psoc *psoc,
3582  			      struct wlan_mlme_btm *btm)
3583  {
3584  	btm->btm_offload_config = cfg_get(psoc, CFG_BTM_ENABLE);
3585  	btm->prefer_btm_query = cfg_get(psoc, CFG_PREFER_BTM_QUERY);
3586  	if (btm->prefer_btm_query)
3587  		MLME_SET_BIT(btm->btm_offload_config, BTM_OFFLOAD_CONFIG_BIT_8);
3588  
3589  	btm->abridge_flag = cfg_get(psoc, CFG_ENABLE_BTM_ABRIDGE);
3590  	if (btm->abridge_flag)
3591  		MLME_SET_BIT(btm->btm_offload_config, BTM_OFFLOAD_CONFIG_BIT_7);
3592  	wlan_mlme_set_btm_abridge_flag(psoc, btm->abridge_flag);
3593  
3594  	btm->btm_solicited_timeout = cfg_get(psoc, CFG_BTM_SOLICITED_TIMEOUT);
3595  	btm->btm_max_attempt_cnt = cfg_get(psoc, CFG_BTM_MAX_ATTEMPT_CNT);
3596  	btm->btm_sticky_time = cfg_get(psoc, CFG_BTM_STICKY_TIME);
3597  	btm->rct_validity_timer = cfg_get(psoc, CFG_BTM_VALIDITY_TIMER);
3598  	btm->disassoc_timer_threshold =
3599  			cfg_get(psoc, CFG_BTM_DISASSOC_TIMER_THRESHOLD);
3600  	btm->btm_query_bitmask = cfg_get(psoc, CFG_BTM_QUERY_BITMASK);
3601  	btm->btm_trig_min_candidate_score =
3602  			cfg_get(psoc, CFG_MIN_BTM_CANDIDATE_SCORE);
3603  }
3604  
3605  static void
mlme_init_roam_score_config(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_cfg * mlme_cfg)3606  mlme_init_roam_score_config(struct wlan_objmgr_psoc *psoc,
3607  			    struct wlan_mlme_cfg *mlme_cfg)
3608  {
3609  	struct roam_trigger_score_delta *score_delta_param;
3610  	struct roam_trigger_min_rssi *min_rssi_param;
3611  
3612  	score_delta_param = &mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER];
3613  	score_delta_param->roam_score_delta =
3614  			cfg_get(psoc, CFG_IDLE_ROAM_SCORE_DELTA);
3615  	score_delta_param->trigger_reason = ROAM_TRIGGER_REASON_IDLE;
3616  
3617  	score_delta_param = &mlme_cfg->trig_score_delta[BTM_ROAM_TRIGGER];
3618  	score_delta_param->roam_score_delta =
3619  			cfg_get(psoc, CFG_BTM_ROAM_SCORE_DELTA);
3620  	score_delta_param->trigger_reason = ROAM_TRIGGER_REASON_BTM;
3621  
3622  	min_rssi_param = &mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI];
3623  	min_rssi_param->min_rssi =
3624  		cfg_get(psoc, CFG_DISCONNECT_ROAM_TRIGGER_MIN_RSSI);
3625  	min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_DEAUTH;
3626  
3627  	min_rssi_param = &mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI];
3628  	min_rssi_param->min_rssi =
3629  		cfg_get(psoc, CFG_BMISS_ROAM_MIN_RSSI);
3630  	min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_BMISS;
3631  
3632  	min_rssi_param = &mlme_cfg->trig_min_rssi[MIN_RSSI_2G_TO_5G_ROAM];
3633  	min_rssi_param->min_rssi =
3634  		cfg_get(psoc, CFG_2G_TO_5G_ROAM_MIN_RSSI);
3635  	min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_HIGH_RSSI;
3636  
3637  }
3638  
3639  #ifdef MULTI_CLIENT_LL_SUPPORT
3640  static void
mlme_init_wlm_multi_client_ll_support(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_fe_wlm * wlm_config)3641  mlme_init_wlm_multi_client_ll_support(struct wlan_objmgr_psoc *psoc,
3642  				      struct wlan_mlme_fe_wlm *wlm_config)
3643  {
3644  	wlm_config->multi_client_ll_support =
3645  			cfg_get(psoc, CFG_WLM_MULTI_CLIENT_LL_SUPPORT);
3646  }
3647  
3648  QDF_STATUS
mlme_get_cfg_multi_client_ll_ini_support(struct wlan_objmgr_psoc * psoc,bool * multi_client_ll_support)3649  mlme_get_cfg_multi_client_ll_ini_support(struct wlan_objmgr_psoc *psoc,
3650  					 bool *multi_client_ll_support)
3651  {
3652  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
3653  
3654  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
3655  	if (!mlme_obj)
3656  		return QDF_STATUS_E_FAILURE;
3657  
3658  	*multi_client_ll_support =
3659  			mlme_obj->cfg.wlm_config.multi_client_ll_support;
3660  
3661  	return QDF_STATUS_SUCCESS;
3662  }
3663  #else
3664  static inline void
mlme_init_wlm_multi_client_ll_support(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_fe_wlm * wlm_config)3665  mlme_init_wlm_multi_client_ll_support(struct wlan_objmgr_psoc *psoc,
3666  				      struct wlan_mlme_fe_wlm *wlm_config)
3667  {
3668  }
3669  #endif
3670  
3671  /**
3672   * mlme_init_fe_wlm_in_cfg() - Populate WLM INI in MLME cfg
3673   * @psoc: pointer to the psoc object
3674   * @wlm_config: pointer to the MLME WLM cfg
3675   *
3676   * Return: None
3677   */
mlme_init_fe_wlm_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_fe_wlm * wlm_config)3678  static void mlme_init_fe_wlm_in_cfg(struct wlan_objmgr_psoc *psoc,
3679  				    struct wlan_mlme_fe_wlm *wlm_config)
3680  {
3681  	uint64_t flags = 0;
3682  	QDF_STATUS status;
3683  
3684  	wlm_config->latency_enable = cfg_get(psoc, CFG_LATENCY_ENABLE);
3685  	wlm_config->latency_reset = cfg_get(psoc, CFG_LATENCY_RESET);
3686  	wlm_config->latency_level = cfg_get(psoc, CFG_LATENCY_LEVEL);
3687  	mlme_init_wlm_multi_client_ll_support(psoc, wlm_config);
3688  
3689  	status = qdf_uint64_parse(cfg_get(psoc, CFG_LATENCY_FLAGS_NORMAL),
3690  				  &flags);
3691  	if (status != QDF_STATUS_SUCCESS) {
3692  		flags = 0;
3693  		mlme_legacy_err("normal latency flags parsing failed");
3694  	}
3695  
3696  	wlm_config->latency_flags[0] = flags & 0xFFFFFFFF;
3697  	wlm_config->latency_host_flags[0] = flags >> 32;
3698  	mlme_legacy_debug("normal latency flags 0x%x host flags 0x%x",
3699  			  wlm_config->latency_flags[0],
3700  			  wlm_config->latency_host_flags[0]);
3701  
3702  	status = qdf_uint64_parse(cfg_get(psoc, CFG_LATENCY_FLAGS_XR),
3703  				  &flags);
3704  	if (status != QDF_STATUS_SUCCESS) {
3705  		flags = 0;
3706  		mlme_legacy_err("xr latency flags parsing failed");
3707  	}
3708  
3709  	wlm_config->latency_flags[1] = flags & 0xFFFFFFFF;
3710  	wlm_config->latency_host_flags[1] = flags >> 32;
3711  	mlme_legacy_debug("xr latency flags 0x%x host flags 0x%x",
3712  			  wlm_config->latency_flags[1],
3713  			  wlm_config->latency_host_flags[1]);
3714  
3715  	status = qdf_uint64_parse(cfg_get(psoc, CFG_LATENCY_FLAGS_LOW),
3716  				  &flags);
3717  	if (status != QDF_STATUS_SUCCESS) {
3718  		flags = 0;
3719  		mlme_legacy_err("low latency flags parsing failed");
3720  	}
3721  
3722  	wlm_config->latency_flags[2] = flags & 0xFFFFFFFF;
3723  	wlm_config->latency_host_flags[2] = flags >> 32;
3724  	mlme_legacy_debug("low latency flags 0x%x host flags 0x%x",
3725  			  wlm_config->latency_flags[2],
3726  			  wlm_config->latency_host_flags[2]);
3727  
3728  	status = qdf_uint64_parse(cfg_get(psoc, CFG_LATENCY_FLAGS_ULTLOW),
3729  				  &flags);
3730  	if (status != QDF_STATUS_SUCCESS) {
3731  		flags = 0;
3732  		mlme_legacy_err("ultra-low latency flags parsing failed");
3733  	}
3734  
3735  	wlm_config->latency_flags[3] = flags & 0xFFFFFFFF;
3736  	wlm_config->latency_host_flags[3] = flags >> 32;
3737  	mlme_legacy_debug("ultra-low latency flags 0x%x host flags 0x%x",
3738  			  wlm_config->latency_flags[3],
3739  			  wlm_config->latency_host_flags[3]);
3740  }
3741  
3742  /**
3743   * mlme_init_fe_rrm_in_cfg() - Populate RRM INI in MLME cfg
3744   * @psoc: pointer to the psoc object
3745   * @rrm_config: pointer to the MLME RRM cfg
3746   *
3747   * Return: None
3748   */
mlme_init_fe_rrm_in_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_fe_rrm * rrm_config)3749  static void mlme_init_fe_rrm_in_cfg(struct wlan_objmgr_psoc *psoc,
3750  				    struct wlan_mlme_fe_rrm *rrm_config)
3751  {
3752  	qdf_size_t len;
3753  
3754  	rrm_config->rrm_enabled = cfg_get(psoc, CFG_RRM_ENABLE);
3755  	rrm_config->sap_rrm_enabled = cfg_get(psoc, CFG_SAP_RRM_ENABLE);
3756  	rrm_config->rrm_rand_interval = cfg_get(psoc, CFG_RRM_MEAS_RAND_INTVL);
3757  
3758  	qdf_uint8_array_parse(cfg_get(psoc, CFG_RM_CAPABILITY),
3759  			      rrm_config->rm_capability,
3760  			      sizeof(rrm_config->rm_capability), &len);
3761  
3762  	if (len < MLME_RMENABLEDCAP_MAX_LEN) {
3763  		mlme_legacy_debug("Incorrect RM capability, using default");
3764  		qdf_uint8_array_parse(cfg_default(CFG_RM_CAPABILITY),
3765  				      rrm_config->rm_capability,
3766  				      sizeof(rrm_config->rm_capability), &len);
3767  	}
3768  }
3769  
mlme_init_powersave_params(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_powersave * ps_cfg)3770  static void mlme_init_powersave_params(struct wlan_objmgr_psoc *psoc,
3771  				       struct wlan_mlme_powersave *ps_cfg)
3772  {
3773  	ps_cfg->is_imps_enabled = cfg_get(psoc, CFG_ENABLE_IMPS);
3774  	ps_cfg->is_bmps_enabled = cfg_get(psoc, CFG_ENABLE_PS);
3775  	ps_cfg->auto_bmps_timer_val = cfg_get(psoc, CFG_AUTO_BMPS_ENABLE_TIMER);
3776  	ps_cfg->bmps_min_listen_interval = cfg_get(psoc, CFG_BMPS_MINIMUM_LI);
3777  	ps_cfg->bmps_max_listen_interval = cfg_get(psoc, CFG_BMPS_MAXIMUM_LI);
3778  	ps_cfg->dtim_selection_diversity =
3779  				cfg_get(psoc, CFG_DTIM_SELECTION_DIVERSITY);
3780  }
3781  
3782  #if defined(CONFIG_AFC_SUPPORT) && defined(CONFIG_BAND_6GHZ)
mlme_init_afc_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3783  static void mlme_init_afc_cfg(struct wlan_objmgr_psoc *psoc,
3784  			      struct wlan_mlme_reg *reg)
3785  {
3786  	reg->enable_6ghz_sp_pwrmode_supp =
3787  		cfg_get(psoc, CFG_6GHZ_SP_POWER_MODE_SUPP);
3788  	reg->afc_disable_timer_check =
3789  		cfg_default(CFG_AFC_TIMER_CHECK_DIS);
3790  	reg->afc_disable_request_id_check =
3791  		cfg_default(CFG_AFC_REQ_ID_CHECK_DIS);
3792  	reg->is_afc_reg_noaction =
3793  		cfg_default(CFG_AFC_REG_NO_ACTION);
3794  }
3795  #else
mlme_init_afc_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3796  static inline void mlme_init_afc_cfg(struct wlan_objmgr_psoc *psoc,
3797  				     struct wlan_mlme_reg *reg)
3798  {
3799  }
3800  #endif
3801  
3802  #ifdef MWS_COEX
mlme_init_mwc_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_mwc * mwc)3803  static void mlme_init_mwc_cfg(struct wlan_objmgr_psoc *psoc,
3804  			      struct wlan_mlme_mwc *mwc)
3805  {
3806  	mwc->mws_coex_4g_quick_tdm =
3807  		cfg_get(psoc, CFG_MWS_COEX_4G_QUICK_FTDM);
3808  	mwc->mws_coex_5g_nr_pwr_limit =
3809  		cfg_get(psoc, CFG_MWS_COEX_5G_NR_PWR_LIMIT);
3810  	mwc->mws_coex_pcc_channel_avoid_delay =
3811  		cfg_get(psoc, CFG_MWS_COEX_PCC_CHANNEL_AVOID_DELAY);
3812  	mwc->mws_coex_scc_channel_avoid_delay =
3813  		cfg_get(psoc, CFG_MWS_COEX_SCC_CHANNEL_AVOID_DELAY);
3814  }
3815  #else
mlme_init_mwc_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_mwc * mwc)3816  static void mlme_init_mwc_cfg(struct wlan_objmgr_psoc *psoc,
3817  			      struct wlan_mlme_mwc *mwc)
3818  {
3819  }
3820  #endif
3821  
3822  #ifdef SAP_AVOID_ACS_FREQ_LIST
mlme_init_acs_avoid_freq_list(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3823  static void mlme_init_acs_avoid_freq_list(struct wlan_objmgr_psoc *psoc,
3824  					  struct wlan_mlme_reg *reg)
3825  {
3826  	qdf_size_t avoid_acs_freq_list_num = 0;
3827  	uint8_t i;
3828  
3829  	qdf_uint16_array_parse(cfg_get(psoc, CFG_SAP_AVOID_ACS_FREQ_LIST),
3830  			       reg->avoid_acs_freq_list,
3831  			       CFG_VALID_CHANNEL_LIST_LEN,
3832  			       &avoid_acs_freq_list_num);
3833  	reg->avoid_acs_freq_list_num = avoid_acs_freq_list_num;
3834  
3835  	for (i = 0; i < avoid_acs_freq_list_num; i++)
3836  		mlme_legacy_debug("avoid_acs_freq %d",
3837  				  reg->avoid_acs_freq_list[i]);
3838  }
3839  #else
mlme_init_acs_avoid_freq_list(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3840  static void mlme_init_acs_avoid_freq_list(struct wlan_objmgr_psoc *psoc,
3841  					  struct wlan_mlme_reg *reg)
3842  {
3843  }
3844  #endif
3845  
3846  #ifdef FEATURE_WLAN_CH_AVOID_EXT
mlme_init_coex_unsafe_chan_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3847  static void mlme_init_coex_unsafe_chan_cfg(struct wlan_objmgr_psoc *psoc,
3848  					   struct wlan_mlme_reg *reg)
3849  {
3850  	reg->coex_unsafe_chan_nb_user_prefer =
3851  		cfg_get(psoc, CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER);
3852  }
3853  
mlme_init_coex_unsafe_chan_reg_disable_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3854  static void mlme_init_coex_unsafe_chan_reg_disable_cfg(
3855  		struct wlan_objmgr_psoc *psoc, struct wlan_mlme_reg *reg)
3856  {
3857  	reg->coex_unsafe_chan_reg_disable =
3858  		cfg_get(psoc, CFG_COEX_UNSAFE_CHAN_REG_DISABLE);
3859  }
3860  #else
mlme_init_coex_unsafe_chan_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3861  static void mlme_init_coex_unsafe_chan_cfg(struct wlan_objmgr_psoc *psoc,
3862  					   struct wlan_mlme_reg *reg)
3863  {
3864  }
3865  
mlme_init_coex_unsafe_chan_reg_disable_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3866  static void mlme_init_coex_unsafe_chan_reg_disable_cfg(
3867  		struct wlan_objmgr_psoc *psoc, struct wlan_mlme_reg *reg)
3868  {
3869  }
3870  #endif
3871  
mlme_init_reg_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_reg * reg)3872  static void mlme_init_reg_cfg(struct wlan_objmgr_psoc *psoc,
3873  			      struct wlan_mlme_reg *reg)
3874  {
3875  	reg->self_gen_frm_pwr = cfg_get(psoc, CFG_SELF_GEN_FRM_PWR);
3876  	reg->etsi_srd_chan_in_master_mode =
3877  			cfg_get(psoc, CFG_ETSI_SRD_CHAN_IN_MASTER_MODE);
3878  	reg->fcc_5dot9_ghz_chan_in_master_mode =
3879  			cfg_get(psoc, CFG_FCC_5DOT9_GHZ_CHAN_IN_MASTER_MODE);
3880  	reg->restart_beaconing_on_ch_avoid =
3881  			cfg_get(psoc, CFG_RESTART_BEACONING_ON_CH_AVOID);
3882  	reg->indoor_channel_support = cfg_get(psoc, CFG_INDOOR_CHANNEL_SUPPORT);
3883  	reg->enable_11d_in_world_mode = cfg_get(psoc,
3884  						CFG_ENABLE_11D_IN_WORLD_MODE);
3885  	reg->scan_11d_interval = cfg_get(psoc, CFG_SCAN_11D_INTERVAL);
3886  	reg->enable_pending_chan_list_req = cfg_get(psoc,
3887  					CFG_ENABLE_PENDING_CHAN_LIST_REQ);
3888  	reg->ignore_fw_reg_offload_ind = cfg_get(
3889  						psoc,
3890  						CFG_IGNORE_FW_REG_OFFLOAD_IND);
3891  	reg->retain_nol_across_regdmn_update =
3892  		cfg_get(psoc, CFG_RETAIN_NOL_ACROSS_REG_DOMAIN);
3893  
3894  	reg->enable_nan_on_indoor_channels =
3895  		cfg_get(psoc, CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN);
3896  
3897  	mlme_init_afc_cfg(psoc, reg);
3898  	mlme_init_acs_avoid_freq_list(psoc, reg);
3899  	mlme_init_coex_unsafe_chan_cfg(psoc, reg);
3900  	mlme_init_coex_unsafe_chan_reg_disable_cfg(psoc, reg);
3901  }
3902  
3903  static void
mlme_init_dot11_mode_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_dot11_mode * dot11_mode)3904  mlme_init_dot11_mode_cfg(struct wlan_objmgr_psoc *psoc,
3905  			 struct wlan_mlme_dot11_mode *dot11_mode)
3906  {
3907  	dot11_mode->dot11_mode = cfg_default(CFG_DOT11_MODE);
3908  	dot11_mode->vdev_type_dot11_mode = cfg_get(psoc, CFG_VDEV_DOT11_MODE);
3909  }
3910  
3911  /**
3912   * mlme_iot_parse_aggr_info - parse aggr related items in ini
3913   * @psoc: PSOC pointer
3914   * @iot: IOT related CFG items
3915   *
3916   * Return: None
3917   */
3918  static void
mlme_iot_parse_aggr_info(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_iot * iot)3919  mlme_iot_parse_aggr_info(struct wlan_objmgr_psoc *psoc,
3920  			 struct wlan_mlme_iot *iot)
3921  {
3922  	char *aggr_info, *oui, *msdu, *mpdu, *aggr_info_temp;
3923  	uint32_t ampdu_sz, amsdu_sz, index = 0, oui_len, cfg_str_len;
3924  	struct wlan_iot_aggr *aggr_info_list;
3925  	const char *cfg_str;
3926  	int ret;
3927  
3928  	cfg_str = cfg_get(psoc, CFG_TX_IOT_AGGR);
3929  	if (!cfg_str)
3930  		return;
3931  
3932  	cfg_str_len = qdf_str_len(cfg_str);
3933  	if (!cfg_str_len)
3934  		return;
3935  
3936  	aggr_info = qdf_mem_malloc(cfg_str_len + 1);
3937  	if (!aggr_info)
3938  		return;
3939  
3940  	aggr_info_list = iot->aggr;
3941  	qdf_mem_copy(aggr_info, cfg_str, cfg_str_len);
3942  	mlme_legacy_debug("aggr_info=[%s]", aggr_info);
3943  
3944  	aggr_info_temp = aggr_info;
3945  	while (aggr_info_temp) {
3946  		/* skip possible spaces before oui string */
3947  		while (*aggr_info_temp == ' ')
3948  			aggr_info_temp++;
3949  
3950  		oui = strsep(&aggr_info_temp, ",");
3951  		if (!oui) {
3952  			mlme_legacy_err("oui error");
3953  			goto end;
3954  		}
3955  
3956  		oui_len = qdf_str_len(oui) / 2;
3957  		if (oui_len > sizeof(aggr_info_list[index].oui)) {
3958  			mlme_legacy_err("size error");
3959  			goto end;
3960  		}
3961  
3962  		amsdu_sz = 0;
3963  		msdu = strsep(&aggr_info_temp, ",");
3964  		if (!msdu) {
3965  			mlme_legacy_err("msdu error");
3966  			goto end;
3967  		}
3968  
3969  		ret = kstrtou32(msdu, 10, &amsdu_sz);
3970  		if (ret || amsdu_sz > IOT_AGGR_MSDU_MAX_NUM) {
3971  			mlme_legacy_err("invalid msdu no. %s [%u]",
3972  					msdu, amsdu_sz);
3973  			goto end;
3974  		}
3975  
3976  		ampdu_sz = 0;
3977  		mpdu = strsep(&aggr_info_temp, ",");
3978  		if (!mpdu) {
3979  			mlme_legacy_err("mpdu error");
3980  			goto end;
3981  		}
3982  
3983  		ret = kstrtou32(mpdu, 10, &ampdu_sz);
3984  		if (ret || ampdu_sz > IOT_AGGR_MPDU_MAX_NUM) {
3985  			mlme_legacy_err("invalid mpdu no. %s [%u]",
3986  					mpdu, ampdu_sz);
3987  			goto end;
3988  		}
3989  
3990  		mlme_legacy_debug("id %u oui[%s] len %u msdu %u mpdu %u",
3991  				  index, oui, oui_len, amsdu_sz, ampdu_sz);
3992  
3993  		ret = qdf_hex_str_to_binary(aggr_info_list[index].oui,
3994  					    oui, oui_len);
3995  		if (ret) {
3996  			mlme_legacy_err("oui error: %d", ret);
3997  			goto end;
3998  		}
3999  
4000  		aggr_info_list[index].amsdu_sz = amsdu_sz;
4001  		aggr_info_list[index].ampdu_sz = ampdu_sz;
4002  		aggr_info_list[index].oui_len = oui_len;
4003  		index++;
4004  		if (index >= IOT_AGGR_INFO_MAX_NUM) {
4005  			mlme_legacy_err("exceed max num, index = %d", index);
4006  			break;
4007  		}
4008  	}
4009  	iot->aggr_num = index;
4010  
4011  end:
4012  	mlme_legacy_debug("configured aggr num %d", iot->aggr_num);
4013  	qdf_mem_free(aggr_info);
4014  }
4015  
4016  /**
4017   * mlme_init_iot_cfg() - parse IOT related items in ini
4018   * @psoc: PSOC pointer
4019   * @iot: IOT related CFG items
4020   *
4021   * Return: None
4022   */
4023  static void
mlme_init_iot_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_iot * iot)4024  mlme_init_iot_cfg(struct wlan_objmgr_psoc *psoc,
4025  		  struct wlan_mlme_iot *iot)
4026  {
4027  	mlme_iot_parse_aggr_info(psoc, iot);
4028  }
4029  
4030  /**
4031   * mlme_init_dual_sta_config - Initialize dual sta configurations
4032   * @gen: Generic CFG config items
4033   *
4034   * Return: None
4035   */
4036  static void
mlme_init_dual_sta_config(struct wlan_mlme_generic * gen)4037  mlme_init_dual_sta_config(struct wlan_mlme_generic *gen)
4038  {
4039  	gen->dual_sta_policy.primary_vdev_id = WLAN_UMAC_VDEV_ID_MAX;
4040  	gen->dual_sta_policy.concurrent_sta_policy =
4041  				QCA_WLAN_CONCURRENT_STA_POLICY_UNBIASED;
4042  }
4043  
4044  #ifdef WLAN_FEATURE_MCC_QUOTA
4045  /**
4046   * mlme_init_user_mcc_quota_config - Initialize mcc quota
4047   * @gen: Generic CFG config items
4048   *
4049   * Return: None
4050   */
4051  static void
mlme_init_user_mcc_quota_config(struct wlan_mlme_generic * gen)4052  mlme_init_user_mcc_quota_config(struct wlan_mlme_generic *gen)
4053  {
4054  	gen->user_mcc_quota.quota = 0;
4055  	gen->user_mcc_quota.op_mode = QDF_MAX_NO_OF_MODE;
4056  	gen->user_mcc_quota.vdev_id = WLAN_UMAC_VDEV_ID_MAX;
4057  }
4058  #else
4059  static void
mlme_init_user_mcc_quota_config(struct wlan_mlme_generic * gen)4060  mlme_init_user_mcc_quota_config(struct wlan_mlme_generic *gen)
4061  {
4062  }
4063  #endif
mlme_cfg_on_psoc_enable(struct wlan_objmgr_psoc * psoc)4064  QDF_STATUS mlme_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
4065  {
4066  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
4067  	struct wlan_mlme_cfg *mlme_cfg;
4068  	QDF_STATUS status = QDF_STATUS_SUCCESS;
4069  
4070  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
4071  	if (!mlme_obj) {
4072  		mlme_legacy_err("Failed to get MLME Obj");
4073  		return QDF_STATUS_E_FAILURE;
4074  	}
4075  
4076  	mlme_cfg = &mlme_obj->cfg;
4077  	mlme_init_generic_cfg(psoc, &mlme_cfg->gen);
4078  	mlme_init_timeout_cfg(psoc, &mlme_cfg->timeouts);
4079  	mlme_init_edca_params(psoc, &mlme_cfg->edca_params);
4080  	mlme_init_ht_cap_in_cfg(psoc, &mlme_cfg->ht_caps);
4081  	mlme_init_wmm_in_cfg(psoc, &mlme_cfg->wmm_params);
4082  	mlme_init_mbo_cfg(psoc, &mlme_cfg->mbo_cfg);
4083  	mlme_init_qos_cfg(psoc, &mlme_cfg->qos_mlme_params);
4084  	mlme_init_rates_in_cfg(psoc, &mlme_cfg->rates);
4085  	mlme_init_dfs_cfg(psoc, &mlme_cfg->dfs_cfg);
4086  	mlme_init_sap_protection_cfg(psoc, &mlme_cfg->sap_protection_cfg);
4087  	mlme_init_vht_cap_cfg(psoc, &mlme_cfg->vht_caps.vht_cap_info);
4088  	mlme_init_chainmask_cfg(psoc, &mlme_cfg->chainmask_cfg);
4089  	mlme_init_sap_cfg(psoc, &mlme_cfg->sap_cfg);
4090  	mlme_init_nss_chains(psoc, &mlme_cfg->nss_chains_ini_cfg);
4091  	mlme_init_twt_cfg(psoc, &mlme_cfg->twt_cfg);
4092  	mlme_init_he_cap_in_cfg(psoc, mlme_cfg);
4093  	mlme_init_eht_cap_in_cfg(psoc, mlme_cfg);
4094  	mlme_init_obss_ht40_cfg(psoc, &mlme_cfg->obss_ht40);
4095  	mlme_init_product_details_cfg(&mlme_cfg->product_details);
4096  	mlme_init_powersave_params(psoc, &mlme_cfg->ps_params);
4097  	mlme_init_sta_cfg(psoc, &mlme_cfg->sta);
4098  	mlme_init_stats_cfg(psoc, &mlme_cfg->stats);
4099  	mlme_init_lfr_cfg(psoc, &mlme_cfg->lfr);
4100  	mlme_init_feature_flag_in_cfg(psoc, &mlme_cfg->feature_flags);
4101  	mlme_init_roam_scoring_cfg(psoc, &mlme_cfg->roam_scoring);
4102  	mlme_init_dot11_mode_cfg(psoc, &mlme_cfg->dot11_mode);
4103  	mlme_init_threshold_cfg(psoc, &mlme_cfg->threshold);
4104  	mlme_init_acs_cfg(psoc, &mlme_cfg->acs);
4105  	mlme_init_power_cfg(psoc, &mlme_cfg->power);
4106  	mlme_init_oce_cfg(psoc, &mlme_cfg->oce);
4107  	mlme_init_wep_cfg(&mlme_cfg->wep_params);
4108  	mlme_init_wifi_pos_cfg(psoc, &mlme_cfg->wifi_pos_cfg);
4109  	mlme_init_wps_params_cfg(psoc, &mlme_cfg->wps_params);
4110  	mlme_init_fe_wlm_in_cfg(psoc, &mlme_cfg->wlm_config);
4111  	mlme_init_fe_rrm_in_cfg(psoc, &mlme_cfg->rrm_config);
4112  	mlme_init_mwc_cfg(psoc, &mlme_cfg->mwc);
4113  	mlme_init_reg_cfg(psoc, &mlme_cfg->reg);
4114  	mlme_init_btm_cfg(psoc, &mlme_cfg->btm);
4115  	mlme_init_roam_score_config(psoc, mlme_cfg);
4116  	mlme_init_ratemask_cfg(psoc, &mlme_cfg->ratemask_cfg);
4117  	mlme_init_iot_cfg(psoc, &mlme_cfg->iot);
4118  	mlme_init_dual_sta_config(&mlme_cfg->gen);
4119  	mlme_init_user_mcc_quota_config(&mlme_cfg->gen);
4120  
4121  	return status;
4122  }
4123  
mlme_get_sae_auth_retry(struct wlan_objmgr_vdev * vdev)4124  struct sae_auth_retry *mlme_get_sae_auth_retry(struct wlan_objmgr_vdev *vdev)
4125  {
4126  	struct mlme_legacy_priv *mlme_priv;
4127  
4128  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4129  	if (!mlme_priv) {
4130  		mlme_legacy_err("vdev legacy private object is NULL");
4131  		return NULL;
4132  	}
4133  
4134  	return &mlme_priv->sae_retry;
4135  }
4136  
mlme_free_sae_auth_retry(struct wlan_objmgr_vdev * vdev)4137  void mlme_free_sae_auth_retry(struct wlan_objmgr_vdev *vdev)
4138  {
4139  	struct mlme_legacy_priv *mlme_priv;
4140  
4141  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4142  	if (!mlme_priv) {
4143  		mlme_legacy_err("vdev legacy private object is NULL");
4144  		return;
4145  	}
4146  
4147  	mlme_priv->sae_retry.sae_auth_max_retry = 0;
4148  	if (mlme_priv->sae_retry.sae_auth.ptr)
4149  		qdf_mem_free(mlme_priv->sae_retry.sae_auth.ptr);
4150  	mlme_priv->sae_retry.sae_auth.ptr = NULL;
4151  	mlme_priv->sae_retry.sae_auth.len = 0;
4152  }
4153  
mlme_set_self_disconnect_ies(struct wlan_objmgr_vdev * vdev,struct element_info * ie)4154  void mlme_set_self_disconnect_ies(struct wlan_objmgr_vdev *vdev,
4155  				  struct element_info *ie)
4156  {
4157  	struct mlme_legacy_priv *mlme_priv;
4158  
4159  	if (!ie || !ie->len || !ie->ptr) {
4160  		mlme_legacy_debug("disocnnect IEs are NULL");
4161  		return;
4162  	}
4163  
4164  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4165  	if (!mlme_priv) {
4166  		mlme_legacy_err("vdev legacy private object is NULL");
4167  		return;
4168  	}
4169  
4170  	if (mlme_priv->disconnect_info.self_discon_ies.ptr) {
4171  		qdf_mem_free(mlme_priv->disconnect_info.self_discon_ies.ptr);
4172  		mlme_priv->disconnect_info.self_discon_ies.len = 0;
4173  	}
4174  
4175  	mlme_priv->disconnect_info.self_discon_ies.ptr =
4176  				qdf_mem_malloc(ie->len);
4177  	if (!mlme_priv->disconnect_info.self_discon_ies.ptr)
4178  		return;
4179  
4180  	qdf_mem_copy(mlme_priv->disconnect_info.self_discon_ies.ptr,
4181  		     ie->ptr, ie->len);
4182  	mlme_priv->disconnect_info.self_discon_ies.len = ie->len;
4183  
4184  	mlme_legacy_debug("Self disconnect IEs");
4185  	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_MLME, QDF_TRACE_LEVEL_DEBUG,
4186  			   mlme_priv->disconnect_info.self_discon_ies.ptr,
4187  			   mlme_priv->disconnect_info.self_discon_ies.len);
4188  }
4189  
mlme_free_self_disconnect_ies(struct wlan_objmgr_vdev * vdev)4190  void mlme_free_self_disconnect_ies(struct wlan_objmgr_vdev *vdev)
4191  {
4192  	struct mlme_legacy_priv *mlme_priv;
4193  
4194  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4195  	if (!mlme_priv) {
4196  		mlme_legacy_err("vdev legacy private object is NULL");
4197  		return;
4198  	}
4199  
4200  	if (mlme_priv->disconnect_info.self_discon_ies.ptr) {
4201  		qdf_mem_free(mlme_priv->disconnect_info.self_discon_ies.ptr);
4202  		mlme_priv->disconnect_info.self_discon_ies.ptr = NULL;
4203  		mlme_priv->disconnect_info.self_discon_ies.len = 0;
4204  	}
4205  }
4206  
mlme_get_self_disconnect_ies(struct wlan_objmgr_vdev * vdev)4207  struct element_info *mlme_get_self_disconnect_ies(struct wlan_objmgr_vdev *vdev)
4208  {
4209  	struct mlme_legacy_priv *mlme_priv;
4210  
4211  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4212  	if (!mlme_priv) {
4213  		mlme_legacy_err("vdev legacy private object is NULL");
4214  		return NULL;
4215  	}
4216  
4217  	return &mlme_priv->disconnect_info.self_discon_ies;
4218  }
4219  
mlme_set_peer_disconnect_ies(struct wlan_objmgr_vdev * vdev,struct element_info * ie)4220  void mlme_set_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev,
4221  				  struct element_info *ie)
4222  {
4223  	struct mlme_legacy_priv *mlme_priv;
4224  
4225  	if (!ie || !ie->len || !ie->ptr) {
4226  		mlme_legacy_debug("disocnnect IEs are NULL");
4227  		return;
4228  	}
4229  
4230  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4231  	if (!mlme_priv) {
4232  		mlme_legacy_err("vdev legacy private object is NULL");
4233  		return;
4234  	}
4235  
4236  	if (mlme_priv->disconnect_info.peer_discon_ies.ptr) {
4237  		qdf_mem_free(mlme_priv->disconnect_info.peer_discon_ies.ptr);
4238  		mlme_priv->disconnect_info.peer_discon_ies.len = 0;
4239  	}
4240  
4241  	mlme_priv->disconnect_info.peer_discon_ies.ptr =
4242  					qdf_mem_malloc(ie->len);
4243  	if (!mlme_priv->disconnect_info.peer_discon_ies.ptr)
4244  		return;
4245  
4246  	qdf_mem_copy(mlme_priv->disconnect_info.peer_discon_ies.ptr,
4247  		     ie->ptr, ie->len);
4248  	mlme_priv->disconnect_info.peer_discon_ies.len = ie->len;
4249  
4250  	mlme_legacy_debug("peer disconnect IEs");
4251  	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_MLME, QDF_TRACE_LEVEL_DEBUG,
4252  			   mlme_priv->disconnect_info.peer_discon_ies.ptr,
4253  			   mlme_priv->disconnect_info.peer_discon_ies.len);
4254  }
4255  
mlme_free_peer_disconnect_ies(struct wlan_objmgr_vdev * vdev)4256  void mlme_free_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev)
4257  {
4258  	struct mlme_legacy_priv *mlme_priv;
4259  
4260  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4261  	if (!mlme_priv) {
4262  		mlme_legacy_err("vdev legacy private object is NULL");
4263  		return;
4264  	}
4265  
4266  	if (mlme_priv->disconnect_info.peer_discon_ies.ptr) {
4267  		qdf_mem_free(mlme_priv->disconnect_info.peer_discon_ies.ptr);
4268  		mlme_priv->disconnect_info.peer_discon_ies.ptr = NULL;
4269  		mlme_priv->disconnect_info.peer_discon_ies.len = 0;
4270  	}
4271  }
4272  
mlme_get_peer_disconnect_ies(struct wlan_objmgr_vdev * vdev)4273  struct element_info *mlme_get_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev)
4274  {
4275  	struct mlme_legacy_priv *mlme_priv;
4276  
4277  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4278  	if (!mlme_priv) {
4279  		mlme_legacy_err("vdev legacy private object is NULL");
4280  		return NULL;
4281  	}
4282  
4283  	return &mlme_priv->disconnect_info.peer_discon_ies;
4284  }
4285  
mlme_free_peer_assoc_rsp_ie(struct peer_mlme_priv_obj * peer_priv)4286  void mlme_free_peer_assoc_rsp_ie(struct peer_mlme_priv_obj *peer_priv)
4287  {
4288  	if (!peer_priv) {
4289  		mlme_legacy_debug("peer priv is NULL");
4290  		return;
4291  	}
4292  
4293  	if (peer_priv->assoc_rsp.ptr) {
4294  		qdf_mem_free(peer_priv->assoc_rsp.ptr);
4295  		peer_priv->assoc_rsp.ptr = NULL;
4296  		peer_priv->assoc_rsp.len = 0;
4297  	}
4298  }
4299  
mlme_set_peer_assoc_rsp_ie(struct wlan_objmgr_psoc * psoc,uint8_t * peer_addr,struct element_info * ie)4300  void mlme_set_peer_assoc_rsp_ie(struct wlan_objmgr_psoc *psoc,
4301  				uint8_t *peer_addr, struct element_info *ie)
4302  {
4303  	struct wlan_objmgr_peer *peer;
4304  	struct peer_mlme_priv_obj *peer_priv;
4305  
4306  	if (!ie || !ie->len || !ie->ptr || !peer_addr) {
4307  		mlme_legacy_debug("Assoc IE is NULL");
4308  		return;
4309  	}
4310  
4311  	peer = wlan_objmgr_get_peer_by_mac(psoc, peer_addr, WLAN_LEGACY_MAC_ID);
4312  	if (!peer)
4313  		return;
4314  
4315  	peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
4316  							  WLAN_UMAC_COMP_MLME);
4317  
4318  	if (!peer_priv)
4319  		goto end;
4320  
4321  	/* Free existing assoc_rsp */
4322  	mlme_free_peer_assoc_rsp_ie(peer_priv);
4323  
4324  	peer_priv->assoc_rsp.ptr = qdf_mem_malloc(ie->len);
4325  	if (!peer_priv->assoc_rsp.ptr)
4326  		goto end;
4327  
4328  	qdf_mem_copy(peer_priv->assoc_rsp.ptr, ie->ptr, ie->len);
4329  	peer_priv->assoc_rsp.len = ie->len;
4330  end:
4331  	wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
4332  }
4333  
mlme_set_follow_ap_edca_flag(struct wlan_objmgr_vdev * vdev,bool flag)4334  void mlme_set_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev, bool flag)
4335  {
4336  	struct mlme_legacy_priv *mlme_priv;
4337  
4338  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4339  	if (!mlme_priv) {
4340  		mlme_legacy_err("vdev legacy private object is NULL");
4341  		return;
4342  	}
4343  
4344  	mlme_priv->follow_ap_edca = flag;
4345  }
4346  
mlme_get_follow_ap_edca_flag(struct wlan_objmgr_vdev * vdev)4347  bool mlme_get_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev)
4348  {
4349  	struct mlme_legacy_priv *mlme_priv;
4350  
4351  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4352  	if (!mlme_priv) {
4353  		mlme_legacy_err("vdev legacy private object is NULL");
4354  		return false;
4355  	}
4356  
4357  	return mlme_priv->follow_ap_edca;
4358  }
4359  
mlme_set_best_6g_power_type(struct wlan_objmgr_vdev * vdev,enum reg_6g_ap_type best_6g_power_type)4360  void mlme_set_best_6g_power_type(struct wlan_objmgr_vdev *vdev,
4361  				 enum reg_6g_ap_type best_6g_power_type)
4362  {
4363  	struct mlme_legacy_priv *mlme_priv;
4364  
4365  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4366  	if (!mlme_priv) {
4367  		mlme_legacy_err("vdev legacy private object is NULL");
4368  		return;
4369  	}
4370  
4371  	mlme_priv->best_6g_power_type = best_6g_power_type;
4372  }
4373  
mlme_get_best_6g_power_type(struct wlan_objmgr_vdev * vdev)4374  enum reg_6g_ap_type mlme_get_best_6g_power_type(struct wlan_objmgr_vdev *vdev)
4375  {
4376  	struct mlme_legacy_priv *mlme_priv;
4377  
4378  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4379  	if (!mlme_priv) {
4380  		mlme_legacy_err("vdev legacy private object is NULL");
4381  		return REG_VERY_LOW_POWER_AP;
4382  	}
4383  
4384  	return mlme_priv->best_6g_power_type;
4385  }
4386  
mlme_set_reconn_after_assoc_timeout_flag(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool flag)4387  void mlme_set_reconn_after_assoc_timeout_flag(struct wlan_objmgr_psoc *psoc,
4388  					      uint8_t vdev_id, bool flag)
4389  {
4390  	struct wlan_objmgr_vdev *vdev;
4391  	struct mlme_legacy_priv *mlme_priv;
4392  
4393  	if (!psoc)
4394  		return;
4395  
4396  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
4397  						    WLAN_LEGACY_MAC_ID);
4398  	if (!vdev)
4399  		return;
4400  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4401  	if (!mlme_priv) {
4402  		mlme_legacy_err("vdev legacy private object is NULL");
4403  		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4404  		return;
4405  	}
4406  
4407  	mlme_priv->reconn_after_assoc_timeout = flag;
4408  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4409  }
4410  
mlme_get_reconn_after_assoc_timeout_flag(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)4411  bool mlme_get_reconn_after_assoc_timeout_flag(struct wlan_objmgr_psoc *psoc,
4412  					      uint8_t vdev_id)
4413  {
4414  	struct wlan_objmgr_vdev *vdev;
4415  	struct mlme_legacy_priv *mlme_priv;
4416  	bool reconn_after_assoc_timeout;
4417  
4418  	if (!psoc)
4419  		return false;
4420  
4421  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
4422  						    WLAN_LEGACY_MAC_ID);
4423  	if (!vdev)
4424  		return false;
4425  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4426  	if (!mlme_priv) {
4427  		mlme_legacy_err("vdev legacy private object is NULL");
4428  		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4429  		return false;
4430  	}
4431  
4432  	reconn_after_assoc_timeout = mlme_priv->reconn_after_assoc_timeout;
4433  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4434  
4435  	return reconn_after_assoc_timeout;
4436  }
4437  
mlme_set_peer_pmf_status(struct wlan_objmgr_peer * peer,bool is_pmf_enabled)4438  void mlme_set_peer_pmf_status(struct wlan_objmgr_peer *peer,
4439  			      bool is_pmf_enabled)
4440  {
4441  	struct peer_mlme_priv_obj *peer_priv;
4442  
4443  	peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
4444  							  WLAN_UMAC_COMP_MLME);
4445  	if (!peer_priv) {
4446  		mlme_legacy_err(" peer mlme component object is NULL");
4447  		return;
4448  	}
4449  	peer_priv->is_pmf_enabled = is_pmf_enabled;
4450  }
4451  
mlme_get_peer_pmf_status(struct wlan_objmgr_peer * peer)4452  bool mlme_get_peer_pmf_status(struct wlan_objmgr_peer *peer)
4453  {
4454  	struct peer_mlme_priv_obj *peer_priv;
4455  
4456  	peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
4457  							  WLAN_UMAC_COMP_MLME);
4458  	if (!peer_priv) {
4459  		mlme_legacy_err("peer mlme component object is NULL");
4460  		return false;
4461  	}
4462  
4463  	return peer_priv->is_pmf_enabled;
4464  }
4465  
wlan_get_opmode_from_vdev_id(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)4466  enum QDF_OPMODE wlan_get_opmode_from_vdev_id(struct wlan_objmgr_pdev *pdev,
4467  					     uint8_t vdev_id)
4468  {
4469  	struct wlan_objmgr_vdev *vdev;
4470  	enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE;
4471  
4472  	if (!pdev)
4473  		return opmode;
4474  
4475  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4476  						    WLAN_LEGACY_MAC_ID);
4477  	if (!vdev)
4478  		return opmode;
4479  
4480  	opmode = wlan_vdev_mlme_get_opmode(vdev);
4481  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4482  
4483  	return opmode;
4484  }
4485  
wlan_mlme_get_bssid_vdev_id(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,struct qdf_mac_addr * bss_peer_mac)4486  QDF_STATUS wlan_mlme_get_bssid_vdev_id(struct wlan_objmgr_pdev *pdev,
4487  				       uint8_t vdev_id,
4488  				       struct qdf_mac_addr *bss_peer_mac)
4489  {
4490  	struct wlan_objmgr_vdev *vdev;
4491  	QDF_STATUS status;
4492  
4493  	if (!pdev)
4494  		return QDF_STATUS_E_INVAL;
4495  
4496  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4497  						    WLAN_LEGACY_MAC_ID);
4498  	if (!vdev)
4499  		return QDF_STATUS_E_INVAL;
4500  
4501  	status = wlan_vdev_get_bss_peer_mac(vdev, bss_peer_mac);
4502  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4503  
4504  	return status;
4505  }
4506  
wlan_get_operation_chan_freq(struct wlan_objmgr_vdev * vdev)4507  qdf_freq_t wlan_get_operation_chan_freq(struct wlan_objmgr_vdev *vdev)
4508  {
4509  	qdf_freq_t chan_freq = 0;
4510  	struct wlan_channel *chan;
4511  
4512  	if (!vdev)
4513  		return chan_freq;
4514  
4515  	chan = wlan_vdev_get_active_channel(vdev);
4516  	if (chan)
4517  		chan_freq = chan->ch_freq;
4518  
4519  	return chan_freq;
4520  }
4521  
wlan_get_operation_chan_freq_vdev_id(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)4522  qdf_freq_t wlan_get_operation_chan_freq_vdev_id(struct wlan_objmgr_pdev *pdev,
4523  						uint8_t vdev_id)
4524  {
4525  	qdf_freq_t chan_freq = 0;
4526  	struct wlan_objmgr_vdev *vdev;
4527  
4528  	if (!pdev)
4529  		return chan_freq;
4530  
4531  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4532  						    WLAN_LEGACY_MAC_ID);
4533  	if (!vdev)
4534  		return chan_freq;
4535  	chan_freq = wlan_get_operation_chan_freq(vdev);
4536  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4537  
4538  	return chan_freq;
4539  }
4540  
wlan_vdev_set_dot11mode(struct wlan_mlme_cfg * mac_mlme_cfg,enum QDF_OPMODE device_mode,struct vdev_mlme_obj * vdev_mlme)4541  void wlan_vdev_set_dot11mode(struct wlan_mlme_cfg *mac_mlme_cfg,
4542  			     enum QDF_OPMODE device_mode,
4543  			     struct vdev_mlme_obj *vdev_mlme)
4544  {
4545  	uint8_t dot11_mode_indx;
4546  	uint8_t *mld_addr;
4547  	enum mlme_vdev_dot11_mode vdev_dot11_mode;
4548  	uint32_t mac_dot11_mode =
4549  			mac_mlme_cfg->dot11_mode.vdev_type_dot11_mode;
4550  
4551  	switch (device_mode) {
4552  	default:
4553  	case QDF_STA_MODE:
4554  		dot11_mode_indx = STA_DOT11_MODE_INDX;
4555  		break;
4556  	case QDF_P2P_CLIENT_MODE:
4557  	case QDF_P2P_DEVICE_MODE:
4558  		dot11_mode_indx = P2P_DEV_DOT11_MODE_INDX;
4559  		break;
4560  	case QDF_TDLS_MODE:
4561  		dot11_mode_indx = TDLS_DOT11_MODE_INDX;
4562  		break;
4563  	case QDF_NAN_DISC_MODE:
4564  		dot11_mode_indx = NAN_DISC_DOT11_MODE_INDX;
4565  		break;
4566  	case QDF_NDI_MODE:
4567  		dot11_mode_indx = NDI_DOT11_MODE_INDX;
4568  		break;
4569  	case QDF_OCB_MODE:
4570  		dot11_mode_indx = OCB_DOT11_MODE_INDX;
4571  		break;
4572  	}
4573  
4574  	vdev_dot11_mode = QDF_GET_BITS(mac_dot11_mode, dot11_mode_indx, 4);
4575  	if ((device_mode != QDF_NAN_DISC_MODE && device_mode != QDF_NDI_MODE) &&
4576  	    (vdev_dot11_mode == MLME_VDEV_DOT11_MODE_AUTO ||
4577  	     vdev_dot11_mode == MLME_VDEV_DOT11_MODE_11BE)) {
4578  		mld_addr = wlan_vdev_mlme_get_mldaddr(vdev_mlme->vdev);
4579  		if (qdf_is_macaddr_zero((struct qdf_mac_addr *)mld_addr)) {
4580  			vdev_dot11_mode = MLME_VDEV_DOT11_MODE_11AX;
4581  			vdev_mlme->proto.vdev_dot11_mode = vdev_dot11_mode;
4582  		}
4583  	}
4584  	mlme_debug("vdev%d: dot11_mode %d", wlan_vdev_get_id(vdev_mlme->vdev),
4585  		   vdev_dot11_mode);
4586  }
4587  
wlan_is_open_wep_cipher(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)4588  bool wlan_is_open_wep_cipher(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
4589  {
4590  	struct wlan_objmgr_vdev *vdev;
4591  	int32_t ucast_cipher;
4592  	bool is_open_wep = false;
4593  
4594  	if (!pdev)
4595  		return is_open_wep;
4596  
4597  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4598  						    WLAN_LEGACY_MAC_ID);
4599  	if (!vdev)
4600  		return is_open_wep;
4601  	ucast_cipher = wlan_crypto_get_param(vdev,
4602  					     WLAN_CRYPTO_PARAM_UCAST_CIPHER);
4603  	if (!ucast_cipher ||
4604  	    ((QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_NONE) ==
4605  	      ucast_cipher)) ||
4606  	      QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP) ||
4607  	      QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_40) ||
4608  	      QDF_HAS_PARAM(ucast_cipher,  WLAN_CRYPTO_CIPHER_WEP_104))
4609  		is_open_wep = true;
4610  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4611  
4612  	return is_open_wep;
4613  }
4614  
wlan_vdev_is_open_mode(struct wlan_objmgr_vdev * vdev)4615  bool wlan_vdev_is_open_mode(struct wlan_objmgr_vdev *vdev)
4616  {
4617  	int32_t ucast_cipher;
4618  
4619  	ucast_cipher = wlan_crypto_get_param(vdev,
4620  					     WLAN_CRYPTO_PARAM_UCAST_CIPHER);
4621  	if (!ucast_cipher ||
4622  	    ((QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_NONE) ==
4623  	      ucast_cipher)))
4624  		return true;
4625  
4626  	return false;
4627  }
4628  
wlan_vdev_id_is_open_cipher(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)4629  bool wlan_vdev_id_is_open_cipher(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
4630  {
4631  	struct wlan_objmgr_vdev *vdev;
4632  	bool is_open = false;
4633  
4634  	if (!pdev)
4635  		return is_open;
4636  
4637  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4638  						    WLAN_LEGACY_MAC_ID);
4639  	if (!vdev)
4640  		return is_open;
4641  	is_open = wlan_vdev_is_open_mode(vdev);
4642  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4643  
4644  	return is_open;
4645  }
4646  
wlan_vdev_id_is_11n_allowed(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)4647  bool wlan_vdev_id_is_11n_allowed(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
4648  {
4649  	struct wlan_objmgr_vdev *vdev;
4650  	bool is_11n_allowed = true;
4651  	int32_t ucast_cipher;
4652  
4653  	if (!pdev)
4654  		return is_11n_allowed;
4655  
4656  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4657  						    WLAN_LEGACY_MAC_ID);
4658  	if (!vdev)
4659  		return is_11n_allowed;
4660  	ucast_cipher = wlan_crypto_get_param(vdev,
4661  					     WLAN_CRYPTO_PARAM_UCAST_CIPHER);
4662  
4663  	if (ucast_cipher == -1)
4664  		goto err;
4665  	if (QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_TKIP) ||
4666  	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP) ||
4667  	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_40) ||
4668  	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_104)) {
4669  		QDF_CLEAR_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_TKIP);
4670  		QDF_CLEAR_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP);
4671  		QDF_CLEAR_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_40);
4672  		QDF_CLEAR_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_104);
4673  		if (!ucast_cipher)
4674  			is_11n_allowed = false;
4675  	}
4676  err:
4677  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4678  
4679  	return is_11n_allowed;
4680  }
4681  
4682  
wlan_is_vdev_id_up(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)4683  bool wlan_is_vdev_id_up(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
4684  {
4685  	struct wlan_objmgr_vdev *vdev;
4686  	bool is_up = false;
4687  
4688  	if (!pdev)
4689  		return is_up;
4690  
4691  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4692  						    WLAN_LEGACY_MAC_ID);
4693  	if (vdev) {
4694  		is_up = QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
4695  		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4696  	}
4697  
4698  	return is_up;
4699  }
4700  
4701  
4702  QDF_STATUS
wlan_get_op_chan_freq_info_vdev_id(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,qdf_freq_t * op_freq,qdf_freq_t * freq_seg_0,enum phy_ch_width * ch_width)4703  wlan_get_op_chan_freq_info_vdev_id(struct wlan_objmgr_pdev *pdev,
4704  				   uint8_t vdev_id, qdf_freq_t *op_freq,
4705  				   qdf_freq_t *freq_seg_0,
4706  				   enum phy_ch_width *ch_width)
4707  {
4708  	struct wlan_objmgr_vdev *vdev;
4709  	struct wlan_channel *chan;
4710  	QDF_STATUS status = QDF_STATUS_E_INVAL;
4711  
4712  	*op_freq = 0;
4713  	*freq_seg_0 = 0;
4714  	*ch_width = 0;
4715  
4716  	if (!pdev)
4717  		return QDF_STATUS_E_INVAL;
4718  
4719  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
4720  						    WLAN_LEGACY_MAC_ID);
4721  	if (!vdev)
4722  		goto rel_ref;
4723  	if (wlan_vdev_mlme_is_active(vdev) != QDF_STATUS_SUCCESS)
4724  		goto rel_ref;
4725  	chan = wlan_vdev_get_active_channel(vdev);
4726  	if (!chan)
4727  		goto rel_ref;
4728  
4729  	/* If operating mode is STA / P2P-CLI then get the channel width
4730  	 * from phymode. This is due the reason where actual operating
4731  	 * channel width is configured as part of WMI_PEER_ASSOC_CMDID
4732  	 * which could be downgraded while the peer associated.
4733  	 * If there is a failure or operating mode is not STA / P2P-CLI
4734  	 * then get channel width from wlan_channel.
4735  	 */
4736  	status = wlan_mlme_get_sta_ch_width(vdev, ch_width);
4737  	if (QDF_IS_STATUS_ERROR(status))
4738  		*ch_width = chan->ch_width;
4739  
4740  	*op_freq = chan->ch_freq;
4741  	*freq_seg_0 = chan->ch_cfreq1;
4742  	status = QDF_STATUS_SUCCESS;
4743  
4744  rel_ref:
4745  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
4746  
4747  	return status;
4748  }
4749  
wlan_strip_ie(uint8_t * addn_ie,uint16_t * addn_ielen,uint8_t eid,enum size_of_len_field size_of_len_field,uint8_t * oui,uint8_t oui_length,uint8_t * extracted_ie,uint32_t eid_max_len)4750  QDF_STATUS wlan_strip_ie(uint8_t *addn_ie, uint16_t *addn_ielen,
4751  			 uint8_t eid, enum size_of_len_field size_of_len_field,
4752  			 uint8_t *oui, uint8_t oui_length,
4753  			 uint8_t *extracted_ie, uint32_t eid_max_len)
4754  {
4755  	uint8_t *tmp_buf = NULL;
4756  	uint16_t tmp_len = 0;
4757  	int left = *addn_ielen;
4758  	uint8_t *ptr = addn_ie;
4759  	uint8_t elem_id;
4760  	uint16_t elem_len, ie_len, extracted_ie_len = 0;
4761  
4762  	if (!addn_ie) {
4763  		mlme_debug("NULL addn_ie pointer");
4764  		return QDF_STATUS_E_INVAL;
4765  	}
4766  	if (!left)
4767  		return QDF_STATUS_E_INVAL;
4768  
4769  	tmp_buf = qdf_mem_malloc(left);
4770  	if (!tmp_buf)
4771  		return QDF_STATUS_E_NOMEM;
4772  
4773  	if (extracted_ie)
4774  		qdf_mem_zero(extracted_ie, eid_max_len + size_of_len_field + 1);
4775  
4776  	while (left >= 2) {
4777  		elem_id  = ptr[0];
4778  		left -= 1;
4779  		if (size_of_len_field == TWO_BYTE) {
4780  			elem_len = *((uint16_t *)&ptr[1]);
4781  			left -= 2;
4782  		} else {
4783  			elem_len = ptr[1];
4784  			left -= 1;
4785  		}
4786  		if (elem_len > left) {
4787  			mlme_err("Invalid IEs eid: %d elem_len: %d left: %d",
4788  				 elem_id, elem_len, left);
4789  			qdf_mem_free(tmp_buf);
4790  			return QDF_STATUS_E_FAILURE;
4791  		}
4792  
4793  		if (eid != elem_id ||
4794  				(oui && qdf_mem_cmp(oui,
4795  						&ptr[size_of_len_field + 1],
4796  						oui_length))) {
4797  			qdf_mem_copy(tmp_buf + tmp_len, &ptr[0],
4798  				     elem_len + size_of_len_field + 1);
4799  			tmp_len += (elem_len + size_of_len_field + 1);
4800  		} else {
4801  			/*
4802  			 * eid matched and if provided OUI also matched
4803  			 * take oui IE and store in provided buffer.
4804  			 */
4805  			if (extracted_ie) {
4806  				ie_len = elem_len + size_of_len_field + 1;
4807  				if (ie_len <= eid_max_len - extracted_ie_len) {
4808  					qdf_mem_copy(
4809  					extracted_ie + extracted_ie_len,
4810  					&ptr[0], ie_len);
4811  					extracted_ie_len += ie_len;
4812  				}
4813  			}
4814  		}
4815  		left -= elem_len;
4816  		ptr += (elem_len + size_of_len_field + 1);
4817  	}
4818  	qdf_mem_copy(addn_ie, tmp_buf, tmp_len);
4819  
4820  	*addn_ielen = tmp_len;
4821  	qdf_mem_free(tmp_buf);
4822  
4823  	return QDF_STATUS_SUCCESS;
4824  }
4825  
wlan_is_channel_present_in_list(qdf_freq_t * freq_lst,uint32_t num_chan,qdf_freq_t chan_freq)4826  bool wlan_is_channel_present_in_list(qdf_freq_t *freq_lst,
4827  				     uint32_t num_chan, qdf_freq_t chan_freq)
4828  {
4829  	int i = 0;
4830  
4831  	/* Check for NULL pointer */
4832  	if (!freq_lst || (num_chan == 0))
4833  		return false;
4834  
4835  	/* Look for the channel in the list */
4836  	for (i = 0; (i < num_chan) && (i < CFG_VALID_CHANNEL_LIST_LEN); i++) {
4837  		if (freq_lst[i] == chan_freq)
4838  			return true;
4839  	}
4840  
4841  	return false;
4842  }
4843  
wlan_roam_is_channel_valid(struct wlan_mlme_reg * reg,qdf_freq_t chan_freq)4844  bool wlan_roam_is_channel_valid(struct wlan_mlme_reg *reg, qdf_freq_t chan_freq)
4845  {
4846  	bool valid = false;
4847  	uint32_t i;
4848  	uint32_t len = reg->valid_channel_list_num;
4849  
4850  	for (i = 0; (i < len); i++) {
4851  		if (wlan_reg_is_dsrc_freq(
4852  			reg->valid_channel_freq_list[i]))
4853  			continue;
4854  
4855  		if (chan_freq == reg->valid_channel_freq_list[i]) {
4856  			valid = true;
4857  			break;
4858  		}
4859  	}
4860  
4861  	return valid;
4862  }
4863  
wlan_get_cfg_max_tx_power(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev,uint32_t ch_freq)4864  int8_t wlan_get_cfg_max_tx_power(struct wlan_objmgr_psoc *psoc,
4865  				 struct wlan_objmgr_pdev *pdev,
4866  				 uint32_t ch_freq)
4867  {
4868  	uint32_t cfg_length = 0;
4869  	int8_t max_tx_pwr = 0;
4870  	struct pwr_channel_info *country_info = NULL;
4871  	uint8_t count = 0;
4872  	uint8_t maxChannels;
4873  	int32_t rem_length = 0;
4874  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
4875  
4876  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
4877  	if (!mlme_obj)
4878  		return max_tx_pwr;
4879  
4880  	if (WLAN_REG_IS_5GHZ_CH_FREQ(ch_freq)) {
4881  		cfg_length = mlme_obj->cfg.power.max_tx_power_5.len;
4882  	} else if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) {
4883  		cfg_length = mlme_obj->cfg.power.max_tx_power_24.len;
4884  
4885  	} else if (wlan_reg_is_6ghz_chan_freq(ch_freq)) {
4886  		return wlan_reg_get_channel_reg_power_for_freq(pdev,
4887  							       ch_freq);
4888  	} else {
4889  		return max_tx_pwr;
4890  	}
4891  
4892  	if (!cfg_length)
4893  		goto error;
4894  
4895  	country_info = qdf_mem_malloc(cfg_length);
4896  	if (!country_info)
4897  		goto error;
4898  
4899  	if (WLAN_REG_IS_5GHZ_CH_FREQ(ch_freq)) {
4900  		if (cfg_length > CFG_MAX_TX_POWER_5_LEN)
4901  			goto error;
4902  		qdf_mem_copy(country_info,
4903  			     mlme_obj->cfg.power.max_tx_power_5.data,
4904  			     cfg_length);
4905  	} else if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) {
4906  		if (cfg_length > CFG_MAX_TX_POWER_2_4_LEN)
4907  			goto error;
4908  		qdf_mem_copy(country_info,
4909  			     mlme_obj->cfg.power.max_tx_power_24.data,
4910  			     cfg_length);
4911  	}
4912  
4913  	/* Identify the channel and maxtxpower */
4914  	rem_length = cfg_length;
4915  	while (rem_length >= (sizeof(struct pwr_channel_info))) {
4916  		maxChannels = country_info[count].num_chan;
4917  		max_tx_pwr = country_info[count].max_tx_pwr;
4918  		count++;
4919  		rem_length -= (sizeof(struct pwr_channel_info));
4920  
4921  		if (ch_freq >= country_info[count].first_freq &&
4922  		    ch_freq < (country_info[count].first_freq + maxChannels)) {
4923  			break;
4924  		}
4925  	}
4926  
4927  error:
4928  	if (country_info)
4929  		qdf_mem_free(country_info);
4930  
4931  	return max_tx_pwr;
4932  }
4933  
4934  #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
4935  static
mlme_roam_state_to_string(enum roam_offload_state state)4936  const char *mlme_roam_state_to_string(enum roam_offload_state state)
4937  {
4938  	switch (state) {
4939  	case WLAN_ROAM_INIT:
4940  		return "ROAM_INIT";
4941  	case WLAN_ROAM_DEINIT:
4942  		return "ROAM_DEINIT";
4943  	case WLAN_ROAM_RSO_ENABLED:
4944  		return "ROAM_RSO_ENABLED";
4945  	case WLAN_ROAM_RSO_STOPPED:
4946  		return "ROAM_RSO_STOPPED";
4947  	case WLAN_ROAMING_IN_PROG:
4948  		return "ROAMING_IN_PROG";
4949  	case WLAN_ROAM_SYNCH_IN_PROG:
4950  		return "ROAM_SYNCH_IN_PROG";
4951  	case WLAN_MLO_ROAM_SYNCH_IN_PROG:
4952  		return "MLO_ROAM_SYNCH_IN_PROG";
4953  	default:
4954  		return "";
4955  	}
4956  }
4957  
4958  static void
mlme_print_roaming_state(uint8_t vdev_id,enum roam_offload_state cur_state,enum roam_offload_state new_state)4959  mlme_print_roaming_state(uint8_t vdev_id, enum roam_offload_state cur_state,
4960  			 enum roam_offload_state new_state)
4961  {
4962  	mlme_nofl_debug("CM_RSO: vdev%d: [%s(%d)] --> [%s(%d)]",
4963  			vdev_id, mlme_roam_state_to_string(cur_state),
4964  			cur_state,
4965  			mlme_roam_state_to_string(new_state), new_state);
4966  
4967  	/* TODO: Try to print the state change requestor also */
4968  }
4969  
4970  bool
mlme_get_supplicant_disabled_roaming(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)4971  mlme_get_supplicant_disabled_roaming(struct wlan_objmgr_psoc *psoc,
4972  				     uint8_t vdev_id)
4973  {
4974  	struct wlan_objmgr_vdev *vdev;
4975  	struct mlme_legacy_priv *mlme_priv;
4976  	bool value;
4977  
4978  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
4979  						    WLAN_MLME_OBJMGR_ID);
4980  
4981  	if (!vdev) {
4982  		mlme_legacy_err("vdev object is NULL");
4983  		return 0;
4984  	}
4985  
4986  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
4987  	if (!mlme_priv) {
4988  		mlme_legacy_err("vdev legacy private object is NULL");
4989  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
4990  		return 0;
4991  	}
4992  
4993  	value = mlme_priv->mlme_roam.roam_cfg.supplicant_disabled_roaming;
4994  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
4995  
4996  	return value;
4997  }
4998  
mlme_set_supplicant_disabled_roaming(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool val)4999  void mlme_set_supplicant_disabled_roaming(struct wlan_objmgr_psoc *psoc,
5000  					  uint8_t vdev_id, bool val)
5001  {
5002  	struct wlan_objmgr_vdev *vdev;
5003  	struct mlme_legacy_priv *mlme_priv;
5004  
5005  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5006  						    WLAN_MLME_OBJMGR_ID);
5007  
5008  	if (!vdev) {
5009  		mlme_legacy_err("vdev object is NULL");
5010  		return;
5011  	}
5012  
5013  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5014  	if (!mlme_priv) {
5015  		mlme_legacy_err("vdev legacy private object is NULL");
5016  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5017  		return;
5018  	}
5019  
5020  	mlme_priv->mlme_roam.roam_cfg.supplicant_disabled_roaming = val;
5021  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5022  }
5023  
5024  uint32_t
mlme_get_roam_trigger_bitmap(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)5025  mlme_get_roam_trigger_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
5026  {
5027  	struct wlan_objmgr_vdev *vdev;
5028  	struct mlme_legacy_priv *mlme_priv;
5029  	uint32_t roam_bitmap;
5030  
5031  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5032  						    WLAN_MLME_OBJMGR_ID);
5033  
5034  	if (!vdev) {
5035  		mlme_legacy_err("vdev object is NULL");
5036  		return 0;
5037  	}
5038  
5039  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5040  	if (!mlme_priv) {
5041  		mlme_legacy_err("vdev legacy private object is NULL");
5042  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5043  		return 0;
5044  	}
5045  
5046  	roam_bitmap = mlme_priv->mlme_roam.roam_cfg.roam_trigger_bitmap;
5047  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5048  
5049  	return roam_bitmap;
5050  }
5051  
mlme_set_roam_trigger_bitmap(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint32_t val)5052  void mlme_set_roam_trigger_bitmap(struct wlan_objmgr_psoc *psoc,
5053  				  uint8_t vdev_id, uint32_t val)
5054  {
5055  	struct wlan_objmgr_vdev *vdev;
5056  	struct mlme_legacy_priv *mlme_priv;
5057  
5058  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5059  						    WLAN_MLME_OBJMGR_ID);
5060  	if (!vdev) {
5061  		mlme_legacy_err("vdev object is NULL");
5062  		return;
5063  	}
5064  
5065  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5066  	if (!mlme_priv) {
5067  		mlme_legacy_err("vdev legacy private object is NULL");
5068  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5069  		return;
5070  	}
5071  
5072  	mlme_priv->mlme_roam.roam_cfg.roam_trigger_bitmap = val;
5073  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5074  }
5075  
5076  uint8_t
mlme_get_operations_bitmap(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)5077  mlme_get_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
5078  {
5079  	struct wlan_objmgr_vdev *vdev;
5080  	struct mlme_legacy_priv *mlme_priv;
5081  	uint8_t bitmap;
5082  
5083  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5084  						    WLAN_MLME_OBJMGR_ID);
5085  
5086  	if (!vdev) {
5087  		mlme_legacy_err("vdev object is NULL");
5088  		return 0xFF;
5089  	}
5090  
5091  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5092  	if (!mlme_priv) {
5093  		mlme_legacy_err("vdev legacy private object is NULL");
5094  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5095  		return 0xFF;
5096  	}
5097  
5098  	bitmap = mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap;
5099  	mlme_legacy_debug("vdev[%d] bitmap[0x%x]", vdev_id,
5100  			  mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap);
5101  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5102  
5103  	return bitmap;
5104  }
5105  
5106  void
mlme_set_operations_bitmap(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,enum wlan_cm_rso_control_requestor reqs,bool clear)5107  mlme_set_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
5108  			   enum wlan_cm_rso_control_requestor reqs, bool clear)
5109  {
5110  	struct wlan_objmgr_vdev *vdev;
5111  	struct mlme_legacy_priv *mlme_priv;
5112  
5113  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5114  						    WLAN_MLME_OBJMGR_ID);
5115  	if (!vdev) {
5116  		mlme_legacy_err("vdev object is NULL");
5117  		return;
5118  	}
5119  
5120  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5121  	if (!mlme_priv) {
5122  		mlme_legacy_err("vdev legacy private object is NULL");
5123  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5124  		return;
5125  	}
5126  
5127  	if (clear)
5128  		mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap &= ~reqs;
5129  	else
5130  		mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap |= reqs;
5131  
5132  	mlme_legacy_debug("vdev[%d] bitmap[0x%x], reqs: %d, clear: %d", vdev_id,
5133  			  mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap,
5134  			  reqs, clear);
5135  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5136  }
5137  
5138  void
mlme_clear_operations_bitmap(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)5139  mlme_clear_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
5140  {
5141  	struct wlan_objmgr_vdev *vdev;
5142  	struct mlme_legacy_priv *mlme_priv;
5143  
5144  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5145  						    WLAN_MLME_OBJMGR_ID);
5146  	if (!vdev) {
5147  		mlme_legacy_err("vdev object is NULL");
5148  		return;
5149  	}
5150  
5151  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5152  	if (!mlme_priv) {
5153  		mlme_legacy_err("vdev legacy private object is NULL");
5154  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5155  		return;
5156  	}
5157  
5158  	mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap = 0;
5159  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5160  }
5161  
mlme_get_cfg_wlm_level(struct wlan_objmgr_psoc * psoc,uint8_t * level)5162  QDF_STATUS mlme_get_cfg_wlm_level(struct wlan_objmgr_psoc *psoc,
5163  				  uint8_t *level)
5164  {
5165  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
5166  
5167  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
5168  	if (!mlme_obj)
5169  		return QDF_STATUS_E_FAILURE;
5170  
5171  	*level = mlme_obj->cfg.wlm_config.latency_level;
5172  
5173  	return QDF_STATUS_SUCCESS;
5174  }
5175  
mlme_get_cfg_wlm_reset(struct wlan_objmgr_psoc * psoc,bool * reset)5176  QDF_STATUS mlme_get_cfg_wlm_reset(struct wlan_objmgr_psoc *psoc,
5177  				  bool *reset)
5178  {
5179  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
5180  
5181  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
5182  	if (!mlme_obj)
5183  		return QDF_STATUS_E_FAILURE;
5184  
5185  	*reset = mlme_obj->cfg.wlm_config.latency_reset;
5186  
5187  	return QDF_STATUS_SUCCESS;
5188  }
5189  
5190  enum roam_offload_state
mlme_get_roam_state(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)5191  mlme_get_roam_state(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
5192  {
5193  	struct wlan_objmgr_vdev *vdev;
5194  	struct mlme_legacy_priv *mlme_priv;
5195  	enum roam_offload_state roam_state;
5196  
5197  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5198  						    WLAN_MLME_OBJMGR_ID);
5199  
5200  	if (!vdev)
5201  		return WLAN_ROAM_DEINIT;
5202  
5203  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5204  	if (!mlme_priv) {
5205  		mlme_legacy_err("vdev legacy private object is NULL");
5206  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5207  		return WLAN_ROAM_DEINIT;
5208  	}
5209  
5210  	roam_state = mlme_priv->mlme_roam.roam_sm.state;
5211  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5212  
5213  	return roam_state;
5214  }
5215  
mlme_set_roam_state(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,enum roam_offload_state new_state)5216  void mlme_set_roam_state(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
5217  			 enum roam_offload_state new_state)
5218  {
5219  	struct wlan_objmgr_vdev *vdev;
5220  	struct mlme_legacy_priv *mlme_priv;
5221  
5222  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5223  						    WLAN_MLME_OBJMGR_ID);
5224  
5225  	if (!vdev) {
5226  		mlme_err("vdev%d: vdev object is NULL", vdev_id);
5227  		return;
5228  	}
5229  
5230  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5231  	if (!mlme_priv) {
5232  		mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id);
5233  		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5234  		return;
5235  	}
5236  
5237  	mlme_print_roaming_state(vdev_id, mlme_priv->mlme_roam.roam_sm.state,
5238  				 new_state);
5239  	mlme_priv->mlme_roam.roam_sm.state = new_state;
5240  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5241  }
5242  
5243  QDF_STATUS
mlme_store_fw_scan_channels(struct wlan_objmgr_psoc * psoc,tSirUpdateChanList * chan_list)5244  mlme_store_fw_scan_channels(struct wlan_objmgr_psoc *psoc,
5245  			    tSirUpdateChanList *chan_list)
5246  {
5247  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
5248  	struct wlan_mlme_lfr_cfg *lfr;
5249  	uint16_t i;
5250  
5251  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
5252  	if (!mlme_obj) {
5253  		mlme_legacy_err("Failed to get MLME Obj");
5254  		return QDF_STATUS_E_FAILURE;
5255  	}
5256  
5257  	lfr = &mlme_obj->cfg.lfr;
5258  	qdf_mem_zero(&lfr->saved_freq_list, sizeof(lfr->saved_freq_list));
5259  	lfr->saved_freq_list.num_channels = chan_list->numChan;
5260  	for (i = 0; i < chan_list->numChan; i++)
5261  		lfr->saved_freq_list.freq[i] = chan_list->chanParam[i].freq;
5262  
5263  	mlme_legacy_debug("ROAM: save %d channels",
5264  			  chan_list->numChan);
5265  
5266  	return QDF_STATUS_SUCCESS;
5267  }
5268  
mlme_get_fw_scan_channels(struct wlan_objmgr_psoc * psoc,uint32_t * freq_list,uint8_t * saved_num_chan)5269  QDF_STATUS mlme_get_fw_scan_channels(struct wlan_objmgr_psoc *psoc,
5270  				     uint32_t *freq_list,
5271  				     uint8_t *saved_num_chan)
5272  {
5273  	struct wlan_mlme_psoc_ext_obj *mlme_obj;
5274  	struct wlan_mlme_lfr_cfg *lfr;
5275  	uint16_t i;
5276  
5277  	if (!freq_list) {
5278  		mlme_legacy_err("ROAM: Freq list is NULL");
5279  		*saved_num_chan = 0;
5280  		return QDF_STATUS_E_FAILURE;
5281  	}
5282  
5283  	mlme_obj = mlme_get_psoc_ext_obj(psoc);
5284  	if (!mlme_obj) {
5285  		mlme_legacy_err("Failed to get MLME Obj");
5286  		*saved_num_chan = 0;
5287  		return QDF_STATUS_E_FAILURE;
5288  	}
5289  
5290  	lfr = &mlme_obj->cfg.lfr;
5291  	*saved_num_chan = lfr->saved_freq_list.num_channels;
5292  
5293  	for (i = 0; i < lfr->saved_freq_list.num_channels; i++)
5294  		freq_list[i] = lfr->saved_freq_list.freq[i];
5295  
5296  	return QDF_STATUS_SUCCESS;
5297  }
5298  #endif
5299  
wlan_mlme_get_mac_vdev_id(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,struct qdf_mac_addr * self_mac)5300  QDF_STATUS wlan_mlme_get_mac_vdev_id(struct wlan_objmgr_pdev *pdev,
5301  				     uint8_t vdev_id,
5302  				     struct qdf_mac_addr *self_mac)
5303  {
5304  	struct wlan_objmgr_vdev *vdev;
5305  
5306  	if (!pdev)
5307  		return QDF_STATUS_E_INVAL;
5308  
5309  	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
5310  						    WLAN_LEGACY_MAC_ID);
5311  	if (!vdev)
5312  		return QDF_STATUS_E_INVAL;
5313  
5314  	qdf_mem_copy(self_mac->bytes,
5315  		     wlan_vdev_mlme_get_macaddr(vdev), QDF_MAC_ADDR_SIZE);
5316  	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
5317  
5318  	return QDF_STATUS_SUCCESS;
5319  }
5320  
5321  qdf_freq_t
wlan_get_sap_user_config_freq(struct wlan_objmgr_vdev * vdev)5322  wlan_get_sap_user_config_freq(struct wlan_objmgr_vdev *vdev)
5323  {
5324  	struct mlme_legacy_priv *mlme_priv;
5325  	enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE;
5326  
5327  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5328  	if (!mlme_priv) {
5329  		mlme_legacy_err("vdev legacy private object is NULL");
5330  		return 0;
5331  	}
5332  
5333  	opmode = wlan_vdev_mlme_get_opmode(vdev);
5334  	if (opmode != QDF_SAP_MODE && opmode != QDF_P2P_GO_MODE) {
5335  		mlme_debug("Cannot get user config freq for mode %d", opmode);
5336  		return 0;
5337  	}
5338  
5339  	return mlme_priv->mlme_ap.user_config_sap_ch_freq;
5340  }
5341  
5342  QDF_STATUS
wlan_set_sap_user_config_freq(struct wlan_objmgr_vdev * vdev,qdf_freq_t freq)5343  wlan_set_sap_user_config_freq(struct wlan_objmgr_vdev *vdev,
5344  			      qdf_freq_t freq)
5345  {
5346  	struct mlme_legacy_priv *mlme_priv;
5347  	enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE;
5348  
5349  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5350  	if (!mlme_priv) {
5351  		mlme_legacy_err("vdev legacy private object is NULL");
5352  		return QDF_STATUS_E_INVAL;
5353  	}
5354  
5355  	opmode = wlan_vdev_mlme_get_opmode(vdev);
5356  	if (opmode != QDF_SAP_MODE && opmode != QDF_P2P_GO_MODE) {
5357  		mlme_debug("Cannot set user config freq for mode %d", opmode);
5358  		return QDF_STATUS_E_FAILURE;
5359  	}
5360  
5361  	mlme_priv->mlme_ap.user_config_sap_ch_freq = freq;
5362  	return QDF_STATUS_SUCCESS;
5363  }
5364  
5365  #ifdef CONFIG_BAND_6GHZ
5366  bool
wlan_get_tpc_update_required_for_sta(struct wlan_objmgr_vdev * vdev)5367  wlan_get_tpc_update_required_for_sta(struct wlan_objmgr_vdev *vdev)
5368  {
5369  	struct mlme_legacy_priv *mlme_priv;
5370  	enum QDF_OPMODE opmode;
5371  
5372  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5373  	if (!mlme_priv) {
5374  		mlme_legacy_err("vdev legacy private object is NULL");
5375  		return false;
5376  	}
5377  
5378  	opmode = wlan_vdev_mlme_get_opmode(vdev);
5379  	if (opmode != QDF_SAP_MODE && opmode != QDF_P2P_GO_MODE) {
5380  		mlme_debug("Invalid opmode %d", opmode);
5381  		return false;
5382  	}
5383  
5384  	return mlme_priv->mlme_ap.update_required_scc_sta_power;
5385  }
5386  
5387  QDF_STATUS
wlan_set_tpc_update_required_for_sta(struct wlan_objmgr_vdev * vdev,bool value)5388  wlan_set_tpc_update_required_for_sta(struct wlan_objmgr_vdev *vdev, bool value)
5389  {
5390  	struct mlme_legacy_priv *mlme_priv;
5391  	enum QDF_OPMODE opmode;
5392  
5393  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5394  	if (!mlme_priv) {
5395  		mlme_legacy_err("vdev legacy private object is NULL");
5396  		return QDF_STATUS_E_INVAL;
5397  	}
5398  
5399  	opmode = wlan_vdev_mlme_get_opmode(vdev);
5400  	if (opmode != QDF_SAP_MODE && opmode != QDF_P2P_GO_MODE) {
5401  		mlme_debug("Invalid mode %d", opmode);
5402  		QDF_ASSERT(0);
5403  		return QDF_STATUS_E_FAILURE;
5404  	}
5405  
5406  	mlme_priv->mlme_ap.update_required_scc_sta_power = value;
5407  	mlme_debug("Set change scc power as %d", value);
5408  	return QDF_STATUS_SUCCESS;
5409  }
5410  #endif
5411  
wlan_mlme_get_sta_num_tx_chains(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint8_t * tx_chains)5412  QDF_STATUS wlan_mlme_get_sta_num_tx_chains(struct wlan_objmgr_psoc *psoc,
5413  					   struct wlan_objmgr_vdev *vdev,
5414  					   uint8_t *tx_chains)
5415  {
5416  	bool dynamic_nss_chains_support;
5417  	struct wlan_mlme_nss_chains *dynamic_cfg;
5418  	enum band_info operating_band;
5419  	QDF_STATUS status;
5420  	struct vdev_mlme_obj *vdev_mlme;
5421  
5422  	status = wlan_mlme_cfg_get_dynamic_nss_chains_support
5423  					(psoc, &dynamic_nss_chains_support);
5424  	if (QDF_IS_STATUS_ERROR(status)) {
5425  		mlme_err("Failed to get dynamic_nss_chains_support");
5426  		return QDF_STATUS_E_INVAL;
5427  	}
5428  
5429  	vdev_mlme =
5430  		wlan_objmgr_vdev_get_comp_private_obj(vdev,
5431  						      WLAN_UMAC_COMP_MLME);
5432  	if (!vdev_mlme) {
5433  		QDF_ASSERT(0);
5434  		return false;
5435  	}
5436  
5437  	if (dynamic_nss_chains_support) {
5438  		dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
5439  		if (!dynamic_cfg) {
5440  			mlme_err("nss chain dynamic config NULL");
5441  			return QDF_STATUS_E_INVAL;
5442  		}
5443  
5444  		operating_band = ucfg_cm_get_connected_band(vdev);
5445  		switch (operating_band) {
5446  		case BAND_2G:
5447  			*tx_chains =
5448  			dynamic_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
5449  			break;
5450  		case BAND_5G:
5451  			*tx_chains =
5452  			dynamic_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
5453  			break;
5454  		default:
5455  			mlme_err("Band %d Not 2G or 5G", operating_band);
5456  			return QDF_STATUS_E_INVAL;
5457  		}
5458  	}
5459  
5460  	return QDF_STATUS_SUCCESS;
5461  }
5462  
wlan_mlme_get_sta_tx_nss(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint8_t * tx_nss)5463  QDF_STATUS wlan_mlme_get_sta_tx_nss(struct wlan_objmgr_psoc *psoc,
5464  				    struct wlan_objmgr_vdev *vdev,
5465  				    uint8_t *tx_nss)
5466  {
5467  	uint8_t proto_generic_nss;
5468  	bool dynamic_nss_chains_support;
5469  	struct wlan_mlme_nss_chains *dynamic_cfg;
5470  	enum band_info operating_band;
5471  	QDF_STATUS status;
5472  
5473  	status = wlan_mlme_cfg_get_dynamic_nss_chains_support
5474  					(psoc, &dynamic_nss_chains_support);
5475  	if (QDF_IS_STATUS_ERROR(status)) {
5476  		mlme_err("Failed to get dynamic_nss_chains_support");
5477  		return QDF_STATUS_E_INVAL;
5478  	}
5479  
5480  	proto_generic_nss = wlan_vdev_mlme_get_nss(vdev);
5481  	if (dynamic_nss_chains_support) {
5482  		dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
5483  		if (!dynamic_cfg) {
5484  			mlme_err("nss chain dynamic config NULL");
5485  			return QDF_STATUS_E_INVAL;
5486  		}
5487  
5488  		operating_band = ucfg_cm_get_connected_band(vdev);
5489  		switch (operating_band) {
5490  		case BAND_2G:
5491  			*tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
5492  			break;
5493  		case BAND_5G:
5494  			*tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
5495  			break;
5496  		default:
5497  			mlme_err("Band %d Not 2G or 5G", operating_band);
5498  			return QDF_STATUS_E_INVAL;
5499  		}
5500  
5501  		if (*tx_nss > proto_generic_nss)
5502  			*tx_nss = proto_generic_nss;
5503  	} else {
5504  		*tx_nss = proto_generic_nss;
5505  	}
5506  
5507  	return QDF_STATUS_SUCCESS;
5508  }
5509  
wlan_mlme_get_sta_num_rx_chains(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint8_t * rx_chains)5510  QDF_STATUS wlan_mlme_get_sta_num_rx_chains(struct wlan_objmgr_psoc *psoc,
5511  					   struct wlan_objmgr_vdev *vdev,
5512  					   uint8_t *rx_chains)
5513  {
5514  	bool dynamic_nss_chains_support;
5515  	struct wlan_mlme_nss_chains *dynamic_cfg;
5516  	enum band_info operating_band;
5517  	QDF_STATUS status;
5518  	struct vdev_mlme_obj *vdev_mlme;
5519  
5520  	status = wlan_mlme_cfg_get_dynamic_nss_chains_support
5521  					(psoc, &dynamic_nss_chains_support);
5522  	if (QDF_IS_STATUS_ERROR(status)) {
5523  		mlme_err("Failed to get dynamic_nss_chains_support");
5524  		return QDF_STATUS_E_INVAL;
5525  	}
5526  	vdev_mlme =
5527  		wlan_objmgr_vdev_get_comp_private_obj(vdev,
5528  						      WLAN_UMAC_COMP_MLME);
5529  	if (!vdev_mlme) {
5530  		QDF_ASSERT(0);
5531  		return false;
5532  	}
5533  
5534  	if (dynamic_nss_chains_support) {
5535  		dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
5536  		if (!dynamic_cfg) {
5537  			mlme_err("nss chain dynamic config NULL");
5538  			return QDF_STATUS_E_INVAL;
5539  		}
5540  
5541  		operating_band = ucfg_cm_get_connected_band(vdev);
5542  		switch (operating_band) {
5543  		case BAND_2G:
5544  			*rx_chains =
5545  			dynamic_cfg->num_rx_chains[NSS_CHAINS_BAND_2GHZ];
5546  			break;
5547  		case BAND_5G:
5548  			*rx_chains =
5549  			dynamic_cfg->num_rx_chains[NSS_CHAINS_BAND_5GHZ];
5550  			break;
5551  		default:
5552  			mlme_err("Band %d Not 2G or 5G", operating_band);
5553  			return QDF_STATUS_E_INVAL;
5554  		}
5555  	}
5556  
5557  	return QDF_STATUS_SUCCESS;
5558  }
5559  
wlan_mlme_get_sta_rx_nss(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint8_t * rx_nss)5560  QDF_STATUS wlan_mlme_get_sta_rx_nss(struct wlan_objmgr_psoc *psoc,
5561  				    struct wlan_objmgr_vdev *vdev,
5562  				    uint8_t *rx_nss)
5563  {
5564  	uint8_t proto_generic_nss;
5565  	bool dynamic_nss_chains_support;
5566  	struct wlan_mlme_nss_chains *dynamic_cfg;
5567  	enum band_info operating_band;
5568  	QDF_STATUS status;
5569  
5570  	status = wlan_mlme_cfg_get_dynamic_nss_chains_support
5571  					(psoc, &dynamic_nss_chains_support);
5572  	if (QDF_IS_STATUS_ERROR(status)) {
5573  		mlme_err("Failed to get dynamic_nss_chains_support");
5574  		return QDF_STATUS_E_INVAL;
5575  	}
5576  
5577  	proto_generic_nss = wlan_vdev_mlme_get_nss(vdev);
5578  	if (dynamic_nss_chains_support) {
5579  		dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
5580  		if (!dynamic_cfg) {
5581  			mlme_err("nss chain dynamic config NULL");
5582  			return QDF_STATUS_E_INVAL;
5583  		}
5584  
5585  		operating_band = ucfg_cm_get_connected_band(vdev);
5586  		switch (operating_band) {
5587  		case BAND_2G:
5588  			*rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
5589  			break;
5590  		case BAND_5G:
5591  			*rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
5592  			break;
5593  		default:
5594  			mlme_err("Band %d Not 2G or 5G", operating_band);
5595  			return QDF_STATUS_E_INVAL;
5596  		}
5597  
5598  		if (*rx_nss > proto_generic_nss)
5599  			*rx_nss = proto_generic_nss;
5600  	} else {
5601  		*rx_nss = proto_generic_nss;
5602  	}
5603  
5604  	return QDF_STATUS_SUCCESS;
5605  }
5606  
5607  #ifdef WLAN_FEATURE_ROAM_OFFLOAD
5608  QDF_STATUS
wmi_extract_peer_oper_mode_event(wmi_unified_t wmi_handle,uint8_t * event,uint32_t len,struct peer_oper_mode_event * data)5609  wmi_extract_peer_oper_mode_event(wmi_unified_t wmi_handle,
5610  				 uint8_t *event,
5611  				 uint32_t len,
5612  				 struct peer_oper_mode_event *data)
5613  {
5614  	if (wmi_handle->ops->extract_peer_oper_mode_event)
5615  		return wmi_handle->ops->extract_peer_oper_mode_event(wmi_handle,
5616  								     event,
5617  								     len, data);
5618  	return QDF_STATUS_E_FAILURE;
5619  }
5620  
mlme_peer_oper_mode_change_event_handler(ol_scn_t scn,uint8_t * event,uint32_t len)5621  int mlme_peer_oper_mode_change_event_handler(ol_scn_t scn,
5622  					      uint8_t *event,
5623  					      uint32_t len)
5624  {
5625  	struct wlan_objmgr_psoc *psoc;
5626  	struct wmi_unified *wmi_handle;
5627  	struct peer_oper_mode_event data = {0};
5628  	struct wlan_mlme_rx_ops *mlme_rx_ops;
5629  	QDF_STATUS qdf_status;
5630  
5631  	psoc = target_if_get_psoc_from_scn_hdl(scn);
5632  	if (!psoc) {
5633  		target_if_err("psoc is null");
5634  		return -EINVAL;
5635  	}
5636  
5637  	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
5638  	if (!wmi_handle) {
5639  		mlme_err("wmi_handle is null");
5640  		return -EINVAL;
5641  	}
5642  
5643  	qdf_status = wmi_extract_peer_oper_mode_event(wmi_handle, event,
5644  						      len, &data);
5645  	if (QDF_IS_STATUS_ERROR(qdf_status)) {
5646  		mlme_err("parsing of event failed, %d", qdf_status);
5647  		return -EINVAL;
5648  	}
5649  
5650  	mlme_rx_ops = mlme_get_rx_ops(psoc);
5651  	if (!mlme_rx_ops || !mlme_rx_ops->peer_oper_mode_eventid) {
5652  		mlme_err("No valid roam rx ops");
5653  		return -EINVAL;
5654  	}
5655  
5656  	qdf_status = mlme_rx_ops->peer_oper_mode_eventid(psoc, &data);
5657  	if (QDF_IS_STATUS_ERROR(qdf_status)) {
5658  		mlme_err("peer_oper_mode_change_event Failed");
5659  		return -EINVAL;
5660  	}
5661  
5662  	return QDF_STATUS_SUCCESS;
5663  }
5664  
wlan_mlme_register_common_events(struct wlan_objmgr_psoc * psoc)5665  QDF_STATUS wlan_mlme_register_common_events(struct wlan_objmgr_psoc *psoc)
5666  {
5667  	QDF_STATUS ret;
5668  	wmi_unified_t handle = get_wmi_unified_hdl_from_psoc(psoc);
5669  
5670  	if (!handle) {
5671  		mlme_err("handle is NULL");
5672  		return QDF_STATUS_E_FAILURE;
5673  	}
5674  
5675  	/* Register for peer operating mode change devent */
5676  	ret = wmi_unified_register_event_handler(handle,
5677  				wmi_peer_oper_mode_change_event_id,
5678  				mlme_peer_oper_mode_change_event_handler,
5679  				WMI_RX_SERIALIZER_CTX);
5680  	if (QDF_IS_STATUS_ERROR(ret)) {
5681  		mlme_err("wmi event(%u) registration failed, ret: %d",
5682  			      wmi_peer_oper_mode_change_event_id, ret);
5683  		return QDF_STATUS_E_FAILURE;
5684  	}
5685  	return QDF_STATUS_SUCCESS;
5686  }
5687  #endif
5688  
5689  QDF_STATUS
wlan_mlme_send_csa_event_status_ind_cmd(struct wlan_objmgr_vdev * vdev,uint8_t csa_status)5690  wlan_mlme_send_csa_event_status_ind_cmd(struct wlan_objmgr_vdev *vdev,
5691  					uint8_t csa_status)
5692  {
5693  	struct wlan_objmgr_psoc *psoc;
5694  	struct  wlan_mlme_tx_ops *tx_ops;
5695  	mlme_psoc_ext_t *mlme_priv;
5696  
5697  	psoc = wlan_vdev_get_psoc(vdev);
5698  	if (!psoc) {
5699  		mlme_err("vdev_id %d psoc object is NULL",
5700  			 wlan_vdev_get_id(vdev));
5701  		return QDF_STATUS_E_FAILURE;
5702  	}
5703  
5704  	mlme_priv = wlan_psoc_mlme_get_ext_hdl(psoc);
5705  	if (!mlme_priv)
5706  		return QDF_STATUS_E_FAILURE;
5707  
5708  	tx_ops = &mlme_priv->mlme_tx_ops;
5709  
5710  	if (!tx_ops || !tx_ops->send_csa_event_status_ind) {
5711  		mlme_err("CSA no op defined");
5712  		return QDF_STATUS_E_FAILURE;
5713  	}
5714  
5715  	return tx_ops->send_csa_event_status_ind(vdev, csa_status);
5716  }
5717  
5718  uint8_t
wlan_mlme_get_sap_psd_for_20mhz(struct wlan_objmgr_vdev * vdev)5719  wlan_mlme_get_sap_psd_for_20mhz(struct wlan_objmgr_vdev *vdev)
5720  {
5721  	struct mlme_legacy_priv *mlme_priv;
5722  	enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE;
5723  
5724  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5725  	if (!mlme_priv) {
5726  		mlme_legacy_err("vdev legacy private object is NULL");
5727  		return 0;
5728  	}
5729  
5730  	opmode = wlan_vdev_mlme_get_opmode(vdev);
5731  	if (opmode != QDF_SAP_MODE) {
5732  		mlme_debug("Invalid opmode %d", opmode);
5733  		return 0;
5734  	}
5735  
5736  	return mlme_priv->mlme_ap.psd_20mhz;
5737  }
5738  
5739  QDF_STATUS
wlan_mlme_set_sap_psd_for_20mhz(struct wlan_objmgr_vdev * vdev,uint8_t psd_power)5740  wlan_mlme_set_sap_psd_for_20mhz(struct wlan_objmgr_vdev *vdev,
5741  				uint8_t psd_power)
5742  {
5743  	struct mlme_legacy_priv *mlme_priv;
5744  	enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE;
5745  
5746  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5747  	if (!mlme_priv) {
5748  		mlme_legacy_err("vdev legacy private object is NULL");
5749  		return QDF_STATUS_E_INVAL;
5750  	}
5751  
5752  	opmode = wlan_vdev_mlme_get_opmode(vdev);
5753  	if (opmode != QDF_SAP_MODE) {
5754  		mlme_debug("Invalid opmode %d", opmode);
5755  		return QDF_STATUS_E_INVAL;
5756  	}
5757  
5758  	mlme_priv->mlme_ap.psd_20mhz = psd_power;
5759  	return QDF_STATUS_SUCCESS;
5760  }
5761  
5762  /**
5763   * wlan_peer_find_mld_peer_n_get_mac_info() - This API will find MLD peer from
5764   * peer list.
5765   * @psoc: Pointer to psoc object
5766   * @obj: Pointer to peer object
5767   * @args: Pointer to void * argument
5768   *
5769   * Return: void
5770   */
5771  static void
wlan_peer_find_mld_peer_n_get_mac_info(struct wlan_objmgr_psoc * psoc,void * obj,void * args)5772  wlan_peer_find_mld_peer_n_get_mac_info(struct wlan_objmgr_psoc *psoc,
5773  				       void *obj, void *args)
5774  {
5775  	struct wlan_objmgr_peer *peer = (struct wlan_objmgr_peer *)obj;
5776  	struct peer_mac_addresses *peer_mac_info =
5777  				(struct peer_mac_addresses *)args;
5778  	uint8_t *mld_mac, *peer_mac, *given_mac;
5779  
5780  	mld_mac = wlan_peer_mlme_get_mldaddr(peer);
5781  	peer_mac = wlan_peer_get_macaddr(peer);
5782  	given_mac = peer_mac_info->mac.bytes;
5783  
5784  	if (!mld_mac || WLAN_ADDR_EQ(mld_mac, given_mac) != QDF_STATUS_SUCCESS)
5785  		return;
5786  	qdf_copy_macaddr(&peer_mac_info->peer_mac,
5787  			 (struct qdf_mac_addr *)peer_mac);
5788  	qdf_copy_macaddr(&peer_mac_info->peer_mld,
5789  			 (struct qdf_mac_addr *)mld_mac);
5790  }
5791  
wlan_find_peer_and_get_mac_and_mld_addr(struct wlan_objmgr_psoc * psoc,struct peer_mac_addresses * peer_mac_info)5792  QDF_STATUS wlan_find_peer_and_get_mac_and_mld_addr(
5793  				struct wlan_objmgr_psoc *psoc,
5794  				struct peer_mac_addresses *peer_mac_info)
5795  {
5796  	struct wlan_objmgr_peer *peer;
5797  	QDF_STATUS status = QDF_STATUS_SUCCESS;
5798  
5799  	peer = wlan_objmgr_get_peer_by_mac(psoc, peer_mac_info->mac.bytes,
5800  					   WLAN_LEGACY_MAC_ID);
5801  	if (peer) {
5802  		qdf_copy_macaddr(
5803  			&peer_mac_info->peer_mac,
5804  			(struct qdf_mac_addr *)wlan_peer_get_macaddr(peer));
5805  		if (wlan_peer_mlme_get_mldaddr(peer))
5806  			qdf_copy_macaddr(
5807  				&peer_mac_info->peer_mld,
5808  				(struct qdf_mac_addr *)
5809  				wlan_peer_mlme_get_mldaddr(peer));
5810  		wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
5811  		return status;
5812  	}
5813  
5814  	/* if not found with mac address try finding using MLD address */
5815  	wlan_objmgr_iterate_obj_list(psoc, WLAN_PEER_OP,
5816  				     wlan_peer_find_mld_peer_n_get_mac_info,
5817  				     peer_mac_info, 0, WLAN_LEGACY_MAC_ID);
5818  	if (qdf_is_macaddr_zero(&peer_mac_info->peer_mac)) {
5819  		mlme_err("peer is null for mac:" QDF_MAC_ADDR_FMT,
5820  			 QDF_MAC_ADDR_REF(peer_mac_info->mac.bytes));
5821  		return QDF_STATUS_E_EXISTS;
5822  	}
5823  
5824  	return status;
5825  }
5826