1  /*
2   * Copyright (c) 2012-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  /*
21   * This file parser_api.cc contains the code for parsing
22   * 802.11 messages.
23   * Author:        Pierre Vandwalle
24   * Date:          03/18/02
25   * History:-
26   * Date           Modified by    Modification Information
27   * --------------------------------------------------------------------
28   *
29   */
30  
31  #include "sir_api.h"
32  #include "ani_global.h"
33  #include "parser_api.h"
34  #include "lim_utils.h"
35  #include "utils_parser.h"
36  #include "lim_ser_des_utils.h"
37  #include "sch_api.h"
38  #include "wmm_apsd.h"
39  #include "rrm_api.h"
40  
41  #include "cds_regdomain.h"
42  #include "qdf_crypto.h"
43  #include "lim_process_fils.h"
44  #include "wlan_utility.h"
45  #include "wifi_pos_api.h"
46  #include "wlan_mlme_public_struct.h"
47  #include "wlan_mlme_ucfg_api.h"
48  #include "wlan_mlme_api.h"
49  #include "wlan_reg_services_api.h"
50  #include "wlan_cm_roam_api.h"
51  #include "wlan_mlo_mgr_sta.h"
52  #include "wlan_twt_cfg_ext_api.h"
53  #include <wlan_cmn_ieee80211.h>
54  #ifdef WLAN_FEATURE_11BE_MLO
55  #include <lim_mlo.h>
56  #include <utils_mlo.h>
57  #endif
58  #ifdef WLAN_FEATURE_11BE
59  #include "wlan_epcs_api.h"
60  #include <wlan_mlo_t2lm.h>
61  #endif
62  #include "wlan_mlo_mgr_link_switch.h"
63  
64  #define RSN_OUI_SIZE 4
65  /* ////////////////////////////////////////////////////////////////////// */
swap_bit_field16(uint16_t in,uint16_t * out)66  void swap_bit_field16(uint16_t in, uint16_t *out)
67  {
68  #ifdef ANI_LITTLE_BIT_ENDIAN
69  	*out = in;
70  #else                           /* Big-Endian... */
71  	*out = ((in & 0x8000) >> 15) |
72  	       ((in & 0x4000) >> 13) |
73  	       ((in & 0x2000) >> 11) |
74  	       ((in & 0x1000) >> 9) |
75  	       ((in & 0x0800) >> 7) |
76  	       ((in & 0x0400) >> 5) |
77  	       ((in & 0x0200) >> 3) |
78  	       ((in & 0x0100) >> 1) |
79  	       ((in & 0x0080) << 1) |
80  	       ((in & 0x0040) << 3) |
81  	       ((in & 0x0020) << 5) |
82  	       ((in & 0x0010) << 7) |
83  	       ((in & 0x0008) << 9) |
84  	       ((in & 0x0004) << 11) |
85  	       ((in & 0x0002) << 13) | ((in & 0x0001) << 15);
86  #endif /* ANI_LITTLE_BIT_ENDIAN */
87  }
88  
__print_wmm_params(struct mac_context * mac,tDot11fIEWMMParams * pWmm)89  static inline void __print_wmm_params(struct mac_context *mac,
90  				      tDot11fIEWMMParams *pWmm)
91  {
92  	pe_nofl_debug("WMM: BE: aifsn %d, acm %d, aci %d, cwmin %d, cwmax %d, txop %d, "
93  		      "BK: aifsn %d, acm %d, aci %d, cwmin %d, cwmax %d, txop %d, "
94  		      "VI: aifsn %d, acm %d, aci %d, cwmin %d, cwmax %d, txop %d, "
95  		      "VO: aifsn %d, acm %d, aci %d, cwmin %d, cwmax %d, txop %d",
96  		      pWmm->acbe_aifsn, pWmm->acbe_acm, pWmm->acbe_aci,
97  		      pWmm->acbe_acwmin, pWmm->acbe_acwmax,
98  		      pWmm->acbe_txoplimit,
99  		      pWmm->acbk_aifsn, pWmm->acbk_acm, pWmm->acbk_aci,
100  		      pWmm->acbk_acwmin, pWmm->acbk_acwmax,
101  		      pWmm->acbk_txoplimit,
102  		      pWmm->acvi_aifsn, pWmm->acvi_acm, pWmm->acvi_aci,
103  		      pWmm->acvi_acwmin, pWmm->acvi_acwmax,
104  		      pWmm->acvi_txoplimit,
105  		      pWmm->acvo_aifsn, pWmm->acvo_acm, pWmm->acvo_aci,
106  		      pWmm->acvo_acwmin, pWmm->acvo_acwmax,
107  		      pWmm->acvo_txoplimit);
108  }
109  
110  /* ////////////////////////////////////////////////////////////////////// */
111  /* Functions for populating "dot11f" style IEs */
112  
113  /* return: >= 0, the starting location of the IE in rsnIEdata inside tSirRSNie */
114  /*         < 0, cannot find */
find_ie_location(struct mac_context * mac,tpSirRSNie pRsnIe,uint8_t EID)115  int find_ie_location(struct mac_context *mac, tpSirRSNie pRsnIe, uint8_t EID)
116  {
117  	int idx, ieLen, bytesLeft;
118  	int ret_val = -1;
119  
120  	/* Here's what's going on: 'rsnIe' looks like this: */
121  
122  	/*     typedef struct sSirRSNie */
123  	/*     { */
124  	/*         uint16_t       length; */
125  	/*         uint8_t        rsnIEdata[WLAN_MAX_IE_LEN+2]; */
126  	/*     } tSirRSNie, *tpSirRSNie; */
127  
128  	/* other code records both the WPA & RSN IEs (including their EIDs & */
129  	/* lengths) into the array 'rsnIEdata'.  We may have: */
130  
131  	/*     With WAPI support, there may be 3 IEs here */
132  	/*     It can be only WPA IE, or only RSN IE or only WAPI IE */
133  	/*     Or two or all three of them with no particular ordering */
134  
135  	/* The if/then/else statements that follow are here to figure out */
136  	/* whether we have the WPA IE, and where it is if we *do* have it. */
137  
138  	/* Save the first IE length */
139  	ieLen = pRsnIe->rsnIEdata[1] + 2;
140  	idx = 0;
141  	bytesLeft = pRsnIe->length;
142  
143  	while (1) {
144  		if (EID == pRsnIe->rsnIEdata[idx])
145  			/* Found it */
146  			return idx;
147  		if (EID != pRsnIe->rsnIEdata[idx] &&
148  		    /* & if no more IE, */
149  		    bytesLeft <= (uint16_t)(ieLen))
150  			return ret_val;
151  
152  		bytesLeft -= ieLen;
153  		ieLen = pRsnIe->rsnIEdata[idx + 1] + 2;
154  		idx += ieLen;
155  	}
156  
157  	return ret_val;
158  }
159  
160  QDF_STATUS
populate_dot11f_capabilities(struct mac_context * mac,tDot11fFfCapabilities * pDot11f,struct pe_session * pe_session)161  populate_dot11f_capabilities(struct mac_context *mac,
162  			     tDot11fFfCapabilities *pDot11f,
163  			     struct pe_session *pe_session)
164  {
165  	uint16_t cfg;
166  	QDF_STATUS nSirStatus;
167  
168  	nSirStatus = lim_get_capability_info(mac, &cfg, pe_session);
169  	if (QDF_STATUS_SUCCESS != nSirStatus) {
170  		pe_err("Failed to retrieve the Capabilities bitfield from CFG status: %d",
171  			   nSirStatus);
172  		return nSirStatus;
173  	}
174  
175  	swap_bit_field16(cfg, (uint16_t *) pDot11f);
176  
177  	return QDF_STATUS_SUCCESS;
178  } /* End populate_dot11f_capabilities. */
179  
180  /**
181   * populate_dot_11_f_ext_chann_switch_ann() - Function to populate ECS
182   * @mac_ptr:            Pointer to PMAC structure
183   * @dot_11_ptr:         ECS element
184   * @session_entry:      PE session entry
185   *
186   * This function is used to populate the extended channel switch element
187   *
188   * Return: None
189   */
populate_dot_11_f_ext_chann_switch_ann(struct mac_context * mac_ptr,tDot11fIEext_chan_switch_ann * dot_11_ptr,struct pe_session * session_entry)190  void populate_dot_11_f_ext_chann_switch_ann(struct mac_context *mac_ptr,
191  		tDot11fIEext_chan_switch_ann *dot_11_ptr,
192  		struct pe_session *session_entry)
193  {
194  	uint8_t ch_offset;
195  	uint32_t sw_target_freq;
196  	uint8_t primary_channel;
197  	enum phy_ch_width ch_width;
198  
199  	ch_width = session_entry->gLimChannelSwitch.ch_width;
200  	ch_offset = session_entry->gLimChannelSwitch.sec_ch_offset;
201  
202  	dot_11_ptr->switch_mode = session_entry->gLimChannelSwitch.switchMode;
203  	sw_target_freq = session_entry->gLimChannelSwitch.sw_target_freq;
204  	primary_channel = session_entry->gLimChannelSwitch.primaryChannel;
205  	dot_11_ptr->new_reg_class =
206  		lim_op_class_from_bandwidth(mac_ptr, sw_target_freq, ch_width,
207  					    ch_offset);
208  	dot_11_ptr->new_channel =
209  		session_entry->gLimChannelSwitch.primaryChannel;
210  	dot_11_ptr->switch_count =
211  		session_entry->gLimChannelSwitch.switchCount;
212  	dot_11_ptr->present = 1;
213  }
214  
215  #define TIME_UNIT 1024 //time unit (TU): A measurement of time equal to 1024 us
216  void
populate_dot11f_max_chan_switch_time(struct mac_context * mac,tDot11fIEmax_chan_switch_time * pDot11f,struct pe_session * pe_session)217  populate_dot11f_max_chan_switch_time(struct mac_context *mac,
218  				     tDot11fIEmax_chan_switch_time *pDot11f,
219  				     struct pe_session *pe_session)
220  {
221  	uint32_t switch_time = pe_session->cac_duration_ms;
222  
223  	if (!switch_time) {
224  		pDot11f->present = 0;
225  		return;
226  	}
227  
228  	switch_time = qdf_do_div(switch_time * 1000, TIME_UNIT);
229  
230  	pDot11f->switch_time[0] = switch_time & 0xff;
231  	pDot11f->switch_time[1] = (switch_time >> 8) & 0xff;
232  	pDot11f->switch_time[2] = (switch_time >> 16) & 0xff;
233  
234  	pDot11f->present = 1;
235  }
236  
populate_dot11f_non_inheritance(struct mac_context * mac_ctx,tDot11fIEnon_inheritance * non_inheritance,uint8_t * non_inher_ie_lists,uint8_t * non_inher_ext_ie_lists,uint8_t non_inher_len,uint8_t non_inher_ext_len)237  void populate_dot11f_non_inheritance(
238  			struct mac_context *mac_ctx,
239  			tDot11fIEnon_inheritance *non_inheritance,
240  			uint8_t *non_inher_ie_lists,
241  			uint8_t *non_inher_ext_ie_lists,
242  			uint8_t non_inher_len, uint8_t non_inher_ext_len)
243  {
244  	uint8_t *non_inher_data;
245  
246  	non_inher_data = non_inheritance->data;
247  	non_inheritance->num_data = 0;
248  	non_inheritance->present = 1;
249  	*non_inher_data++ = non_inher_len;
250  	non_inheritance->num_data++;
251  	qdf_mem_copy(non_inher_data,
252  		     non_inher_ie_lists,
253  		     non_inher_len);
254  	non_inher_data += non_inher_len;
255  	non_inheritance->num_data += non_inher_len;
256  	*non_inher_data++ = non_inher_ext_len;
257  	non_inheritance->num_data++;
258  	qdf_mem_copy(non_inher_data,
259  		     non_inher_ext_ie_lists,
260  		     non_inher_ext_len);
261  	non_inheritance->num_data += non_inher_ext_len;
262  }
263  
264  void
populate_dot11f_chan_switch_ann(struct mac_context * mac,tDot11fIEChanSwitchAnn * pDot11f,struct pe_session * pe_session)265  populate_dot11f_chan_switch_ann(struct mac_context *mac,
266  				tDot11fIEChanSwitchAnn *pDot11f,
267  				struct pe_session *pe_session)
268  {
269  	pDot11f->switchMode = pe_session->gLimChannelSwitch.switchMode;
270  	pDot11f->newChannel = pe_session->gLimChannelSwitch.primaryChannel;
271  	pDot11f->switchCount =
272  		(uint8_t) pe_session->gLimChannelSwitch.switchCount;
273  
274  	pDot11f->present = 1;
275  }
276  
277  /**
278   * populate_dot11_supp_operating_classes() - Function to populate supported
279   *                      operating class IE
280   * @mac_ptr:            Pointer to PMAC structure
281   * @dot_11_ptr:         Operating class element
282   * @session_entry:      PE session entry
283   *
284   * Return: None
285   */
286  void
populate_dot11_supp_operating_classes(struct mac_context * mac_ptr,tDot11fIESuppOperatingClasses * dot_11_ptr,struct pe_session * session_entry)287  populate_dot11_supp_operating_classes(struct mac_context *mac_ptr,
288  				tDot11fIESuppOperatingClasses *dot_11_ptr,
289  				struct pe_session *session_entry)
290  {
291  	uint8_t ch_offset;
292  
293  	if (session_entry->ch_width == CH_WIDTH_80MHZ) {
294  		ch_offset = BW80;
295  	} else {
296  		switch (session_entry->htSecondaryChannelOffset) {
297  		case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
298  			ch_offset = BW40_HIGH_PRIMARY;
299  			break;
300  		case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
301  			ch_offset = BW40_LOW_PRIMARY;
302  			break;
303  		default:
304  			ch_offset = BW20;
305  			break;
306  		}
307  	}
308  
309  	wlan_reg_dmn_get_curr_opclasses(&dot_11_ptr->num_classes,
310  					&dot_11_ptr->classes[1]);
311  	dot_11_ptr->classes[0] =
312  		lim_op_class_from_bandwidth(mac_ptr,
313  					    session_entry->curr_op_freq,
314  					    session_entry->ch_width,
315  					    ch_offset);
316  	dot_11_ptr->num_classes++;
317  	dot_11_ptr->present = 1;
318  }
319  
320  void
populate_dot11f_tx_power_env(struct mac_context * mac,tDot11fIEtransmit_power_env * tpe_ptr,enum phy_ch_width chan_width,uint32_t chan_freq,uint16_t * num_tpe,bool is_chan_switch)321  populate_dot11f_tx_power_env(struct mac_context *mac,
322  			     tDot11fIEtransmit_power_env *tpe_ptr,
323  			     enum phy_ch_width chan_width, uint32_t chan_freq,
324  			     uint16_t *num_tpe, bool is_chan_switch)
325  {
326  	uint8_t count;
327  	uint16_t eirp_power, reg_power;
328  	int power_for_bss;
329  	bool add_eirp_power = false;
330  	struct ch_params chan_params;
331  	bool psd_tpe = false;
332  	uint32_t bw_threshold, bw_val;
333  	int num_tpe_ies = 0;
334  	uint32_t num_tx_power, num_tx_power_psd;
335  	uint32_t max_tx_pwr_count, max_tx_pwr_count_psd;
336  	qdf_freq_t psd_start_freq;
337  
338  	if (!wlan_reg_is_6ghz_chan_freq(chan_freq)) {
339  		psd_tpe = false;
340  	} else {
341  		wlan_reg_get_client_power_for_6ghz_ap(mac->pdev,
342  						      REG_DEFAULT_CLIENT,
343  						      chan_freq,
344  						      &psd_tpe,
345  						      &reg_power, &eirp_power);
346  		pe_debug("chan_freq %d, reg_power %d, psd_power %d",
347  			 chan_freq, reg_power, eirp_power);
348  	}
349  
350  	switch (chan_width) {
351  	case CH_WIDTH_20MHZ:
352  		max_tx_pwr_count = 0;
353  		max_tx_pwr_count_psd = 1;
354  		num_tx_power = 1;
355  		num_tx_power_psd = 1;
356  		break;
357  
358  	case CH_WIDTH_40MHZ:
359  		max_tx_pwr_count = 1;
360  		max_tx_pwr_count_psd = 2;
361  		num_tx_power = 2;
362  		num_tx_power_psd = 2;
363  		break;
364  
365  	case CH_WIDTH_80MHZ:
366  		max_tx_pwr_count = 2;
367  		max_tx_pwr_count_psd = 3;
368  		num_tx_power = 3;
369  		num_tx_power_psd = 4;
370  		break;
371  
372  	case CH_WIDTH_160MHZ:
373  	case CH_WIDTH_80P80MHZ:
374  		max_tx_pwr_count = 3;
375  		max_tx_pwr_count_psd = 4;
376  		num_tx_power = 4;
377  		num_tx_power_psd = 8;
378  		break;
379  	default:
380  		return;
381  	}
382  
383  	if (!psd_tpe) {
384  		reg_power = wlan_reg_get_channel_reg_power_for_freq(
385  			mac->pdev, chan_freq);
386  
387  		tpe_ptr->present = 1;
388  		tpe_ptr->max_tx_pwr_count = max_tx_pwr_count;
389  		tpe_ptr->max_tx_pwr_interpret = 0;
390  		tpe_ptr->max_tx_pwr_category = 0;
391  		tpe_ptr->num_tx_power = num_tx_power;
392  		for (count = 0; count < num_tx_power; count++)
393  			tpe_ptr->tx_power[count] = reg_power;
394  
395  		num_tpe_ies++;
396  		tpe_ptr++;
397  	} else {
398  
399  		bw_val = wlan_reg_get_bw_value(chan_width);
400  		bw_threshold = 20;
401  		power_for_bss = eirp_power + 13;
402  
403  		while ((reg_power > power_for_bss) &&
404  		       (bw_threshold < bw_val)) {
405  			bw_threshold = 2 * bw_threshold;
406  			power_for_bss += 3;
407  		}
408  		if (bw_threshold < bw_val)
409  			add_eirp_power = true;
410  
411  		pe_debug("bw_threshold %d", bw_threshold);
412  
413  		if (add_eirp_power) {
414  			tpe_ptr->present = 1;
415  			tpe_ptr->max_tx_pwr_count = max_tx_pwr_count;
416  			tpe_ptr->max_tx_pwr_interpret = 2;
417  			tpe_ptr->max_tx_pwr_category = 0;
418  			tpe_ptr->num_tx_power = num_tx_power;
419  			for (count = 0; count < num_tx_power; count++) {
420  				tpe_ptr->tx_power[count] = reg_power * 2;
421  				pe_debug("non-psd default TPE %d %d",
422  					 count, tpe_ptr->tx_power[count]);
423  			}
424  			num_tpe_ies++;
425  			tpe_ptr++;
426  		}
427  
428  		wlan_reg_get_client_power_for_6ghz_ap(mac->pdev,
429  						      REG_SUBORDINATE_CLIENT,
430  						      chan_freq,
431  						      &psd_tpe,
432  						      &reg_power,
433  						      &eirp_power);
434  
435  		if (reg_power) {
436  			bw_val = wlan_reg_get_bw_value(chan_width);
437  			bw_threshold = 20;
438  			power_for_bss = eirp_power + 13;
439  
440  			while ((reg_power > power_for_bss) &&
441  			       (bw_threshold < bw_val)) {
442  				bw_threshold = 2 * bw_threshold;
443  				power_for_bss += 3;
444  			}
445  			if (bw_threshold < bw_val)
446  				add_eirp_power = true;
447  
448  			if (add_eirp_power) {
449  				tpe_ptr->present = 1;
450  				tpe_ptr->max_tx_pwr_count = max_tx_pwr_count;
451  				tpe_ptr->max_tx_pwr_interpret = 2;
452  				tpe_ptr->max_tx_pwr_category = 1;
453  				tpe_ptr->num_tx_power = num_tx_power;
454  				for (count = 0; count < num_tx_power; count++) {
455  					tpe_ptr->tx_power[count] =
456  							reg_power * 2;
457  					pe_debug("non-psd subord TPE %d %d",
458  						 count,
459  						 tpe_ptr->tx_power[count]);
460  				}
461  				num_tpe_ies++;
462  				tpe_ptr++;
463  			}
464  		}
465  
466  		tpe_ptr->present = 1;
467  		tpe_ptr->max_tx_pwr_count = max_tx_pwr_count_psd;
468  		tpe_ptr->max_tx_pwr_interpret = 3;
469  		tpe_ptr->max_tx_pwr_category = 0;
470  		tpe_ptr->num_tx_power = num_tx_power_psd;
471  
472  		chan_params.ch_width = chan_width;
473  		bw_val = wlan_reg_get_bw_value(chan_width);
474  		wlan_reg_set_channel_params_for_pwrmode(mac->pdev, chan_freq,
475  							chan_freq, &chan_params,
476  							REG_CURRENT_PWR_MODE);
477  
478  		if (chan_params.mhz_freq_seg1)
479  			psd_start_freq =
480  				chan_params.mhz_freq_seg1 - bw_val / 2 + 10;
481  		else
482  			psd_start_freq =
483  				chan_params.mhz_freq_seg0 - bw_val / 2 + 10;
484  
485  		for (count = 0; count < num_tx_power_psd; count++) {
486  			wlan_reg_get_client_power_for_6ghz_ap(
487  							mac->pdev,
488  							REG_DEFAULT_CLIENT,
489  							psd_start_freq +
490  							20 * count,
491  							&psd_tpe,
492  							&reg_power,
493  							&eirp_power);
494  			tpe_ptr->tx_power[count] = eirp_power * 2;
495  			pe_debug("psd default TPE %d %d",
496  				 count, tpe_ptr->tx_power[count]);
497  		}
498  		num_tpe_ies++;
499  		tpe_ptr++;
500  
501  		wlan_reg_get_client_power_for_6ghz_ap(mac->pdev,
502  						      REG_SUBORDINATE_CLIENT,
503  						      chan_freq,
504  						      &psd_tpe,
505  						      &reg_power,
506  						      &eirp_power);
507  
508  		if (eirp_power) {
509  			tpe_ptr->present = 1;
510  			tpe_ptr->max_tx_pwr_count = max_tx_pwr_count_psd;
511  			tpe_ptr->max_tx_pwr_interpret = 3;
512  			tpe_ptr->max_tx_pwr_category = 1;
513  			tpe_ptr->num_tx_power = num_tx_power_psd;
514  
515  			for (count = 0; count < num_tx_power_psd; count++) {
516  				wlan_reg_get_client_power_for_6ghz_ap(
517  							mac->pdev,
518  							REG_SUBORDINATE_CLIENT,
519  							psd_start_freq +
520  							20 * count,
521  							&psd_tpe,
522  							&reg_power,
523  							&eirp_power);
524  				tpe_ptr->tx_power[count] = eirp_power * 2;
525  				pe_debug("psd subord TPE %d %d",
526  					 count, tpe_ptr->tx_power[count]);
527  			}
528  			num_tpe_ies++;
529  			tpe_ptr++;
530  		}
531  	}
532  	*num_tpe = num_tpe_ies;
533  }
534  
535  void
populate_dot11f_chan_switch_wrapper(struct mac_context * mac,tDot11fIEChannelSwitchWrapper * pDot11f,struct pe_session * pe_session)536  populate_dot11f_chan_switch_wrapper(struct mac_context *mac,
537  				    tDot11fIEChannelSwitchWrapper *pDot11f,
538  				    struct pe_session *pe_session)
539  {
540  	uint16_t num_tpe;
541  	/*
542  	 * The new country subelement is present only when
543  	 * 1. AP performs Extended Channel switching to new country.
544  	 * 2. New Operating Class table or a changed set of operating
545  	 * classes relative to the contents of the country element sent
546  	 * in the beacons.
547  	 *
548  	 * In the current scenario Channel Switch wrapper IE is included
549  	 * when we a radar is found and the AP does a channel change in
550  	 * the same regulatory domain(No country change or Operating class
551  	 * table). So, we do not need to include the New Country IE.
552  	 *
553  	 * Transmit Power Envlope Subelement is optional
554  	 * in Channel Switch Wrapper IE. So, not setting
555  	 * the TPE subelement. We include only WiderBWChanSwitchAnn.
556  	 */
557  	pDot11f->present = 1;
558  
559  	/*
560  	 * Add the Wide Channel Bandwidth Sublement.
561  	 */
562  	pDot11f->WiderBWChanSwitchAnn.newChanWidth =
563  		pe_session->gLimWiderBWChannelSwitch.newChanWidth;
564  	pDot11f->WiderBWChanSwitchAnn.newCenterChanFreq0 =
565  		pe_session->gLimWiderBWChannelSwitch.newCenterChanFreq0;
566  	pDot11f->WiderBWChanSwitchAnn.newCenterChanFreq1 =
567  		pe_session->gLimWiderBWChannelSwitch.newCenterChanFreq1;
568  	pDot11f->WiderBWChanSwitchAnn.present = 1;
569  
570  	/*
571  	 * Add the Transmit power Envelope Sublement.
572  	 */
573  	if (pe_session->vhtCapability) {
574  		populate_dot11f_tx_power_env(mac,
575  				&pDot11f->transmit_power_env,
576  				pe_session->gLimChannelSwitch.ch_width,
577  				pe_session->gLimChannelSwitch.sw_target_freq,
578  				&num_tpe, true);
579  	}
580  }
581  
582  #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
583  void
populate_dot11f_avoid_channel_ie(struct mac_context * mac_ctx,tDot11fIEQComVendorIE * dot11f,struct pe_session * pe_session)584  populate_dot11f_avoid_channel_ie(struct mac_context *mac_ctx,
585  				 tDot11fIEQComVendorIE *dot11f,
586  				 struct pe_session *pe_session)
587  {
588  	if (!pe_session->sap_advertise_avoid_ch_ie)
589  		return;
590  
591  	dot11f->present = true;
592  	dot11f->type = QCOM_VENDOR_IE_MCC_AVOID_CH;
593  	dot11f->channel = wlan_reg_freq_to_chan(
594  		mac_ctx->pdev, pe_session->curr_op_freq);
595  }
596  #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
597  
598  QDF_STATUS
populate_dot11f_country(struct mac_context * mac,tDot11fIECountry * ctry_ie,struct pe_session * pe_session)599  populate_dot11f_country(struct mac_context *mac,
600  			tDot11fIECountry *ctry_ie, struct pe_session *pe_session)
601  {
602  	uint8_t code[REG_ALPHA2_LEN + 1];
603  	uint8_t cur_triplet_num_chans = 0;
604  	int chan_enum, chan_num;
605  	struct regulatory_channel *sec_cur_chan_list;
606  	struct regulatory_channel *cur_chan, *start, *prev;
607  	uint8_t buffer_triplets[81][3];
608  	uint8_t i, j, num_triplets = 0;
609  	QDF_STATUS status = QDF_STATUS_SUCCESS;
610  	bool six_gig_started = false;
611  	uint8_t band_bitmap;
612  	uint32_t band_capability;
613  	uint8_t chan_spacing_for_2ghz = 1;
614  	uint8_t chan_spacing_for_5ghz_6ghz = 4;
615  	struct mlme_legacy_priv *mlme_priv = NULL;
616  
617  	sec_cur_chan_list = qdf_mem_malloc(NUM_CHANNELS *
618  					   sizeof(*sec_cur_chan_list));
619  	if (!sec_cur_chan_list)
620  		return QDF_STATUS_E_NOMEM;
621  
622  	if (pe_session) {
623  		mlme_priv = wlan_vdev_mlme_get_ext_hdl(pe_session->vdev);
624  		if (!mlme_priv) {
625  			pe_err("Invalid mlme priv object");
626  			status = QDF_STATUS_E_FAILURE;
627  			goto out;
628  		}
629  	}
630  
631  	if (!pe_session ||
632  	    (mlme_priv && mlme_priv->country_ie_for_all_band)) {
633  		status = wlan_mlme_get_band_capability(mac->psoc,
634  						       &band_capability);
635  		if (QDF_IS_STATUS_ERROR(status)) {
636  			pe_err("Failed to get MLME Band Capability");
637  			goto out;
638  		}
639  		band_bitmap = (uint8_t)band_capability;
640  	} else {
641  		if (pe_session->limRFBand == REG_BAND_UNKNOWN) {
642  			pe_err("Wrong reg band for country info");
643  			status = QDF_STATUS_E_FAILURE;
644  			goto out;
645  		}
646  		band_bitmap = BIT(pe_session->limRFBand);
647  	}
648  
649  	chan_num = wlan_reg_get_secondary_band_channel_list(
650  						mac->pdev,
651  						band_bitmap,
652  						sec_cur_chan_list);
653  	if (!chan_num) {
654  		pe_err("failed to get cur_chan list");
655  		status = QDF_STATUS_E_FAILURE;
656  		goto out;
657  	}
658  
659  	wlan_reg_read_current_country(mac->psoc, code);
660  	qdf_mem_copy(ctry_ie->country, code, REG_ALPHA2_LEN);
661  
662  	/* advertise global operating class */
663  	ctry_ie->country[REG_ALPHA2_LEN] = 0x04;
664  
665  	start = NULL;
666  	prev = NULL;
667  	for (chan_enum = 0; chan_enum < chan_num; chan_enum++) {
668  		cur_chan = &sec_cur_chan_list[chan_enum];
669  
670  		if (cur_chan->chan_flags & REGULATORY_CHAN_DISABLED)
671  			continue;
672  
673  		if (wlan_reg_is_6ghz_chan_freq(cur_chan->center_freq) &&
674  		    !six_gig_started) {
675  			buffer_triplets[num_triplets][0] = OP_CLASS_ID_201;
676  			buffer_triplets[num_triplets][1] = OP_CLASS_131;
677  			num_triplets++;
678  			six_gig_started = true;
679  		}
680  
681  		if (start && prev &&
682  		    ((prev->chan_num + chan_spacing_for_2ghz ==
683  		      cur_chan->chan_num) ||
684  		     (prev->chan_num + chan_spacing_for_5ghz_6ghz ==
685  		      cur_chan->chan_num)) &&
686  		    start->tx_power == cur_chan->tx_power) {
687  			/* Can use same entry */
688  			prev = cur_chan;
689  			cur_triplet_num_chans++;
690  			continue;
691  		}
692  
693  		if (start && prev) {
694  			/* Save as entry */
695  			buffer_triplets[num_triplets][0] = start->chan_num;
696  			buffer_triplets[num_triplets][1] =
697  					cur_triplet_num_chans + 1;
698  			buffer_triplets[num_triplets][2] = start->tx_power;
699  			start = NULL;
700  			cur_triplet_num_chans = 0;
701  
702  			num_triplets++;
703  			if (num_triplets > 80) {
704  				pe_err("Triplets number exceed max size");
705  				status = QDF_STATUS_E_FAILURE;
706  				goto out;
707  			}
708  		}
709  
710  		if ((chan_enum == NUM_CHANNELS - 1) && (six_gig_started)) {
711  			buffer_triplets[num_triplets][0] = OP_CLASS_ID_201;
712  			buffer_triplets[num_triplets][1] = OP_CLASS_132;
713  			num_triplets++;
714  
715  			buffer_triplets[num_triplets][0] = OP_CLASS_ID_201;
716  			buffer_triplets[num_triplets][1] = OP_CLASS_133;
717  			num_triplets++;
718  
719  			buffer_triplets[num_triplets][0] = OP_CLASS_ID_201;
720  			buffer_triplets[num_triplets][1] = OP_CLASS_134;
721  			num_triplets++;
722  		}
723  
724  		/* Start new group */
725  		start = cur_chan;
726  		prev = cur_chan;
727  	}
728  
729  	if (start) {
730  		buffer_triplets[num_triplets][0] = start->chan_num;
731  		buffer_triplets[num_triplets][1] = cur_triplet_num_chans + 1;
732  		buffer_triplets[num_triplets][2] = start->tx_power;
733  		num_triplets++;
734  	}
735  
736  	if (!num_triplets) {
737  		/* at-least one triplet should be present */
738  		pe_err("No triplet present");
739  		status = QDF_STATUS_E_FAILURE;
740  		goto out;
741  	}
742  
743  	ctry_ie->num_more_triplets = num_triplets - 1;
744  	ctry_ie->first_triplet[0] = buffer_triplets[0][0];
745  	ctry_ie->first_triplet[1] = buffer_triplets[0][1];
746  	ctry_ie->first_triplet[2] = buffer_triplets[0][2];
747  
748  	for (i = 0; i < ctry_ie->num_more_triplets; i++) {
749  		for (j = 0; j < 3; j++) {
750  			ctry_ie->more_triplets[i][j] = buffer_triplets[i+1][j];
751  		}
752  	}
753  	ctry_ie->present = 1;
754  
755  out:
756  	qdf_mem_free(sec_cur_chan_list);
757  	return status;
758  } /* End populate_dot11f_country. */
759  
760  /**
761   * populate_dot11f_ds_params() - To populate DS IE params
762   * @mac_ctx: Pointer to global mac context
763   * @dot11f_param: pointer to DS params IE
764   * @freq: freq
765   *
766   * This routine will populate DS param in management frame like
767   * beacon, probe response, and etc.
768   *
769   * Return: Overall success
770   */
771  QDF_STATUS
populate_dot11f_ds_params(struct mac_context * mac_ctx,tDot11fIEDSParams * dot11f_param,qdf_freq_t freq)772  populate_dot11f_ds_params(struct mac_context *mac_ctx,
773  			  tDot11fIEDSParams *dot11f_param, qdf_freq_t freq)
774  {
775  	if (WLAN_REG_IS_24GHZ_CH_FREQ(freq)) {
776  		/* .11b/g mode PHY => Include the DS Parameter Set IE: */
777  		dot11f_param->curr_channel = wlan_reg_freq_to_chan(
778  								mac_ctx->pdev,
779  								freq);
780  		dot11f_param->present = 1;
781  	}
782  
783  	return QDF_STATUS_SUCCESS;
784  }
785  
786  #define SET_AIFSN(aifsn) (((aifsn) < 2) ? 2 : (aifsn))
787  
788  void
populate_dot11f_edca_param_set(struct mac_context * mac,tDot11fIEEDCAParamSet * pDot11f,struct pe_session * pe_session)789  populate_dot11f_edca_param_set(struct mac_context *mac,
790  			       tDot11fIEEDCAParamSet *pDot11f,
791  			       struct pe_session *pe_session)
792  {
793  
794  	if (pe_session->limQosEnabled) {
795  		/* change to bitwise operation, after this is fixed in frames. */
796  		pDot11f->qos =
797  			(uint8_t) (0xf0 &
798  				   (pe_session->gLimEdcaParamSetCount << 4));
799  
800  		/* Fill each EDCA parameter set in order: be, bk, vi, vo */
801  		pDot11f->acbe_aifsn =
802  			(0xf &
803  			 SET_AIFSN(pe_session->gLimEdcaParamsBC[0].aci.aifsn));
804  		pDot11f->acbe_acm =
805  			(0x1 & pe_session->gLimEdcaParamsBC[0].aci.acm);
806  		pDot11f->acbe_aci = (0x3 & QCA_WLAN_AC_BE);
807  		pDot11f->acbe_acwmin =
808  			(0xf & pe_session->gLimEdcaParamsBC[0].cw.min);
809  		pDot11f->acbe_acwmax =
810  			(0xf & pe_session->gLimEdcaParamsBC[0].cw.max);
811  		pDot11f->acbe_txoplimit =
812  			pe_session->gLimEdcaParamsBC[0].txoplimit;
813  
814  		pDot11f->acbk_aifsn =
815  			(0xf &
816  			 SET_AIFSN(pe_session->gLimEdcaParamsBC[1].aci.aifsn));
817  		pDot11f->acbk_acm =
818  			(0x1 & pe_session->gLimEdcaParamsBC[1].aci.acm);
819  		pDot11f->acbk_aci = (0x3 & QCA_WLAN_AC_BK);
820  		pDot11f->acbk_acwmin =
821  			(0xf & pe_session->gLimEdcaParamsBC[1].cw.min);
822  		pDot11f->acbk_acwmax =
823  			(0xf & pe_session->gLimEdcaParamsBC[1].cw.max);
824  		pDot11f->acbk_txoplimit =
825  			pe_session->gLimEdcaParamsBC[1].txoplimit;
826  
827  		pDot11f->acvi_aifsn =
828  			(0xf &
829  			 SET_AIFSN(pe_session->gLimEdcaParamsBC[2].aci.aifsn));
830  		pDot11f->acvi_acm =
831  			(0x1 & pe_session->gLimEdcaParamsBC[2].aci.acm);
832  		pDot11f->acvi_aci = (0x3 & QCA_WLAN_AC_VI);
833  		pDot11f->acvi_acwmin =
834  			(0xf & pe_session->gLimEdcaParamsBC[2].cw.min);
835  		pDot11f->acvi_acwmax =
836  			(0xf & pe_session->gLimEdcaParamsBC[2].cw.max);
837  		pDot11f->acvi_txoplimit =
838  			pe_session->gLimEdcaParamsBC[2].txoplimit;
839  
840  		pDot11f->acvo_aifsn =
841  			(0xf &
842  			 SET_AIFSN(pe_session->gLimEdcaParamsBC[3].aci.aifsn));
843  		pDot11f->acvo_acm =
844  			(0x1 & pe_session->gLimEdcaParamsBC[3].aci.acm);
845  		pDot11f->acvo_aci = (0x3 & QCA_WLAN_AC_VO);
846  		pDot11f->acvo_acwmin =
847  			(0xf & pe_session->gLimEdcaParamsBC[3].cw.min);
848  		pDot11f->acvo_acwmax =
849  			(0xf & pe_session->gLimEdcaParamsBC[3].cw.max);
850  		pDot11f->acvo_txoplimit =
851  			pe_session->gLimEdcaParamsBC[3].txoplimit;
852  
853  		pDot11f->present = 1;
854  	}
855  
856  } /* End PopluateDot11fEDCAParamSet. */
857  
858  QDF_STATUS
populate_dot11f_erp_info(struct mac_context * mac,tDot11fIEERPInfo * pDot11f,struct pe_session * pe_session)859  populate_dot11f_erp_info(struct mac_context *mac,
860  			 tDot11fIEERPInfo *pDot11f, struct pe_session *pe_session)
861  {
862  	uint32_t val;
863  	enum reg_wifi_band rfBand = REG_BAND_UNKNOWN;
864  
865  	lim_get_rf_band_new(mac, &rfBand, pe_session);
866  	if (REG_BAND_2G == rfBand) {
867  		pDot11f->present = 1;
868  
869  		val = pe_session->cfgProtection.fromllb;
870  		if (!val) {
871  			pe_err("11B protection not enabled. Not populating ERP IE %d",
872  				val);
873  			return QDF_STATUS_SUCCESS;
874  		}
875  
876  		if (pe_session->gLim11bParams.protectionEnabled) {
877  			pDot11f->non_erp_present = 1;
878  			pDot11f->use_prot = 1;
879  		}
880  
881  		if (pe_session->gLimOlbcParams.protectionEnabled) {
882  			/* FIXME_PROTECTION: we should be setting non_erp present also. */
883  			/* check the test plan first. */
884  			pDot11f->use_prot = 1;
885  		}
886  
887  		if ((pe_session->gLimNoShortParams.numNonShortPreambleSta)
888  		    || !pe_session->beaconParams.fShortPreamble) {
889  			pDot11f->barker_preamble = 1;
890  
891  		}
892  	}
893  
894  	return QDF_STATUS_SUCCESS;
895  } /* End populate_dot11f_erp_info. */
896  
897  QDF_STATUS
populate_dot11f_ext_supp_rates(struct mac_context * mac,uint8_t nChannelNum,tDot11fIEExtSuppRates * pDot11f,struct pe_session * pe_session)898  populate_dot11f_ext_supp_rates(struct mac_context *mac, uint8_t nChannelNum,
899  			       tDot11fIEExtSuppRates *pDot11f,
900  			       struct pe_session *pe_session)
901  {
902  	qdf_size_t n_rates = 0;
903  	uint8_t rates[SIR_MAC_MAX_NUMBER_OF_RATES];
904  
905  	/* Use the ext rates present in session entry whenever nChannelNum is set to OPERATIONAL
906  	   else use the ext supported rate set from CFG, which is fixed and does not change dynamically and is used for
907  	   sending mgmt frames (lile probe req) which need to go out before any session is present.
908  	 */
909  	if (POPULATE_DOT11F_RATES_OPERATIONAL == nChannelNum) {
910  		if (pe_session) {
911  			n_rates = pe_session->extRateSet.numRates;
912  			qdf_mem_copy(rates, pe_session->extRateSet.rate,
913  				     n_rates);
914  		} else {
915  			pe_err("no session context exists while populating Operational Rate Set");
916  		}
917  	} else if (HIGHEST_24GHZ_CHANNEL_NUM >= nChannelNum) {
918  		if (!pe_session) {
919  			pe_err("null pe_session");
920  			return QDF_STATUS_E_INVAL;
921  		}
922  
923  		n_rates = mlme_get_ext_opr_rate(pe_session->vdev, rates,
924  						sizeof(rates));
925  	}
926  
927  	if (0 != n_rates) {
928  		pe_debug("ext supp rates present, num %d", (uint8_t)n_rates);
929  		pDot11f->num_rates = (uint8_t)n_rates;
930  		qdf_mem_copy(pDot11f->rates, rates, n_rates);
931  		pDot11f->present = 1;
932  	}
933  
934  	return QDF_STATUS_SUCCESS;
935  
936  } /* End populate_dot11f_ext_supp_rates. */
937  
938  QDF_STATUS
populate_dot11f_ext_supp_rates1(struct mac_context * mac,uint8_t nChannelNum,tDot11fIEExtSuppRates * pDot11f)939  populate_dot11f_ext_supp_rates1(struct mac_context *mac,
940  				uint8_t nChannelNum,
941  				tDot11fIEExtSuppRates *pDot11f)
942  {
943  	qdf_size_t nRates;
944  	QDF_STATUS nsir_status;
945  	uint8_t rates[SIR_MAC_MAX_NUMBER_OF_RATES];
946  
947  	if (14 < nChannelNum) {
948  		pDot11f->present = 0;
949  		return QDF_STATUS_SUCCESS;
950  	}
951  	/* N.B. I have *no* idea why we're calling 'wlan_cfg_get_str' with an argument */
952  	/* of WNI_CFG_SUPPORTED_RATES_11A here, but that's what was done */
953  	/* previously & I'm afraid to change it! */
954  	nRates = SIR_MAC_MAX_NUMBER_OF_RATES;
955  	nsir_status = wlan_mlme_get_cfg_str(
956  				rates,
957  				&mac->mlme_cfg->rates.supported_11a,
958  				&nRates);
959  	if (QDF_IS_STATUS_ERROR(nsir_status)) {
960  		pe_err("Failed to retrieve nItem from CFG status: %d",
961  		       (nsir_status));
962  		return nsir_status;
963  	}
964  
965  	if (0 != nRates) {
966  		pDot11f->num_rates = (uint8_t) nRates;
967  		qdf_mem_copy(pDot11f->rates, rates, nRates);
968  		pDot11f->present = 1;
969  	}
970  
971  	return QDF_STATUS_SUCCESS;
972  } /* populate_dot11f_ext_supp_rates1. */
973  
974  QDF_STATUS
populate_dot11f_ht_caps(struct mac_context * mac,struct pe_session * pe_session,tDot11fIEHTCaps * pDot11f)975  populate_dot11f_ht_caps(struct mac_context *mac,
976  			struct pe_session *pe_session, tDot11fIEHTCaps *pDot11f)
977  {
978  	qdf_size_t ncfglen;
979  	QDF_STATUS nSirStatus;
980  	uint8_t disable_high_ht_mcs_2x2 = 0;
981  	struct ch_params ch_params = {0};
982  	uint8_t cb_mode;
983  
984  	tSirMacTxBFCapabilityInfo *pTxBFCapabilityInfo;
985  	tSirMacASCapabilityInfo *pASCapabilityInfo;
986  	struct mlme_ht_capabilities_info *ht_cap_info;
987  	struct mlme_vht_capabilities_info *vht_cap_info;
988  
989  	ht_cap_info = &mac->mlme_cfg->ht_caps.ht_cap_info;
990  	vht_cap_info = &mac->mlme_cfg->vht_caps.vht_cap_info;
991  
992  	pDot11f->mimoPowerSave = ht_cap_info->mimo_power_save;
993  	pDot11f->greenField = ht_cap_info->green_field;
994  	pDot11f->delayedBA = ht_cap_info->delayed_ba;
995  	pDot11f->maximalAMSDUsize = ht_cap_info->maximal_amsdu_size;
996  	pDot11f->dsssCckMode40MHz = ht_cap_info->dsss_cck_mode_40_mhz;
997  	pDot11f->psmp = ht_cap_info->psmp;
998  	pDot11f->stbcControlFrame = ht_cap_info->stbc_control_frame;
999  	pDot11f->lsigTXOPProtection = ht_cap_info->l_sig_tx_op_protection;
1000  
1001  	/* All sessionized entries will need the check below */
1002  	if (!pe_session) {     /* Only in case of NO session */
1003  		pDot11f->supportedChannelWidthSet =
1004  			ht_cap_info->supported_channel_width_set;
1005  		pDot11f->advCodingCap = ht_cap_info->adv_coding_cap;
1006  		pDot11f->txSTBC = ht_cap_info->tx_stbc;
1007  		pDot11f->rxSTBC = ht_cap_info->rx_stbc;
1008  		pDot11f->shortGI20MHz = ht_cap_info->short_gi_20_mhz;
1009  		pDot11f->shortGI40MHz = ht_cap_info->short_gi_40_mhz;
1010  	} else {
1011  		cb_mode = lim_get_cb_mode_for_freq(mac, pe_session,
1012  						   pe_session->curr_op_freq);
1013  		if (WLAN_REG_IS_24GHZ_CH_FREQ(pe_session->curr_op_freq) &&
1014  		    LIM_IS_STA_ROLE(pe_session) &&
1015  		    cb_mode != WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) {
1016  			pDot11f->supportedChannelWidthSet = 1;
1017  			ch_params.ch_width = CH_WIDTH_40MHZ;
1018  			wlan_reg_set_channel_params_for_pwrmode(
1019  				mac->pdev, pe_session->curr_op_freq, 0,
1020  				&ch_params, REG_CURRENT_PWR_MODE);
1021  			if (ch_params.ch_width != CH_WIDTH_40MHZ)
1022  				pDot11f->supportedChannelWidthSet = 0;
1023  		} else if (LIM_IS_STA_ROLE(pe_session)) {
1024  			if (pe_session->ch_width == CH_WIDTH_20MHZ)
1025  				pDot11f->supportedChannelWidthSet = 0;
1026  			else
1027  				pDot11f->supportedChannelWidthSet = 1;
1028  		} else {
1029  			pDot11f->supportedChannelWidthSet =
1030  				pe_session->htSupportedChannelWidthSet;
1031  		}
1032  
1033  		pDot11f->advCodingCap = pe_session->ht_config.adv_coding_cap;
1034  		pDot11f->txSTBC = pe_session->ht_config.tx_stbc;
1035  		pDot11f->rxSTBC = pe_session->ht_config.rx_stbc;
1036  		pDot11f->shortGI20MHz = pe_session->ht_config.short_gi_20_mhz;
1037  		pDot11f->shortGI40MHz = pe_session->ht_config.short_gi_40_mhz;
1038  	}
1039  
1040  	/* Ensure that shortGI40MHz is Disabled if supportedChannelWidthSet is
1041  	   eHT_CHANNEL_WIDTH_20MHZ */
1042  	if (pDot11f->supportedChannelWidthSet == eHT_CHANNEL_WIDTH_20MHZ) {
1043  		pDot11f->shortGI40MHz = 0;
1044  	}
1045  
1046  	pDot11f->maxRxAMPDUFactor =
1047  		mac->mlme_cfg->ht_caps.ampdu_params.max_rx_ampdu_factor;
1048  	pDot11f->mpduDensity =
1049  		mac->mlme_cfg->ht_caps.ampdu_params.mpdu_density;
1050  	pDot11f->reserved1 = mac->mlme_cfg->ht_caps.ampdu_params.reserved;
1051  
1052  	ncfglen = SIZE_OF_SUPPORTED_MCS_SET;
1053  	nSirStatus = wlan_mlme_get_cfg_str(
1054  		pDot11f->supportedMCSSet,
1055  		&mac->mlme_cfg->rates.supported_mcs_set,
1056  		&ncfglen);
1057  	if (QDF_IS_STATUS_ERROR(nSirStatus)) {
1058  		pe_err("Failed to retrieve nItem from CFG status: %d",
1059  		       (nSirStatus));
1060  			return nSirStatus;
1061  	}
1062  
1063  	if (pe_session) {
1064  		disable_high_ht_mcs_2x2 =
1065  				mac->mlme_cfg->rates.disable_high_ht_mcs_2x2;
1066  		if (pe_session->nss == NSS_1x1_MODE) {
1067  			pDot11f->supportedMCSSet[1] = 0;
1068  			pDot11f->txSTBC = 0;
1069  		} else if (wlan_reg_is_24ghz_ch_freq(
1070  			   pe_session->curr_op_freq) &&
1071  			   disable_high_ht_mcs_2x2 &&
1072  			   (pe_session->opmode == QDF_STA_MODE)) {
1073  			pe_debug("Disabling high HT MCS [%d]",
1074  				 disable_high_ht_mcs_2x2);
1075  			pDot11f->supportedMCSSet[1] =
1076  					(pDot11f->supportedMCSSet[1] >>
1077  						disable_high_ht_mcs_2x2);
1078  		}
1079  	}
1080  
1081  	/* If STA mode, session supported NSS > 1 and
1082  	 * SMPS enabled publish HT SMPS IE
1083  	 */
1084  	if (pe_session &&
1085  	    LIM_IS_STA_ROLE(pe_session) &&
1086  	    (mac->mlme_cfg->ht_caps.enable_smps) &&
1087  	    (!pe_session->supported_nss_1x1)) {
1088  		pe_debug("Add SM power save IE: %d",
1089  			 mac->mlme_cfg->ht_caps.smps);
1090  		pDot11f->mimoPowerSave = mac->mlme_cfg->ht_caps.smps;
1091  	}
1092  
1093  	pDot11f->pco = mac->mlme_cfg->ht_caps.ext_cap_info.pco;
1094  	pDot11f->transitionTime =
1095  		mac->mlme_cfg->ht_caps.ext_cap_info.transition_time;
1096  	pDot11f->mcsFeedback =
1097  		mac->mlme_cfg->ht_caps.ext_cap_info.mcs_feedback;
1098  
1099  	pTxBFCapabilityInfo =
1100  		(tSirMacTxBFCapabilityInfo *)&vht_cap_info->tx_bf_cap;
1101  	pDot11f->txBF = pTxBFCapabilityInfo->txBF;
1102  	pDot11f->rxStaggeredSounding = pTxBFCapabilityInfo->rxStaggeredSounding;
1103  	pDot11f->txStaggeredSounding = pTxBFCapabilityInfo->txStaggeredSounding;
1104  	pDot11f->rxZLF = pTxBFCapabilityInfo->rxZLF;
1105  	pDot11f->txZLF = pTxBFCapabilityInfo->txZLF;
1106  	pDot11f->implicitTxBF = pTxBFCapabilityInfo->implicitTxBF;
1107  	pDot11f->calibration = pTxBFCapabilityInfo->calibration;
1108  	pDot11f->explicitCSITxBF = pTxBFCapabilityInfo->explicitCSITxBF;
1109  	pDot11f->explicitUncompressedSteeringMatrix =
1110  		pTxBFCapabilityInfo->explicitUncompressedSteeringMatrix;
1111  	pDot11f->explicitBFCSIFeedback =
1112  		pTxBFCapabilityInfo->explicitBFCSIFeedback;
1113  	pDot11f->explicitUncompressedSteeringMatrixFeedback =
1114  		pTxBFCapabilityInfo->explicitUncompressedSteeringMatrixFeedback;
1115  	pDot11f->explicitCompressedSteeringMatrixFeedback =
1116  		pTxBFCapabilityInfo->explicitCompressedSteeringMatrixFeedback;
1117  	pDot11f->csiNumBFAntennae = pTxBFCapabilityInfo->csiNumBFAntennae;
1118  	pDot11f->uncompressedSteeringMatrixBFAntennae =
1119  		pTxBFCapabilityInfo->uncompressedSteeringMatrixBFAntennae;
1120  	pDot11f->compressedSteeringMatrixBFAntennae =
1121  		pTxBFCapabilityInfo->compressedSteeringMatrixBFAntennae;
1122  
1123  	pASCapabilityInfo = (tSirMacASCapabilityInfo *)&vht_cap_info->as_cap;
1124  	pDot11f->antennaSelection = pASCapabilityInfo->antennaSelection;
1125  	pDot11f->explicitCSIFeedbackTx =
1126  		pASCapabilityInfo->explicitCSIFeedbackTx;
1127  	pDot11f->antennaIndicesFeedbackTx =
1128  		pASCapabilityInfo->antennaIndicesFeedbackTx;
1129  	pDot11f->explicitCSIFeedback = pASCapabilityInfo->explicitCSIFeedback;
1130  	pDot11f->antennaIndicesFeedback =
1131  		pASCapabilityInfo->antennaIndicesFeedback;
1132  	pDot11f->rxAS = pASCapabilityInfo->rxAS;
1133  	pDot11f->txSoundingPPDUs = pASCapabilityInfo->txSoundingPPDUs;
1134  
1135  	pDot11f->present = 1;
1136  
1137  	return QDF_STATUS_SUCCESS;
1138  
1139  } /* End populate_dot11f_ht_caps. */
1140  
1141  #define SEC_CHANNEL_OFFSET                      20
1142  
wlan_get_cb_mode(struct mac_context * mac,qdf_freq_t ch_freq,tDot11fBeaconIEs * ie_struct,struct pe_session * pe_session)1143  ePhyChanBondState wlan_get_cb_mode(struct mac_context *mac,
1144  				   qdf_freq_t ch_freq,
1145  				   tDot11fBeaconIEs *ie_struct,
1146  				   struct pe_session *pe_session)
1147  {
1148  	ePhyChanBondState cb_mode = PHY_SINGLE_CHANNEL_CENTERED;
1149  	uint32_t sec_ch_freq = 0;
1150  	uint32_t self_cb_mode;
1151  	struct ch_params ch_params = {0};
1152  
1153  	self_cb_mode = lim_get_cb_mode_for_freq(mac, pe_session, ch_freq);
1154  	if (self_cb_mode == WNI_CFG_CHANNEL_BONDING_MODE_DISABLE)
1155  		return PHY_SINGLE_CHANNEL_CENTERED;
1156  
1157  	if (pe_session->dot11mode == MLME_DOT11_MODE_11A ||
1158  	    pe_session->dot11mode == MLME_DOT11_MODE_11G ||
1159  	    pe_session->dot11mode == MLME_DOT11_MODE_11B)
1160  		return PHY_SINGLE_CHANNEL_CENTERED;
1161  
1162  	if (!(ie_struct->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ ==
1163  		ie_struct->HTCaps.supportedChannelWidthSet))) {
1164  		return PHY_SINGLE_CHANNEL_CENTERED;
1165  	}
1166  
1167  	/* In Case WPA2 and TKIP is the only one cipher suite in Pairwise */
1168  	if ((ie_struct->RSN.present &&
1169  	    (ie_struct->RSN.pwise_cipher_suite_count == 1) &&
1170  	    !qdf_mem_cmp(&(ie_struct->RSN.pwise_cipher_suites[0][0]),
1171  			 "\x00\x0f\xac\x02", 4)) ||
1172  		/* In Case only WPA1 is supported and TKIP is
1173  		 * the only one cipher suite in Unicast.
1174  		 */
1175  	    (!ie_struct->RSN.present && (ie_struct->WPA.present &&
1176  	    (ie_struct->WPA.unicast_cipher_count == 1) &&
1177  	    !qdf_mem_cmp(&(ie_struct->WPA.unicast_ciphers[0][0]),
1178  			 "\x00\x50\xf2\x02", 4)))) {
1179  		pe_debug("No channel bonding in TKIP mode");
1180  		return PHY_SINGLE_CHANNEL_CENTERED;
1181  	}
1182  
1183  	if (!ie_struct->HTInfo.present)
1184  		return PHY_SINGLE_CHANNEL_CENTERED;
1185  
1186  	pe_debug("ch freq %d scws %u rtws %u sco %u", ch_freq,
1187  		 ie_struct->HTCaps.supportedChannelWidthSet,
1188  		 ie_struct->HTInfo.recommendedTxWidthSet,
1189  		 ie_struct->HTInfo.secondaryChannelOffset);
1190  
1191  	if (ie_struct->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
1192  		cb_mode = ie_struct->HTInfo.secondaryChannelOffset;
1193  	else
1194  		cb_mode = PHY_SINGLE_CHANNEL_CENTERED;
1195  
1196  	switch (cb_mode) {
1197  	case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1198  		sec_ch_freq = ch_freq + SEC_CHANNEL_OFFSET;
1199  		break;
1200  	case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1201  		sec_ch_freq = ch_freq - SEC_CHANNEL_OFFSET;
1202  		break;
1203  	default:
1204  		break;
1205  	}
1206  
1207  	if (cb_mode != PHY_SINGLE_CHANNEL_CENTERED) {
1208  		ch_params.ch_width = CH_WIDTH_40MHZ;
1209  		wlan_reg_set_channel_params_for_pwrmode(mac->pdev, ch_freq,
1210  							sec_ch_freq, &ch_params,
1211  							REG_CURRENT_PWR_MODE);
1212  		if (ch_params.ch_width == CH_WIDTH_20MHZ ||
1213  		    ch_params.sec_ch_offset != cb_mode) {
1214  			pe_err("ch freq %d :: Supported HT BW %d and cbmode %d, APs HT BW %d and cbmode %d, so switch to 20Mhz",
1215  				ch_freq, ch_params.ch_width,
1216  				ch_params.sec_ch_offset,
1217  				ie_struct->HTInfo.recommendedTxWidthSet,
1218  				cb_mode);
1219  			cb_mode = PHY_SINGLE_CHANNEL_CENTERED;
1220  		}
1221  	}
1222  
1223  	return cb_mode;
1224  }
1225  
lim_log_vht_cap(struct mac_context * mac,tDot11fIEVHTCaps * pDot11f)1226  void lim_log_vht_cap(struct mac_context *mac, tDot11fIEVHTCaps *pDot11f)
1227  {
1228  #ifdef DUMP_MGMT_CNTNTS
1229  	pe_debug("maxMPDULen (2): %d", pDot11f->maxMPDULen);
1230  	pe_debug("supportedChannelWidthSet (2): %d",
1231  		pDot11f->supportedChannelWidthSet);
1232  	pe_debug("ldpcCodingCap (1): %d",
1233  		pDot11f->ldpcCodingCap);
1234  	pe_debug("shortGI80MHz (1): %d", pDot11f->shortGI80MHz);
1235  	pe_debug("shortGI160and80plus80MHz (1): %d",
1236  		pDot11f->shortGI160and80plus80MHz);
1237  	pe_debug("txSTBC (1): %d", pDot11f->txSTBC);
1238  	pe_debug("rxSTBC (3): %d", pDot11f->rxSTBC);
1239  	pe_debug("suBeamFormerCap (1): %d",
1240  		pDot11f->suBeamFormerCap);
1241  	pe_debug("suBeamformeeCap (1): %d",
1242  		pDot11f->suBeamformeeCap);
1243  	pe_debug("csnofBeamformerAntSup (3): %d",
1244  		pDot11f->csnofBeamformerAntSup);
1245  	pe_debug("numSoundingDim (3): %d",
1246  		pDot11f->numSoundingDim);
1247  	pe_debug("muBeamformerCap (1): %d",
1248  		pDot11f->muBeamformerCap);
1249  	pe_debug("muBeamformeeCap (1): %d",
1250  		pDot11f->muBeamformeeCap);
1251  	pe_debug("vhtTXOPPS (1): %d", pDot11f->vhtTXOPPS);
1252  	pe_debug("htcVHTCap (1): %d", pDot11f->htcVHTCap);
1253  	pe_debug("maxAMPDULenExp (3): %d",
1254  		pDot11f->maxAMPDULenExp);
1255  	pe_debug("vhtLinkAdaptCap (2): %d",
1256  		pDot11f->vhtLinkAdaptCap);
1257  	pe_debug("rxAntPattern (1): %d",
1258  		pDot11f->rxAntPattern;
1259  	pe_debug("txAntPattern (1): %d",
1260  		pDot11f->txAntPattern);
1261  	pe_debug("reserved1 (2): %d", pDot11f->reserved1);
1262  	pe_debug("rxMCSMap (16): %d", pDot11f->rxMCSMap);
1263  	pe_debug("rxHighSupDataRate (13): %d",
1264  		pDot11f->rxHighSupDataRate);
1265  	pe_debug("reserved2(3): %d", pDot11f->reserved2);
1266  	pe_debug("txMCSMap (16): %d", pDot11f->txMCSMap);
1267  	pe_debug("txSupDataRate (13): %d"),
1268  		pDot11f->txSupDataRate;
1269  	pe_debug("reserved3 (3): %d", pDot11f->reserved3);
1270  #endif /* DUMP_MGMT_CNTNTS */
1271  }
1272  
1273  static void lim_log_vht_operation(struct mac_context *mac,
1274  				  tDot11fIEVHTOperation *pDot11f)
1275  {
1276  #ifdef DUMP_MGMT_CNTNTS
1277  	pe_debug("chanWidth: %d", pDot11f->chanWidth);
1278  	pe_debug("chan_center_freq_seg0: %d",
1279  		 pDot11f->chan_center_freq_seg0);
1280  	pe_debug("chan_center_freq_seg1: %d",
1281  		 pDot11f->chan_center_freq_seg1);
1282  	pe_debug("basicMCSSet: %d", pDot11f->basicMCSSet);
1283  #endif /* DUMP_MGMT_CNTNTS */
1284  }
1285  
1286  static void lim_log_operating_mode(struct mac_context *mac,
1287  				   tDot11fIEOperatingMode *pDot11f)
1288  {
1289  #ifdef DUMP_MGMT_CNTNTS
1290  	pe_debug("ChanWidth: %d", pDot11f->chanWidth);
1291  	pe_debug("reserved: %d", pDot11f->reserved);
1292  	pe_debug("rxNSS: %d", pDot11f->rxNSS);
1293  	pe_debug("rxNSS Type: %d", pDot11f->rxNSSType);
1294  #endif /* DUMP_MGMT_CNTNTS */
1295  }
1296  
1297  static void lim_log_qos_map_set(struct mac_context *mac,
1298  				struct qos_map_set *pQosMapSet)
1299  {
1300  	if (pQosMapSet->num_dscp_exceptions > QOS_MAP_MAX_EX)
1301  		pQosMapSet->num_dscp_exceptions = QOS_MAP_MAX_EX;
1302  
1303  	pe_debug("num of dscp exceptions: %d", pQosMapSet->num_dscp_exceptions);
1304  	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
1305  			   pQosMapSet->dscp_exceptions,
1306  			   sizeof(pQosMapSet->dscp_exceptions));
1307  	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
1308  			   pQosMapSet->dscp_range,
1309  			   sizeof(pQosMapSet->dscp_range));
1310  }
1311  
1312  QDF_STATUS
1313  populate_dot11f_vht_caps(struct mac_context *mac,
1314  			 struct pe_session *pe_session, tDot11fIEVHTCaps *pDot11f)
1315  {
1316  	uint32_t nCfgValue = 0;
1317  	struct mlme_vht_capabilities_info *vht_cap_info;
1318  
1319  	if (!(mac->mlme_cfg)) {
1320  		pe_err("invalid mlme cfg");
1321  		return QDF_STATUS_E_FAILURE;
1322  	}
1323  	vht_cap_info = &mac->mlme_cfg->vht_caps.vht_cap_info;
1324  
1325  	pDot11f->present = 1;
1326  
1327  	nCfgValue = vht_cap_info->ampdu_len;
1328  	pDot11f->maxMPDULen = (nCfgValue & 0x0003);
1329  
1330  	nCfgValue = vht_cap_info->supp_chan_width;
1331  	pDot11f->supportedChannelWidthSet = (nCfgValue & 0x0003);
1332  
1333  	nCfgValue = 0;
1334  	/* With VHT it suffices if we just examine HT */
1335  	if (pe_session) {
1336  		if (lim_is_he_6ghz_band(pe_session)) {
1337  			pDot11f->present = 0;
1338  			return QDF_STATUS_SUCCESS;
1339  		}
1340  
1341  		if (wlan_reg_is_24ghz_ch_freq(pe_session->curr_op_freq)) {
1342  			pDot11f->supportedChannelWidthSet = 0;
1343  		} else {
1344  			if (pe_session->ch_width <= CH_WIDTH_80MHZ)
1345  				pDot11f->supportedChannelWidthSet = 0;
1346  		}
1347  
1348  		if (pe_session->ht_config.adv_coding_cap)
1349  			pDot11f->ldpcCodingCap =
1350  				pe_session->vht_config.ldpc_coding;
1351  
1352  		pDot11f->shortGI80MHz =
1353  			pe_session->vht_config.shortgi80;
1354  
1355  		if (pDot11f->supportedChannelWidthSet)
1356  			pDot11f->shortGI160and80plus80MHz =
1357  				pe_session->vht_config.shortgi160and80plus80;
1358  
1359  		if (pe_session->ht_config.tx_stbc)
1360  			pDot11f->txSTBC = pe_session->vht_config.tx_stbc;
1361  
1362  		if (pe_session->ht_config.rx_stbc)
1363  			pDot11f->rxSTBC = pe_session->vht_config.rx_stbc;
1364  
1365  		pDot11f->suBeamformeeCap =
1366  			pe_session->vht_config.su_beam_formee;
1367  		if (pe_session->vht_config.su_beam_formee) {
1368  			pDot11f->muBeamformeeCap =
1369  				pe_session->vht_config.mu_beam_formee;
1370  			pDot11f->csnofBeamformerAntSup =
1371  			      pe_session->vht_config.csnof_beamformer_antSup;
1372  		} else {
1373  			pDot11f->muBeamformeeCap = 0;
1374  		}
1375  		pDot11f->suBeamFormerCap =
1376  			pe_session->vht_config.su_beam_former;
1377  
1378  		pDot11f->vhtTXOPPS = pe_session->vht_config.vht_txops;
1379  
1380  		pDot11f->numSoundingDim =
1381  				pe_session->vht_config.num_soundingdim;
1382  
1383  		pDot11f->htcVHTCap = pe_session->vht_config.htc_vhtcap;
1384  
1385  		pDot11f->rxAntPattern = pe_session->vht_config.rx_antpattern;
1386  
1387  		pDot11f->txAntPattern = pe_session->vht_config.tx_antpattern;
1388  		pDot11f->extended_nss_bw_supp =
1389  			pe_session->vht_config.extended_nss_bw_supp;
1390  
1391  		pDot11f->maxAMPDULenExp =
1392  				pe_session->vht_config.max_ampdu_lenexp;
1393  
1394  		pDot11f->vhtLinkAdaptCap =
1395  				pe_session->vht_config.vht_link_adapt;
1396  	} else {
1397  		nCfgValue = vht_cap_info->ldpc_coding_cap;
1398  		pDot11f->ldpcCodingCap = (nCfgValue & 0x0001);
1399  
1400  		nCfgValue = vht_cap_info->short_gi_80mhz;
1401  		pDot11f->shortGI80MHz = (nCfgValue & 0x0001);
1402  
1403  		if (pDot11f->supportedChannelWidthSet) {
1404  			nCfgValue = vht_cap_info->short_gi_160mhz;
1405  			pDot11f->shortGI160and80plus80MHz = (nCfgValue & 0x0001);
1406  		}
1407  
1408  		nCfgValue = vht_cap_info->tx_stbc;
1409  		pDot11f->txSTBC = (nCfgValue & 0x0001);
1410  
1411  		nCfgValue = vht_cap_info->rx_stbc;
1412  		pDot11f->rxSTBC = (nCfgValue & 0x0007);
1413  
1414  		nCfgValue = vht_cap_info->su_bformee;
1415  		pDot11f->suBeamformeeCap = (nCfgValue & 0x0001);
1416  
1417  		nCfgValue = vht_cap_info->enable_mu_bformee;
1418  		pDot11f->muBeamformeeCap = (nCfgValue & 0x0001);
1419  
1420  		nCfgValue = vht_cap_info->su_bformer;
1421  		pDot11f->suBeamFormerCap = (nCfgValue & 0x0001);
1422  
1423  		nCfgValue = vht_cap_info->tx_bfee_ant_supp;
1424  		pDot11f->csnofBeamformerAntSup = (nCfgValue & 0x0007);
1425  
1426  		nCfgValue = vht_cap_info->txop_ps;
1427  		pDot11f->vhtTXOPPS = (nCfgValue & 0x0001);
1428  
1429  		nCfgValue = vht_cap_info->num_soundingdim;
1430  		pDot11f->numSoundingDim = (nCfgValue & 0x0007);
1431  
1432  		nCfgValue = vht_cap_info->htc_vhtc;
1433  		pDot11f->htcVHTCap = (nCfgValue & 0x0001);
1434  
1435  		pDot11f->rxAntPattern = vht_cap_info->rx_antpattern;
1436  
1437  		pDot11f->txAntPattern = vht_cap_info->tx_antpattern;
1438  
1439  		nCfgValue = vht_cap_info->ampdu_len_exponent;
1440  		pDot11f->maxAMPDULenExp = (nCfgValue & 0x0007);
1441  
1442  		nCfgValue = vht_cap_info->link_adap_cap;
1443  		pDot11f->vhtLinkAdaptCap = (nCfgValue & 0x0003);
1444  
1445  		pDot11f->extended_nss_bw_supp =
1446  			vht_cap_info->extended_nss_bw_supp;
1447  	}
1448  
1449  	pDot11f->max_nsts_total = vht_cap_info->max_nsts_total;
1450  	pDot11f->vht_extended_nss_bw_cap =
1451  		vht_cap_info->vht_extended_nss_bw_cap;
1452  
1453  	nCfgValue = vht_cap_info->mu_bformer;
1454  	pDot11f->muBeamformerCap = (nCfgValue & 0x0001);
1455  
1456  
1457  	nCfgValue = vht_cap_info->rx_mcs_map;
1458  	pDot11f->rxMCSMap = (nCfgValue & 0x0000FFFF);
1459  
1460  	nCfgValue = vht_cap_info->rx_supp_data_rate;
1461  	pDot11f->rxHighSupDataRate = (nCfgValue & 0x00001FFF);
1462  
1463  	nCfgValue = vht_cap_info->tx_mcs_map;
1464  	pDot11f->txMCSMap = (nCfgValue & 0x0000FFFF);
1465  
1466  	nCfgValue = vht_cap_info->tx_supp_data_rate;
1467  	pDot11f->txSupDataRate = (nCfgValue & 0x00001FFF);
1468  
1469  	if (pe_session) {
1470  		if (pe_session->nss == NSS_1x1_MODE) {
1471  			pDot11f->txMCSMap |= DISABLE_NSS2_MCS;
1472  			pDot11f->rxMCSMap |= DISABLE_NSS2_MCS;
1473  			pDot11f->txSupDataRate =
1474  				VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
1475  			pDot11f->rxHighSupDataRate =
1476  				VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
1477  			if (!pe_session->ch_width &&
1478  			    !vht_cap_info->enable_vht20_mcs9 &&
1479  			    ((pDot11f->txMCSMap & VHT_1x1_MCS_MASK) ==
1480  			     VHT_1x1_MCS9_MAP)) {
1481  				DISABLE_VHT_MCS_9(pDot11f->txMCSMap,
1482  						NSS_1x1_MODE);
1483  				DISABLE_VHT_MCS_9(pDot11f->rxMCSMap,
1484  						NSS_1x1_MODE);
1485  			}
1486  			pDot11f->txSTBC = 0;
1487  		} else {
1488  			if (!pe_session->ch_width &&
1489  			    !vht_cap_info->enable_vht20_mcs9 &&
1490  			    ((pDot11f->txMCSMap & VHT_2x2_MCS_MASK) ==
1491  			     VHT_2x2_MCS9_MAP)) {
1492  				DISABLE_VHT_MCS_9(pDot11f->txMCSMap,
1493  						NSS_2x2_MODE);
1494  				DISABLE_VHT_MCS_9(pDot11f->rxMCSMap,
1495  						NSS_2x2_MODE);
1496  			}
1497  		}
1498  	}
1499  
1500  	lim_log_vht_cap(mac, pDot11f);
1501  	return QDF_STATUS_SUCCESS;
1502  }
1503  
1504  QDF_STATUS
1505  populate_dot11f_vht_operation(struct mac_context *mac,
1506  			      struct pe_session *pe_session,
1507  			      tDot11fIEVHTOperation *pDot11f)
1508  {
1509  	uint32_t mcs_set;
1510  	struct mlme_vht_capabilities_info *vht_cap_info;
1511  	enum reg_wifi_band band;
1512  	uint8_t band_mask;
1513  	struct ch_params ch_params = {0};
1514  	qdf_freq_t sec_chan_freq = 0;
1515  
1516  	if (!pe_session || !pe_session->vhtCapability)
1517  		return QDF_STATUS_SUCCESS;
1518  
1519  	band = wlan_reg_freq_to_band(pe_session->curr_op_freq);
1520  	band_mask = 1 << band;
1521  
1522  	ch_params.ch_width = pe_session->ch_width;
1523  	ch_params.mhz_freq_seg0 =
1524  		wlan_reg_chan_band_to_freq(mac->pdev,
1525  					   pe_session->ch_center_freq_seg0,
1526  					   band_mask);
1527  
1528  	if (pe_session->ch_center_freq_seg1)
1529  		ch_params.mhz_freq_seg1 =
1530  			wlan_reg_chan_band_to_freq(mac->pdev,
1531  						   pe_session->ch_center_freq_seg1,
1532  						   band_mask);
1533  
1534  	if (band == (REG_BAND_2G) && ch_params.ch_width == CH_WIDTH_40MHZ) {
1535  		if (ch_params.mhz_freq_seg0 ==  pe_session->curr_op_freq + 10)
1536  			sec_chan_freq = pe_session->curr_op_freq + 20;
1537  		if (ch_params.mhz_freq_seg0 ==  pe_session->curr_op_freq - 10)
1538  			sec_chan_freq = pe_session->curr_op_freq - 20;
1539  	}
1540  
1541  	wlan_reg_set_channel_params_for_pwrmode(mac->pdev,
1542  						pe_session->curr_op_freq,
1543  						sec_chan_freq, &ch_params,
1544  						REG_CURRENT_PWR_MODE);
1545  
1546  	pDot11f->present = 1;
1547  
1548  	if (pe_session->ch_width > CH_WIDTH_40MHZ) {
1549  		pDot11f->chanWidth = 1;
1550  		pDot11f->chan_center_freq_seg0 =
1551  			ch_params.center_freq_seg0;
1552  		if (pe_session->ch_width == CH_WIDTH_80P80MHZ ||
1553  				pe_session->ch_width == CH_WIDTH_160MHZ)
1554  			pDot11f->chan_center_freq_seg1 =
1555  				ch_params.center_freq_seg1;
1556  		else
1557  			pDot11f->chan_center_freq_seg1 = 0;
1558  	} else {
1559  		pDot11f->chanWidth = 0;
1560  		pDot11f->chan_center_freq_seg0 = 0;
1561  		pDot11f->chan_center_freq_seg1 = 0;
1562  	}
1563  
1564  	vht_cap_info = &mac->mlme_cfg->vht_caps.vht_cap_info;
1565  	mcs_set = vht_cap_info->basic_mcs_set;
1566  	mcs_set = (mcs_set & 0xFFFC) | vht_cap_info->rx_mcs;
1567  
1568  	if (pe_session->nss == NSS_1x1_MODE)
1569  		mcs_set |= 0x000C;
1570  	else
1571  		mcs_set = (mcs_set & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
1572  
1573  	pDot11f->basicMCSSet = (uint16_t)mcs_set;
1574  	lim_log_vht_operation(mac, pDot11f);
1575  
1576  	return QDF_STATUS_SUCCESS;
1577  
1578  }
1579  
1580  QDF_STATUS
1581  populate_dot11f_ext_cap(struct mac_context *mac,
1582  			bool isVHTEnabled, tDot11fIEExtCap *pDot11f,
1583  			struct pe_session *pe_session)
1584  {
1585  	struct s_ext_cap *p_ext_cap;
1586  
1587  	pDot11f->present = 1;
1588  
1589  	if (!pe_session) {
1590  		pe_debug("11MC - enabled for non-SAP cases");
1591  		pDot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
1592  	} else if (pe_session->sap_dot11mc) {
1593  		pe_debug("11MC support enabled");
1594  		pDot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
1595  	} else {
1596  		if (eLIM_AP_ROLE != pe_session->limSystemRole)
1597  			pDot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
1598  		else
1599  			pDot11f->num_bytes = DOT11F_IE_EXTCAP_MIN_LEN;
1600  	}
1601  
1602  	p_ext_cap = (struct s_ext_cap *)pDot11f->bytes;
1603  	if (isVHTEnabled == true)
1604  		p_ext_cap->oper_mode_notification = 1;
1605  
1606  	if (mac->mlme_cfg->gen.rtt3_enabled) {
1607  		uint32_t ftm = ucfg_wifi_pos_get_ftm_cap(mac->psoc);
1608  		if (!pe_session || LIM_IS_STA_ROLE(pe_session)) {
1609  			p_ext_cap->fine_time_meas_initiator =
1610  				(ftm & WMI_FW_STA_RTT_INITR) ? 1 : 0;
1611  			p_ext_cap->fine_time_meas_responder =
1612  				(ftm & WMI_FW_STA_RTT_RESPR) ? 1 : 0;
1613  		} else if (LIM_IS_AP_ROLE(pe_session)) {
1614  			p_ext_cap->fine_time_meas_initiator =
1615  				(ftm & WMI_FW_AP_RTT_INITR) ? 1 : 0;
1616  			p_ext_cap->fine_time_meas_responder =
1617  				(ftm & WMI_FW_AP_RTT_RESPR) ? 1 : 0;
1618  		}
1619  	}
1620  #ifdef QCA_HT_2040_COEX
1621  	if (mac->roam.configParam.obssEnabled)
1622  		p_ext_cap->bss_coexist_mgmt_support = 1;
1623  #endif
1624  	p_ext_cap->ext_chan_switch = 1;
1625  
1626  	if (pe_session && pe_session->enable_bcast_probe_rsp)
1627  		p_ext_cap->fils_capability = 1;
1628  
1629  	if (pe_session && pe_session->is_mbssid_enabled)
1630  		p_ext_cap->multi_bssid = 1;
1631  
1632  	/* Beacon Protection Enabled : This field is reserved for STA */
1633  	if (pe_session && (pe_session->opmode == QDF_SAP_MODE ||
1634  	    pe_session->opmode == QDF_P2P_GO_MODE)) {
1635  		p_ext_cap->beacon_protection_enable = pe_session ?
1636  			mlme_get_bigtk_support(pe_session->vdev) : false;
1637  	}
1638  	if (pe_session)
1639  		populate_dot11f_twt_extended_caps(mac, pe_session, pDot11f);
1640  
1641  	/* Need to calculate the num_bytes based on bits set */
1642  	if (pDot11f->present)
1643  		pDot11f->num_bytes = lim_compute_ext_cap_ie_length(pDot11f);
1644  
1645  	return QDF_STATUS_SUCCESS;
1646  }
1647  
1648  #ifdef WLAN_FEATURE_11AX
1649  static void populate_dot11f_qcn_ie_he_params(struct mac_context *mac,
1650  					     struct pe_session *pe_session,
1651  					     tDot11fIEqcn_ie *qcn_ie,
1652  					     uint8_t attr_id)
1653  {
1654  	uint16_t mcs_12_13_supp = 0;
1655  
1656  	if (!lim_is_session_he_capable(pe_session))
1657  		return;
1658  
1659  	/* To fix WAPI IoT issue.*/
1660  	if (pe_session->encryptType == eSIR_ED_WPI)
1661  		return;
1662  
1663  	if (wlan_reg_is_24ghz_ch_freq(pe_session->curr_op_freq)) {
1664  		if (!(LIM_IS_AP_ROLE(pe_session) &&
1665  		      pe_session->ch_width == CH_WIDTH_40MHZ &&
1666  		      (mac->mlme_cfg->he_caps.disable_sap_mcs_12_13 &
1667  		       BIT(DISABLE_MCS_12_13_2G_40M))))
1668  			mcs_12_13_supp = mac->mlme_cfg->he_caps.he_mcs_12_13_supp_2g;
1669  	} else {
1670  		mcs_12_13_supp = mac->mlme_cfg->he_caps.he_mcs_12_13_supp_5g;
1671  	}
1672  
1673  	if (!mcs_12_13_supp)
1674  		return;
1675  
1676  	qcn_ie->present = 1;
1677  	qcn_ie->he_mcs13_attr.present = 1;
1678  	qcn_ie->he_mcs13_attr.he_mcs_12_13_supp_80 = mcs_12_13_supp & 0xFF;
1679  	qcn_ie->he_mcs13_attr.he_mcs_12_13_supp_160 = mcs_12_13_supp >> 8;
1680  }
1681  #else /* WLAN_FEATURE_11AX */
1682  static void populate_dot11f_qcn_ie_he_params(struct mac_context *mac,
1683  					     struct pe_session *pe_session,
1684  					     tDot11fIEqcn_ie *qcn_ie,
1685  					     uint8_t attr_id)
1686  {}
1687  #endif /* WLAN_FEATURE_11AX */
1688  
1689  void populate_dot11f_bss_max_idle(struct mac_context *mac,
1690  				  struct pe_session *session,
1691  				  tDot11fIEbss_max_idle_period *max_idle_ie)
1692  {
1693  	max_idle_ie->present = 0;
1694  	if (lim_is_session_he_capable(session) &&
1695  	    mac->mlme_cfg->sta.bss_max_idle_period) {
1696  		max_idle_ie->present = 1;
1697  		max_idle_ie->max_idle_period =
1698  			mac->mlme_cfg->sta.bss_max_idle_period;
1699  		max_idle_ie->prot_keep_alive_reqd = session->limRmfEnabled;
1700  	}
1701  }
1702  
1703  void populate_dot11f_edca_pifs_param_set(struct mac_context *mac,
1704  					 tDot11fIEqcn_ie *qcn_ie)
1705  {
1706  	struct wlan_edca_pifs_param_ie param = {0};
1707  	struct edca_param *eparam;
1708  	struct pifs_param *pparam;
1709  	uint8_t edca_param_type;
1710  
1711  	qcn_ie->present = 1;
1712  	qcn_ie->edca_pifs_param_attr.present = 1;
1713  
1714  	edca_param_type = mac->mlme_cfg->edca_params.edca_param_type;
1715  	wlan_mlme_set_edca_pifs_param(&param, edca_param_type);
1716  	qcn_ie->edca_pifs_param_attr.edca_param_type = edca_param_type;
1717  
1718  	if (edca_param_type == HOST_EDCA_PARAM_TYPE_AGGRESSIVE) {
1719  		qcn_ie->edca_pifs_param_attr.num_data = sizeof(*eparam);
1720  		eparam = (struct edca_param *)qcn_ie->edca_pifs_param_attr.data;
1721  		qdf_mem_copy(eparam, &param.edca_pifs_param.eparam,
1722  			     sizeof(*eparam));
1723  	} else if (edca_param_type == HOST_EDCA_PARAM_TYPE_PIFS) {
1724  		qcn_ie->edca_pifs_param_attr.num_data = sizeof(*pparam);
1725  		pparam = (struct pifs_param *)qcn_ie->edca_pifs_param_attr.data;
1726  		qdf_mem_copy(pparam, &param.edca_pifs_param.pparam,
1727  			     sizeof(*pparam));
1728  	}
1729  }
1730  
1731  void populate_dot11f_qcn_ie(struct mac_context *mac,
1732  			    struct pe_session *pe_session,
1733  			    tDot11fIEqcn_ie *qcn_ie,
1734  			    uint8_t attr_id)
1735  {
1736  	qcn_ie->present = 0;
1737  	if (mac->mlme_cfg->sta.qcn_ie_support &&
1738  	    ((attr_id == QCN_IE_ATTR_ID_ALL) ||
1739  	    (attr_id == QCN_IE_ATTR_ID_VERSION))) {
1740  		qcn_ie->present = 1;
1741  		qcn_ie->qcn_version.present = 1;
1742  		qcn_ie->qcn_version.version = QCN_IE_VERSION_SUPPORTED;
1743  		qcn_ie->qcn_version.sub_version = QCN_IE_SUBVERSION_SUPPORTED;
1744  	}
1745  	if (pe_session->vhtCapability &&
1746  	    mac->mlme_cfg->vht_caps.vht_cap_info.vht_mcs_10_11_supp) {
1747  		qcn_ie->present = 1;
1748  		qcn_ie->vht_mcs11_attr.present = 1;
1749  		qcn_ie->vht_mcs11_attr.vht_mcs_10_11_supp = 1;
1750  	}
1751  
1752  	populate_dot11f_qcn_ie_he_params(mac, pe_session, qcn_ie, attr_id);
1753  	if (policy_mgr_is_vdev_ll_lt_sap(mac->psoc, pe_session->vdev_id)) {
1754  		pe_debug("Populate edca/pifs param ie for ll sap");
1755  		populate_dot11f_edca_pifs_param_set(mac, qcn_ie);
1756  	}
1757  }
1758  
1759  QDF_STATUS
1760  populate_dot11f_operating_mode(struct mac_context *mac,
1761  			       tDot11fIEOperatingMode *pDot11f,
1762  			       struct pe_session *pe_session)
1763  {
1764  	pDot11f->present = 1;
1765  
1766  	pDot11f->chanWidth = pe_session->gLimOperatingMode.chanWidth;
1767  	pDot11f->rxNSS = pe_session->gLimOperatingMode.rxNSS;
1768  	pDot11f->rxNSSType = pe_session->gLimOperatingMode.rxNSSType;
1769  
1770  	return QDF_STATUS_SUCCESS;
1771  }
1772  
1773  QDF_STATUS
1774  populate_dot11f_ht_info(struct mac_context *mac,
1775  			tDot11fIEHTInfo *pDot11f, struct pe_session *pe_session)
1776  {
1777  	qdf_size_t ncfglen;
1778  	QDF_STATUS nSirStatus;
1779  
1780  	if (!pe_session) {
1781  		pe_err("Invalid session entry");
1782  		return QDF_STATUS_E_FAILURE;
1783  	}
1784  
1785  	pDot11f->primaryChannel = wlan_reg_freq_to_chan(
1786  		mac->pdev, pe_session->curr_op_freq);
1787  
1788  	pDot11f->secondaryChannelOffset =
1789  		pe_session->htSecondaryChannelOffset;
1790  	pDot11f->recommendedTxWidthSet =
1791  		pe_session->htRecommendedTxWidthSet;
1792  	pDot11f->rifsMode = pe_session->beaconParams.fRIFSMode;
1793  	pDot11f->controlledAccessOnly =
1794  		mac->mlme_cfg->ht_caps.info_field_1.controlled_access_only;
1795  	pDot11f->serviceIntervalGranularity =
1796  		mac->lim.gHTServiceIntervalGranularity;
1797  
1798  	if (LIM_IS_AP_ROLE(pe_session)) {
1799  		pDot11f->opMode = pe_session->htOperMode;
1800  		pDot11f->nonGFDevicesPresent =
1801  			pe_session->beaconParams.llnNonGFCoexist;
1802  		pDot11f->obssNonHTStaPresent =
1803  			pe_session->beaconParams.gHTObssMode;
1804  		pDot11f->reserved = 0;
1805  	} else {
1806  		pDot11f->opMode = 0;
1807  		pDot11f->nonGFDevicesPresent = 0;
1808  		pDot11f->obssNonHTStaPresent = 0;
1809  		pDot11f->reserved = 0;
1810  	}
1811  
1812  	pDot11f->basicSTBCMCS = mac->lim.gHTSTBCBasicMCS;
1813  	pDot11f->dualCTSProtection = mac->lim.gHTDualCTSProtection;
1814  	pDot11f->secondaryBeacon = mac->lim.gHTSecondaryBeacon;
1815  	pDot11f->lsigTXOPProtectionFullSupport =
1816  		pe_session->beaconParams.fLsigTXOPProtectionFullSupport;
1817  	pDot11f->pcoActive = mac->lim.gHTPCOActive;
1818  	pDot11f->pcoPhase = mac->lim.gHTPCOPhase;
1819  	pDot11f->reserved2 = 0;
1820  
1821  	ncfglen = SIZE_OF_BASIC_MCS_SET;
1822  	nSirStatus = wlan_mlme_get_cfg_str(pDot11f->basicMCSSet,
1823  					   &mac->mlme_cfg->rates.basic_mcs_set,
1824  					   &ncfglen);
1825  	if (QDF_IS_STATUS_ERROR(nSirStatus)) {
1826  		pe_err("Failed to retrieve nItem from CFG status: %d",
1827  		       (nSirStatus));
1828  		return nSirStatus;
1829  	}
1830  
1831  	pDot11f->present = 1;
1832  
1833  	return QDF_STATUS_SUCCESS;
1834  
1835  } /* End populate_dot11f_ht_info. */
1836  
1837  #ifdef ANI_SUPPORT_11H
1838  QDF_STATUS
1839  populate_dot11f_measurement_report0(struct mac_context *mac,
1840  				    tpSirMacMeasReqActionFrame pReq,
1841  				    tDot11fIEMeasurementReport *pDot11f)
1842  {
1843  	pDot11f->token = pReq->measReqIE.measToken;
1844  	pDot11f->late = 0;
1845  	pDot11f->incapable = 0;
1846  	pDot11f->refused = 1;
1847  	pDot11f->type = SIR_MAC_BASIC_MEASUREMENT_TYPE;
1848  
1849  	pDot11f->present = 1;
1850  
1851  	return QDF_STATUS_SUCCESS;
1852  
1853  } /* End PopulatedDot11fMeasurementReport0. */
1854  QDF_STATUS
1855  populate_dot11f_measurement_report1(struct mac_context *mac,
1856  				    tpSirMacMeasReqActionFrame pReq,
1857  				    tDot11fIEMeasurementReport *pDot11f)
1858  {
1859  	pDot11f->token = pReq->measReqIE.measToken;
1860  	pDot11f->late = 0;
1861  	pDot11f->incapable = 0;
1862  	pDot11f->refused = 1;
1863  	pDot11f->type = SIR_MAC_CCA_MEASUREMENT_TYPE;
1864  	pDot11f->present = 1;
1865  	return QDF_STATUS_SUCCESS;
1866  } /* End PopulatedDot11fMeasurementReport1. */
1867  QDF_STATUS
1868  populate_dot11f_measurement_report2(struct mac_context *mac,
1869  				    tpSirMacMeasReqActionFrame pReq,
1870  				    tDot11fIEMeasurementReport *pDot11f)
1871  {
1872  	pDot11f->token = pReq->measReqIE.measToken;
1873  	pDot11f->late = 0;
1874  	pDot11f->incapable = 0;
1875  	pDot11f->refused = 1;
1876  	pDot11f->type = SIR_MAC_RPI_MEASUREMENT_TYPE;
1877  	pDot11f->present = 1;
1878  	return QDF_STATUS_SUCCESS;
1879  } /* End PopulatedDot11fMeasurementReport2. */
1880  #endif
1881  
1882  void
1883  populate_dot11f_power_caps(struct mac_context *mac,
1884  			   tDot11fIEPowerCaps *pCaps,
1885  			   uint8_t nAssocType, struct pe_session *pe_session)
1886  {
1887  	struct vdev_mlme_obj *mlme_obj;
1888  
1889  	pCaps->minTxPower = pe_session->min_11h_pwr;
1890  	pCaps->maxTxPower = pe_session->maxTxPower;
1891  
1892  	/* Use firmware updated max tx power if non zero */
1893  	mlme_obj = wlan_vdev_mlme_get_cmpt_obj(pe_session->vdev);
1894  	if (mlme_obj && mlme_obj->mgmt.generic.tx_pwrlimit)
1895  		pCaps->maxTxPower = mlme_obj->mgmt.generic.tx_pwrlimit;
1896  
1897  	pCaps->present = 1;
1898  } /* End populate_dot11f_power_caps. */
1899  
1900  QDF_STATUS
1901  populate_dot11f_power_constraints(struct mac_context *mac,
1902  				  tDot11fIEPowerConstraints *pDot11f)
1903  {
1904  	pDot11f->localPowerConstraints =
1905  			mac->mlme_cfg->power.local_power_constraint;
1906  
1907  	pDot11f->present = 1;
1908  
1909  	return QDF_STATUS_SUCCESS;
1910  } /* End populate_dot11f_power_constraints. */
1911  
1912  void
1913  populate_dot11f_qos_caps_station(struct mac_context *mac, struct pe_session *pe_session,
1914  				 tDot11fIEQOSCapsStation *pDot11f)
1915  {
1916  	uint8_t max_sp_length = 0;
1917  
1918  	max_sp_length = mac->mlme_cfg->wmm_params.max_sp_length;
1919  
1920  	pDot11f->more_data_ack = 0;
1921  	pDot11f->max_sp_length = max_sp_length;
1922  	pDot11f->qack = 0;
1923  
1924  	if (mac->lim.gUapsdEnable) {
1925  		pDot11f->acbe_uapsd =
1926  			LIM_UAPSD_GET(ACBE, pe_session->gUapsdPerAcBitmask);
1927  		pDot11f->acbk_uapsd =
1928  			LIM_UAPSD_GET(ACBK, pe_session->gUapsdPerAcBitmask);
1929  		pDot11f->acvi_uapsd =
1930  			LIM_UAPSD_GET(ACVI, pe_session->gUapsdPerAcBitmask);
1931  		pDot11f->acvo_uapsd =
1932  			LIM_UAPSD_GET(ACVO, pe_session->gUapsdPerAcBitmask);
1933  	}
1934  	pDot11f->present = 1;
1935  } /* End PopulatedDot11fQOSCaps. */
1936  
1937  QDF_STATUS
1938  populate_dot11f_rsn(struct mac_context *mac,
1939  		    tpSirRSNie pRsnIe, tDot11fIERSN *pDot11f)
1940  {
1941  	uint32_t status;
1942  	int idx;
1943  
1944  	if (pRsnIe->length) {
1945  		idx = find_ie_location(mac, pRsnIe, DOT11F_EID_RSN);
1946  		if (0 <= idx) {
1947  			status = dot11f_unpack_ie_rsn(mac, pRsnIe->rsnIEdata + idx + 2,   /* EID, length */
1948  						      pRsnIe->rsnIEdata[idx + 1],
1949  						      pDot11f, false);
1950  			if (DOT11F_FAILED(status)) {
1951  				pe_err("Parse failure in Populate Dot11fRSN (0x%08x)",
1952  					status);
1953  				return QDF_STATUS_E_FAILURE;
1954  			}
1955  			pe_debug("status 0x%08x", status);
1956  		}
1957  
1958  	}
1959  
1960  	return QDF_STATUS_SUCCESS;
1961  } /* End populate_dot11f_rsn. */
1962  
1963  QDF_STATUS populate_dot11f_rsn_opaque(struct mac_context *mac,
1964  					 tpSirRSNie pRsnIe,
1965  					 tDot11fIERSNOpaque *pDot11f)
1966  {
1967  	int idx;
1968  
1969  	if (pRsnIe->length) {
1970  		idx = find_ie_location(mac, pRsnIe, DOT11F_EID_RSN);
1971  		if (0 <= idx) {
1972  			pDot11f->present = 1;
1973  			pDot11f->num_data = pRsnIe->rsnIEdata[idx + 1];
1974  			qdf_mem_copy(pDot11f->data, pRsnIe->rsnIEdata + idx + 2,        /* EID, len */
1975  				     pRsnIe->rsnIEdata[idx + 1]);
1976  		}
1977  	}
1978  
1979  	return QDF_STATUS_SUCCESS;
1980  
1981  } /* End populate_dot11f_rsn_opaque. */
1982  
1983  #if defined(FEATURE_WLAN_WAPI)
1984  
1985  QDF_STATUS
1986  populate_dot11f_wapi(struct mac_context *mac,
1987  		     tpSirRSNie pRsnIe, tDot11fIEWAPI *pDot11f)
1988  {
1989  	uint32_t status;
1990  	int idx;
1991  
1992  	if (pRsnIe->length) {
1993  		idx = find_ie_location(mac, pRsnIe, DOT11F_EID_WAPI);
1994  		if (0 <= idx) {
1995  			status = dot11f_unpack_ie_wapi(mac, pRsnIe->rsnIEdata + idx + 2,  /* EID, length */
1996  						       pRsnIe->rsnIEdata[idx + 1],
1997  						       pDot11f, false);
1998  			if (DOT11F_FAILED(status)) {
1999  				pe_err("Parse failure (0x%08x)", status);
2000  				return QDF_STATUS_E_FAILURE;
2001  			}
2002  			pe_debug("status 0x%08x", status);
2003  		}
2004  	}
2005  
2006  	return QDF_STATUS_SUCCESS;
2007  } /* End populate_dot11f_wapi. */
2008  
2009  QDF_STATUS populate_dot11f_wapi_opaque(struct mac_context *mac,
2010  					  tpSirRSNie pRsnIe,
2011  					  tDot11fIEWAPIOpaque *pDot11f)
2012  {
2013  	int idx;
2014  
2015  	if (pRsnIe->length) {
2016  		idx = find_ie_location(mac, pRsnIe, DOT11F_EID_WAPI);
2017  		if (0 <= idx) {
2018  			pDot11f->present = 1;
2019  			pDot11f->num_data = pRsnIe->rsnIEdata[idx + 1];
2020  			qdf_mem_copy(pDot11f->data, pRsnIe->rsnIEdata + idx + 2,        /* EID, len */
2021  				     pRsnIe->rsnIEdata[idx + 1]);
2022  		}
2023  	}
2024  
2025  	return QDF_STATUS_SUCCESS;
2026  
2027  } /* End populate_dot11f_wapi_opaque. */
2028  
2029  #endif /* defined(FEATURE_WLAN_WAPI) */
2030  
2031  void
2032  populate_dot11f_ssid(struct mac_context *mac,
2033  		     tSirMacSSid *pInternal, tDot11fIESSID *pDot11f)
2034  {
2035  	pDot11f->present = 1;
2036  	pDot11f->num_ssid = pInternal->length;
2037  	if (pInternal->length) {
2038  		qdf_mem_copy((uint8_t *) pDot11f->ssid,
2039  			     (uint8_t *) &pInternal->ssId, pInternal->length);
2040  	}
2041  } /* End populate_dot11f_ssid. */
2042  
2043  QDF_STATUS populate_dot11f_ssid2(struct pe_session *pe_session,
2044  				 tDot11fIESSID *pDot11f)
2045  {
2046  	qdf_mem_copy(pDot11f->ssid, pe_session->ssId.ssId,
2047  		     pe_session->ssId.length);
2048  	pDot11f->num_ssid = pe_session->ssId.length;
2049  	pDot11f->present = 1;
2050  
2051  	return QDF_STATUS_SUCCESS;
2052  } /* End populate_dot11f_ssid2. */
2053  
2054  void
2055  populate_dot11f_schedule(tSirMacScheduleIE *pSchedule,
2056  			 tDot11fIESchedule *pDot11f)
2057  {
2058  	pDot11f->aggregation = pSchedule->info.aggregation;
2059  	pDot11f->tsid = pSchedule->info.tsid;
2060  	pDot11f->direction = pSchedule->info.direction;
2061  	pDot11f->reserved = pSchedule->info.rsvd;
2062  	pDot11f->service_start_time = pSchedule->svcStartTime;
2063  	pDot11f->service_interval = pSchedule->svcInterval;
2064  	pDot11f->max_service_dur = pSchedule->maxSvcDuration;
2065  	pDot11f->spec_interval = pSchedule->specInterval;
2066  
2067  	pDot11f->present = 1;
2068  } /* End populate_dot11f_schedule. */
2069  
2070  void
2071  populate_dot11f_supp_channels(struct mac_context *mac,
2072  			      tDot11fIESuppChannels *pDot11f,
2073  			      uint8_t nAssocType, struct pe_session *pe_session)
2074  {
2075  	uint8_t i, j = 0;
2076  	uint8_t *p;
2077  	struct supported_channels supportedChannels;
2078  	uint8_t channel, opclass, base_opclass;
2079  	uint8_t reg_cc[REG_ALPHA2_LEN + 1];
2080  
2081  	wlan_add_supported_5Ghz_channels(mac->psoc, mac->pdev,
2082  					 supportedChannels.channelList,
2083  					 &supportedChannels.numChnl,
2084  					 false);
2085  
2086  	p = supportedChannels.channelList;
2087  	pDot11f->num_bands = supportedChannels.numChnl;
2088  
2089  	wlan_reg_read_current_country(mac->psoc, reg_cc);
2090  	for (i = 0U; i < pDot11f->num_bands; i++) {
2091  		base_opclass = wlan_reg_dmn_get_opclass_from_channel(
2092  						reg_cc,
2093  						p[i], BW20);
2094  		pDot11f->bands[j][0] = p[i];
2095  		pDot11f->bands[j][1] = 1;
2096  		channel = p[i];
2097  		while (i + 1 < pDot11f->num_bands && (p[i + 1] == channel + 4)) {
2098  			opclass = wlan_reg_dmn_get_opclass_from_channel(
2099  						reg_cc,
2100  						p[i + 1], BW20);
2101  			if (base_opclass != opclass)
2102  				goto skip;
2103  			pDot11f->bands[j][1]++;
2104  			channel = p[++i];
2105  		}
2106  skip:
2107  		j++;
2108  	}
2109  
2110  	pDot11f->num_bands = j;
2111  	pDot11f->present = 1;
2112  
2113  } /* End populate_dot11f_supp_channels. */
2114  
2115  QDF_STATUS
2116  populate_dot11f_supp_rates(struct mac_context *mac,
2117  			   uint8_t nChannelNum,
2118  			   tDot11fIESuppRates *pDot11f,
2119  			   struct pe_session *pe_session)
2120  {
2121  	QDF_STATUS nsir_status;
2122  	qdf_size_t nRates;
2123  	uint8_t rates[SIR_MAC_MAX_NUMBER_OF_RATES];
2124  
2125  	/* Use the operational rates present in session entry whenever
2126  	 * nChannelNum is set to OPERATIONAL else use the supported
2127  	 * rate set from CFG, which is fixed and does not change
2128  	 * dynamically and is used for sending mgmt frames (lile probe
2129  	 * req) which need to go out before any session is present.
2130  	 */
2131  	if (POPULATE_DOT11F_RATES_OPERATIONAL == nChannelNum) {
2132  		if (pe_session) {
2133  			nRates = pe_session->rateSet.numRates;
2134  			qdf_mem_copy(rates, pe_session->rateSet.rate,
2135  				     nRates);
2136  		} else {
2137  			pe_err("no session context exists while populating Operational Rate Set");
2138  			nRates = 0;
2139  		}
2140  	} else if (14 >= nChannelNum) {
2141  		nRates = SIR_MAC_MAX_NUMBER_OF_RATES;
2142  		nsir_status = wlan_mlme_get_cfg_str(
2143  					rates,
2144  					&mac->mlme_cfg->rates.supported_11b,
2145  					&nRates);
2146  		if (QDF_IS_STATUS_ERROR(nsir_status)) {
2147  			pe_err("Failed to retrieve nItem from CFG status: %d",
2148  			       (nsir_status));
2149  			return nsir_status;
2150  		}
2151  	} else {
2152  		nRates = SIR_MAC_MAX_NUMBER_OF_RATES;
2153  		nsir_status = wlan_mlme_get_cfg_str(
2154  					rates,
2155  					&mac->mlme_cfg->rates.supported_11a,
2156  					&nRates);
2157  		if (QDF_IS_STATUS_ERROR(nsir_status)) {
2158  			pe_err("Failed to retrieve nItem from CFG status: %d",
2159  			       (nsir_status));
2160  			return nsir_status;
2161  		}
2162  	}
2163  
2164  	if (0 != nRates) {
2165  		pDot11f->num_rates = (uint8_t) nRates;
2166  		qdf_mem_copy(pDot11f->rates, rates, nRates);
2167  		pDot11f->present = 1;
2168  	}
2169  
2170  	return QDF_STATUS_SUCCESS;
2171  
2172  } /* End populate_dot11f_supp_rates. */
2173  
2174  /**
2175   * populate_dot11f_rates_tdls() - populate supported rates and
2176   *                                extended supported rates IE.
2177   * @p_mac: Pointer to global mac context
2178   * @p_supp_rates: pointer to supported rates IE
2179   * @p_ext_supp_rates: pointer to extended supported rates IE
2180   * @curr_oper_channel: current operating channel
2181   *
2182   * This function populates the supported rates and extended supported
2183   * rates IE based in the STA capability. If the number of rates
2184   * supported is less than MAX_NUM_SUPPORTED_RATES, only supported rates
2185   * IE is populated.
2186   *
2187   * Return: QDF_STATUS QDF_STATUS_SUCCESS on Success and QDF_STATUS_E_FAILURE
2188   *         on failure.
2189   */
2190  
2191  QDF_STATUS
2192  populate_dot11f_rates_tdls(struct mac_context *p_mac,
2193  			   tDot11fIESuppRates *p_supp_rates,
2194  			   tDot11fIEExtSuppRates *p_ext_supp_rates,
2195  			   uint8_t curr_oper_channel)
2196  {
2197  	tSirMacRateSet temp_rateset;
2198  	tSirMacRateSet temp_rateset2;
2199  	uint32_t i;
2200  	uint32_t self_dot11mode = 0;
2201  	qdf_size_t num_rates;
2202  
2203  	self_dot11mode = p_mac->mlme_cfg->dot11_mode.dot11_mode;
2204  
2205  	/**
2206  	 * Include 11b rates only when the device configured in
2207  	 * auto, 11a/b/g or 11b_only and also if current base
2208  	 * channel is 5 GHz then no need to advertise the 11b rates.
2209  	 * If devices move to 2.4GHz off-channel then they can communicate
2210  	 * in 11g rates i.e. (6, 9, 12, 18, 24, 36 and 54).
2211  	 */
2212  	pe_debug("Current operating channel %d self_dot11mode = %d",
2213  		curr_oper_channel, self_dot11mode);
2214  
2215  	if ((curr_oper_channel <= SIR_11B_CHANNEL_END) &&
2216  	    ((self_dot11mode == MLME_DOT11_MODE_ALL) ||
2217  	    (self_dot11mode == MLME_DOT11_MODE_11A) ||
2218  	    (self_dot11mode == MLME_DOT11_MODE_11AC) ||
2219  	    (self_dot11mode == MLME_DOT11_MODE_11N) ||
2220  	    (self_dot11mode == MLME_DOT11_MODE_11G) ||
2221  	    (self_dot11mode == MLME_DOT11_MODE_11B))) {
2222  		num_rates = p_mac->mlme_cfg->rates.supported_11b.len;
2223  		wlan_mlme_get_cfg_str((uint8_t *)&temp_rateset.rate,
2224  				      &p_mac->mlme_cfg->rates.supported_11b,
2225  				      &num_rates);
2226  		temp_rateset.numRates = (uint8_t)num_rates;
2227  	} else {
2228  	    temp_rateset.numRates = 0;
2229  	}
2230  
2231  	/* Include 11a rates when the device configured in non-11b mode */
2232  	if (!IS_DOT11_MODE_11B(self_dot11mode)) {
2233  		num_rates = p_mac->mlme_cfg->rates.supported_11a.len;
2234  		wlan_mlme_get_cfg_str((uint8_t *)&temp_rateset2.rate,
2235  				      &p_mac->mlme_cfg->rates.supported_11a,
2236  				      &num_rates);
2237  		temp_rateset2.numRates = (uint8_t)num_rates;
2238  	} else {
2239  		temp_rateset2.numRates = 0;
2240  	}
2241  
2242  	if ((temp_rateset.numRates + temp_rateset2.numRates) >
2243  					SIR_MAC_MAX_NUMBER_OF_RATES) {
2244  		pe_err("more than %d rates in CFG",
2245  				SIR_MAC_MAX_NUMBER_OF_RATES);
2246  		return QDF_STATUS_E_FAILURE;
2247  	}
2248  
2249  	/**
2250  	 * copy all rates in temp_rateset,
2251  	 * there are SIR_MAC_MAX_NUMBER_OF_RATES rates max
2252  	 */
2253  	for (i = 0; i < temp_rateset2.numRates; i++)
2254  		temp_rateset.rate[i + temp_rateset.numRates] =
2255  						temp_rateset2.rate[i];
2256  
2257  	temp_rateset.numRates += temp_rateset2.numRates;
2258  
2259  	if (temp_rateset.numRates <= MAX_NUM_SUPPORTED_RATES) {
2260  		p_supp_rates->num_rates = temp_rateset.numRates;
2261  		qdf_mem_copy(p_supp_rates->rates, temp_rateset.rate,
2262  			     p_supp_rates->num_rates);
2263  		p_supp_rates->present = 1;
2264  	}  else { /* Populate extended capability as well */
2265  		p_supp_rates->num_rates = MAX_NUM_SUPPORTED_RATES;
2266  		qdf_mem_copy(p_supp_rates->rates, temp_rateset.rate,
2267  			     p_supp_rates->num_rates);
2268  		p_supp_rates->present = 1;
2269  
2270  		p_ext_supp_rates->num_rates = temp_rateset.numRates -
2271  				     MAX_NUM_SUPPORTED_RATES;
2272  		qdf_mem_copy(p_ext_supp_rates->rates,
2273  			     (uint8_t *)temp_rateset.rate +
2274  			     MAX_NUM_SUPPORTED_RATES,
2275  			     p_ext_supp_rates->num_rates);
2276  		p_ext_supp_rates->present = 1;
2277  	}
2278  
2279  	return QDF_STATUS_SUCCESS;
2280  
2281  } /* End populate_dot11f_rates_tdls */
2282  
2283  
2284  QDF_STATUS
2285  populate_dot11f_tpc_report(struct mac_context *mac,
2286  			   tDot11fIETPCReport *pDot11f, struct pe_session *pe_session)
2287  {
2288  	uint16_t staid;
2289  	uint8_t tx_power;
2290  	QDF_STATUS nSirStatus;
2291  
2292  	nSirStatus = lim_get_mgmt_staid(mac, &staid, pe_session);
2293  	if (QDF_STATUS_SUCCESS != nSirStatus) {
2294  		pe_err("Failed to get the STAID in Populate Dot11fTPCReport; lim_get_mgmt_staid returned status %d",
2295  			nSirStatus);
2296  		return QDF_STATUS_E_FAILURE;
2297  	}
2298  	tx_power = wlan_reg_get_channel_reg_power_for_freq(
2299  				mac->pdev, pe_session->curr_op_freq);
2300  	pDot11f->tx_power = tx_power;
2301  	pDot11f->link_margin = 0;
2302  	pDot11f->present = 1;
2303  
2304  	return QDF_STATUS_SUCCESS;
2305  } /* End populate_dot11f_tpc_report. */
2306  
2307  void populate_dot11f_ts_info(struct mac_ts_info *pInfo,
2308  			     tDot11fFfTSInfo *pDot11f)
2309  {
2310  	pDot11f->traffic_type = pInfo->traffic.trafficType;
2311  	pDot11f->tsid = pInfo->traffic.tsid;
2312  	pDot11f->direction = pInfo->traffic.direction;
2313  	pDot11f->access_policy = pInfo->traffic.accessPolicy;
2314  	pDot11f->aggregation = pInfo->traffic.aggregation;
2315  	pDot11f->psb = pInfo->traffic.psb;
2316  	pDot11f->user_priority = pInfo->traffic.userPrio;
2317  	pDot11f->tsinfo_ack_pol = pInfo->traffic.ackPolicy;
2318  	pDot11f->schedule = pInfo->schedule.schedule;
2319  } /* End PopulatedDot11fTSInfo. */
2320  
2321  void populate_dot11f_wmm(struct mac_context *mac,
2322  			 tDot11fIEWMMInfoAp *pInfo,
2323  			 tDot11fIEWMMParams *pParams,
2324  			 tDot11fIEWMMCaps *pCaps, struct pe_session *pe_session)
2325  {
2326  	if (pe_session->limWmeEnabled) {
2327  		populate_dot11f_wmm_params(mac, pParams,
2328  					   pe_session);
2329  		if (pe_session->limWsmEnabled)
2330  			populate_dot11f_wmm_caps(pCaps);
2331  	}
2332  } /* End populate_dot11f_wmm. */
2333  
2334  void populate_dot11f_wmm_caps(tDot11fIEWMMCaps *pCaps)
2335  {
2336  	pCaps->version = SIR_MAC_OUI_VERSION_1;
2337  	pCaps->qack = 0;
2338  	pCaps->queue_request = 1;
2339  	pCaps->txop_request = 0;
2340  	pCaps->more_ack = 0;
2341  	pCaps->present = 1;
2342  } /* End PopulateDot11fWmmCaps. */
2343  
2344  #ifdef FEATURE_WLAN_ESE
2345  #ifdef WLAN_FEATURE_HOST_ROAM
2346  void populate_dot11f_re_assoc_tspec(struct mac_context *mac,
2347  				    tDot11fReAssocRequest *pReassoc,
2348  				    struct pe_session *pe_session)
2349  {
2350  	uint8_t numTspecs = 0, idx;
2351  	tTspecInfo *pTspec = NULL;
2352  	struct mlme_legacy_priv *mlme_priv;
2353  
2354  	mlme_priv = wlan_vdev_mlme_get_ext_hdl(pe_session->vdev);
2355  	if (!mlme_priv)
2356  		return;
2357  
2358  	numTspecs = mlme_priv->connect_info.ese_tspec_info.numTspecs;
2359  	pTspec = &mlme_priv->connect_info.ese_tspec_info.tspec[0];
2360  	pReassoc->num_WMMTSPEC = numTspecs;
2361  	if (numTspecs) {
2362  		for (idx = 0; idx < numTspecs; idx++) {
2363  			populate_dot11f_wmmtspec(&pTspec->tspec,
2364  						 &pReassoc->WMMTSPEC[idx]);
2365  			pTspec->tspec.mediumTime = 0;
2366  			pTspec++;
2367  		}
2368  	}
2369  }
2370  #endif
2371  void ese_populate_wmm_tspec(struct mac_tspec_ie *source,
2372  			    ese_wmm_tspec_ie *dest)
2373  {
2374  	dest->traffic_type = source->tsinfo.traffic.trafficType;
2375  	dest->tsid = source->tsinfo.traffic.tsid;
2376  	dest->direction = source->tsinfo.traffic.direction;
2377  	dest->access_policy = source->tsinfo.traffic.accessPolicy;
2378  	dest->aggregation = source->tsinfo.traffic.aggregation;
2379  	dest->psb = source->tsinfo.traffic.psb;
2380  	dest->user_priority = source->tsinfo.traffic.userPrio;
2381  	dest->tsinfo_ack_pol = source->tsinfo.traffic.ackPolicy;
2382  	dest->burst_size_defn = source->tsinfo.traffic.burstSizeDefn;
2383  	/* As defined in IEEE 802.11-2007, section 7.3.2.30
2384  	 * Nominal MSDU size: Bit[0:14]=Size, Bit[15]=Fixed
2385  	 */
2386  	dest->size = (source->nomMsduSz & SIZE_MASK);
2387  	dest->fixed = (source->nomMsduSz & FIXED_MASK) ? 1 : 0;
2388  	dest->max_msdu_size = source->maxMsduSz;
2389  	dest->min_service_int = source->minSvcInterval;
2390  	dest->max_service_int = source->maxSvcInterval;
2391  	dest->inactivity_int = source->inactInterval;
2392  	dest->suspension_int = source->suspendInterval;
2393  	dest->service_start_time = source->svcStartTime;
2394  	dest->min_data_rate = source->minDataRate;
2395  	dest->mean_data_rate = source->meanDataRate;
2396  	dest->peak_data_rate = source->peakDataRate;
2397  	dest->burst_size = source->maxBurstSz;
2398  	dest->delay_bound = source->delayBound;
2399  	dest->min_phy_rate = source->minPhyRate;
2400  	dest->surplus_bw_allowance = source->surplusBw;
2401  	dest->medium_time = source->mediumTime;
2402  }
2403  
2404  #endif
2405  
2406  void populate_dot11f_wmm_info_ap(struct mac_context *mac, tDot11fIEWMMInfoAp *pInfo,
2407  				 struct pe_session *pe_session)
2408  {
2409  	pInfo->version = SIR_MAC_OUI_VERSION_1;
2410  
2411  	/* WMM Specification 3.1.3, 3.2.3 */
2412  	pInfo->param_set_count = (0xf & pe_session->gLimEdcaParamSetCount);
2413  	if (LIM_IS_AP_ROLE(pe_session))
2414  		pInfo->uapsd = (0x1 & pe_session->apUapsdEnable);
2415  	else
2416  		pInfo->uapsd = (0x1 & mac->lim.gUapsdEnable);
2417  
2418  	pInfo->present = 1;
2419  }
2420  
2421  void populate_dot11f_wmm_info_station_per_session(struct mac_context *mac,
2422  						  struct pe_session *pe_session,
2423  						  tDot11fIEWMMInfoStation *pInfo)
2424  {
2425  	uint8_t max_sp_length = 0;
2426  
2427  	max_sp_length = mac->mlme_cfg->wmm_params.max_sp_length;
2428  	pInfo->version = SIR_MAC_OUI_VERSION_1;
2429  	pInfo->acvo_uapsd =
2430  		LIM_UAPSD_GET(ACVO, pe_session->gUapsdPerAcBitmask);
2431  	pInfo->acvi_uapsd =
2432  		LIM_UAPSD_GET(ACVI, pe_session->gUapsdPerAcBitmask);
2433  	pInfo->acbk_uapsd =
2434  		LIM_UAPSD_GET(ACBK, pe_session->gUapsdPerAcBitmask);
2435  	pInfo->acbe_uapsd =
2436  		LIM_UAPSD_GET(ACBE, pe_session->gUapsdPerAcBitmask);
2437  
2438  	pInfo->max_sp_length = max_sp_length;
2439  	pInfo->present = 1;
2440  }
2441  
2442  void populate_dot11f_wmm_params(struct mac_context *mac,
2443  				tDot11fIEWMMParams *pParams,
2444  				struct pe_session *pe_session)
2445  {
2446  	pParams->version = SIR_MAC_OUI_VERSION_1;
2447  
2448  	if (LIM_IS_AP_ROLE(pe_session))
2449  		pParams->qosInfo =
2450  			(pe_session->
2451  			 apUapsdEnable << 7) | ((uint8_t) (0x0f & pe_session->
2452  							   gLimEdcaParamSetCount));
2453  	else
2454  		pParams->qosInfo =
2455  			(mac->lim.
2456  			 gUapsdEnable << 7) | ((uint8_t) (0x0f & pe_session->
2457  							  gLimEdcaParamSetCount));
2458  
2459  	/* Fill each EDCA parameter set in order: be, bk, vi, vo */
2460  	pParams->acbe_aifsn =
2461  		(0xf & SET_AIFSN(pe_session->gLimEdcaParamsBC[0].aci.aifsn));
2462  	pParams->acbe_acm = (0x1 & pe_session->gLimEdcaParamsBC[0].aci.acm);
2463  	pParams->acbe_aci = (0x3 & QCA_WLAN_AC_BE);
2464  	pParams->acbe_acwmin =
2465  		(0xf & pe_session->gLimEdcaParamsBC[0].cw.min);
2466  	pParams->acbe_acwmax =
2467  		(0xf & pe_session->gLimEdcaParamsBC[0].cw.max);
2468  	pParams->acbe_txoplimit = pe_session->gLimEdcaParamsBC[0].txoplimit;
2469  
2470  	pParams->acbk_aifsn =
2471  		(0xf & SET_AIFSN(pe_session->gLimEdcaParamsBC[1].aci.aifsn));
2472  	pParams->acbk_acm = (0x1 & pe_session->gLimEdcaParamsBC[1].aci.acm);
2473  	pParams->acbk_aci = (0x3 & QCA_WLAN_AC_BK);
2474  	pParams->acbk_acwmin =
2475  		(0xf & pe_session->gLimEdcaParamsBC[1].cw.min);
2476  	pParams->acbk_acwmax =
2477  		(0xf & pe_session->gLimEdcaParamsBC[1].cw.max);
2478  	pParams->acbk_txoplimit = pe_session->gLimEdcaParamsBC[1].txoplimit;
2479  
2480  	if (LIM_IS_AP_ROLE(pe_session))
2481  		pParams->acvi_aifsn =
2482  			(0xf & pe_session->gLimEdcaParamsBC[2].aci.aifsn);
2483  	else
2484  		pParams->acvi_aifsn =
2485  			(0xf &
2486  			 SET_AIFSN(pe_session->gLimEdcaParamsBC[2].aci.aifsn));
2487  
2488  	pParams->acvi_acm = (0x1 & pe_session->gLimEdcaParamsBC[2].aci.acm);
2489  	pParams->acvi_aci = (0x3 & QCA_WLAN_AC_VI);
2490  	pParams->acvi_acwmin =
2491  		(0xf & pe_session->gLimEdcaParamsBC[2].cw.min);
2492  	pParams->acvi_acwmax =
2493  		(0xf & pe_session->gLimEdcaParamsBC[2].cw.max);
2494  	pParams->acvi_txoplimit = pe_session->gLimEdcaParamsBC[2].txoplimit;
2495  
2496  	if (LIM_IS_AP_ROLE(pe_session))
2497  		pParams->acvo_aifsn =
2498  			(0xf & pe_session->gLimEdcaParamsBC[3].aci.aifsn);
2499  	else
2500  		pParams->acvo_aifsn =
2501  			(0xf &
2502  			 SET_AIFSN(pe_session->gLimEdcaParamsBC[3].aci.aifsn));
2503  
2504  	pParams->acvo_acm = (0x1 & pe_session->gLimEdcaParamsBC[3].aci.acm);
2505  	pParams->acvo_aci = (0x3 & QCA_WLAN_AC_VO);
2506  	pParams->acvo_acwmin =
2507  		(0xf & pe_session->gLimEdcaParamsBC[3].cw.min);
2508  	pParams->acvo_acwmax =
2509  		(0xf & pe_session->gLimEdcaParamsBC[3].cw.max);
2510  	pParams->acvo_txoplimit = pe_session->gLimEdcaParamsBC[3].txoplimit;
2511  
2512  	pParams->present = 1;
2513  
2514  } /* End populate_dot11f_wmm_params. */
2515  
2516  QDF_STATUS
2517  populate_dot11f_wpa(struct mac_context *mac,
2518  		    tpSirRSNie pRsnIe, tDot11fIEWPA *pDot11f)
2519  {
2520  	uint32_t status;
2521  	int idx;
2522  
2523  	if (pRsnIe->length) {
2524  		idx = find_ie_location(mac, pRsnIe, DOT11F_EID_WPA);
2525  		if (0 <= idx) {
2526  			status = dot11f_unpack_ie_wpa(mac, pRsnIe->rsnIEdata + idx + 2 + 4,       /* EID, length, OUI */
2527  						      pRsnIe->rsnIEdata[idx + 1] - 4,   /* OUI */
2528  						      pDot11f, false);
2529  			if (DOT11F_FAILED(status)) {
2530  				pe_err("Parse failure in Populate Dot11fWPA (0x%08x)",
2531  					status);
2532  				return QDF_STATUS_E_FAILURE;
2533  			}
2534  		}
2535  	}
2536  
2537  	return QDF_STATUS_SUCCESS;
2538  } /* End populate_dot11f_wpa. */
2539  
2540  QDF_STATUS populate_dot11f_wpa_opaque(struct mac_context *mac,
2541  					 tpSirRSNie pRsnIe,
2542  					 tDot11fIEWPAOpaque *pDot11f)
2543  {
2544  	int idx;
2545  
2546  	if (pRsnIe->length) {
2547  		idx = find_ie_location(mac, pRsnIe, DOT11F_EID_WPA);
2548  		if (0 <= idx) {
2549  			pDot11f->present = 1;
2550  			pDot11f->num_data = pRsnIe->rsnIEdata[idx + 1] - 4;
2551  			qdf_mem_copy(pDot11f->data, pRsnIe->rsnIEdata + idx + 2 + 4,    /* EID, len, OUI */
2552  				     pRsnIe->rsnIEdata[idx + 1] - 4);   /* OUI */
2553  		}
2554  	}
2555  
2556  	return QDF_STATUS_SUCCESS;
2557  
2558  } /* End populate_dot11f_wpa_opaque. */
2559  
2560  /* ////////////////////////////////////////////////////////////////////// */
2561  
2562  QDF_STATUS
2563  sir_convert_probe_req_frame2_struct(struct mac_context *mac,
2564  				    uint8_t *pFrame,
2565  				    uint32_t nFrame, tpSirProbeReq pProbeReq)
2566  {
2567  	uint32_t status;
2568  	tDot11fProbeRequest *pr;
2569  
2570  	pr = qdf_mem_malloc(sizeof(*pr));
2571  	if (!pr) {
2572  		pe_err("malloc failed for probe request");
2573  		return QDF_STATUS_E_FAILURE;
2574  	}
2575  
2576  	/* Ok, zero-init our [out] parameter, */
2577  	qdf_mem_zero((uint8_t *) pProbeReq, sizeof(tSirProbeReq));
2578  
2579  	/* delegate to the framesc-generated code, */
2580  	status = dot11f_unpack_probe_request(mac, pFrame, nFrame, pr, false);
2581  	if (DOT11F_FAILED(status)) {
2582  		pe_err("Failed to parse a Probe Request (0x%08x, %d bytes):",
2583  			status, nFrame);
2584  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
2585  				   pFrame, nFrame);
2586  		qdf_mem_free(pr);
2587  		return QDF_STATUS_E_FAILURE;
2588  	} else if (DOT11F_WARNED(status)) {
2589  		pe_debug("There were warnings while unpacking a Probe Request (0x%08x, %d bytes):",
2590  			status, nFrame);
2591  	}
2592  	/* & "transliterate" from a 'tDot11fProbeRequestto' a 'tSirProbeReq'... */
2593  	if (!pr->SSID.present) {
2594  		pe_debug("Mandatory IE SSID not present!");
2595  	} else {
2596  		pProbeReq->ssidPresent = 1;
2597  		convert_ssid(mac, &pProbeReq->ssId, &pr->SSID);
2598  	}
2599  
2600  	if (!pr->SuppRates.present) {
2601  		pe_debug_rl("Mandatory IE Supported Rates not present!");
2602  		qdf_mem_free(pr);
2603  		return QDF_STATUS_E_FAILURE;
2604  	} else {
2605  		pProbeReq->suppRatesPresent = 1;
2606  		convert_supp_rates(mac, &pProbeReq->supportedRates,
2607  				   &pr->SuppRates);
2608  	}
2609  
2610  	if (pr->ExtSuppRates.present) {
2611  		pProbeReq->extendedRatesPresent = 1;
2612  		convert_ext_supp_rates(mac, &pProbeReq->extendedRates,
2613  				       &pr->ExtSuppRates);
2614  	}
2615  
2616  	if (pr->HTCaps.present)
2617  		qdf_mem_copy(&pProbeReq->HTCaps, &pr->HTCaps,
2618  			     sizeof(tDot11fIEHTCaps));
2619  
2620  	if (pr->WscProbeReq.present) {
2621  		pProbeReq->wscIePresent = 1;
2622  		memcpy(&pProbeReq->probeReqWscIeInfo, &pr->WscProbeReq,
2623  		       sizeof(tDot11fIEWscProbeReq));
2624  	}
2625  	if (pr->VHTCaps.present)
2626  		qdf_mem_copy(&pProbeReq->VHTCaps, &pr->VHTCaps,
2627  			     sizeof(tDot11fIEVHTCaps));
2628  
2629  	if (pr->P2PProbeReq.present)
2630  		pProbeReq->p2pIePresent = 1;
2631  
2632  	if (pr->he_cap.present)
2633  		qdf_mem_copy(&pProbeReq->he_cap, &pr->he_cap,
2634  			     sizeof(tDot11fIEhe_cap));
2635  
2636  	qdf_mem_free(pr);
2637  
2638  	return QDF_STATUS_SUCCESS;
2639  } /* End sir_convert_probe_req_frame2_struct. */
2640  
2641  
2642  /**
2643   * sir_validate_and_rectify_ies() - API to check malformed frame
2644   * @mac_ctx: mac context
2645   * @mgmt_frame: pointer to management frame
2646   * @frame_bytes: no of bytes in frame
2647   * @missing_rsn_bytes: missing rsn bytes
2648   *
2649   * The frame would contain fixed IEs of 12 bytes followed by variable IEs
2650   * (Tagged elements). Every Tagged IE has tag number, tag length and data.
2651   * Tag length indicates the size of data in bytes.
2652   * This function checks for size of Frame received with the sum of all IEs.
2653   * And also rectifies missing optional fields in IE.
2654   *
2655   * NOTE : Presently this function rectifies RSN capability in RSN IE, can
2656   * be extended to rectify other optional fields in other IEs.
2657   *
2658   * Return: 0 on success, error number otherwise.
2659   */
2660  QDF_STATUS
2661  sir_validate_and_rectify_ies(struct mac_context *mac_ctx,
2662  				uint8_t *mgmt_frame,
2663  				uint32_t frame_bytes,
2664  				uint32_t *missing_rsn_bytes)
2665  {
2666  	uint32_t length = SIZE_OF_FIXED_PARAM;
2667  	uint8_t *ref_frame = NULL;
2668  
2669  	/* Frame contains atleast one IE */
2670  	if (frame_bytes > (SIZE_OF_FIXED_PARAM +
2671  			SIZE_OF_TAG_PARAM_NUM + SIZE_OF_TAG_PARAM_LEN)) {
2672  		while (length < frame_bytes) {
2673  			/* ref frame points to next IE */
2674  			ref_frame = mgmt_frame + length;
2675  			length += (uint32_t)(SIZE_OF_TAG_PARAM_NUM +
2676  					SIZE_OF_TAG_PARAM_LEN +
2677  					(*(ref_frame + SIZE_OF_TAG_PARAM_NUM)));
2678  		}
2679  		if (length != frame_bytes) {
2680  			/*
2681  			 * Workaround : Some APs may not include RSN
2682  			 * Capability but the length of which is included in
2683  			 * RSN IE length. This may cause in updating RSN
2684  			 * Capability with junk value. To avoid this, add RSN
2685  			 * Capability value with default value.
2686  			 */
2687  			if (ref_frame && (*ref_frame == RSNIEID) &&
2688  				(length == (frame_bytes +
2689  					RSNIE_CAPABILITY_LEN))) {
2690  				/* Assume RSN Capability as 00 */
2691  				qdf_mem_set((uint8_t *)(mgmt_frame +
2692  					(frame_bytes)),
2693  					RSNIE_CAPABILITY_LEN,
2694  					DEFAULT_RSNIE_CAP_VAL);
2695  				*missing_rsn_bytes = RSNIE_CAPABILITY_LEN;
2696  				pe_debug("Added RSN Capability to RSNIE as 0x00 0x00");
2697  				return QDF_STATUS_SUCCESS;
2698  			}
2699  			return QDF_STATUS_E_FAILURE;
2700  		}
2701  	}
2702  	return QDF_STATUS_SUCCESS;
2703  }
2704  
2705  void sir_copy_caps_info(struct mac_context *mac_ctx, tDot11fFfCapabilities caps,
2706  					    tpSirProbeRespBeacon pProbeResp)
2707  {
2708  	pProbeResp->capabilityInfo.ess = caps.ess;
2709  	pProbeResp->capabilityInfo.ibss = caps.ibss;
2710  	pProbeResp->capabilityInfo.cfPollable = caps.cfPollable;
2711  	pProbeResp->capabilityInfo.cfPollReq = caps.cfPollReq;
2712  	pProbeResp->capabilityInfo.privacy = caps.privacy;
2713  	pProbeResp->capabilityInfo.shortPreamble = caps.shortPreamble;
2714  	pProbeResp->capabilityInfo.criticalUpdateFlag = caps.criticalUpdateFlag;
2715  	pProbeResp->capabilityInfo.channelAgility =	caps.channelAgility;
2716  	pProbeResp->capabilityInfo.spectrumMgt = caps.spectrumMgt;
2717  	pProbeResp->capabilityInfo.qos = caps.qos;
2718  	pProbeResp->capabilityInfo.shortSlotTime = caps.shortSlotTime;
2719  	pProbeResp->capabilityInfo.apsd = caps.apsd;
2720  	pProbeResp->capabilityInfo.rrm = caps.rrm;
2721  	pProbeResp->capabilityInfo.dsssOfdm = caps.dsssOfdm;
2722  	pProbeResp->capabilityInfo.delayedBA = caps.delayedBA;
2723  	pProbeResp->capabilityInfo.immediateBA = caps.immediateBA;
2724  }
2725  
2726  #ifdef WLAN_FEATURE_FILS_SK
2727  static void populate_dot11f_fils_rsn(struct mac_context *mac_ctx,
2728  				     tDot11fIERSNOpaque *p_dot11f,
2729  				     uint8_t *rsn_ie)
2730  {
2731  	pe_debug("FILS RSN IE length %d", rsn_ie[1]);
2732  	if (rsn_ie[1]) {
2733  		p_dot11f->present = 1;
2734  		p_dot11f->num_data = rsn_ie[1];
2735  		qdf_mem_copy(p_dot11f->data, &rsn_ie[2], rsn_ie[1]);
2736  	}
2737  }
2738  
2739  void populate_dot11f_fils_params(struct mac_context *mac_ctx,
2740  		tDot11fAssocRequest *frm,
2741  		struct pe_session *pe_session)
2742  {
2743  	struct pe_fils_session *fils_info = pe_session->fils_info;
2744  
2745  	/* Populate RSN IE with FILS AKM */
2746  	populate_dot11f_fils_rsn(mac_ctx, &frm->RSNOpaque,
2747  				 fils_info->rsn_ie);
2748  
2749  	/* Populate FILS session IE */
2750  	frm->fils_session.present = true;
2751  	qdf_mem_copy(frm->fils_session.session,
2752  		     fils_info->fils_session, FILS_SESSION_LENGTH);
2753  
2754  	/* Populate FILS Key confirmation IE */
2755  	if (fils_info->key_auth_len) {
2756  		frm->fils_key_confirmation.present = true;
2757  		frm->fils_key_confirmation.num_key_auth =
2758  						fils_info->key_auth_len;
2759  
2760  		qdf_mem_copy(frm->fils_key_confirmation.key_auth,
2761  			     fils_info->key_auth, fils_info->key_auth_len);
2762  	}
2763  }
2764  
2765  /**
2766   * update_fils_data: update fils params from beacon/probe response
2767   * @fils_ind: pointer to sir_fils_indication
2768   * @fils_indication: pointer to tDot11fIEfils_indication
2769   *
2770   * Return: None
2771   */
2772  void update_fils_data(struct sir_fils_indication *fils_ind,
2773  		      tDot11fIEfils_indication *fils_indication)
2774  {
2775  	uint8_t *data;
2776  	uint8_t remaining_data = fils_indication->num_variable_data;
2777  
2778  	data = fils_indication->variable_data;
2779  	fils_ind->is_present = true;
2780  	fils_ind->is_ip_config_supported =
2781  			fils_indication->is_ip_config_supported;
2782  	fils_ind->is_fils_sk_auth_supported =
2783  			fils_indication->is_fils_sk_auth_supported;
2784  	fils_ind->is_fils_sk_auth_pfs_supported =
2785  			fils_indication->is_fils_sk_auth_pfs_supported;
2786  	fils_ind->is_pk_auth_supported =
2787  			fils_indication->is_pk_auth_supported;
2788  	if (fils_indication->is_cache_id_present) {
2789  		if (remaining_data < SIR_CACHE_IDENTIFIER_LEN) {
2790  			pe_err("Failed to copy Cache Identifier, Invalid remaining data %d",
2791  				remaining_data);
2792  			return;
2793  		}
2794  		fils_ind->cache_identifier.is_present = true;
2795  		qdf_mem_copy(fils_ind->cache_identifier.identifier,
2796  				data, SIR_CACHE_IDENTIFIER_LEN);
2797  		data = data + SIR_CACHE_IDENTIFIER_LEN;
2798  		remaining_data = remaining_data - SIR_CACHE_IDENTIFIER_LEN;
2799  	}
2800  	if (fils_indication->is_hessid_present) {
2801  		if (remaining_data < SIR_HESSID_LEN) {
2802  			pe_err("Failed to copy HESSID, Invalid remaining data %d",
2803  				remaining_data);
2804  			return;
2805  		}
2806  		fils_ind->hessid.is_present = true;
2807  		qdf_mem_copy(fils_ind->hessid.hessid,
2808  				data, SIR_HESSID_LEN);
2809  		data = data + SIR_HESSID_LEN;
2810  		remaining_data = remaining_data - SIR_HESSID_LEN;
2811  	}
2812  	if (fils_indication->realm_identifiers_cnt) {
2813  		if (remaining_data < (fils_indication->realm_identifiers_cnt *
2814  		    SIR_REALM_LEN)) {
2815  			pe_err("Failed to copy Realm Identifier, Invalid remaining data %d realm_cnt %d",
2816  				remaining_data,
2817  				fils_indication->realm_identifiers_cnt);
2818  			return;
2819  		}
2820  		fils_ind->realm_identifier.is_present = true;
2821  		fils_ind->realm_identifier.realm_cnt =
2822  			fils_indication->realm_identifiers_cnt;
2823  		qdf_mem_copy(fils_ind->realm_identifier.realm,
2824  			data, fils_ind->realm_identifier.realm_cnt *
2825  					SIR_REALM_LEN);
2826  	}
2827  }
2828  #endif
2829  
2830  #ifdef WLAN_FEATURE_11AX_BSS_COLOR
2831  static void update_bss_color_change_ie_from_probe_rsp(
2832  		tDot11fProbeResponse *prb_frm,
2833  		tpSirProbeRespBeacon prb_rsp_struct)
2834  {
2835  	if (prb_frm->bss_color_change.present) {
2836  		pe_debug("11AX: HE BSS color change present");
2837  		qdf_mem_copy(&prb_rsp_struct->vendor_he_bss_color_change,
2838  			     &prb_frm->bss_color_change,
2839  			     sizeof(tDot11fIEbss_color_change));
2840  	}
2841  }
2842  #else
2843  static inline void update_bss_color_change_ie_from_probe_rsp(
2844  		tDot11fProbeResponse *prb_frm,
2845  		tpSirProbeRespBeacon prb_rsp_struct)
2846  {}
2847  #endif
2848  
2849  #ifdef WLAN_FEATURE_11BE
2850  static void
2851  sir_convert_probe_frame2_eht_struct(tDot11fProbeResponse *pr,
2852  				    tpSirProbeRespBeacon p_probe_resp)
2853  {
2854  	if (pr->eht_cap.present) {
2855  		qdf_mem_copy(&p_probe_resp->eht_cap, &pr->eht_cap,
2856  			     sizeof(tDot11fIEeht_cap));
2857  	}
2858  }
2859  #else
2860  static inline void
2861  sir_convert_probe_frame2_eht_struct(tDot11fProbeResponse *pr,
2862  				    tpSirProbeRespBeacon p_probe_resp)
2863  {
2864  }
2865  #endif
2866  
2867  #ifdef WLAN_FEATURE_11BE_MLO
2868  static QDF_STATUS
2869  sir_convert_probe_frame2_mlo_struct(uint8_t *pframe,
2870  				    uint32_t nframe,
2871  				    tDot11fProbeResponse *pr,
2872  				    tpSirProbeRespBeacon p_probe_resp)
2873  {
2874  	uint32_t status;
2875  	uint8_t *ml_ie;
2876  	qdf_size_t ml_ie_total_len;
2877  
2878  	if (pr->mlo_ie.present) {
2879  		status = util_find_mlie(pframe + WLAN_PROBE_RESP_IES_OFFSET,
2880  					nframe - WLAN_PROBE_RESP_IES_OFFSET,
2881  					&ml_ie, &ml_ie_total_len);
2882  		if (QDF_IS_STATUS_SUCCESS(status)) {
2883  			sir_convert_mlo_probe_rsp_frame2_struct(ml_ie,
2884  							 ml_ie_total_len,
2885  							 &p_probe_resp->mlo_ie);
2886  		}
2887  	}
2888  
2889  	return QDF_STATUS_SUCCESS;
2890  }
2891  #else
2892  static inline QDF_STATUS
2893  sir_convert_probe_frame2_mlo_struct(uint8_t *pframe,
2894  				    uint32_t nframe,
2895  				    tDot11fProbeResponse *pr,
2896  				    tpSirProbeRespBeacon p_probe_resp)
2897  {
2898  	return QDF_STATUS_SUCCESS;
2899  }
2900  #endif
2901  
2902  #ifdef WLAN_FEATURE_11BE_MLO
2903  static QDF_STATUS
2904  sir_convert_probe_frame2_t2lm_struct(tDot11fProbeResponse *pr,
2905  				     tpSirProbeRespBeacon bcn_struct)
2906  {
2907  	QDF_STATUS status = QDF_STATUS_SUCCESS;
2908  	struct wlan_t2lm_context *t2lm_ctx;
2909  	/* add 3 bytes for extn_ie_header */
2910  	uint8_t ie[DOT11F_IE_T2LM_IE_MAX_LEN + 3];
2911  	struct wlan_t2lm_info t2lm;
2912  	uint8_t i;
2913  
2914  	t2lm_ctx = &bcn_struct->t2lm_ctx;
2915  	qdf_mem_zero(&t2lm_ctx->established_t2lm.t2lm,
2916  		     sizeof(struct wlan_t2lm_info));
2917  	t2lm_ctx->established_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
2918  
2919  	qdf_mem_zero(&t2lm_ctx->upcoming_t2lm.t2lm,
2920  		     sizeof(struct wlan_t2lm_info));
2921  	t2lm_ctx->upcoming_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
2922  
2923  	if (!pr->num_t2lm_ie)
2924  		return status;
2925  
2926  	pe_debug("Number of T2LM IEs in probe rsp %d", pr->num_t2lm_ie);
2927  	for (i = 0; i < pr->num_t2lm_ie; i++) {
2928  		qdf_mem_zero(&ie[0], DOT11F_IE_T2LM_IE_MAX_LEN + 3);
2929  		qdf_mem_zero(&t2lm, sizeof(struct wlan_t2lm_info));
2930  		ie[ID_POS] = WLAN_ELEMID_EXTN_ELEM;
2931  		ie[TAG_LEN_POS] = pr->t2lm_ie[i].num_data + 1;
2932  		ie[IDEXT_POS] = WLAN_EXTN_ELEMID_T2LM;
2933  		qdf_mem_copy(&ie[3], &pr->t2lm_ie[i].data[0],
2934  			     pr->t2lm_ie[i].num_data);
2935  
2936  		qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
2937  				   &ie[0], pr->t2lm_ie[i].num_data + 3);
2938  
2939  		if (ie[TAG_LEN_POS] + 2 > DOT11F_IE_T2LM_IE_MAX_LEN + 3) {
2940  			pe_debug("Invalid T2LM IE length");
2941  			return QDF_STATUS_E_PROTO;
2942  		}
2943  
2944  		status = wlan_mlo_parse_t2lm_info(&ie[0], &t2lm);
2945  		if (QDF_IS_STATUS_ERROR(status)) {
2946  			pe_debug("Parse T2LM IE fail");
2947  			return status;
2948  		}
2949  
2950  		if (!t2lm.mapping_switch_time_present &&
2951  		    t2lm.expected_duration_present) {
2952  			qdf_mem_copy(&t2lm_ctx->established_t2lm.t2lm, &t2lm,
2953  				     sizeof(struct wlan_t2lm_info));
2954  			pe_debug("Parse established T2LM IE success");
2955  		} else if (t2lm.mapping_switch_time_present) {
2956  			qdf_mem_copy(&t2lm_ctx->upcoming_t2lm.t2lm, &t2lm,
2957  				     sizeof(struct wlan_t2lm_info));
2958  			pe_debug("Parse upcoming T2LM IE success");
2959  		}
2960  		pe_debug("Parse T2LM IE success");
2961  	}
2962  	return status;
2963  }
2964  #else
2965  static inline QDF_STATUS
2966  sir_convert_probe_frame2_t2lm_struct(tDot11fProbeResponse *pr,
2967  				     tpSirProbeRespBeacon bcn_struct)
2968  {
2969  	return QDF_STATUS_SUCCESS;
2970  }
2971  #endif
2972  
2973  QDF_STATUS sir_convert_probe_frame2_struct(struct mac_context *mac,
2974  					      uint8_t *pFrame,
2975  					      uint32_t nFrame,
2976  					      tpSirProbeRespBeacon pProbeResp)
2977  {
2978  	uint32_t status;
2979  	tDot11fProbeResponse *pr;
2980  
2981  	/* Ok, zero-init our [out] parameter, */
2982  	qdf_mem_zero((uint8_t *) pProbeResp, sizeof(tSirProbeRespBeacon));
2983  
2984  	pr = qdf_mem_malloc(sizeof(tDot11fProbeResponse));
2985  	if (!pr)
2986  		return QDF_STATUS_E_NOMEM;
2987  
2988  	/* delegate to the framesc-generated code, */
2989  	status = dot11f_unpack_probe_response(mac, pFrame, nFrame, pr, false);
2990  	if (DOT11F_FAILED(status)) {
2991  		pe_err("Failed to parse a Probe Response (0x%08x, %d bytes):",
2992  			status, nFrame);
2993  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
2994  				   pFrame, nFrame);
2995  		qdf_mem_free(pr);
2996  		return QDF_STATUS_E_FAILURE;
2997  	}
2998  	/* & "transliterate" from a 'tDot11fProbeResponse' to a 'tSirProbeRespBeacon'... */
2999  
3000  	/* Timestamp */
3001  	qdf_mem_copy((uint8_t *) pProbeResp->timeStamp,
3002  		     (uint8_t *) &pr->TimeStamp, sizeof(tSirMacTimeStamp));
3003  
3004  	/* Beacon Interval */
3005  	pProbeResp->beaconInterval = pr->BeaconInterval.interval;
3006  
3007  	sir_copy_caps_info(mac, pr->Capabilities, pProbeResp);
3008  
3009  	if (!pr->SSID.present) {
3010  		pe_debug("Mandatory IE SSID not present!");
3011  	} else {
3012  		pProbeResp->ssidPresent = 1;
3013  		convert_ssid(mac, &pProbeResp->ssId, &pr->SSID);
3014  	}
3015  
3016  	if (!pr->SuppRates.present) {
3017  		pe_debug_rl("Mandatory IE Supported Rates not present!");
3018  	} else {
3019  		pProbeResp->suppRatesPresent = 1;
3020  		convert_supp_rates(mac, &pProbeResp->supportedRates,
3021  				   &pr->SuppRates);
3022  	}
3023  
3024  	if (pr->ExtSuppRates.present) {
3025  		pProbeResp->extendedRatesPresent = 1;
3026  		convert_ext_supp_rates(mac, &pProbeResp->extendedRates,
3027  				       &pr->ExtSuppRates);
3028  	}
3029  
3030  	if (pr->CFParams.present) {
3031  		pProbeResp->cfPresent = 1;
3032  		convert_cf_params(mac, &pProbeResp->cfParamSet, &pr->CFParams);
3033  	}
3034  
3035  	if (pr->Country.present) {
3036  		pProbeResp->countryInfoPresent = 1;
3037  		convert_country(mac, &pProbeResp->countryInfoParam,
3038  				&pr->Country);
3039  	}
3040  
3041  	if (pr->EDCAParamSet.present) {
3042  		pProbeResp->edcaPresent = 1;
3043  		convert_edca_param(mac, &pProbeResp->edcaParams,
3044  				   &pr->EDCAParamSet);
3045  	}
3046  
3047  	if (pr->ChanSwitchAnn.present) {
3048  		pProbeResp->channelSwitchPresent = 1;
3049  		qdf_mem_copy(&pProbeResp->channelSwitchIE, &pr->ChanSwitchAnn,
3050  			     sizeof(pProbeResp->channelSwitchIE));
3051  	}
3052  
3053  	if (pr->ext_chan_switch_ann.present) {
3054  		pProbeResp->ext_chan_switch_present = 1;
3055  		qdf_mem_copy(&pProbeResp->ext_chan_switch,
3056  			     &pr->ext_chan_switch_ann,
3057  			     sizeof(tDot11fIEext_chan_switch_ann));
3058  	}
3059  
3060  	if (pr->SuppOperatingClasses.present) {
3061  		pProbeResp->supp_operating_class_present = 1;
3062  		qdf_mem_copy(&pProbeResp->supp_operating_classes,
3063  			&pr->SuppOperatingClasses,
3064  			sizeof(tDot11fIESuppOperatingClasses));
3065  	}
3066  
3067  	if (pr->sec_chan_offset_ele.present) {
3068  		pProbeResp->sec_chan_offset_present = 1;
3069  		qdf_mem_copy(&pProbeResp->sec_chan_offset,
3070  			     &pr->sec_chan_offset_ele,
3071  			     sizeof(pProbeResp->sec_chan_offset));
3072  	}
3073  
3074  	if (pr->TPCReport.present) {
3075  		pProbeResp->tpcReportPresent = 1;
3076  		qdf_mem_copy(&pProbeResp->tpcReport, &pr->TPCReport,
3077  			     sizeof(tDot11fIETPCReport));
3078  	}
3079  
3080  	if (pr->PowerConstraints.present) {
3081  		pProbeResp->powerConstraintPresent = 1;
3082  		qdf_mem_copy(&pProbeResp->localPowerConstraint,
3083  			     &pr->PowerConstraints,
3084  			     sizeof(tDot11fIEPowerConstraints));
3085  	}
3086  
3087  	if (pr->Quiet.present) {
3088  		pProbeResp->quietIEPresent = 1;
3089  		qdf_mem_copy(&pProbeResp->quietIE, &pr->Quiet,
3090  			     sizeof(tDot11fIEQuiet));
3091  	}
3092  
3093  	if (pr->HTCaps.present) {
3094  		qdf_mem_copy(&pProbeResp->HTCaps, &pr->HTCaps,
3095  			     sizeof(tDot11fIEHTCaps));
3096  	}
3097  
3098  	if (pr->HTInfo.present) {
3099  		qdf_mem_copy(&pProbeResp->HTInfo, &pr->HTInfo,
3100  			     sizeof(tDot11fIEHTInfo));
3101  	}
3102  
3103  	if (pr->he_op.oper_info_6g_present) {
3104  		pProbeResp->chan_freq = wlan_reg_chan_band_to_freq(mac->pdev,
3105  						pr->he_op.oper_info_6g.info.primary_ch,
3106  						BIT(REG_BAND_6G));
3107  	} else if (pr->DSParams.present) {
3108  		pProbeResp->dsParamsPresent = 1;
3109  		pProbeResp->chan_freq =
3110  		    wlan_reg_legacy_chan_to_freq(mac->pdev, pr->DSParams.curr_channel);
3111  	} else if (pr->HTInfo.present) {
3112  		pProbeResp->chan_freq =
3113  		    wlan_reg_legacy_chan_to_freq(mac->pdev, pr->HTInfo.primaryChannel);
3114  	}
3115  
3116  	if (pr->RSNOpaque.present) {
3117  		pProbeResp->rsnPresent = 1;
3118  		convert_rsn_opaque(mac, &pProbeResp->rsn, &pr->RSNOpaque);
3119  	}
3120  
3121  	if (pr->WPA.present) {
3122  		pProbeResp->wpaPresent = 1;
3123  		convert_wpa(mac, &pProbeResp->wpa, &pr->WPA);
3124  	}
3125  
3126  	if (pr->WMMParams.present) {
3127  		pProbeResp->wmeEdcaPresent = 1;
3128  		convert_wmm_params(mac, &pProbeResp->edcaParams, &pr->WMMParams);
3129  	}
3130  
3131  	if (pr->WMMInfoAp.present) {
3132  		pProbeResp->wmeInfoPresent = 1;
3133  		pe_debug("WMM Information Element present in Probe Response Frame!");
3134  	}
3135  
3136  	if (pr->WMMCaps.present) {
3137  		pProbeResp->wsmCapablePresent = 1;
3138  	}
3139  
3140  	if (pr->ERPInfo.present) {
3141  		pProbeResp->erpPresent = 1;
3142  		convert_erp_info(mac, &pProbeResp->erpIEInfo, &pr->ERPInfo);
3143  	}
3144  	if (pr->MobilityDomain.present) {
3145  		/* MobilityDomain */
3146  		pProbeResp->mdiePresent = 1;
3147  		qdf_mem_copy((uint8_t *) &(pProbeResp->mdie[0]),
3148  			     (uint8_t *) &(pr->MobilityDomain.MDID),
3149  			     sizeof(uint16_t));
3150  		pProbeResp->mdie[2] =
3151  			((pr->MobilityDomain.overDSCap << 0) | (pr->MobilityDomain.
3152  								resourceReqCap <<
3153  								1));
3154  		pe_debug("mdie=%02x%02x%02x",
3155  			(unsigned int)pProbeResp->mdie[0],
3156  			(unsigned int)pProbeResp->mdie[1],
3157  			(unsigned int)pProbeResp->mdie[2]);
3158  	}
3159  
3160  #if defined FEATURE_WLAN_ESE
3161  	if (pr->ESEVersion.present)
3162  		pProbeResp->is_ese_ver_ie_present = 1;
3163  	if (pr->QBSSLoad.present) {
3164  		qdf_mem_copy(&pProbeResp->QBSSLoad, &pr->QBSSLoad,
3165  			     sizeof(tDot11fIEQBSSLoad));
3166  	}
3167  #endif
3168  	if (pr->P2PProbeRes.present) {
3169  		qdf_mem_copy(&pProbeResp->P2PProbeRes, &pr->P2PProbeRes,
3170  			     sizeof(tDot11fIEP2PProbeRes));
3171  	}
3172  	if (pr->VHTCaps.present) {
3173  		qdf_mem_copy(&pProbeResp->VHTCaps, &pr->VHTCaps,
3174  			     sizeof(tDot11fIEVHTCaps));
3175  	}
3176  	if (pr->VHTOperation.present) {
3177  		qdf_mem_copy(&pProbeResp->VHTOperation, &pr->VHTOperation,
3178  			     sizeof(tDot11fIEVHTOperation));
3179  	}
3180  	if (pr->VHTExtBssLoad.present) {
3181  		qdf_mem_copy(&pProbeResp->VHTExtBssLoad, &pr->VHTExtBssLoad,
3182  			     sizeof(tDot11fIEVHTExtBssLoad));
3183  	}
3184  	pProbeResp->Vendor1IEPresent = pr->Vendor1IE.present;
3185  	pProbeResp->Vendor3IEPresent = pr->Vendor3IE.present;
3186  
3187  	pProbeResp->vendor_vht_ie.present = pr->vendor_vht_ie.present;
3188  	if (pr->vendor_vht_ie.present)
3189  		pProbeResp->vendor_vht_ie.sub_type = pr->vendor_vht_ie.sub_type;
3190  	if (pr->vendor_vht_ie.VHTCaps.present) {
3191  		qdf_mem_copy(&pProbeResp->vendor_vht_ie.VHTCaps,
3192  				&pr->vendor_vht_ie.VHTCaps,
3193  				sizeof(tDot11fIEVHTCaps));
3194  	}
3195  	if (pr->vendor_vht_ie.VHTOperation.present) {
3196  		qdf_mem_copy(&pProbeResp->vendor_vht_ie.VHTOperation,
3197  				&pr->vendor_vht_ie.VHTOperation,
3198  				sizeof(tDot11fIEVHTOperation));
3199  	}
3200  	/* Update HS 2.0 Information Element */
3201  	if (pr->hs20vendor_ie.present) {
3202  		pe_debug("HS20 Indication Element Present, rel#:%u, id:%u",
3203  			pr->hs20vendor_ie.release_num,
3204  			pr->hs20vendor_ie.hs_id_present);
3205  		qdf_mem_copy(&pProbeResp->hs20vendor_ie,
3206  			&pr->hs20vendor_ie,
3207  			sizeof(tDot11fIEhs20vendor_ie) -
3208  			sizeof(pr->hs20vendor_ie.hs_id));
3209  		if (pr->hs20vendor_ie.hs_id_present)
3210  			qdf_mem_copy(&pProbeResp->hs20vendor_ie.hs_id,
3211  				&pr->hs20vendor_ie.hs_id,
3212  				sizeof(pr->hs20vendor_ie.hs_id));
3213  	}
3214  	if (pr->MBO_IE.present) {
3215  		pProbeResp->MBO_IE_present = true;
3216  		if (pr->MBO_IE.cellular_data_cap.present)
3217  			pProbeResp->MBO_capability =
3218  				pr->MBO_IE.cellular_data_cap.cellular_connectivity;
3219  
3220  		if (pr->MBO_IE.assoc_disallowed.present) {
3221  			pProbeResp->assoc_disallowed = true;
3222  			pProbeResp->assoc_disallowed_reason =
3223  				pr->MBO_IE.assoc_disallowed.reason_code;
3224  		}
3225  	}
3226  
3227  	if (pr->qcn_ie.present)
3228  		qdf_mem_copy(&pProbeResp->qcn_ie, &pr->qcn_ie,
3229  			     sizeof(tDot11fIEqcn_ie));
3230  
3231  	if (pr->he_cap.present) {
3232  		qdf_mem_copy(&pProbeResp->he_cap, &pr->he_cap,
3233  			     sizeof(tDot11fIEhe_cap));
3234  	}
3235  	if (pr->he_op.present) {
3236  		qdf_mem_copy(&pProbeResp->he_op, &pr->he_op,
3237  			     sizeof(tDot11fIEhe_op));
3238  	}
3239  
3240  	sir_convert_probe_frame2_eht_struct(pr, pProbeResp);
3241  	update_bss_color_change_ie_from_probe_rsp(pr, pProbeResp);
3242  	sir_convert_probe_frame2_mlo_struct(pFrame, nFrame, pr, pProbeResp);
3243  	sir_convert_probe_frame2_t2lm_struct(pr, pProbeResp);
3244  
3245  	qdf_mem_free(pr);
3246  	return QDF_STATUS_SUCCESS;
3247  
3248  } /* End sir_convert_probe_frame2_struct. */
3249  
3250  #ifdef WLAN_FEATURE_11BE
3251  static void
3252  sir_convert_assoc_req_frame2_eht_struct(tDot11fAssocRequest *ar,
3253  					tpSirAssocReq p_assoc_req)
3254  {
3255  	if (ar->eht_cap.present)
3256  		qdf_mem_copy(&p_assoc_req->eht_cap, &ar->eht_cap,
3257  			     sizeof(tDot11fIEeht_cap));
3258  }
3259  #else
3260  static inline void
3261  sir_convert_assoc_req_frame2_eht_struct(tDot11fAssocRequest *ar,
3262  					tpSirAssocReq p_assoc_req)
3263  {
3264  }
3265  #endif
3266  
3267  #ifdef WLAN_FEATURE_11BE_MLO
3268  static QDF_STATUS
3269  sir_convert_assoc_req_frame2_mlo_struct(uint8_t *pframe,
3270  					uint32_t nframe,
3271  					tDot11fAssocRequest *ar,
3272  					tpSirAssocReq p_assoc_req)
3273  {
3274  	uint8_t *ml_ie;
3275  	qdf_size_t ml_ie_total_len;
3276  	struct qdf_mac_addr mld_mac_addr;
3277  	uint32_t status;
3278  
3279  	if (ar->mlo_ie.present) {
3280  		status = util_find_mlie(pframe + WLAN_ASSOC_REQ_IES_OFFSET,
3281  					nframe - WLAN_ASSOC_REQ_IES_OFFSET,
3282  					&ml_ie, &ml_ie_total_len);
3283  
3284  		if (QDF_IS_STATUS_SUCCESS(status)) {
3285  			util_get_bvmlie_persta_partner_info(ml_ie,
3286  							ml_ie_total_len,
3287  							&p_assoc_req->mlo_info);
3288  			util_get_bvmlie_mldmacaddr(ml_ie, ml_ie_total_len,
3289  						   &mld_mac_addr);
3290  			qdf_mem_copy(p_assoc_req->mld_mac, mld_mac_addr.bytes,
3291  				     QDF_MAC_ADDR_SIZE);
3292  			pe_debug("Partner link count: %d, MLD mac addr: " QDF_MAC_ADDR_FMT,
3293  				 p_assoc_req->mlo_info.num_partner_links,
3294  				 QDF_MAC_ADDR_REF(p_assoc_req->mld_mac));
3295  		} else {
3296  			pe_debug("Do not find mlie");
3297  		}
3298  	}
3299  
3300  	return QDF_STATUS_SUCCESS;
3301  }
3302  #else
3303  static inline QDF_STATUS
3304  sir_convert_assoc_req_frame2_mlo_struct(uint8_t *pFrame,
3305  					uint32_t nFrame,
3306  					tDot11fAssocRequest *ar,
3307  					tpSirAssocReq p_assoc_req)
3308  {
3309  	return QDF_STATUS_SUCCESS;
3310  }
3311  #endif
3312  
3313  enum wlan_status_code
3314  sir_convert_assoc_req_frame2_struct(struct mac_context *mac,
3315  				    uint8_t *pFrame,
3316  				    uint32_t nFrame, tpSirAssocReq pAssocReq)
3317  {
3318  	tDot11fAssocRequest *ar;
3319  	uint32_t status;
3320  
3321  	ar = qdf_mem_malloc(sizeof(tDot11fAssocRequest));
3322  	if (!ar)
3323  		return STATUS_UNSPECIFIED_FAILURE;
3324  
3325  	/* delegate to the framesc-generated code, */
3326  	status = dot11f_unpack_assoc_request(mac, pFrame, nFrame, ar, false);
3327  	if (DOT11F_FAILED(status)) {
3328  		pe_err("Failed to parse an Association Request (0x%08x, %d bytes):",
3329  			status, nFrame);
3330  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
3331  				   pFrame, nFrame);
3332  		qdf_mem_free(ar);
3333  		return STATUS_UNSPECIFIED_FAILURE;
3334  	} else if (DOT11F_WARNED(status)) {
3335  		pe_debug("There were warnings while unpacking an Association Request (0x%08x, %d bytes):",
3336  			status, nFrame);
3337  	}
3338  	/* & "transliterate" from a 'tDot11fAssocRequest' to a 'tSirAssocReq'... */
3339  
3340  	/* make sure this is seen as an assoc request */
3341  	pAssocReq->reassocRequest = 0;
3342  
3343  	/* Capabilities */
3344  	pAssocReq->capabilityInfo.ess = ar->Capabilities.ess;
3345  	pAssocReq->capabilityInfo.ibss = ar->Capabilities.ibss;
3346  	pAssocReq->capabilityInfo.cfPollable = ar->Capabilities.cfPollable;
3347  	pAssocReq->capabilityInfo.cfPollReq = ar->Capabilities.cfPollReq;
3348  	pAssocReq->capabilityInfo.privacy = ar->Capabilities.privacy;
3349  	pAssocReq->capabilityInfo.shortPreamble =
3350  		ar->Capabilities.shortPreamble;
3351  	pAssocReq->capabilityInfo.criticalUpdateFlag =
3352  		ar->Capabilities.criticalUpdateFlag;
3353  	pAssocReq->capabilityInfo.channelAgility =
3354  		ar->Capabilities.channelAgility;
3355  	pAssocReq->capabilityInfo.spectrumMgt = ar->Capabilities.spectrumMgt;
3356  	pAssocReq->capabilityInfo.qos = ar->Capabilities.qos;
3357  	pAssocReq->capabilityInfo.shortSlotTime =
3358  		ar->Capabilities.shortSlotTime;
3359  	pAssocReq->capabilityInfo.apsd = ar->Capabilities.apsd;
3360  	pAssocReq->capabilityInfo.rrm = ar->Capabilities.rrm;
3361  	pAssocReq->capabilityInfo.dsssOfdm = ar->Capabilities.dsssOfdm;
3362  	pAssocReq->capabilityInfo.delayedBA = ar->Capabilities.delayedBA;
3363  	pAssocReq->capabilityInfo.immediateBA = ar->Capabilities.immediateBA;
3364  
3365  	/* Listen Interval */
3366  	pAssocReq->listenInterval = ar->ListenInterval.interval;
3367  
3368  	/* SSID */
3369  	if (ar->SSID.present) {
3370  		pAssocReq->ssidPresent = 1;
3371  		convert_ssid(mac, &pAssocReq->ssId, &ar->SSID);
3372  	}
3373  	/* Supported Rates */
3374  	if (ar->SuppRates.present) {
3375  		pAssocReq->suppRatesPresent = 1;
3376  		convert_supp_rates(mac, &pAssocReq->supportedRates,
3377  				   &ar->SuppRates);
3378  	}
3379  	/* Extended Supported Rates */
3380  	if (ar->ExtSuppRates.present) {
3381  		pAssocReq->extendedRatesPresent = 1;
3382  		convert_ext_supp_rates(mac, &pAssocReq->extendedRates,
3383  				       &ar->ExtSuppRates);
3384  	}
3385  	/* QOS Capabilities: */
3386  	if (ar->QOSCapsStation.present) {
3387  		pAssocReq->qosCapabilityPresent = 1;
3388  		convert_qos_caps_station(mac, &pAssocReq->qosCapability,
3389  					 &ar->QOSCapsStation);
3390  	}
3391  	/* WPA */
3392  	if (ar->WPAOpaque.present) {
3393  		pAssocReq->wpaPresent = 1;
3394  		convert_wpa_opaque(mac, &pAssocReq->wpa, &ar->WPAOpaque);
3395  	}
3396  #ifdef FEATURE_WLAN_WAPI
3397  	if (ar->WAPIOpaque.present) {
3398  		pAssocReq->wapiPresent = 1;
3399  		convert_wapi_opaque(mac, &pAssocReq->wapi, &ar->WAPIOpaque);
3400  	}
3401  #endif
3402  	/* RSN */
3403  	if (ar->RSNOpaque.present) {
3404  		pAssocReq->rsnPresent = 1;
3405  		convert_rsn_opaque(mac, &pAssocReq->rsn, &ar->RSNOpaque);
3406  	}
3407  	/* WSC IE */
3408  	if (ar->WscIEOpaque.present) {
3409  		pAssocReq->addIEPresent = 1;
3410  		convert_wsc_opaque(mac, &pAssocReq->addIE, &ar->WscIEOpaque);
3411  	}
3412  
3413  	if (ar->P2PIEOpaque.present) {
3414  		pAssocReq->addIEPresent = 1;
3415  		convert_p2p_opaque(mac, &pAssocReq->addIE, &ar->P2PIEOpaque);
3416  	}
3417  #ifdef WLAN_FEATURE_WFD
3418  	if (ar->WFDIEOpaque.present) {
3419  		pAssocReq->addIEPresent = 1;
3420  		convert_wfd_opaque(mac, &pAssocReq->addIE, &ar->WFDIEOpaque);
3421  	}
3422  #endif
3423  
3424  	/* Power Capabilities */
3425  	if (ar->PowerCaps.present) {
3426  		pAssocReq->powerCapabilityPresent = 1;
3427  		convert_power_caps(mac, &pAssocReq->powerCapability,
3428  				   &ar->PowerCaps);
3429  	}
3430  	/* Supported Channels */
3431  	if (ar->SuppChannels.present) {
3432  		pAssocReq->supportedChannelsPresent = 1;
3433  		convert_supp_channels(mac, &pAssocReq->supportedChannels,
3434  				      &ar->SuppChannels);
3435  	}
3436  
3437  	if (ar->HTCaps.present) {
3438  		qdf_mem_copy(&pAssocReq->HTCaps, &ar->HTCaps,
3439  			     sizeof(tDot11fIEHTCaps));
3440  	}
3441  
3442  	if (ar->WMMInfoStation.present) {
3443  		pAssocReq->wmeInfoPresent = 1;
3444  		qdf_mem_copy(&pAssocReq->WMMInfoStation, &ar->WMMInfoStation,
3445  			     sizeof(tDot11fIEWMMInfoStation));
3446  
3447  	}
3448  
3449  	if (ar->WMMCaps.present)
3450  		pAssocReq->wsmCapablePresent = 1;
3451  
3452  	if (!pAssocReq->ssidPresent) {
3453  		pe_debug("Received Assoc without SSID IE");
3454  		qdf_mem_free(ar);
3455  		return STATUS_UNSPECIFIED_FAILURE;
3456  	}
3457  
3458  	if (!pAssocReq->suppRatesPresent && !pAssocReq->extendedRatesPresent) {
3459  		pe_debug("Received Assoc without supp rate IE");
3460  		qdf_mem_free(ar);
3461  		return STATUS_ASSOC_DENIED_RATES;
3462  	}
3463  	if (ar->VHTCaps.present) {
3464  		qdf_mem_copy(&pAssocReq->VHTCaps, &ar->VHTCaps,
3465  			     sizeof(tDot11fIEVHTCaps));
3466  		lim_log_vht_cap(mac, &pAssocReq->VHTCaps);
3467  	}
3468  	if (ar->OperatingMode.present) {
3469  		qdf_mem_copy(&pAssocReq->operMode, &ar->OperatingMode,
3470  			     sizeof(tDot11fIEOperatingMode));
3471  		lim_log_operating_mode(mac, &pAssocReq->operMode);
3472  	}
3473  	if (ar->ExtCap.present) {
3474  		struct s_ext_cap *ext_cap;
3475  
3476  		qdf_mem_copy(&pAssocReq->ExtCap, &ar->ExtCap,
3477  			    sizeof(tDot11fIEExtCap));
3478  		ext_cap = (struct s_ext_cap *)&pAssocReq->ExtCap.bytes;
3479  		pe_debug("timingMeas: %d, finetimingMeas Init: %d, Resp: %d",
3480  			ext_cap->timing_meas, ext_cap->fine_time_meas_initiator,
3481  			ext_cap->fine_time_meas_responder);
3482  	}
3483  	if (ar->SuppOperatingClasses.present) {
3484  		uint8_t num_classes = ar->SuppOperatingClasses.num_classes;
3485  
3486  		if (num_classes > sizeof(ar->SuppOperatingClasses.classes))
3487  			num_classes =
3488  				sizeof(ar->SuppOperatingClasses.classes);
3489  		qdf_mem_copy(&pAssocReq->supp_operating_classes,
3490  			     &ar->SuppOperatingClasses,
3491  			     sizeof(tDot11fIESuppOperatingClasses));
3492  	}
3493  
3494  	pAssocReq->vendor_vht_ie.present = ar->vendor_vht_ie.present;
3495  	if (ar->vendor_vht_ie.present) {
3496  		pAssocReq->vendor_vht_ie.sub_type = ar->vendor_vht_ie.sub_type;
3497  		if (ar->vendor_vht_ie.VHTCaps.present) {
3498  			qdf_mem_copy(&pAssocReq->vendor_vht_ie.VHTCaps,
3499  				     &ar->vendor_vht_ie.VHTCaps,
3500  				     sizeof(tDot11fIEVHTCaps));
3501  			lim_log_vht_cap(mac, &pAssocReq->VHTCaps);
3502  		}
3503  	}
3504  	if (ar->qcn_ie.present)
3505  		qdf_mem_copy(&pAssocReq->qcn_ie, &ar->qcn_ie,
3506  			     sizeof(tDot11fIEqcn_ie));
3507  	if (ar->bss_max_idle_period.present) {
3508  		qdf_mem_copy(&pAssocReq->bss_max_idle_period,
3509  			     &ar->bss_max_idle_period,
3510  			     sizeof(tDot11fIEbss_max_idle_period));
3511  	}
3512  	if (ar->he_cap.present)
3513  		qdf_mem_copy(&pAssocReq->he_cap, &ar->he_cap,
3514  			     sizeof(tDot11fIEhe_cap));
3515  
3516  	if (ar->he_6ghz_band_cap.present)
3517  		qdf_mem_copy(&pAssocReq->he_6ghz_band_cap,
3518  			     &ar->he_6ghz_band_cap,
3519  			     sizeof(tDot11fIEhe_6ghz_band_cap));
3520  
3521  	sir_convert_assoc_req_frame2_eht_struct(ar, pAssocReq);
3522  	sir_convert_assoc_req_frame2_mlo_struct(pFrame, nFrame, ar, pAssocReq);
3523  
3524  	pe_debug("ht %d vht %d opmode %d vendor vht %d he %d he 6ghband %d eht %d",
3525  		 ar->HTCaps.present, ar->VHTCaps.present,
3526  		 ar->OperatingMode.present, ar->vendor_vht_ie.VHTCaps.present,
3527  		 ar->he_cap.present, ar->he_6ghz_band_cap.present,
3528  		 ar->eht_cap.present);
3529  
3530  	qdf_mem_free(ar);
3531  	return STATUS_SUCCESS;
3532  
3533  } /* End sir_convert_assoc_req_frame2_struct. */
3534  
3535  QDF_STATUS dot11f_parse_assoc_response(struct mac_context *mac_ctx,
3536  				       uint8_t *p_buf, uint32_t n_buf,
3537  				       tDot11fAssocResponse *p_frm,
3538  				       bool append_ie)
3539  {
3540  	uint32_t status;
3541  
3542  	status = dot11f_unpack_assoc_response(mac_ctx, p_buf,
3543  					      n_buf, p_frm, append_ie);
3544  	if (DOT11F_FAILED(status)) {
3545  		pe_err("Failed to parse an Association Response (0x%08x, %d bytes):",
3546  			status, n_buf);
3547  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
3548  				   p_buf, n_buf);
3549  		return QDF_STATUS_E_FAILURE;
3550  	}
3551  	return QDF_STATUS_SUCCESS;
3552  }
3553  
3554  #ifdef WLAN_FEATURE_FILS_SK
3555  /**
3556   * fils_convert_assoc_rsp_frame2_struct() - Copy FILS IE's to Assoc rsp struct
3557   * @ar: frame parser Assoc response struct
3558   * @pAssocRsp: LIM Assoc response
3559   *
3560   * Return: None
3561   */
3562  static void fils_convert_assoc_rsp_frame2_struct(tDot11fAssocResponse *ar,
3563  						 tpSirAssocRsp pAssocRsp)
3564  {
3565  	if (ar->fils_session.present) {
3566  		pe_debug("fils session IE present");
3567  		pAssocRsp->fils_session.present = true;
3568  		qdf_mem_copy(pAssocRsp->fils_session.session,
3569  				ar->fils_session.session,
3570  				DOT11F_IE_FILS_SESSION_MAX_LEN);
3571  	}
3572  
3573  	if (ar->fils_key_confirmation.present) {
3574  		pe_debug("fils key conf IE present");
3575  		pAssocRsp->fils_key_auth.num_key_auth =
3576  			ar->fils_key_confirmation.num_key_auth;
3577  		qdf_mem_copy(pAssocRsp->fils_key_auth.key_auth,
3578  				ar->fils_key_confirmation.key_auth,
3579  				pAssocRsp->fils_key_auth.num_key_auth);
3580  	}
3581  
3582  	if (ar->fils_kde.present) {
3583  		pe_debug("fils kde IE present %d",
3584  				ar->fils_kde.num_kde_list);
3585  		pAssocRsp->fils_kde.num_kde_list =
3586  			ar->fils_kde.num_kde_list;
3587  		qdf_mem_copy(pAssocRsp->fils_kde.key_rsc,
3588  				ar->fils_kde.key_rsc, KEY_RSC_LEN);
3589  		qdf_mem_copy(&pAssocRsp->fils_kde.kde_list,
3590  				&ar->fils_kde.kde_list,
3591  				pAssocRsp->fils_kde.num_kde_list);
3592  	}
3593  
3594  	if (ar->fils_hlp_container.present) {
3595  		pe_debug("FILS HLP container IE present");
3596  		sir_copy_mac_addr(pAssocRsp->dst_mac.bytes,
3597  				ar->fils_hlp_container.dest_mac);
3598  		sir_copy_mac_addr(pAssocRsp->src_mac.bytes,
3599  				ar->fils_hlp_container.src_mac);
3600  		pAssocRsp->hlp_data_len = ar->fils_hlp_container.num_hlp_packet;
3601  		qdf_mem_copy(pAssocRsp->hlp_data,
3602  				ar->fils_hlp_container.hlp_packet,
3603  				pAssocRsp->hlp_data_len);
3604  
3605  		if (ar->fragment_ie.present) {
3606  			pe_debug("FILS fragment ie present");
3607  			qdf_mem_copy(pAssocRsp->hlp_data +
3608  					pAssocRsp->hlp_data_len,
3609  					ar->fragment_ie.data,
3610  					ar->fragment_ie.num_data);
3611  			pAssocRsp->hlp_data_len += ar->fragment_ie.num_data;
3612  		}
3613  	}
3614  }
3615  #else
3616  static inline void fils_convert_assoc_rsp_frame2_struct(tDot11fAssocResponse
3617  							*ar, tpSirAssocRsp
3618  							pAssocRsp)
3619  { }
3620  #endif
3621  
3622  QDF_STATUS wlan_parse_ftie_sha384(uint8_t *frame, uint32_t frame_len,
3623  				  struct sSirAssocRsp *assoc_rsp)
3624  {
3625  	const uint8_t *ie, *ie_end, *pos;
3626  	uint8_t ie_len, remaining_ie_len;
3627  	struct wlan_sha384_ftinfo_subelem *ft_subelem;
3628  
3629  	ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_FTINFO, frame, frame_len);
3630  	if (!ie) {
3631  		pe_err("FT IE not present");
3632  		return QDF_STATUS_E_FAILURE;
3633  	}
3634  
3635  	if (!ie[1]) {
3636  		pe_err("FT IE length is zero");
3637  		return QDF_STATUS_E_FAILURE;
3638  	}
3639  
3640  	ie_len = ie[1];
3641  	if (ie_len < sizeof(struct wlan_sha384_ftinfo)) {
3642  		pe_err("Invalid FTIE len:%d", ie_len);
3643  		return QDF_STATUS_E_FAILURE;
3644  	}
3645  	remaining_ie_len = ie_len;
3646  	pos = ie + 2;
3647  	qdf_mem_copy(&assoc_rsp->sha384_ft_info, pos,
3648  		     sizeof(struct wlan_sha384_ftinfo));
3649  	ie_end = ie + ie_len;
3650  	pos += sizeof(struct wlan_sha384_ftinfo);
3651  	remaining_ie_len -= sizeof(struct wlan_sha384_ftinfo);
3652  	ft_subelem = &assoc_rsp->sha384_ft_subelem;
3653  	qdf_mem_zero(ft_subelem, sizeof(*ft_subelem));
3654  	while (ie_end - pos >= 2) {
3655  		uint8_t id, len;
3656  
3657  		id = *pos++;
3658  		len = *pos++;
3659  		/* Subtract data length(len) + 1 bytes for
3660  		 * Subelement ID + 1 bytes for length from
3661  		 * remaining FTIE buffer len (ie_len).
3662  		 * Subelement Parameter(s) field :
3663  		 *         Subelement ID  Length     Data
3664  		 * Octets:      1            1     variable
3665  		 */
3666  		if (len < 1 || remaining_ie_len < (len + 2)) {
3667  			pe_err("Invalid FT subelem length");
3668  			return QDF_STATUS_E_FAILURE;
3669  		}
3670  
3671  		remaining_ie_len -= (len + 2);
3672  
3673  		switch (id) {
3674  		case FTIE_SUBELEM_R1KH_ID:
3675  			if (len != FTIE_R1KH_LEN) {
3676  				pe_err("Invalid R1KH-ID length: %d",
3677  				       len);
3678  				return QDF_STATUS_E_FAILURE;
3679  			}
3680  			ft_subelem->r1kh_id.present = 1;
3681  			qdf_mem_copy(ft_subelem->r1kh_id.PMK_R1_ID,
3682  				     pos, FTIE_R1KH_LEN);
3683  			break;
3684  		case FTIE_SUBELEM_GTK:
3685  			if (ft_subelem->gtk) {
3686  				qdf_mem_zero(ft_subelem->gtk,
3687  					     ft_subelem->gtk_len);
3688  				ft_subelem->gtk_len = 0;
3689  				qdf_mem_free(ft_subelem->gtk);
3690  			}
3691  			ft_subelem->gtk = qdf_mem_malloc(len);
3692  			if (!ft_subelem->gtk)
3693  				return QDF_STATUS_E_NOMEM;
3694  
3695  			qdf_mem_copy(ft_subelem->gtk, pos, len);
3696  			ft_subelem->gtk_len = len;
3697  			break;
3698  		case FTIE_SUBELEM_R0KH_ID:
3699  			if (len < 1 || len > FTIE_R0KH_MAX_LEN) {
3700  				pe_err("Invalid R0KH-ID length: %d",
3701  				       len);
3702  				return QDF_STATUS_E_FAILURE;
3703  			}
3704  			ft_subelem->r0kh_id.present = 1;
3705  			ft_subelem->r0kh_id.num_PMK_R0_ID = len;
3706  			qdf_mem_copy(ft_subelem->r0kh_id.PMK_R0_ID,
3707  				     pos, len);
3708  			break;
3709  		case FTIE_SUBELEM_IGTK:
3710  			if (ft_subelem->igtk) {
3711  				qdf_mem_zero(ft_subelem->igtk,
3712  					     ft_subelem->igtk_len);
3713  				ft_subelem->igtk_len = 0;
3714  				qdf_mem_free(ft_subelem->igtk);
3715  			}
3716  			ft_subelem->igtk = qdf_mem_malloc(len);
3717  			if (!ft_subelem->igtk)
3718  				return QDF_STATUS_E_NOMEM;
3719  
3720  			qdf_mem_copy(ft_subelem->igtk, pos, len);
3721  			ft_subelem->igtk_len = len;
3722  
3723  			break;
3724  		default:
3725  			pe_debug("Unknown subelem id %d len:%d",
3726  				 id, len);
3727  			break;
3728  		}
3729  		pos += len;
3730  	}
3731  	return QDF_STATUS_SUCCESS;
3732  }
3733  
3734  #ifdef WLAN_FEATURE_11BE
3735  static void
3736  sir_convert_assoc_resp_frame2_eht_struct(tDot11fAssocResponse *ar,
3737  					 tpSirAssocRsp p_assoc_rsp)
3738  {
3739  	if (ar->eht_cap.present)
3740  		qdf_mem_copy(&p_assoc_rsp->eht_cap, &ar->eht_cap,
3741  			     sizeof(tDot11fIEeht_cap));
3742  
3743  	if (ar->eht_op.present)
3744  		qdf_mem_copy(&p_assoc_rsp->eht_op, &ar->eht_op,
3745  			     sizeof(tDot11fIEeht_op));
3746  }
3747  #else
3748  static inline void
3749  sir_convert_assoc_resp_frame2_eht_struct(tDot11fAssocResponse *ar,
3750  					 tpSirAssocRsp p_assoc_rsp)
3751  {
3752  }
3753  #endif
3754  
3755  #ifdef WLAN_FEATURE_11BE_MLO
3756  static QDF_STATUS
3757  sir_copy_assoc_rsp_partner_info_to_session(struct pe_session *session_entry,
3758  					   struct mlo_partner_info *partner_info)
3759  {
3760  	uint16_t i, partner_idx = 0, j, link_id;
3761  	struct mlo_link_info *link_info;
3762  	struct mlo_partner_info *ml_partner_info =
3763  			&session_entry->ml_partner_info;
3764  
3765  	link_info = mlo_mgr_get_ap_link(session_entry->vdev);
3766  	if (!link_info)
3767  		return QDF_STATUS_E_FAILURE;
3768  
3769  	/* Clear the Partner info already filled from the join request */
3770  	qdf_mem_zero(ml_partner_info, sizeof(*ml_partner_info));
3771  	for (i = 1; i < WLAN_MAX_ML_BSS_LINKS; i++) {
3772  		link_id = link_info[i].link_id;
3773  		for (j = 0; j < partner_info->num_partner_links; j++) {
3774  			if (partner_info->partner_link_info[j].link_id !=
3775  			    link_id)
3776  				continue;
3777  
3778  			ml_partner_info->partner_link_info[partner_idx++] =
3779  					partner_info->partner_link_info[j];
3780  			break;
3781  		}
3782  	}
3783  	ml_partner_info->num_partner_links = partner_idx;
3784  
3785  	return QDF_STATUS_SUCCESS;
3786  }
3787  
3788  static QDF_STATUS
3789  sir_convert_assoc_resp_frame2_mlo_struct(struct mac_context *mac,
3790  					 uint8_t *frame,
3791  					 uint32_t frame_len,
3792  					 struct pe_session *session_entry,
3793  					 tDot11fAssocResponse *ar,
3794  					 tpSirAssocRsp p_assoc_rsp)
3795  {
3796  	uint8_t *ml_ie;
3797  	qdf_size_t ml_ie_total_len;
3798  	struct wlan_mlo_ie *ml_ie_info;
3799  	bool link_id_found;
3800  	uint8_t link_id;
3801  	bool eml_cap_found, msd_cap_found;
3802  	uint16_t eml_cap;
3803  	uint16_t msd_cap;
3804  	struct qdf_mac_addr mld_mac_addr;
3805  	QDF_STATUS status = QDF_STATUS_SUCCESS;
3806  	struct mlo_partner_info partner_info;
3807  
3808  	if (!ar->mlo_ie.present)
3809  		return status;
3810  
3811  	status = util_find_mlie(frame + WLAN_ASSOC_RSP_IES_OFFSET,
3812  				frame_len - WLAN_ASSOC_RSP_IES_OFFSET,
3813  				&ml_ie, &ml_ie_total_len);
3814  	if (QDF_IS_STATUS_ERROR(status))
3815  		return status;
3816  
3817  	ml_ie_info = &p_assoc_rsp->mlo_ie.mlo_ie;
3818  	util_get_bvmlie_persta_partner_info(ml_ie, ml_ie_total_len,
3819  					    &partner_info);
3820  
3821  	sir_copy_assoc_rsp_partner_info_to_session(session_entry,
3822  						   &partner_info);
3823  
3824  	if (!wlan_cm_is_roam_sync_in_progress(mac->psoc,
3825  					      session_entry->vdev_id)) {
3826  		session_entry->ml_partner_info.num_partner_links =
3827  		QDF_MIN(
3828  		session_entry->ml_partner_info.num_partner_links,
3829  		session_entry->lim_join_req->partner_info.num_partner_links);
3830  	}
3831  	util_get_bvmlie_mldmacaddr(ml_ie, ml_ie_total_len,
3832  				   &mld_mac_addr);
3833  	qdf_mem_copy(ml_ie_info->mld_mac_addr,
3834  		     mld_mac_addr.bytes, QDF_MAC_ADDR_SIZE);
3835  
3836  	util_get_mlie_common_info_len(ml_ie, ml_ie_total_len,
3837  				      &ml_ie_info->common_info_length);
3838  
3839  	util_get_bvmlie_primary_linkid(ml_ie, ml_ie_total_len,
3840  				       &link_id_found, &link_id);
3841  	util_get_bvmlie_msd_cap(ml_ie, ml_ie_total_len,
3842  				&msd_cap_found, &msd_cap);
3843  	if (msd_cap_found) {
3844  		ml_ie_info->medium_sync_delay_info_present =
3845  						msd_cap_found;
3846  		ml_ie_info->medium_sync_delay_info.medium_sync_duration =
3847  		  QDF_GET_BITS(
3848  		     msd_cap,
3849  		     WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_DURATION_IDX,
3850  		     WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_DURATION_BITS);
3851  		ml_ie_info->medium_sync_delay_info.medium_sync_ofdm_ed_thresh =
3852  		  QDF_GET_BITS(
3853  		     msd_cap,
3854  		     WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_OFDMEDTHRESH_IDX,
3855  		     WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_OFDMEDTHRESH_BITS);
3856  		ml_ie_info->medium_sync_delay_info.medium_sync_max_txop_num =
3857  		  QDF_GET_BITS(
3858  		     msd_cap,
3859  		     WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_MAXTXOPS_IDX,
3860  		     WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_MAXTXOPS_BITS);
3861  	}
3862  	util_get_bvmlie_eml_cap(ml_ie, ml_ie_total_len,
3863  				&eml_cap_found, &eml_cap);
3864  	if (eml_cap_found) {
3865  		ml_ie_info->eml_capab_present = eml_cap_found;
3866  		ml_ie_info->eml_capabilities_info.emlsr_support =
3867  			QDF_GET_BITS(eml_cap,
3868  				     WLAN_ML_BV_CINFO_EMLCAP_EMLSRSUPPORT_IDX,
3869  				     WLAN_ML_BV_CINFO_EMLCAP_EMLSRSUPPORT_BITS);
3870  
3871  		ml_ie_info->eml_capabilities_info.transition_timeout =
3872  			QDF_GET_BITS(eml_cap,
3873  				     WLAN_ML_BV_CINFO_EMLCAP_TRANSTIMEOUT_IDX,
3874  				     WLAN_ML_BV_CINFO_EMLCAP_TRANSTIMEOUT_BITS);
3875  	}
3876  
3877  	ml_ie_info->num_sta_profile =
3878  			session_entry->ml_partner_info.num_partner_links;
3879  	ml_ie_info->link_id_info_present = link_id_found;
3880  	ml_ie_info->link_id = link_id;
3881  
3882  	pe_debug("vdev:%d Partner link count: %d, Link id: %d, MLD mac addr: " QDF_MAC_ADDR_FMT,
3883  		 session_entry->vdev_id,
3884  		 ml_ie_info->num_sta_profile, ml_ie_info->link_id,
3885  		 QDF_MAC_ADDR_REF(ml_ie_info->mld_mac_addr));
3886  
3887  	return status;
3888  }
3889  
3890  static QDF_STATUS
3891  sir_convert_assoc_resp_frame2_t2lm_struct(struct mac_context *mac,
3892  					  uint8_t *frame,
3893  					  uint32_t frame_len,
3894  					  struct pe_session *session_entry,
3895  					  tDot11fAssocResponse *ar,
3896  					  tpSirAssocRsp p_assoc_rsp)
3897  {
3898  	QDF_STATUS status = QDF_STATUS_SUCCESS;
3899  	struct wlan_t2lm_context *t2lm_ctx;
3900  	/* add 3 bytes for extn_ie_header */
3901  	uint8_t ie[DOT11F_IE_T2LM_IE_MAX_LEN + 3];
3902  	struct wlan_t2lm_info t2lm;
3903  	uint8_t i;
3904  
3905  	t2lm_ctx = &p_assoc_rsp->t2lm_ctx;
3906  	qdf_mem_zero(&t2lm_ctx->established_t2lm.t2lm,
3907  		     sizeof(struct wlan_t2lm_info));
3908  	t2lm_ctx->established_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
3909  
3910  	qdf_mem_zero(&t2lm_ctx->upcoming_t2lm.t2lm,
3911  		     sizeof(struct wlan_t2lm_info));
3912  	t2lm_ctx->upcoming_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
3913  
3914  	if (!ar->num_t2lm_ie) {
3915  		pe_debug("T2LM IEs not present");
3916  		return status;
3917  	}
3918  
3919  	pe_debug("Number of T2LM IEs in assoc resp %d", ar->num_t2lm_ie);
3920  	for (i = 0; i < ar->num_t2lm_ie; i++) {
3921  		qdf_mem_zero(&ie[0], DOT11F_IE_T2LM_IE_MAX_LEN + 3);
3922  		qdf_mem_zero(&t2lm, sizeof(struct wlan_t2lm_info));
3923  		ie[ID_POS] = WLAN_ELEMID_EXTN_ELEM;
3924  		ie[TAG_LEN_POS] = ar->t2lm_ie[i].num_data + 1;
3925  		ie[IDEXT_POS] = WLAN_EXTN_ELEMID_T2LM;
3926  		qdf_mem_copy(&ie[3], &ar->t2lm_ie[i].data[0],
3927  			     ar->t2lm_ie[i].num_data);
3928  		qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
3929  				   &ie[0], ar->t2lm_ie[i].num_data + 3);
3930  
3931  		if (ie[TAG_LEN_POS] + 2 > DOT11F_IE_T2LM_IE_MAX_LEN + 3) {
3932  			pe_debug("Invalid T2LM IE length");
3933  			return QDF_STATUS_E_PROTO;
3934  		}
3935  
3936  		status = wlan_mlo_parse_t2lm_info(&ie[0], &t2lm);
3937  		if (QDF_IS_STATUS_ERROR(status)) {
3938  			pe_debug("Parse T2LM IE fail");
3939  			return status;
3940  		}
3941  
3942  		if (!t2lm.mapping_switch_time_present &&
3943  		    t2lm.expected_duration_present) {
3944  			qdf_mem_copy(&t2lm_ctx->established_t2lm.t2lm, &t2lm,
3945  				     sizeof(struct wlan_t2lm_info));
3946  			pe_debug("Parse established T2LM IE success");
3947  		} else if (t2lm.mapping_switch_time_present) {
3948  			qdf_mem_copy(&t2lm_ctx->upcoming_t2lm.t2lm, &t2lm,
3949  				     sizeof(struct wlan_t2lm_info));
3950  			pe_debug("Parse upcoming T2LM IE success");
3951  		}
3952  		pe_debug("Parse T2LM IE success");
3953  	}
3954  	return status;
3955  }
3956  
3957  #else
3958  static inline QDF_STATUS
3959  sir_convert_assoc_resp_frame2_mlo_struct(struct mac_context *mac,
3960  					 uint8_t *frame,
3961  					 uint32_t frame_len,
3962  					 struct pe_session *session_entry,
3963  					 tDot11fAssocResponse *ar,
3964  					 tpSirAssocRsp p_assoc_rsp)
3965  {
3966  	return QDF_STATUS_SUCCESS;
3967  }
3968  
3969  static inline QDF_STATUS
3970  sir_convert_assoc_resp_frame2_t2lm_struct(struct mac_context *mac,
3971  					  uint8_t *frame,
3972  					  uint32_t frame_len,
3973  					  struct pe_session *session_entry,
3974  					  tDot11fAssocResponse *ar,
3975  					  tpSirAssocRsp p_assoc_rsp)
3976  {
3977  	return QDF_STATUS_SUCCESS;
3978  }
3979  #endif
3980  #ifdef WLAN_FEATURE_SR
3981  static void sir_convert_assoc_resp_frame2_sr(tpSirAssocRsp pAssocRsp,
3982  					     tDot11fAssocResponse *ar)
3983  {
3984  	if (ar->spatial_reuse.present)
3985  		qdf_mem_copy(&pAssocRsp->srp_ie, &ar->spatial_reuse,
3986  			     sizeof(tDot11fIEspatial_reuse));
3987  }
3988  #else
3989  static inline void sir_convert_assoc_resp_frame2_sr(tpSirAssocRsp pAssocRsp,
3990  						    tDot11fAssocResponse *ar)
3991  {
3992  }
3993  #endif
3994  
3995  QDF_STATUS
3996  sir_convert_assoc_resp_frame2_struct(struct mac_context *mac,
3997  				     struct pe_session *session_entry,
3998  				     uint8_t *frame, uint32_t frame_len,
3999  				     tpSirAssocRsp pAssocRsp)
4000  {
4001  	tDot11fAssocResponse *ar;
4002  	enum ani_akm_type auth_type;
4003  	uint32_t status, ie_len;
4004  	QDF_STATUS qdf_status;
4005  	uint8_t cnt = 0;
4006  	bool sha384_akm;
4007  	uint8_t *ie_ptr;
4008  	uint16_t status_code;
4009  
4010  	ar = qdf_mem_malloc(sizeof(*ar));
4011  	if (!ar)
4012  		return QDF_STATUS_E_FAILURE;
4013  
4014  	status_code = sir_read_u16(frame +
4015  				   SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET);
4016  	if (lim_is_fils_connection(session_entry) && status_code)
4017  		pe_debug("FILS: assoc reject Status code:%d", status_code);
4018  
4019  	/*
4020  	 * decrypt the cipher text using AEAD decryption, if association
4021  	 * response status code is successful, else the don't do AEAD decryption
4022  	 * since AP doesn't include FILS session IE when association reject is
4023  	 * sent
4024  	 */
4025  	if (lim_is_fils_connection(session_entry) && !status_code) {
4026  		status = aead_decrypt_assoc_rsp(mac, session_entry,
4027  						ar, frame, &frame_len);
4028  		if (!QDF_IS_STATUS_SUCCESS(status)) {
4029  			pe_err("FILS assoc rsp AEAD decrypt fails");
4030  			qdf_mem_free(ar);
4031  			return QDF_STATUS_E_FAILURE;
4032  		}
4033  	}
4034  
4035  	status = dot11f_parse_assoc_response(mac, frame, frame_len, ar, false);
4036  	if (QDF_STATUS_SUCCESS != status) {
4037  		qdf_mem_free(ar);
4038  		return status;
4039  	}
4040  
4041  	/* Capabilities */
4042  	pAssocRsp->capabilityInfo.ess = ar->Capabilities.ess;
4043  	pAssocRsp->capabilityInfo.ibss = ar->Capabilities.ibss;
4044  	pAssocRsp->capabilityInfo.cfPollable = ar->Capabilities.cfPollable;
4045  	pAssocRsp->capabilityInfo.cfPollReq = ar->Capabilities.cfPollReq;
4046  	pAssocRsp->capabilityInfo.privacy = ar->Capabilities.privacy;
4047  	pAssocRsp->capabilityInfo.shortPreamble =
4048  		ar->Capabilities.shortPreamble;
4049  	pAssocRsp->capabilityInfo.criticalUpdateFlag =
4050  		ar->Capabilities.criticalUpdateFlag;
4051  	pAssocRsp->capabilityInfo.channelAgility =
4052  		ar->Capabilities.channelAgility;
4053  	pAssocRsp->capabilityInfo.spectrumMgt = ar->Capabilities.spectrumMgt;
4054  	pAssocRsp->capabilityInfo.qos = ar->Capabilities.qos;
4055  	pAssocRsp->capabilityInfo.shortSlotTime =
4056  		ar->Capabilities.shortSlotTime;
4057  	pAssocRsp->capabilityInfo.apsd = ar->Capabilities.apsd;
4058  	pAssocRsp->capabilityInfo.rrm = ar->Capabilities.rrm;
4059  	pAssocRsp->capabilityInfo.dsssOfdm = ar->Capabilities.dsssOfdm;
4060  	pAssocRsp->capabilityInfo.delayedBA = ar->Capabilities.delayedBA;
4061  	pAssocRsp->capabilityInfo.immediateBA = ar->Capabilities.immediateBA;
4062  
4063  	pAssocRsp->status_code = ar->Status.status;
4064  	pAssocRsp->aid = ar->AID.associd;
4065  
4066  	if (ar->TimeoutInterval.present) {
4067  		pAssocRsp->TimeoutInterval.present = 1;
4068  		pAssocRsp->TimeoutInterval.timeoutType =
4069  			ar->TimeoutInterval.timeoutType;
4070  		pAssocRsp->TimeoutInterval.timeoutValue =
4071  			ar->TimeoutInterval.timeoutValue;
4072  	}
4073  
4074  	if (!ar->SuppRates.present) {
4075  		pAssocRsp->suppRatesPresent = 0;
4076  		pe_debug_rl("Mandatory IE Supported Rates not present!");
4077  	} else {
4078  		pAssocRsp->suppRatesPresent = 1;
4079  		convert_supp_rates(mac, &pAssocRsp->supportedRates,
4080  				&ar->SuppRates);
4081  	}
4082  
4083  	if (ar->ExtSuppRates.present) {
4084  		pAssocRsp->extendedRatesPresent = 1;
4085  		convert_ext_supp_rates(mac, &pAssocRsp->extendedRates,
4086  				&ar->ExtSuppRates);
4087  	}
4088  
4089  	if (ar->EDCAParamSet.present) {
4090  		pAssocRsp->edcaPresent = 1;
4091  		convert_edca_param(mac, &pAssocRsp->edca, &ar->EDCAParamSet);
4092  	}
4093  	if (ar->WMMParams.present) {
4094  		pAssocRsp->wmeEdcaPresent = 1;
4095  		convert_wmm_params(mac, &pAssocRsp->edca, &ar->WMMParams);
4096  	}
4097  
4098  	if (ar->HTCaps.present)
4099  		qdf_mem_copy(&pAssocRsp->HTCaps, &ar->HTCaps,
4100  			     sizeof(tDot11fIEHTCaps));
4101  
4102  	if (ar->HTInfo.present)
4103  		qdf_mem_copy(&pAssocRsp->HTInfo, &ar->HTInfo,
4104  			     sizeof(tDot11fIEHTInfo));
4105  
4106  	if (ar->RRMEnabledCap.present) {
4107  		qdf_mem_copy(&pAssocRsp->rrm_caps, &ar->RRMEnabledCap,
4108  			     sizeof(tDot11fIERRMEnabledCap));
4109  	}
4110  	if (ar->MobilityDomain.present) {
4111  		/* MobilityDomain */
4112  		pAssocRsp->mdiePresent = 1;
4113  		qdf_mem_copy((uint8_t *) &(pAssocRsp->mdie[0]),
4114  				(uint8_t *) &(ar->MobilityDomain.MDID),
4115  				sizeof(uint16_t));
4116  		pAssocRsp->mdie[2] = ((ar->MobilityDomain.overDSCap << 0) |
4117  				      (ar->MobilityDomain.resourceReqCap << 1));
4118  		pe_debug("new mdie=%02x%02x%02x",
4119  			(unsigned int)pAssocRsp->mdie[0],
4120  			(unsigned int)pAssocRsp->mdie[1],
4121  			(unsigned int)pAssocRsp->mdie[2]);
4122  	}
4123  
4124  	/*
4125  	 * If the connection is based on SHA384 AKM suite,
4126  	 * then the length of MIC is 24 bytes, but frame parser
4127  	 * has FTIE MIC of 16 bytes only. This results in parsing FTIE
4128  	 * failure and R0KH and R1KH are not sent to firmware over RSO
4129  	 * command. Frame parser doesn't have
4130  	 * info on the connected AKM. So parse the FTIE again if
4131  	 * AKM is sha384 based and extract the R0KH and R1KH using the new
4132  	 * parsing logic.
4133  	 */
4134  	auth_type = session_entry->connected_akm;
4135  	sha384_akm = lim_is_sha384_akm(auth_type);
4136  	ie_ptr = frame + FIXED_PARAM_OFFSET_ASSOC_RSP;
4137  	ie_len = frame_len - FIXED_PARAM_OFFSET_ASSOC_RSP;
4138  	if (sha384_akm) {
4139  		qdf_status = wlan_parse_ftie_sha384(ie_ptr, ie_len, pAssocRsp);
4140  		if (QDF_IS_STATUS_ERROR(qdf_status)) {
4141  			pe_err("FT IE parsing failed status:%d", status);
4142  		} else {
4143  			pe_debug("FT: R0KH present:%d len:%d R1KH present%d",
4144  				 pAssocRsp->sha384_ft_subelem.r0kh_id.present,
4145  				 pAssocRsp->sha384_ft_subelem.r0kh_id.num_PMK_R0_ID,
4146  				 pAssocRsp->sha384_ft_subelem.r1kh_id.present);
4147  			ar->FTInfo.present = false;
4148  		}
4149  	} else if (ar->FTInfo.present) {
4150  		pe_debug("FT: R0KH present:%d, len:%d R1KH present:%d",
4151  			 ar->FTInfo.R0KH_ID.present,
4152  			 ar->FTInfo.R0KH_ID.num_PMK_R0_ID,
4153  			 ar->FTInfo.R1KH_ID.present);
4154  		pAssocRsp->ftinfoPresent = 1;
4155  		qdf_mem_copy(&pAssocRsp->FTInfo, &ar->FTInfo,
4156  			     sizeof(tDot11fIEFTInfo));
4157  	}
4158  
4159  	if (ar->num_RICDataDesc && ar->num_RICDataDesc <= 2) {
4160  		for (cnt = 0; cnt < ar->num_RICDataDesc; cnt++) {
4161  			if (ar->RICDataDesc[cnt].present) {
4162  				qdf_mem_copy(&pAssocRsp->RICData[cnt],
4163  						&ar->RICDataDesc[cnt],
4164  						sizeof(tDot11fIERICDataDesc));
4165  			}
4166  		}
4167  		pAssocRsp->num_RICData = ar->num_RICDataDesc;
4168  		pAssocRsp->ricPresent = true;
4169  	}
4170  
4171  #ifdef FEATURE_WLAN_ESE
4172  	if (ar->num_WMMTSPEC) {
4173  		pAssocRsp->num_tspecs = ar->num_WMMTSPEC;
4174  		for (cnt = 0; cnt < ar->num_WMMTSPEC; cnt++) {
4175  			qdf_mem_copy(&pAssocRsp->TSPECInfo[cnt],
4176  					&ar->WMMTSPEC[cnt],
4177  					sizeof(tDot11fIEWMMTSPEC));
4178  		}
4179  		pAssocRsp->tspecPresent = true;
4180  	}
4181  
4182  	if (ar->ESETrafStrmMet.present) {
4183  		pAssocRsp->tsmPresent = 1;
4184  		qdf_mem_copy(&pAssocRsp->tsmIE.tsid,
4185  				&ar->ESETrafStrmMet.tsid,
4186  				sizeof(struct ese_tsm_ie));
4187  	}
4188  #endif
4189  	if (ar->bss_max_idle_period.present)
4190  		qdf_mem_copy(&pAssocRsp->bss_max_idle_period,
4191  			     &ar->bss_max_idle_period,
4192  			     sizeof(tDot11fIEbss_max_idle_period));
4193  
4194  	if (ar->VHTCaps.present) {
4195  		qdf_mem_copy(&pAssocRsp->VHTCaps, &ar->VHTCaps,
4196  			     sizeof(tDot11fIEVHTCaps));
4197  		lim_log_vht_cap(mac, &pAssocRsp->VHTCaps);
4198  	}
4199  	if (ar->VHTOperation.present) {
4200  		qdf_mem_copy(&pAssocRsp->VHTOperation, &ar->VHTOperation,
4201  			     sizeof(tDot11fIEVHTOperation));
4202  		lim_log_vht_operation(mac, &pAssocRsp->VHTOperation);
4203  	}
4204  
4205  	if (ar->ExtCap.present) {
4206  		struct s_ext_cap *ext_cap;
4207  
4208  		qdf_mem_copy(&pAssocRsp->ExtCap, &ar->ExtCap,
4209  				sizeof(tDot11fIEExtCap));
4210  		ext_cap = (struct s_ext_cap *)&pAssocRsp->ExtCap.bytes;
4211  		pe_debug("timingMeas: %d, finetimingMeas Init: %d, Resp: %d",
4212  			ext_cap->timing_meas, ext_cap->fine_time_meas_initiator,
4213  			ext_cap->fine_time_meas_responder);
4214  	}
4215  
4216  	if (ar->OperatingMode.present) {
4217  		qdf_mem_copy(&pAssocRsp->oper_mode_ntf, &ar->OperatingMode,
4218  			     sizeof(tDot11fIEOperatingMode));
4219  	}
4220  
4221  	if (ar->QosMapSet.present) {
4222  		pAssocRsp->QosMapSet.present = 1;
4223  		convert_qos_mapset_frame(mac, &pAssocRsp->QosMapSet,
4224  					 &ar->QosMapSet);
4225  		lim_log_qos_map_set(mac, &pAssocRsp->QosMapSet);
4226  	}
4227  
4228  	pAssocRsp->vendor_vht_ie.present = ar->vendor_vht_ie.present;
4229  	if (ar->vendor_vht_ie.present)
4230  		pAssocRsp->vendor_vht_ie.sub_type = ar->vendor_vht_ie.sub_type;
4231  	if (ar->OBSSScanParameters.present) {
4232  		qdf_mem_copy(&pAssocRsp->obss_scanparams,
4233  				&ar->OBSSScanParameters,
4234  				sizeof(struct sDot11fIEOBSSScanParameters));
4235  	}
4236  	if (ar->vendor_vht_ie.VHTCaps.present) {
4237  		qdf_mem_copy(&pAssocRsp->vendor_vht_ie.VHTCaps,
4238  				&ar->vendor_vht_ie.VHTCaps,
4239  				sizeof(tDot11fIEVHTCaps));
4240  		lim_log_vht_cap(mac, &pAssocRsp->VHTCaps);
4241  	}
4242  	if (ar->vendor_vht_ie.VHTOperation.present) {
4243  		qdf_mem_copy(&pAssocRsp->vendor_vht_ie.VHTOperation,
4244  				&ar->vendor_vht_ie.VHTOperation,
4245  				sizeof(tDot11fIEVHTOperation));
4246  		lim_log_vht_operation(mac, &pAssocRsp->VHTOperation);
4247  	}
4248  
4249  	if (ar->qcn_ie.present)
4250  		qdf_mem_copy(&pAssocRsp->qcn_ie, &ar->qcn_ie,
4251  			     sizeof(tDot11fIEqcn_ie));
4252  	if (ar->he_cap.present) {
4253  		qdf_mem_copy(&pAssocRsp->he_cap, &ar->he_cap,
4254  			     sizeof(tDot11fIEhe_cap));
4255  	}
4256  	if (ar->he_op.present)
4257  		qdf_mem_copy(&pAssocRsp->he_op, &ar->he_op,
4258  			     sizeof(tDot11fIEhe_op));
4259  
4260  	sir_convert_assoc_resp_frame2_sr(pAssocRsp, ar);
4261  
4262  	if (ar->he_6ghz_band_cap.present)
4263  		qdf_mem_copy(&pAssocRsp->he_6ghz_band_cap,
4264  			     &ar->he_6ghz_band_cap,
4265  			     sizeof(tDot11fIEhe_6ghz_band_cap));
4266  
4267  	if (ar->mu_edca_param_set.present) {
4268  		pAssocRsp->mu_edca_present = true;
4269  		convert_mu_edca_param(mac, &pAssocRsp->mu_edca,
4270  				&ar->mu_edca_param_set);
4271  	}
4272  
4273  	if (ar->MBO_IE.present && ar->MBO_IE.rssi_assoc_rej.present)
4274  		qdf_mem_copy(&pAssocRsp->rssi_assoc_rej,
4275  			     &ar->MBO_IE.rssi_assoc_rej,
4276  			     sizeof(tDot11fTLVrssi_assoc_rej));
4277  
4278  	sir_convert_assoc_resp_frame2_eht_struct(ar, pAssocRsp);
4279  	fils_convert_assoc_rsp_frame2_struct(ar, pAssocRsp);
4280  	sir_convert_assoc_resp_frame2_mlo_struct(mac, frame, frame_len,
4281  						 session_entry, ar, pAssocRsp);
4282  	sir_convert_assoc_resp_frame2_t2lm_struct(mac, frame, frame_len,
4283  						  session_entry, ar, pAssocRsp);
4284  	pe_debug("ht %d vht %d vendor vht: cap %d op %d, he %d he 6ghband %d eht %d eht320 %d, max idle: present %d val %d, he mu edca %d wmm %d qos %d mlo %d",
4285  		 ar->HTCaps.present, ar->VHTCaps.present,
4286  		 ar->vendor_vht_ie.VHTCaps.present,
4287  		 ar->vendor_vht_ie.VHTOperation.present, ar->he_cap.present,
4288  		 ar->he_6ghz_band_cap.present, ar->eht_cap.present,
4289  		 pAssocRsp->eht_cap.support_320mhz_6ghz,
4290  		 ar->bss_max_idle_period.present,
4291  		 pAssocRsp->bss_max_idle_period.max_idle_period,
4292  		 ar->mu_edca_param_set.present, ar->WMMParams.present,
4293  		 ar->QosMapSet.present,
4294  		 ar->mlo_ie.present);
4295  
4296  	if (ar->WMMParams.present)
4297  		__print_wmm_params(mac, &ar->WMMParams);
4298  
4299  	qdf_mem_free(ar);
4300  	return QDF_STATUS_SUCCESS;
4301  } /* End sir_convert_assoc_resp_frame2_struct. */
4302  
4303  #ifdef WLAN_FEATURE_11BE
4304  static void
4305  sir_convert_reassoc_req_frame2_eht_struct(tDot11fReAssocRequest *ar,
4306  					  tpSirAssocReq p_assoc_req)
4307  {
4308  	if (ar->eht_cap.present) {
4309  		qdf_mem_copy(&p_assoc_req->eht_cap, &ar->eht_cap,
4310  			     sizeof(tDot11fIEeht_cap));
4311  		pe_debug("Received Assoc Req with EHT Capability IE");
4312  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
4313  				   &p_assoc_req->eht_cap,
4314  				   sizeof(tDot11fIEeht_cap));
4315  	}
4316  }
4317  #else
4318  static inline void
4319  sir_convert_reassoc_req_frame2_eht_struct(tDot11fReAssocRequest *ar,
4320  					  tpSirAssocReq p_assoc_req)
4321  {
4322  }
4323  #endif
4324  
4325  #ifdef WLAN_FEATURE_11BE_MLO
4326  static QDF_STATUS
4327  sir_convert_reassoc_req_frame2_mlo_struct(uint8_t *pframe, uint32_t nframe,
4328  					  tDot11fReAssocRequest *ar,
4329  					  tpSirAssocReq p_assoc_req)
4330  {
4331  	uint8_t *ml_ie;
4332  	qdf_size_t ml_ie_total_len;
4333  	struct qdf_mac_addr mld_mac_addr;
4334  	uint32_t status = QDF_STATUS_SUCCESS;
4335  
4336  	if (ar->mlo_ie.present) {
4337  		status = util_find_mlie(pframe + WLAN_REASSOC_REQ_IES_OFFSET,
4338  					nframe - WLAN_ASSOC_REQ_IES_OFFSET,
4339  					&ml_ie, &ml_ie_total_len);
4340  		if (QDF_IS_STATUS_SUCCESS(status)) {
4341  			util_get_bvmlie_persta_partner_info(ml_ie,
4342  							ml_ie_total_len,
4343  							&p_assoc_req->mlo_info);
4344  
4345  			util_get_bvmlie_mldmacaddr(ml_ie, ml_ie_total_len,
4346  						   &mld_mac_addr);
4347  			qdf_mem_copy(p_assoc_req->mld_mac, mld_mac_addr.bytes,
4348  				     QDF_MAC_ADDR_SIZE);
4349  		} else {
4350  			pe_debug("Do not find ml ie");
4351  		}
4352  	}
4353  	return status;
4354  }
4355  #else
4356  static QDF_STATUS
4357  sir_convert_reassoc_req_frame2_mlo_struct(uint8_t *pframe, uint32_t nframe,
4358  					  tDot11fReAssocRequest *ar,
4359  					  tpSirAssocReq p_assoc_req)
4360  {
4361  	return QDF_STATUS_SUCCESS;
4362  }
4363  #endif
4364  enum wlan_status_code
4365  sir_convert_reassoc_req_frame2_struct(struct mac_context *mac,
4366  				      uint8_t *pFrame,
4367  				      uint32_t nFrame, tpSirAssocReq pAssocReq)
4368  {
4369  	tDot11fReAssocRequest *ar;
4370  	uint32_t status;
4371  
4372  	ar = qdf_mem_malloc(sizeof(*ar));
4373  	if (!ar)
4374  		return STATUS_UNSPECIFIED_FAILURE;
4375  
4376  	/* delegate to the framesc-generated code, */
4377  	status = dot11f_unpack_re_assoc_request(mac, pFrame, nFrame,
4378  						ar, false);
4379  	if (DOT11F_FAILED(status)) {
4380  		pe_err("Failed to parse a Re-association Request (0x%08x, %d bytes):",
4381  			status, nFrame);
4382  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
4383  				   pFrame, nFrame);
4384  		qdf_mem_free(ar);
4385  		return STATUS_UNSPECIFIED_FAILURE;
4386  	} else if (DOT11F_WARNED(status)) {
4387  		pe_debug("There were warnings while unpacking a Re-association Request (0x%08x, %d bytes):",
4388  			status, nFrame);
4389  	}
4390  	/* & "transliterate" from a 'tDot11fReAssocRequest' to a 'tSirAssocReq'... */
4391  
4392  	/* make sure this is seen as a re-assoc request */
4393  	pAssocReq->reassocRequest = 1;
4394  
4395  	/* Capabilities */
4396  	pAssocReq->capabilityInfo.ess = ar->Capabilities.ess;
4397  	pAssocReq->capabilityInfo.ibss = ar->Capabilities.ibss;
4398  	pAssocReq->capabilityInfo.cfPollable = ar->Capabilities.cfPollable;
4399  	pAssocReq->capabilityInfo.cfPollReq = ar->Capabilities.cfPollReq;
4400  	pAssocReq->capabilityInfo.privacy = ar->Capabilities.privacy;
4401  	pAssocReq->capabilityInfo.shortPreamble = ar->Capabilities.shortPreamble;
4402  	pAssocReq->capabilityInfo.criticalUpdateFlag =
4403  		ar->Capabilities.criticalUpdateFlag;
4404  	pAssocReq->capabilityInfo.channelAgility =
4405  		ar->Capabilities.channelAgility;
4406  	pAssocReq->capabilityInfo.spectrumMgt = ar->Capabilities.spectrumMgt;
4407  	pAssocReq->capabilityInfo.qos = ar->Capabilities.qos;
4408  	pAssocReq->capabilityInfo.shortSlotTime = ar->Capabilities.shortSlotTime;
4409  	pAssocReq->capabilityInfo.apsd = ar->Capabilities.apsd;
4410  	pAssocReq->capabilityInfo.rrm = ar->Capabilities.rrm;
4411  	pAssocReq->capabilityInfo.dsssOfdm = ar->Capabilities.dsssOfdm;
4412  	pAssocReq->capabilityInfo.delayedBA = ar->Capabilities.delayedBA;
4413  	pAssocReq->capabilityInfo.immediateBA = ar->Capabilities.immediateBA;
4414  
4415  	/* Listen Interval */
4416  	pAssocReq->listenInterval = ar->ListenInterval.interval;
4417  
4418  	/* SSID */
4419  	if (ar->SSID.present) {
4420  		pAssocReq->ssidPresent = 1;
4421  		convert_ssid(mac, &pAssocReq->ssId, &ar->SSID);
4422  	}
4423  	/* Supported Rates */
4424  	if (ar->SuppRates.present) {
4425  		pAssocReq->suppRatesPresent = 1;
4426  		convert_supp_rates(mac, &pAssocReq->supportedRates,
4427  				   &ar->SuppRates);
4428  	}
4429  	/* Extended Supported Rates */
4430  	if (ar->ExtSuppRates.present) {
4431  		pAssocReq->extendedRatesPresent = 1;
4432  		convert_ext_supp_rates(mac, &pAssocReq->extendedRates,
4433  				       &ar->ExtSuppRates);
4434  	}
4435  	/* QOS Capabilities: */
4436  	if (ar->QOSCapsStation.present) {
4437  		pAssocReq->qosCapabilityPresent = 1;
4438  		convert_qos_caps_station(mac, &pAssocReq->qosCapability,
4439  					 &ar->QOSCapsStation);
4440  	}
4441  	/* WPA */
4442  	if (ar->WPAOpaque.present) {
4443  		pAssocReq->wpaPresent = 1;
4444  		convert_wpa_opaque(mac, &pAssocReq->wpa, &ar->WPAOpaque);
4445  	}
4446  	/* RSN */
4447  	if (ar->RSNOpaque.present) {
4448  		pAssocReq->rsnPresent = 1;
4449  		convert_rsn_opaque(mac, &pAssocReq->rsn, &ar->RSNOpaque);
4450  	}
4451  
4452  	/* Power Capabilities */
4453  	if (ar->PowerCaps.present) {
4454  		pAssocReq->powerCapabilityPresent = 1;
4455  		convert_power_caps(mac, &pAssocReq->powerCapability,
4456  				   &ar->PowerCaps);
4457  	}
4458  	/* Supported Channels */
4459  	if (ar->SuppChannels.present) {
4460  		pAssocReq->supportedChannelsPresent = 1;
4461  		convert_supp_channels(mac, &pAssocReq->supportedChannels,
4462  				      &ar->SuppChannels);
4463  	}
4464  
4465  	if (ar->HTCaps.present) {
4466  		qdf_mem_copy(&pAssocReq->HTCaps, &ar->HTCaps,
4467  			     sizeof(tDot11fIEHTCaps));
4468  	}
4469  
4470  	if (ar->WMMInfoStation.present) {
4471  		pAssocReq->wmeInfoPresent = 1;
4472  		qdf_mem_copy(&pAssocReq->WMMInfoStation, &ar->WMMInfoStation,
4473  			     sizeof(tDot11fIEWMMInfoStation));
4474  
4475  	}
4476  
4477  	if (ar->WMMCaps.present)
4478  		pAssocReq->wsmCapablePresent = 1;
4479  
4480  	if (!pAssocReq->ssidPresent) {
4481  		pe_debug("Received Assoc without SSID IE");
4482  		qdf_mem_free(ar);
4483  		return STATUS_UNSPECIFIED_FAILURE;
4484  	}
4485  
4486  	if (!pAssocReq->suppRatesPresent && !pAssocReq->extendedRatesPresent) {
4487  		pe_debug("Received Assoc without supp rate IE");
4488  		qdf_mem_free(ar);
4489  		return STATUS_ASSOC_DENIED_RATES;
4490  	}
4491  	/* Why no call to 'updateAssocReqFromPropCapability' here, like */
4492  	/* there is in 'sir_convert_assoc_req_frame2_struct'? */
4493  
4494  	/* WSC IE */
4495  	if (ar->WscIEOpaque.present) {
4496  		pAssocReq->addIEPresent = 1;
4497  		convert_wsc_opaque(mac, &pAssocReq->addIE, &ar->WscIEOpaque);
4498  	}
4499  
4500  	if (ar->P2PIEOpaque.present) {
4501  		pAssocReq->addIEPresent = 1;
4502  		convert_p2p_opaque(mac, &pAssocReq->addIE, &ar->P2PIEOpaque);
4503  	}
4504  #ifdef WLAN_FEATURE_WFD
4505  	if (ar->WFDIEOpaque.present) {
4506  		pAssocReq->addIEPresent = 1;
4507  		convert_wfd_opaque(mac, &pAssocReq->addIE, &ar->WFDIEOpaque);
4508  	}
4509  #endif
4510  	if (ar->SuppOperatingClasses.present) {
4511  		uint8_t num_classes = ar->SuppOperatingClasses.num_classes;
4512  
4513  		if (num_classes > sizeof(ar->SuppOperatingClasses.classes))
4514  			num_classes =
4515  				sizeof(ar->SuppOperatingClasses.classes);
4516  		qdf_mem_copy(&pAssocReq->supp_operating_classes,
4517  			     &ar->SuppOperatingClasses,
4518  			     sizeof(tDot11fIESuppOperatingClasses));
4519  		QDF_TRACE_HEX_DUMP(
4520  			QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
4521  			ar->SuppOperatingClasses.classes, num_classes);
4522  	}
4523  	if (ar->VHTCaps.present) {
4524  		qdf_mem_copy(&pAssocReq->VHTCaps, &ar->VHTCaps,
4525  			     sizeof(tDot11fIEVHTCaps));
4526  	}
4527  	if (ar->OperatingMode.present) {
4528  		qdf_mem_copy(&pAssocReq->operMode, &ar->OperatingMode,
4529  			     sizeof(tDot11fIEOperatingMode));
4530  		pe_warn("Received Assoc Req with Operating Mode IE");
4531  		lim_log_operating_mode(mac, &pAssocReq->operMode);
4532  	}
4533  	if (ar->ExtCap.present) {
4534  		struct s_ext_cap *ext_cap;
4535  
4536  		qdf_mem_copy(&pAssocReq->ExtCap, &ar->ExtCap,
4537  			     sizeof(tDot11fIEExtCap));
4538  		ext_cap = (struct s_ext_cap *)&pAssocReq->ExtCap.bytes;
4539  		pe_debug("timingMeas: %d, finetimingMeas Init: %d, Resp: %d",
4540  			ext_cap->timing_meas, ext_cap->fine_time_meas_initiator,
4541  			ext_cap->fine_time_meas_responder);
4542  	}
4543  	if (ar->he_cap.present) {
4544  		qdf_mem_copy(&pAssocReq->he_cap, &ar->he_cap,
4545  			     sizeof(tDot11fIEhe_cap));
4546  	}
4547  	if (ar->he_6ghz_band_cap.present) {
4548  		qdf_mem_copy(&pAssocReq->he_6ghz_band_cap,
4549  			     &ar->he_6ghz_band_cap,
4550  			     sizeof(tDot11fIEhe_6ghz_band_cap));
4551  	}
4552  
4553  	sir_convert_reassoc_req_frame2_eht_struct(ar, pAssocReq);
4554  	sir_convert_reassoc_req_frame2_mlo_struct(pFrame, nFrame,
4555  						  ar, pAssocReq);
4556  	pe_debug("ht %d vht %d opmode %d vendor vht %d he %d he 6ghband %d eht %d",
4557  		 ar->HTCaps.present, ar->VHTCaps.present,
4558  		 ar->OperatingMode.present, ar->vendor_vht_ie.VHTCaps.present,
4559  		 ar->he_cap.present, ar->he_6ghz_band_cap.present,
4560  		 ar->eht_cap.present);
4561  	qdf_mem_free(ar);
4562  
4563  	return STATUS_SUCCESS;
4564  
4565  } /* End sir_convert_reassoc_req_frame2_struct. */
4566  
4567  #ifdef FEATURE_WLAN_ESE
4568  QDF_STATUS
4569  sir_beacon_ie_ese_bcn_report(struct mac_context *mac,
4570  	uint8_t *pPayload, const uint32_t nPayload,
4571  	uint8_t **outIeBuf, uint32_t *pOutIeLen)
4572  {
4573  	tDot11fBeaconIEs *pBies = NULL;
4574  	uint32_t status = QDF_STATUS_SUCCESS;
4575  	QDF_STATUS retStatus = QDF_STATUS_SUCCESS;
4576  	tSirEseBcnReportMandatoryIe eseBcnReportMandatoryIe;
4577  
4578  	/* To store how many bytes are required to be allocated
4579  	   for Bcn report mandatory Ies */
4580  	uint16_t numBytes = 0, freeBytes = 0;
4581  	uint8_t *pos = NULL;
4582  	uint32_t freq;
4583  
4584  	freq = WMA_GET_RX_FREQ(pPayload);
4585  	/* Zero-init our [out] parameter, */
4586  	qdf_mem_zero((uint8_t *) &eseBcnReportMandatoryIe,
4587  		    sizeof(eseBcnReportMandatoryIe));
4588  	pBies = qdf_mem_malloc(sizeof(tDot11fBeaconIEs));
4589  	if (!pBies)
4590  		return QDF_STATUS_E_NOMEM;
4591  	qdf_mem_zero(pBies, sizeof(tDot11fBeaconIEs));
4592  	/* delegate to the framesc-generated code, */
4593  	status = dot11f_unpack_beacon_i_es(mac, pPayload, nPayload,
4594  					   pBies, false);
4595  
4596  	if (DOT11F_FAILED(status)) {
4597  		pe_err("Failed to parse Beacon IEs (0x%08x, %d bytes):",
4598  			status, nPayload);
4599  		qdf_mem_free(pBies);
4600  		return QDF_STATUS_E_FAILURE;
4601  	} else if (DOT11F_WARNED(status)) {
4602  		pe_debug("There were warnings while unpacking Beacon IEs (0x%08x, %d bytes):",
4603  			status, nPayload);
4604  	}
4605  
4606  	status = lim_strip_and_decode_eht_op(pPayload + WLAN_BEACON_IES_OFFSET,
4607  					     nPayload - WLAN_BEACON_IES_OFFSET,
4608  					     &pBies->eht_op,
4609  					     pBies->VHTOperation,
4610  					     pBies->he_op,
4611  					     pBies->HTInfo);
4612  	if (status != QDF_STATUS_SUCCESS) {
4613  		pe_err("Failed to extract eht op");
4614  		qdf_mem_free(pBies);
4615  		return status;
4616  	}
4617  
4618  	status = lim_strip_and_decode_eht_cap(pPayload + WLAN_BEACON_IES_OFFSET,
4619  					      nPayload - WLAN_BEACON_IES_OFFSET,
4620  					      &pBies->eht_cap,
4621  					      pBies->he_cap,
4622  					      freq);
4623  	if (status != QDF_STATUS_SUCCESS) {
4624  		pe_err("Failed to extract eht cap");
4625  		qdf_mem_free(pBies);
4626  		return status;
4627  	}
4628  
4629  	/* & "transliterate" from a 'tDot11fBeaconIEs' to a 'eseBcnReportMandatoryIe'... */
4630  	if (!pBies->SSID.present) {
4631  		pe_debug("Mandatory IE SSID not present!");
4632  	} else {
4633  		eseBcnReportMandatoryIe.ssidPresent = 1;
4634  		convert_ssid(mac, &eseBcnReportMandatoryIe.ssId, &pBies->SSID);
4635  		/* 1 for EID, 1 for length and length bytes */
4636  		numBytes += 1 + 1 + eseBcnReportMandatoryIe.ssId.length;
4637  	}
4638  
4639  	if (!pBies->SuppRates.present) {
4640  		pe_debug_rl("Mandatory IE Supported Rates not present!");
4641  	} else {
4642  		eseBcnReportMandatoryIe.suppRatesPresent = 1;
4643  		convert_supp_rates(mac, &eseBcnReportMandatoryIe.supportedRates,
4644  				   &pBies->SuppRates);
4645  		numBytes +=
4646  			1 + 1 + eseBcnReportMandatoryIe.supportedRates.numRates;
4647  	}
4648  
4649  	if (pBies->FHParamSet.present) {
4650  		eseBcnReportMandatoryIe.fhParamPresent = 1;
4651  		convert_fh_params(mac, &eseBcnReportMandatoryIe.fhParamSet,
4652  				  &pBies->FHParamSet);
4653  		numBytes += 1 + 1 + WLAN_FH_PARAM_IE_MAX_LEN;
4654  	}
4655  
4656  	if (pBies->DSParams.present) {
4657  		eseBcnReportMandatoryIe.dsParamsPresent = 1;
4658  		eseBcnReportMandatoryIe.dsParamSet.channelNumber =
4659  			pBies->DSParams.curr_channel;
4660  		numBytes += 1 + 1 + WLAN_DS_PARAM_IE_MAX_LEN;
4661  	}
4662  
4663  	if (pBies->CFParams.present) {
4664  		eseBcnReportMandatoryIe.cfPresent = 1;
4665  		convert_cf_params(mac, &eseBcnReportMandatoryIe.cfParamSet,
4666  				  &pBies->CFParams);
4667  		numBytes += 1 + 1 + WLAN_CF_PARAM_IE_MAX_LEN;
4668  	}
4669  
4670  	if (pBies->TIM.present) {
4671  		eseBcnReportMandatoryIe.timPresent = 1;
4672  		eseBcnReportMandatoryIe.tim.dtimCount = pBies->TIM.dtim_count;
4673  		eseBcnReportMandatoryIe.tim.dtimPeriod = pBies->TIM.dtim_period;
4674  		eseBcnReportMandatoryIe.tim.bitmapControl = pBies->TIM.bmpctl;
4675  		/* As per the ESE spec, May truncate and report first 4 octets only */
4676  		numBytes += 1 + 1 + SIR_MAC_TIM_EID_MIN;
4677  	}
4678  
4679  	if (pBies->RRMEnabledCap.present) {
4680  		eseBcnReportMandatoryIe.rrmPresent = 1;
4681  		qdf_mem_copy(&eseBcnReportMandatoryIe.rmEnabledCapabilities,
4682  			     &pBies->RRMEnabledCap,
4683  			     sizeof(tDot11fIERRMEnabledCap));
4684  		numBytes += 1 + 1 + WLAN_RM_CAPABILITY_IE_MAX_LEN;
4685  	}
4686  
4687  	*outIeBuf = qdf_mem_malloc(numBytes);
4688  	if (!*outIeBuf) {
4689  		qdf_mem_free(pBies);
4690  		return QDF_STATUS_E_NOMEM;
4691  	}
4692  	pos = *outIeBuf;
4693  	*pOutIeLen = numBytes;
4694  	freeBytes = numBytes;
4695  
4696  	/* Start filling the output Ie with Mandatory IE information */
4697  	/* Fill SSID IE */
4698  	if (eseBcnReportMandatoryIe.ssidPresent) {
4699  		if (freeBytes < (1 + 1 + eseBcnReportMandatoryIe.ssId.length)) {
4700  			pe_err("Insufficient memory to copy SSID");
4701  			retStatus = QDF_STATUS_E_FAILURE;
4702  			goto err_bcnrep;
4703  		}
4704  		*pos = WLAN_ELEMID_SSID;
4705  		pos++;
4706  		*pos = eseBcnReportMandatoryIe.ssId.length;
4707  		pos++;
4708  		qdf_mem_copy(pos,
4709  			     (uint8_t *) eseBcnReportMandatoryIe.ssId.ssId,
4710  			     eseBcnReportMandatoryIe.ssId.length);
4711  		pos += eseBcnReportMandatoryIe.ssId.length;
4712  		freeBytes -= (1 + 1 + eseBcnReportMandatoryIe.ssId.length);
4713  	}
4714  
4715  	/* Fill Supported Rates IE */
4716  	if (eseBcnReportMandatoryIe.suppRatesPresent) {
4717  		if (freeBytes <
4718  		    (1 + 1 + eseBcnReportMandatoryIe.supportedRates.numRates)) {
4719  			pe_err("Insufficient memory to copy Rates IE");
4720  			retStatus = QDF_STATUS_E_FAILURE;
4721  			goto err_bcnrep;
4722  		}
4723  		if (eseBcnReportMandatoryIe.supportedRates.numRates <=
4724  			WLAN_SUPPORTED_RATES_IE_MAX_LEN) {
4725  			*pos = WLAN_ELEMID_RATES;
4726  			pos++;
4727  			*pos = eseBcnReportMandatoryIe.supportedRates.numRates;
4728  			pos++;
4729  			qdf_mem_copy(pos,
4730  			     (uint8_t *) eseBcnReportMandatoryIe.supportedRates.
4731  			     rate,
4732  			     eseBcnReportMandatoryIe.supportedRates.numRates);
4733  			pos += eseBcnReportMandatoryIe.supportedRates.numRates;
4734  			freeBytes -=
4735  			(1 + 1 +
4736  			 eseBcnReportMandatoryIe.supportedRates.numRates);
4737  		}
4738  	}
4739  
4740  	/* Fill FH Parameter set IE */
4741  	if (eseBcnReportMandatoryIe.fhParamPresent) {
4742  		if (freeBytes < (1 + 1 + WLAN_FH_PARAM_IE_MAX_LEN)) {
4743  			pe_err("Insufficient memory to copy FHIE");
4744  			retStatus = QDF_STATUS_E_FAILURE;
4745  			goto err_bcnrep;
4746  		}
4747  		*pos = WLAN_ELEMID_FHPARMS;
4748  		pos++;
4749  		*pos = WLAN_FH_PARAM_IE_MAX_LEN;
4750  		pos++;
4751  		qdf_mem_copy(pos,
4752  			     (uint8_t *) &eseBcnReportMandatoryIe.fhParamSet,
4753  			     WLAN_FH_PARAM_IE_MAX_LEN);
4754  		pos += WLAN_FH_PARAM_IE_MAX_LEN;
4755  		freeBytes -= (1 + 1 + WLAN_FH_PARAM_IE_MAX_LEN);
4756  	}
4757  
4758  	/* Fill DS Parameter set IE */
4759  	if (eseBcnReportMandatoryIe.dsParamsPresent) {
4760  		if (freeBytes < (1 + 1 + WLAN_DS_PARAM_IE_MAX_LEN)) {
4761  			pe_err("Insufficient memory to copy DS IE");
4762  			retStatus = QDF_STATUS_E_FAILURE;
4763  			goto err_bcnrep;
4764  		}
4765  		*pos = WLAN_ELEMID_DSPARMS;
4766  		pos++;
4767  		*pos = WLAN_DS_PARAM_IE_MAX_LEN;
4768  		pos++;
4769  		*pos = eseBcnReportMandatoryIe.dsParamSet.channelNumber;
4770  		pos += WLAN_DS_PARAM_IE_MAX_LEN;
4771  		freeBytes -= (1 + 1 + WLAN_DS_PARAM_IE_MAX_LEN);
4772  	}
4773  
4774  	/* Fill CF Parameter set */
4775  	if (eseBcnReportMandatoryIe.cfPresent) {
4776  		if (freeBytes < (1 + 1 + WLAN_CF_PARAM_IE_MAX_LEN)) {
4777  			pe_err("Insufficient memory to copy CF IE");
4778  			retStatus = QDF_STATUS_E_FAILURE;
4779  			goto err_bcnrep;
4780  		}
4781  		*pos = WLAN_ELEMID_CFPARMS;
4782  		pos++;
4783  		*pos = WLAN_CF_PARAM_IE_MAX_LEN;
4784  		pos++;
4785  		qdf_mem_copy(pos,
4786  			     (uint8_t *) &eseBcnReportMandatoryIe.cfParamSet,
4787  			     WLAN_CF_PARAM_IE_MAX_LEN);
4788  		pos += WLAN_CF_PARAM_IE_MAX_LEN;
4789  		freeBytes -= (1 + 1 + WLAN_CF_PARAM_IE_MAX_LEN);
4790  	}
4791  
4792  	/* Fill TIM IE */
4793  	if (eseBcnReportMandatoryIe.timPresent) {
4794  		if (freeBytes < (1 + 1 + SIR_MAC_TIM_EID_MIN)) {
4795  			pe_err("Insufficient memory to copy TIM IE");
4796  			retStatus = QDF_STATUS_E_FAILURE;
4797  			goto err_bcnrep;
4798  		}
4799  		*pos = WLAN_ELEMID_TIM;
4800  		pos++;
4801  		*pos = SIR_MAC_TIM_EID_MIN;
4802  		pos++;
4803  		qdf_mem_copy(pos,
4804  			     (uint8_t *) &eseBcnReportMandatoryIe.tim,
4805  			     SIR_MAC_TIM_EID_MIN);
4806  		pos += SIR_MAC_TIM_EID_MIN;
4807  		freeBytes -= (1 + 1 + SIR_MAC_TIM_EID_MIN);
4808  	}
4809  
4810  	/* Fill RM Capability IE */
4811  	if (eseBcnReportMandatoryIe.rrmPresent) {
4812  		if (freeBytes < (1 + 1 + WLAN_RM_CAPABILITY_IE_MAX_LEN)) {
4813  			pe_err("Insufficient memory to copy RRM IE");
4814  			retStatus = QDF_STATUS_E_FAILURE;
4815  			goto err_bcnrep;
4816  		}
4817  		*pos = WLAN_ELEMID_RRM;
4818  		pos++;
4819  		*pos = WLAN_RM_CAPABILITY_IE_MAX_LEN;
4820  		pos++;
4821  		qdf_mem_copy(pos,
4822  			     (uint8_t *) &eseBcnReportMandatoryIe.
4823  			     rmEnabledCapabilities,
4824  			     WLAN_RM_CAPABILITY_IE_MAX_LEN);
4825  		freeBytes -= (1 + 1 + WLAN_RM_CAPABILITY_IE_MAX_LEN);
4826  	}
4827  
4828  	if (freeBytes != 0) {
4829  		pe_err("Mismatch in allocation and copying of IE in Bcn Rep");
4830  		retStatus = QDF_STATUS_E_FAILURE;
4831  	}
4832  
4833  err_bcnrep:
4834  	/* The message counter would not be incremented in case of
4835  	 * returning failure and hence next time, this function gets
4836  	 * called, it would be using the same msg ctr for a different
4837  	 * BSS.So, it is good to clear the memory allocated for a BSS
4838  	 * that is returning failure.On success, the caller would take
4839  	 * care of freeing up the memory*/
4840  	if (retStatus == QDF_STATUS_E_FAILURE) {
4841  		qdf_mem_free(*outIeBuf);
4842  		*outIeBuf = NULL;
4843  	}
4844  
4845  	qdf_mem_free(pBies);
4846  	return retStatus;
4847  }
4848  
4849  #endif /* FEATURE_WLAN_ESE */
4850  
4851  #ifdef WLAN_FEATURE_11AX_BSS_COLOR
4852  static void update_bss_color_change_from_beacon_ies(tDot11fBeaconIEs *bcn_ies,
4853  		tpSirProbeRespBeacon bcn_struct)
4854  {
4855  	if (bcn_ies->bss_color_change.present) {
4856  		qdf_mem_copy(&bcn_struct->vendor_he_bss_color_change,
4857  			     &bcn_ies->bss_color_change,
4858  			     sizeof(tDot11fIEbss_color_change));
4859  	}
4860  }
4861  #else
4862  static inline void update_bss_color_change_from_beacon_ies(
4863  		tDot11fBeaconIEs *bcn_ies,
4864  		tpSirProbeRespBeacon bcn_struct)
4865  {}
4866  #endif
4867  
4868  QDF_STATUS
4869  sir_parse_beacon_ie(struct mac_context *mac,
4870  		    tpSirProbeRespBeacon pBeaconStruct,
4871  		    uint8_t *pPayload, uint32_t nPayload)
4872  {
4873  	tDot11fBeaconIEs *pBies;
4874  	uint32_t status;
4875  	uint32_t freq;
4876  
4877  	freq = WMA_GET_RX_FREQ(pPayload);
4878  	/* Zero-init our [out] parameter, */
4879  	qdf_mem_zero((uint8_t *) pBeaconStruct, sizeof(tSirProbeRespBeacon));
4880  
4881  	pBies = qdf_mem_malloc(sizeof(tDot11fBeaconIEs));
4882  	if (!pBies)
4883  		return QDF_STATUS_E_NOMEM;
4884  	qdf_mem_zero(pBies, sizeof(tDot11fBeaconIEs));
4885  	/* delegate to the framesc-generated code, */
4886  	status = dot11f_unpack_beacon_i_es(mac, pPayload, nPayload,
4887  					   pBies, false);
4888  
4889  	if (DOT11F_FAILED(status)) {
4890  		pe_err("Failed to parse Beacon IEs (0x%08x, %d bytes):",
4891  			status, nPayload);
4892  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
4893  				   pPayload, nPayload);
4894  		qdf_mem_free(pBies);
4895  		return QDF_STATUS_E_FAILURE;
4896  	} else if (DOT11F_WARNED(status)) {
4897  		pe_debug("warnings (0x%08x, %d bytes):", status, nPayload);
4898  	}
4899  
4900  	status = lim_strip_and_decode_eht_op(pPayload,
4901  					     nPayload,
4902  					     &pBies->eht_op,
4903  					     pBies->VHTOperation,
4904  					     pBies->he_op,
4905  					     pBies->HTInfo);
4906  	if (status != QDF_STATUS_SUCCESS) {
4907  		pe_err("Failed to extract eht op");
4908  		qdf_mem_free(pBies);
4909  		return QDF_STATUS_E_FAILURE;
4910  	}
4911  
4912  	status = lim_strip_and_decode_eht_cap(pPayload,
4913  					      nPayload,
4914  					      &pBies->eht_cap,
4915  					      pBies->he_cap,
4916  					      freq);
4917  	if (status != QDF_STATUS_SUCCESS) {
4918  		pe_err("Failed to extract eht cap");
4919  		qdf_mem_free(pBies);
4920  		return QDF_STATUS_E_FAILURE;
4921  	}
4922  
4923  	/* & "transliterate" from a 'tDot11fBeaconIEs' to a 'tSirProbeRespBeacon'... */
4924  	if (!pBies->SSID.present) {
4925  		pe_debug("Mandatory IE SSID not present!");
4926  	} else {
4927  		pBeaconStruct->ssidPresent = 1;
4928  		convert_ssid(mac, &pBeaconStruct->ssId, &pBies->SSID);
4929  	}
4930  
4931  	if (!pBies->SuppRates.present) {
4932  		pe_debug_rl("Mandatory IE Supported Rates not present!");
4933  	} else {
4934  		pBeaconStruct->suppRatesPresent = 1;
4935  		convert_supp_rates(mac, &pBeaconStruct->supportedRates,
4936  				   &pBies->SuppRates);
4937  	}
4938  
4939  	if (pBies->ExtSuppRates.present) {
4940  		pBeaconStruct->extendedRatesPresent = 1;
4941  		convert_ext_supp_rates(mac, &pBeaconStruct->extendedRates,
4942  				       &pBies->ExtSuppRates);
4943  	}
4944  
4945  	if (pBies->CFParams.present) {
4946  		pBeaconStruct->cfPresent = 1;
4947  		convert_cf_params(mac, &pBeaconStruct->cfParamSet,
4948  				  &pBies->CFParams);
4949  	}
4950  
4951  	if (pBies->TIM.present) {
4952  		pBeaconStruct->timPresent = 1;
4953  		convert_tim(mac, &pBeaconStruct->tim, &pBies->TIM);
4954  	}
4955  
4956  	if (pBies->Country.present) {
4957  		pBeaconStruct->countryInfoPresent = 1;
4958  		convert_country(mac, &pBeaconStruct->countryInfoParam,
4959  				&pBies->Country);
4960  	}
4961  	/* 11h IEs */
4962  	if (pBies->TPCReport.present) {
4963  		pBeaconStruct->tpcReportPresent = 1;
4964  		qdf_mem_copy(&pBeaconStruct->tpcReport,
4965  			     &pBies->TPCReport, sizeof(tDot11fIETPCReport));
4966  	}
4967  
4968  	if (pBies->PowerConstraints.present) {
4969  		pBeaconStruct->powerConstraintPresent = 1;
4970  		qdf_mem_copy(&pBeaconStruct->localPowerConstraint,
4971  			     &pBies->PowerConstraints,
4972  			     sizeof(tDot11fIEPowerConstraints));
4973  	}
4974  #ifdef FEATURE_WLAN_ESE
4975  	if (pBies->ESEVersion.present)
4976  		pBeaconStruct->is_ese_ver_ie_present = 1;
4977  	if (pBies->ESETxmitPower.present) {
4978  		pBeaconStruct->eseTxPwr.present = 1;
4979  		pBeaconStruct->eseTxPwr.power_limit =
4980  			pBies->ESETxmitPower.power_limit;
4981  	}
4982  	if (pBies->QBSSLoad.present) {
4983  		qdf_mem_copy(&pBeaconStruct->QBSSLoad, &pBies->QBSSLoad,
4984  			     sizeof(tDot11fIEQBSSLoad));
4985  	}
4986  #endif
4987  
4988  	if (pBies->EDCAParamSet.present) {
4989  		pBeaconStruct->edcaPresent = 1;
4990  		convert_edca_param(mac, &pBeaconStruct->edcaParams,
4991  				   &pBies->EDCAParamSet);
4992  	}
4993  	/* QOS Capabilities: */
4994  	if (pBies->QOSCapsAp.present) {
4995  		pBeaconStruct->qosCapabilityPresent = 1;
4996  		convert_qos_caps(mac, &pBeaconStruct->qosCapability,
4997  				 &pBies->QOSCapsAp);
4998  	}
4999  
5000  	if (pBies->ChanSwitchAnn.present) {
5001  		pBeaconStruct->channelSwitchPresent = 1;
5002  		qdf_mem_copy(&pBeaconStruct->channelSwitchIE,
5003  			     &pBies->ChanSwitchAnn,
5004  			     sizeof(pBeaconStruct->channelSwitchIE));
5005  	}
5006  
5007  	if (pBies->SuppOperatingClasses.present) {
5008  		pBeaconStruct->supp_operating_class_present = 1;
5009  		qdf_mem_copy(&pBeaconStruct->supp_operating_classes,
5010  			&pBies->SuppOperatingClasses,
5011  			sizeof(tDot11fIESuppOperatingClasses));
5012  	}
5013  
5014  	if (pBies->ext_chan_switch_ann.present) {
5015  		pBeaconStruct->ext_chan_switch_present = 1;
5016  		qdf_mem_copy(&pBeaconStruct->ext_chan_switch,
5017  			     &pBies->ext_chan_switch_ann,
5018  			     sizeof(tDot11fIEext_chan_switch_ann));
5019  	}
5020  
5021  	if (pBies->sec_chan_offset_ele.present) {
5022  		pBeaconStruct->sec_chan_offset_present = 1;
5023  		qdf_mem_copy(&pBeaconStruct->sec_chan_offset,
5024  			     &pBies->sec_chan_offset_ele,
5025  			     sizeof(pBeaconStruct->sec_chan_offset));
5026  	}
5027  
5028  	if (pBies->Quiet.present) {
5029  		pBeaconStruct->quietIEPresent = 1;
5030  		qdf_mem_copy(&pBeaconStruct->quietIE, &pBies->Quiet,
5031  			     sizeof(tDot11fIEQuiet));
5032  	}
5033  
5034  	if (pBies->HTCaps.present) {
5035  		qdf_mem_copy(&pBeaconStruct->HTCaps, &pBies->HTCaps,
5036  			     sizeof(tDot11fIEHTCaps));
5037  	}
5038  
5039  	if (pBies->HTInfo.present) {
5040  		qdf_mem_copy(&pBeaconStruct->HTInfo, &pBies->HTInfo,
5041  			     sizeof(tDot11fIEHTInfo));
5042  	}
5043  
5044  	if (pBies->he_op.oper_info_6g_present) {
5045  		pBeaconStruct->chan_freq = wlan_reg_chan_band_to_freq(mac->pdev,
5046  						pBies->he_op.oper_info_6g.info.primary_ch,
5047  						BIT(REG_BAND_6G));
5048  	} else if (pBies->DSParams.present) {
5049  		pBeaconStruct->dsParamsPresent = 1;
5050  		pBeaconStruct->chan_freq =
5051  		    wlan_reg_legacy_chan_to_freq(mac->pdev,
5052  						 pBies->DSParams.curr_channel);
5053  	} else if (pBies->HTInfo.present) {
5054  		pBeaconStruct->chan_freq =
5055  		    wlan_reg_legacy_chan_to_freq(mac->pdev,
5056  						 pBies->HTInfo.primaryChannel);
5057  	}
5058  
5059  	if (pBies->RSN.present) {
5060  		pBeaconStruct->rsnPresent = 1;
5061  		convert_rsn(mac, &pBeaconStruct->rsn, &pBies->RSN);
5062  	}
5063  
5064  	if (pBies->WPA.present) {
5065  		pBeaconStruct->wpaPresent = 1;
5066  		convert_wpa(mac, &pBeaconStruct->wpa, &pBies->WPA);
5067  	}
5068  
5069  	if (pBies->WMMParams.present) {
5070  		pBeaconStruct->wmeEdcaPresent = 1;
5071  		convert_wmm_params(mac, &pBeaconStruct->edcaParams,
5072  				   &pBies->WMMParams);
5073  		qdf_mem_copy(&pBeaconStruct->wmm_params, &pBies->WMMParams,
5074  			     sizeof(tDot11fIEWMMParams));
5075  	}
5076  
5077  	if (pBies->WMMInfoAp.present) {
5078  		pBeaconStruct->wmeInfoPresent = 1;
5079  	}
5080  
5081  	if (pBies->WMMCaps.present) {
5082  		pBeaconStruct->wsmCapablePresent = 1;
5083  	}
5084  
5085  	if (pBies->ERPInfo.present) {
5086  		pBeaconStruct->erpPresent = 1;
5087  		convert_erp_info(mac, &pBeaconStruct->erpIEInfo,
5088  				 &pBies->ERPInfo);
5089  	}
5090  	if (pBies->VHTCaps.present) {
5091  		pBeaconStruct->VHTCaps.present = 1;
5092  		qdf_mem_copy(&pBeaconStruct->VHTCaps, &pBies->VHTCaps,
5093  			     sizeof(tDot11fIEVHTCaps));
5094  	}
5095  	if (pBies->VHTOperation.present) {
5096  		pBeaconStruct->VHTOperation.present = 1;
5097  		qdf_mem_copy(&pBeaconStruct->VHTOperation, &pBies->VHTOperation,
5098  			     sizeof(tDot11fIEVHTOperation));
5099  	}
5100  	if (pBies->VHTExtBssLoad.present) {
5101  		pBeaconStruct->VHTExtBssLoad.present = 1;
5102  		qdf_mem_copy(&pBeaconStruct->VHTExtBssLoad,
5103  			     &pBies->VHTExtBssLoad,
5104  			     sizeof(tDot11fIEVHTExtBssLoad));
5105  	}
5106  	if (pBies->OperatingMode.present) {
5107  		pBeaconStruct->OperatingMode.present = 1;
5108  		qdf_mem_copy(&pBeaconStruct->OperatingMode,
5109  			     &pBies->OperatingMode,
5110  			     sizeof(tDot11fIEOperatingMode));
5111  	}
5112  	if (pBies->MobilityDomain.present) {
5113  		pBeaconStruct->mdiePresent = 1;
5114  		qdf_mem_copy(pBeaconStruct->mdie, &pBies->MobilityDomain.MDID,
5115  			     SIR_MDIE_SIZE);
5116  	}
5117  
5118  	pBeaconStruct->Vendor1IEPresent = pBies->Vendor1IE.present;
5119  	pBeaconStruct->Vendor3IEPresent = pBies->Vendor3IE.present;
5120  	pBeaconStruct->vendor_vht_ie.present = pBies->vendor_vht_ie.present;
5121  	if (pBies->vendor_vht_ie.present)
5122  		pBeaconStruct->vendor_vht_ie.sub_type =
5123  						pBies->vendor_vht_ie.sub_type;
5124  
5125  	if (pBies->vendor_vht_ie.VHTCaps.present) {
5126  		pBeaconStruct->vendor_vht_ie.VHTCaps.present = 1;
5127  		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTCaps,
5128  				&pBies->vendor_vht_ie.VHTCaps,
5129  				sizeof(tDot11fIEVHTCaps));
5130  	}
5131  	if (pBies->vendor_vht_ie.VHTOperation.present) {
5132  		pBeaconStruct->vendor_vht_ie.VHTOperation.present = 1;
5133  		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTOperation,
5134  				&pBies->vendor_vht_ie.VHTOperation,
5135  				sizeof(tDot11fIEVHTOperation));
5136  	}
5137  	if (pBies->ExtCap.present) {
5138  		qdf_mem_copy(&pBeaconStruct->ext_cap, &pBies->ExtCap,
5139  				sizeof(tDot11fIEExtCap));
5140  	}
5141  	/* Update HS 2.0 Information Element */
5142  	if (pBies->hs20vendor_ie.present) {
5143  		pe_debug("HS20 Indication Element Present, rel#:%u, id:%u",
5144  			pBies->hs20vendor_ie.release_num,
5145  			pBies->hs20vendor_ie.hs_id_present);
5146  		qdf_mem_copy(&pBeaconStruct->hs20vendor_ie,
5147  			&pBies->hs20vendor_ie,
5148  			sizeof(tDot11fIEhs20vendor_ie) -
5149  			sizeof(pBies->hs20vendor_ie.hs_id));
5150  		if (pBies->hs20vendor_ie.hs_id_present)
5151  			qdf_mem_copy(&pBeaconStruct->hs20vendor_ie.hs_id,
5152  				&pBies->hs20vendor_ie.hs_id,
5153  				sizeof(pBies->hs20vendor_ie.hs_id));
5154  	}
5155  
5156  	if (pBies->MBO_IE.present) {
5157  		pBeaconStruct->MBO_IE_present = true;
5158  		if (pBies->MBO_IE.cellular_data_cap.present)
5159  			pBeaconStruct->MBO_capability =
5160  				pBies->MBO_IE.cellular_data_cap.cellular_connectivity;
5161  
5162  		if (pBies->MBO_IE.assoc_disallowed.present) {
5163  			pBeaconStruct->assoc_disallowed = true;
5164  			pBeaconStruct->assoc_disallowed_reason =
5165  				pBies->MBO_IE.assoc_disallowed.reason_code;
5166  		}
5167  	}
5168  
5169  	if (pBies->qcn_ie.present)
5170  		qdf_mem_copy(&pBeaconStruct->qcn_ie, &pBies->qcn_ie,
5171  			     sizeof(tDot11fIEqcn_ie));
5172  
5173  	if (pBies->he_cap.present) {
5174  		qdf_mem_copy(&pBeaconStruct->he_cap, &pBies->he_cap,
5175  			     sizeof(tDot11fIEhe_cap));
5176  	}
5177  	if (pBies->he_op.present) {
5178  		qdf_mem_copy(&pBeaconStruct->he_op, &pBies->he_op,
5179  			     sizeof(tDot11fIEhe_op));
5180  	}
5181  
5182  	if (pBies->eht_cap.present) {
5183  		qdf_mem_copy(&pBeaconStruct->eht_cap, &pBies->eht_cap,
5184  			     sizeof(tDot11fIEeht_cap));
5185  	}
5186  	if (pBies->eht_op.present) {
5187  		qdf_mem_copy(&pBeaconStruct->eht_op, &pBies->eht_op,
5188  			    sizeof(tDot11fIEeht_op));
5189  	}
5190  
5191  	update_bss_color_change_from_beacon_ies(pBies, pBeaconStruct);
5192  
5193  	qdf_mem_free(pBies);
5194  	return QDF_STATUS_SUCCESS;
5195  } /* End sir_parse_beacon_ie. */
5196  
5197  #ifdef WLAN_FEATURE_11AX_BSS_COLOR
5198  static void convert_bcon_bss_color_change_ie(tDot11fBeacon *bcn_frm,
5199  		tpSirProbeRespBeacon bcn_struct)
5200  {
5201  	if (bcn_frm->bss_color_change.present) {
5202  		pe_debug("11AX: HE BSS color change present");
5203  		qdf_mem_copy(&bcn_struct->vendor_he_bss_color_change,
5204  			     &bcn_frm->bss_color_change,
5205  			     sizeof(tDot11fIEbss_color_change));
5206  	}
5207  }
5208  #else
5209  static inline void convert_bcon_bss_color_change_ie(tDot11fBeacon *bcn_frm,
5210  		tpSirProbeRespBeacon bcn_struct)
5211  {}
5212  #endif
5213  
5214  #ifdef WLAN_FEATURE_SR
5215  static void sir_convert_beacon_frame2_sr_struct(tDot11fBeacon *bcn_frm,
5216  						tpSirProbeRespBeacon bcn_struct)
5217  {
5218  	if (bcn_frm->spatial_reuse.present)
5219  		qdf_mem_copy(&bcn_struct->srp_ie, &bcn_frm->spatial_reuse,
5220  			     sizeof(tDot11fIEspatial_reuse));
5221  }
5222  #else
5223  static inline void
5224  sir_convert_beacon_frame2_sr_struct(tDot11fBeacon *bcn_frm,
5225  				    tpSirProbeRespBeacon bcn_struct)
5226  {
5227  }
5228  #endif
5229  
5230  #ifdef WLAN_FEATURE_11BE_MLO
5231  static QDF_STATUS
5232  sir_convert_beacon_frame2_t2lm_struct(tDot11fBeacon *bcn_frm,
5233  				      tpSirProbeRespBeacon bcn_struct)
5234  {
5235  	QDF_STATUS status = QDF_STATUS_SUCCESS;
5236  	struct wlan_t2lm_context *t2lm_ctx;
5237  	/* add 3 bytes for extn_ie_header */
5238  	uint8_t ie[DOT11F_IE_T2LM_IE_MAX_LEN + 3];
5239  	struct wlan_t2lm_info t2lm;
5240  	uint8_t i;
5241  
5242  	t2lm_ctx = &bcn_struct->t2lm_ctx;
5243  	qdf_mem_zero(&t2lm_ctx->established_t2lm.t2lm,
5244  		     sizeof(struct wlan_t2lm_info));
5245  	t2lm_ctx->established_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
5246  
5247  	qdf_mem_zero(&t2lm_ctx->upcoming_t2lm.t2lm,
5248  		     sizeof(struct wlan_t2lm_info));
5249  	t2lm_ctx->upcoming_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
5250  
5251  	if (!bcn_frm->num_t2lm_ie)
5252  		return status;
5253  
5254  	pe_debug("Number of T2LM IEs in beacon %d", bcn_frm->num_t2lm_ie);
5255  	for (i = 0; i < bcn_frm->num_t2lm_ie; i++) {
5256  		qdf_mem_zero(&ie[0], DOT11F_IE_T2LM_IE_MAX_LEN + 3);
5257  		qdf_mem_zero(&t2lm, sizeof(struct wlan_t2lm_info));
5258  		ie[ID_POS] = WLAN_ELEMID_EXTN_ELEM;
5259  		ie[TAG_LEN_POS] = bcn_frm->t2lm_ie[i].num_data + 1;
5260  		ie[IDEXT_POS] = WLAN_EXTN_ELEMID_T2LM;
5261  		qdf_mem_copy(&ie[3], &bcn_frm->t2lm_ie[i].data[0],
5262  			     bcn_frm->t2lm_ie[i].num_data);
5263  		qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
5264  				   &ie[0], bcn_frm->t2lm_ie[i].num_data + 3);
5265  
5266  		if (ie[TAG_LEN_POS] + 2 > DOT11F_IE_T2LM_IE_MAX_LEN + 3) {
5267  			pe_debug("Invalid T2LM IE length");
5268  			return QDF_STATUS_E_PROTO;
5269  		}
5270  
5271  		status = wlan_mlo_parse_t2lm_info(&ie[0], &t2lm);
5272  		if (QDF_IS_STATUS_ERROR(status)) {
5273  			pe_debug("Parse T2LM IE fail");
5274  			return status;
5275  		}
5276  
5277  		if (!t2lm.mapping_switch_time_present &&
5278  		    t2lm.expected_duration_present) {
5279  			qdf_mem_copy(&t2lm_ctx->established_t2lm.t2lm, &t2lm,
5280  				     sizeof(struct wlan_t2lm_info));
5281  			pe_debug("Parse established T2LM IE success");
5282  		} else if (t2lm.mapping_switch_time_present) {
5283  			qdf_mem_copy(&t2lm_ctx->upcoming_t2lm.t2lm, &t2lm,
5284  				     sizeof(struct wlan_t2lm_info));
5285  			pe_debug("Parse upcoming T2LM IE success");
5286  		}
5287  		pe_debug("Parse T2LM IE success");
5288  	}
5289  	return status;
5290  }
5291  #else
5292  static inline QDF_STATUS
5293  sir_convert_beacon_frame2_t2lm_struct(tDot11fBeacon *bcn_frm,
5294  				      tpSirProbeRespBeacon bcn_struct)
5295  {
5296  	return QDF_STATUS_SUCCESS;
5297  }
5298  #endif
5299  
5300  #ifdef WLAN_FEATURE_11BE_MLO
5301  static QDF_STATUS
5302  sir_convert_beacon_frame2_mlo_struct(uint8_t *pframe, uint32_t nframe,
5303  				     tDot11fBeacon *bcn_frm,
5304  				     tpSirProbeRespBeacon bcn_struct)
5305  {
5306  	uint8_t *ml_ie, *sta_prof;
5307  	qdf_size_t ml_ie_total_len;
5308  	uint8_t common_info_len = 0;
5309  	struct mlo_partner_info partner_info;
5310  	QDF_STATUS status = QDF_STATUS_SUCCESS;
5311  	uint8_t bpcc;
5312  	bool bpcc_found;
5313  	bool ext_mld_cap_found = false;
5314  	uint16_t ext_mld_cap = 0;
5315  
5316  	if (bcn_frm->mlo_ie.present) {
5317  		status = util_find_mlie(pframe + WLAN_BEACON_IES_OFFSET,
5318  					nframe - WLAN_BEACON_IES_OFFSET,
5319  					&ml_ie, &ml_ie_total_len);
5320  		if (QDF_IS_STATUS_SUCCESS(status)) {
5321  			status = util_get_bvmlie_persta_partner_info(
5322  								ml_ie,
5323  								ml_ie_total_len,
5324  								&partner_info);
5325  			if (QDF_IS_STATUS_ERROR(status))
5326  				return status;
5327  			bcn_struct->mlo_ie.mlo_ie.num_sta_profile =
5328  						partner_info.num_partner_links;
5329  			util_get_mlie_common_info_len(ml_ie, ml_ie_total_len,
5330  						      &common_info_len);
5331  			sta_prof = ml_ie + sizeof(struct wlan_ie_multilink) +
5332  				   common_info_len;
5333  
5334  			lim_store_mlo_ie_raw_info(ml_ie, sta_prof,
5335  						  ml_ie_total_len,
5336  						  &bcn_struct->mlo_ie.mlo_ie);
5337  
5338  			util_get_bvmlie_ext_mld_cap_op_info(ml_ie,
5339  							    ml_ie_total_len,
5340  							    &ext_mld_cap_found,
5341  							    &ext_mld_cap);
5342  			if (ext_mld_cap_found) {
5343  				bcn_struct->mlo_ie.mlo_ie.ext_mld_capab_and_op_info.rec_max_simultaneous_links =
5344  				QDF_GET_BITS(
5345  				ext_mld_cap,
5346  				WLAN_ML_BV_CINFO_EXTMLDCAPINFO_RECOM_MAX_SIMULT_LINKS_IDX,
5347  				WLAN_ML_BV_CINFO_EXTMLDCAPINFO_RECOM_MAX_SIMULT_LINKS_BITS);
5348  			}
5349  			util_get_bvmlie_bssparamchangecnt(ml_ie,
5350  							  ml_ie_total_len,
5351  							  &bpcc_found, &bpcc);
5352  			bcn_struct->mlo_ie.mlo_ie.bss_param_change_cnt_present =
5353  						bpcc_found;
5354  			bcn_struct->mlo_ie.mlo_ie.bss_param_change_count = bpcc;
5355  			bcn_struct->mlo_ie.mlo_ie_present = true;
5356  		}
5357  	}
5358  
5359  	return status;
5360  }
5361  #else
5362  static inline QDF_STATUS
5363  sir_convert_beacon_frame2_mlo_struct(uint8_t *pframe, uint32_t nframe,
5364  				     tDot11fBeacon *bcn_frm,
5365  				     tpSirProbeRespBeacon bcn_struct)
5366  {
5367  	return QDF_STATUS_SUCCESS;
5368  }
5369  #endif
5370  
5371  QDF_STATUS
5372  sir_convert_beacon_frame2_struct(struct mac_context *mac,
5373  				 uint8_t *pFrame,
5374  				 tpSirProbeRespBeacon pBeaconStruct)
5375  {
5376  	tDot11fBeacon *pBeacon;
5377  	uint32_t status, nPayload;
5378  	uint8_t *pPayload;
5379  	tpSirMacMgmtHdr pHdr;
5380  	uint32_t freq;
5381  
5382  	pPayload = WMA_GET_RX_MPDU_DATA(pFrame);
5383  	nPayload = WMA_GET_RX_PAYLOAD_LEN(pFrame);
5384  	pHdr = WMA_GET_RX_MAC_HEADER(pFrame);
5385  	freq = WMA_GET_RX_FREQ(pFrame);
5386  
5387  	/* Zero-init our [out] parameter, */
5388  	qdf_mem_zero((uint8_t *) pBeaconStruct, sizeof(tSirProbeRespBeacon));
5389  
5390  	pBeacon = qdf_mem_malloc_atomic(sizeof(tDot11fBeacon));
5391  	if (!pBeacon)
5392  		return QDF_STATUS_E_NOMEM;
5393  
5394  	/* get the MAC address out of the BD, */
5395  	qdf_mem_copy(pBeaconStruct->bssid, pHdr->sa, 6);
5396  
5397  	/* delegate to the framesc-generated code, */
5398  	status = dot11f_unpack_beacon(mac, pPayload, nPayload, pBeacon, false);
5399  	if (DOT11F_FAILED(status)) {
5400  		pe_err("Failed to parse Beacon IEs (0x%08x, %d bytes):",
5401  			status, nPayload);
5402  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
5403  				   pPayload, nPayload);
5404  		qdf_mem_free(pBeacon);
5405  		return QDF_STATUS_E_FAILURE;
5406  	}
5407  
5408  	status = lim_strip_and_decode_eht_op(pPayload + WLAN_BEACON_IES_OFFSET,
5409  					     nPayload - WLAN_BEACON_IES_OFFSET,
5410  					     &pBeacon->eht_op,
5411  					     pBeacon->VHTOperation,
5412  					     pBeacon->he_op,
5413  					     pBeacon->HTInfo);
5414  	if (status != QDF_STATUS_SUCCESS) {
5415  		pe_err("Failed to extract eht op");
5416  		qdf_mem_free(pBeacon);
5417  		return QDF_STATUS_E_FAILURE;
5418  	}
5419  
5420  	status = lim_strip_and_decode_eht_cap(pPayload + WLAN_BEACON_IES_OFFSET,
5421  					      nPayload - WLAN_BEACON_IES_OFFSET,
5422  					      &pBeacon->eht_cap,
5423  					      pBeacon->he_cap,
5424  					      freq);
5425  	if (status != QDF_STATUS_SUCCESS) {
5426  		pe_err("Failed to extract eht cap");
5427  		qdf_mem_free(pBeacon);
5428  		return QDF_STATUS_E_FAILURE;
5429  	}
5430  
5431  	/* & "transliterate" from a 'tDot11fBeacon' to a 'tSirProbeRespBeacon'... */
5432  	/* Timestamp */
5433  	qdf_mem_copy((uint8_t *) pBeaconStruct->timeStamp,
5434  		     (uint8_t *) &pBeacon->TimeStamp,
5435  		     sizeof(tSirMacTimeStamp));
5436  
5437  	/* Beacon Interval */
5438  	pBeaconStruct->beaconInterval = pBeacon->BeaconInterval.interval;
5439  
5440  	/* Capabilities */
5441  	pBeaconStruct->capabilityInfo.ess = pBeacon->Capabilities.ess;
5442  	pBeaconStruct->capabilityInfo.ibss = pBeacon->Capabilities.ibss;
5443  	pBeaconStruct->capabilityInfo.cfPollable =
5444  		pBeacon->Capabilities.cfPollable;
5445  	pBeaconStruct->capabilityInfo.cfPollReq =
5446  		pBeacon->Capabilities.cfPollReq;
5447  	pBeaconStruct->capabilityInfo.privacy = pBeacon->Capabilities.privacy;
5448  	pBeaconStruct->capabilityInfo.shortPreamble =
5449  		pBeacon->Capabilities.shortPreamble;
5450  	pBeaconStruct->capabilityInfo.criticalUpdateFlag =
5451  		pBeacon->Capabilities.criticalUpdateFlag;
5452  	pBeaconStruct->capabilityInfo.channelAgility =
5453  		pBeacon->Capabilities.channelAgility;
5454  	pBeaconStruct->capabilityInfo.spectrumMgt =
5455  		pBeacon->Capabilities.spectrumMgt;
5456  	pBeaconStruct->capabilityInfo.qos = pBeacon->Capabilities.qos;
5457  	pBeaconStruct->capabilityInfo.shortSlotTime =
5458  		pBeacon->Capabilities.shortSlotTime;
5459  	pBeaconStruct->capabilityInfo.apsd = pBeacon->Capabilities.apsd;
5460  	pBeaconStruct->capabilityInfo.rrm = pBeacon->Capabilities.rrm;
5461  	pBeaconStruct->capabilityInfo.dsssOfdm = pBeacon->Capabilities.dsssOfdm;
5462  	pBeaconStruct->capabilityInfo.delayedBA =
5463  		pBeacon->Capabilities.delayedBA;
5464  	pBeaconStruct->capabilityInfo.immediateBA =
5465  		pBeacon->Capabilities.immediateBA;
5466  
5467  	if (!pBeacon->SSID.present) {
5468  		pe_debug("Mandatory IE SSID not present!");
5469  	} else {
5470  		pBeaconStruct->ssidPresent = 1;
5471  		convert_ssid(mac, &pBeaconStruct->ssId, &pBeacon->SSID);
5472  	}
5473  
5474  	if (!pBeacon->SuppRates.present) {
5475  		pe_debug_rl("Mandatory IE Supported Rates not present!");
5476  	} else {
5477  		pBeaconStruct->suppRatesPresent = 1;
5478  		convert_supp_rates(mac, &pBeaconStruct->supportedRates,
5479  				   &pBeacon->SuppRates);
5480  	}
5481  
5482  	if (pBeacon->ExtSuppRates.present) {
5483  		pBeaconStruct->extendedRatesPresent = 1;
5484  		convert_ext_supp_rates(mac, &pBeaconStruct->extendedRates,
5485  				       &pBeacon->ExtSuppRates);
5486  	}
5487  
5488  	if (pBeacon->CFParams.present) {
5489  		pBeaconStruct->cfPresent = 1;
5490  		convert_cf_params(mac, &pBeaconStruct->cfParamSet,
5491  				  &pBeacon->CFParams);
5492  	}
5493  
5494  	if (pBeacon->TIM.present) {
5495  		pBeaconStruct->timPresent = 1;
5496  		convert_tim(mac, &pBeaconStruct->tim, &pBeacon->TIM);
5497  	}
5498  
5499  	if (pBeacon->Country.present) {
5500  		pBeaconStruct->countryInfoPresent = 1;
5501  		convert_country(mac, &pBeaconStruct->countryInfoParam,
5502  				&pBeacon->Country);
5503  	}
5504  	/* QOS Capabilities: */
5505  	if (pBeacon->QOSCapsAp.present) {
5506  		pBeaconStruct->qosCapabilityPresent = 1;
5507  		convert_qos_caps(mac, &pBeaconStruct->qosCapability,
5508  				 &pBeacon->QOSCapsAp);
5509  	}
5510  
5511  	if (pBeacon->EDCAParamSet.present) {
5512  		pBeaconStruct->edcaPresent = 1;
5513  		convert_edca_param(mac, &pBeaconStruct->edcaParams,
5514  				   &pBeacon->EDCAParamSet);
5515  	}
5516  
5517  	if (pBeacon->ChanSwitchAnn.present) {
5518  		pBeaconStruct->channelSwitchPresent = 1;
5519  		qdf_mem_copy(&pBeaconStruct->channelSwitchIE,
5520  			     &pBeacon->ChanSwitchAnn,
5521  			     sizeof(pBeaconStruct->channelSwitchIE));
5522  	}
5523  
5524  	if (pBeacon->ext_chan_switch_ann.present) {
5525  		pBeaconStruct->ext_chan_switch_present = 1;
5526  		qdf_mem_copy(&pBeaconStruct->ext_chan_switch,
5527  			     &pBeacon->ext_chan_switch_ann,
5528  			     sizeof(tDot11fIEext_chan_switch_ann));
5529  	}
5530  
5531  	if (pBeacon->sec_chan_offset_ele.present) {
5532  		pBeaconStruct->sec_chan_offset_present = 1;
5533  		qdf_mem_copy(&pBeaconStruct->sec_chan_offset,
5534  			     &pBeacon->sec_chan_offset_ele,
5535  			     sizeof(pBeaconStruct->sec_chan_offset));
5536  	}
5537  
5538  	if (pBeacon->TPCReport.present) {
5539  		pBeaconStruct->tpcReportPresent = 1;
5540  		qdf_mem_copy(&pBeaconStruct->tpcReport, &pBeacon->TPCReport,
5541  			     sizeof(tDot11fIETPCReport));
5542  	}
5543  
5544  	if (pBeacon->PowerConstraints.present) {
5545  		pBeaconStruct->powerConstraintPresent = 1;
5546  		qdf_mem_copy(&pBeaconStruct->localPowerConstraint,
5547  			     &pBeacon->PowerConstraints,
5548  			     sizeof(tDot11fIEPowerConstraints));
5549  	}
5550  
5551  	if (pBeacon->Quiet.present) {
5552  		pBeaconStruct->quietIEPresent = 1;
5553  		qdf_mem_copy(&pBeaconStruct->quietIE, &pBeacon->Quiet,
5554  			     sizeof(tDot11fIEQuiet));
5555  	}
5556  
5557  	if (pBeacon->HTCaps.present) {
5558  		qdf_mem_copy(&pBeaconStruct->HTCaps, &pBeacon->HTCaps,
5559  			     sizeof(tDot11fIEHTCaps));
5560  	}
5561  
5562  	if (pBeacon->HTInfo.present) {
5563  		qdf_mem_copy(&pBeaconStruct->HTInfo, &pBeacon->HTInfo,
5564  			     sizeof(tDot11fIEHTInfo));
5565  
5566  	}
5567  
5568  	if (pBeacon->he_op.oper_info_6g_present) {
5569  		pBeaconStruct->chan_freq = wlan_reg_chan_band_to_freq(mac->pdev,
5570  						pBeacon->he_op.oper_info_6g.info.primary_ch,
5571  						BIT(REG_BAND_6G));
5572  		pBeaconStruct->ap_power_type =
5573  				pBeacon->he_op.oper_info_6g.info.reg_info;
5574  	} else if (pBeacon->DSParams.present) {
5575  		pBeaconStruct->dsParamsPresent = 1;
5576  		pBeaconStruct->chan_freq =
5577  		    wlan_reg_legacy_chan_to_freq(mac->pdev,
5578  						 pBeacon->DSParams.curr_channel);
5579  	} else if (pBeacon->HTInfo.present) {
5580  		pBeaconStruct->chan_freq =
5581  		    wlan_reg_legacy_chan_to_freq(mac->pdev,
5582  						 pBeacon->HTInfo.primaryChannel);
5583  	} else {
5584  		pBeaconStruct->chan_freq = WMA_GET_RX_FREQ(pFrame);
5585  		pe_debug_rl("In Beacon No Channel info");
5586  	}
5587  
5588  	if (pBeacon->RSN.present) {
5589  		pBeaconStruct->rsnPresent = 1;
5590  		convert_rsn(mac, &pBeaconStruct->rsn, &pBeacon->RSN);
5591  	}
5592  
5593  	if (pBeacon->WPA.present) {
5594  		pBeaconStruct->wpaPresent = 1;
5595  		convert_wpa(mac, &pBeaconStruct->wpa, &pBeacon->WPA);
5596  	}
5597  
5598  	if (pBeacon->WMMParams.present) {
5599  		pBeaconStruct->wmeEdcaPresent = 1;
5600  		convert_wmm_params(mac, &pBeaconStruct->edcaParams,
5601  				   &pBeacon->WMMParams);
5602  	}
5603  
5604  	if (pBeacon->WMMInfoAp.present) {
5605  		pBeaconStruct->wmeInfoPresent = 1;
5606  		pe_debug("WMM Info present in Beacon Frame!");
5607  	}
5608  
5609  	if (pBeacon->WMMCaps.present) {
5610  		pBeaconStruct->wsmCapablePresent = 1;
5611  	}
5612  
5613  	if (pBeacon->ERPInfo.present) {
5614  		pBeaconStruct->erpPresent = 1;
5615  		convert_erp_info(mac, &pBeaconStruct->erpIEInfo,
5616  				 &pBeacon->ERPInfo);
5617  	}
5618  	if (pBeacon->MobilityDomain.present) {
5619  		/* MobilityDomain */
5620  		pBeaconStruct->mdiePresent = 1;
5621  		qdf_mem_copy((uint8_t *) &(pBeaconStruct->mdie[0]),
5622  			     (uint8_t *) &(pBeacon->MobilityDomain.MDID),
5623  			     sizeof(uint16_t));
5624  		pBeaconStruct->mdie[2] =
5625  			((pBeacon->MobilityDomain.overDSCap << 0) | (pBeacon->
5626  								     MobilityDomain.
5627  								     resourceReqCap
5628  								     << 1));
5629  	}
5630  
5631  #ifdef FEATURE_WLAN_ESE
5632  	if (pBeacon->ESEVersion.present)
5633  		pBeaconStruct->is_ese_ver_ie_present = 1;
5634  	if (pBeacon->ESETxmitPower.present) {
5635  		/* copy ESE TPC info element */
5636  		pBeaconStruct->eseTxPwr.present = 1;
5637  		qdf_mem_copy(&pBeaconStruct->eseTxPwr,
5638  			     &pBeacon->ESETxmitPower,
5639  			     sizeof(tDot11fIEESETxmitPower));
5640  	}
5641  	if (pBeacon->QBSSLoad.present) {
5642  		qdf_mem_copy(&pBeaconStruct->QBSSLoad,
5643  			     &pBeacon->QBSSLoad, sizeof(tDot11fIEQBSSLoad));
5644  	}
5645  #endif
5646  	if (pBeacon->VHTCaps.present) {
5647  		qdf_mem_copy(&pBeaconStruct->VHTCaps, &pBeacon->VHTCaps,
5648  			     sizeof(tDot11fIEVHTCaps));
5649  	}
5650  	if (pBeacon->VHTOperation.present) {
5651  		qdf_mem_copy(&pBeaconStruct->VHTOperation,
5652  			     &pBeacon->VHTOperation,
5653  			     sizeof(tDot11fIEVHTOperation));
5654  	}
5655  	if (pBeacon->VHTExtBssLoad.present) {
5656  		qdf_mem_copy(&pBeaconStruct->VHTExtBssLoad,
5657  			     &pBeacon->VHTExtBssLoad,
5658  			     sizeof(tDot11fIEVHTExtBssLoad));
5659  	}
5660  	if (pBeacon->OperatingMode.present) {
5661  		qdf_mem_copy(&pBeaconStruct->OperatingMode,
5662  			     &pBeacon->OperatingMode,
5663  			     sizeof(tDot11fIEOperatingMode));
5664  	}
5665  	if (pBeacon->WiderBWChanSwitchAnn.present) {
5666  		pBeaconStruct->WiderBWChanSwitchAnnPresent = 1;
5667  		qdf_mem_copy(&pBeaconStruct->WiderBWChanSwitchAnn,
5668  			     &pBeacon->WiderBWChanSwitchAnn,
5669  			     sizeof(tDot11fIEWiderBWChanSwitchAnn));
5670  	}
5671  
5672  	pBeaconStruct->Vendor1IEPresent = pBeacon->Vendor1IE.present;
5673  	pBeaconStruct->Vendor3IEPresent = pBeacon->Vendor3IE.present;
5674  
5675  	pBeaconStruct->vendor_vht_ie.present = pBeacon->vendor_vht_ie.present;
5676  	if (pBeacon->vendor_vht_ie.present) {
5677  		pBeaconStruct->vendor_vht_ie.sub_type =
5678  			pBeacon->vendor_vht_ie.sub_type;
5679  	}
5680  
5681  	if (pBeacon->vendor_vht_ie.VHTCaps.present) {
5682  		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTCaps,
5683  				&pBeacon->vendor_vht_ie.VHTCaps,
5684  				sizeof(tDot11fIEVHTCaps));
5685  	}
5686  	if (pBeacon->vendor_vht_ie.VHTOperation.present) {
5687  		qdf_mem_copy(&pBeaconStruct->vendor_vht_ie.VHTOperation,
5688  				&pBeacon->VHTOperation,
5689  				sizeof(tDot11fIEVHTOperation));
5690  	}
5691  	/* Update HS 2.0 Information Element */
5692  	if (pBeacon->hs20vendor_ie.present) {
5693  		qdf_mem_copy(&pBeaconStruct->hs20vendor_ie,
5694  			&pBeacon->hs20vendor_ie,
5695  			sizeof(tDot11fIEhs20vendor_ie) -
5696  			sizeof(pBeacon->hs20vendor_ie.hs_id));
5697  		if (pBeacon->hs20vendor_ie.hs_id_present)
5698  			qdf_mem_copy(&pBeaconStruct->hs20vendor_ie.hs_id,
5699  				&pBeacon->hs20vendor_ie.hs_id,
5700  				sizeof(pBeacon->hs20vendor_ie.hs_id));
5701  	}
5702  #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
5703  	if (pBeacon->QComVendorIE.present) {
5704  		pBeaconStruct->AvoidChannelIE.present =
5705  			pBeacon->QComVendorIE.present;
5706  		pBeaconStruct->AvoidChannelIE.type =
5707  			pBeacon->QComVendorIE.type;
5708  		pBeaconStruct->AvoidChannelIE.channel =
5709  			pBeacon->QComVendorIE.channel;
5710  	}
5711  #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
5712  	if (pBeacon->OBSSScanParameters.present) {
5713  		qdf_mem_copy(&pBeaconStruct->obss_scanparams,
5714  			&pBeacon->OBSSScanParameters,
5715  			sizeof(struct sDot11fIEOBSSScanParameters));
5716  	}
5717  	if (pBeacon->MBO_IE.present) {
5718  		pBeaconStruct->MBO_IE_present = true;
5719  		if (pBeacon->MBO_IE.cellular_data_cap.present)
5720  			pBeaconStruct->MBO_capability =
5721  				pBeacon->MBO_IE.cellular_data_cap.cellular_connectivity;
5722  
5723  		if (pBeacon->MBO_IE.assoc_disallowed.present) {
5724  			pBeaconStruct->assoc_disallowed = true;
5725  			pBeaconStruct->assoc_disallowed_reason =
5726  				pBeacon->MBO_IE.assoc_disallowed.reason_code;
5727  		}
5728  	}
5729  
5730  	if (pBeacon->qcn_ie.present)
5731  		qdf_mem_copy(&pBeaconStruct->qcn_ie, &pBeacon->qcn_ie,
5732  			     sizeof(tDot11fIEqcn_ie));
5733  
5734  	if (pBeacon->he_cap.present) {
5735  		qdf_mem_copy(&pBeaconStruct->he_cap,
5736  			     &pBeacon->he_cap,
5737  			     sizeof(tDot11fIEhe_cap));
5738  	}
5739  	if (pBeacon->he_op.present) {
5740  		qdf_mem_copy(&pBeaconStruct->he_op,
5741  			     &pBeacon->he_op,
5742  			     sizeof(tDot11fIEhe_op));
5743  	}
5744  
5745  	if (pBeacon->eht_cap.present)
5746  		qdf_mem_copy(&pBeaconStruct->eht_cap, &pBeacon->eht_cap,
5747  			     sizeof(tDot11fIEeht_cap));
5748  	if (pBeacon->eht_op.present)
5749  		qdf_mem_copy(&pBeaconStruct->eht_op, &pBeacon->eht_op,
5750  			    sizeof(tDot11fIEeht_op));
5751  
5752  	pBeaconStruct->num_transmit_power_env = pBeacon->num_transmit_power_env;
5753  	if (pBeacon->num_transmit_power_env) {
5754  		qdf_mem_copy(pBeaconStruct->transmit_power_env,
5755  			     pBeacon->transmit_power_env,
5756  			     pBeacon->num_transmit_power_env *
5757  			     sizeof(tDot11fIEtransmit_power_env));
5758  	}
5759  
5760  	convert_bcon_bss_color_change_ie(pBeacon, pBeaconStruct);
5761  	sir_convert_beacon_frame2_mlo_struct(pPayload, nPayload, pBeacon,
5762  					     pBeaconStruct);
5763  	sir_convert_beacon_frame2_t2lm_struct(pBeacon, pBeaconStruct);
5764  	sir_convert_beacon_frame2_sr_struct(pBeacon, pBeaconStruct);
5765  
5766  	qdf_mem_free(pBeacon);
5767  	return QDF_STATUS_SUCCESS;
5768  
5769  } /* End sir_convert_beacon_frame2_struct. */
5770  
5771  #ifdef WLAN_FEATURE_FILS_SK
5772  
5773  /* update_ftie_in_fils_conf() - API to update fils info from auth
5774   * response packet from AP
5775   * @auth: auth packet pointer received from AP
5776   * @auth_frame: data structure needs to be updated
5777   *
5778   * Return: None
5779   */
5780  static void
5781  update_ftie_in_fils_conf(tDot11fAuthentication *auth,
5782  			 tpSirMacAuthFrameBody auth_frame)
5783  {
5784  	/**
5785  	 * Copy the FTIE sent by the AP in the auth request frame.
5786  	 * This is required for FT-FILS connection.
5787  	 * This FTIE will be sent in Assoc request frame without
5788  	 * any modification.
5789  	 */
5790  	if (auth->FTInfo.present) {
5791  		pe_debug("FT-FILS: r0kh_len:%d r1kh_present:%d",
5792  			 auth->FTInfo.R0KH_ID.num_PMK_R0_ID,
5793  			 auth->FTInfo.R1KH_ID.present);
5794  
5795  		auth_frame->ft_ie.present = 1;
5796  		if (auth->FTInfo.R1KH_ID.present) {
5797  			qdf_mem_copy(auth_frame->ft_ie.r1kh_id,
5798  				     auth->FTInfo.R1KH_ID.PMK_R1_ID,
5799  				     FT_R1KH_ID_LEN);
5800  		}
5801  
5802  		if (auth->FTInfo.R0KH_ID.present) {
5803  			qdf_mem_copy(auth_frame->ft_ie.r0kh_id,
5804  				     auth->FTInfo.R0KH_ID.PMK_R0_ID,
5805  				     auth->FTInfo.R0KH_ID.num_PMK_R0_ID);
5806  			auth_frame->ft_ie.r0kh_id_len =
5807  					auth->FTInfo.R0KH_ID.num_PMK_R0_ID;
5808  		}
5809  
5810  		if (auth_frame->ft_ie.gtk_ie.present) {
5811  			pe_debug("FT-FILS: GTK present");
5812  			qdf_mem_copy(&auth_frame->ft_ie.gtk_ie,
5813  				     &auth->FTInfo.GTK,
5814  				     sizeof(struct mac_ft_gtk_ie));
5815  		}
5816  
5817  		if (auth_frame->ft_ie.igtk_ie.present) {
5818  			pe_debug("FT-FILS: IGTK present");
5819  			qdf_mem_copy(&auth_frame->ft_ie.igtk_ie,
5820  				     &auth->FTInfo.IGTK,
5821  				     sizeof(struct mac_ft_igtk_ie));
5822  		}
5823  
5824  		qdf_mem_copy(auth_frame->ft_ie.anonce, auth->FTInfo.Anonce,
5825  			     FT_NONCE_LEN);
5826  		qdf_mem_copy(auth_frame->ft_ie.snonce, auth->FTInfo.Snonce,
5827  			     FT_NONCE_LEN);
5828  
5829  		qdf_mem_copy(auth_frame->ft_ie.mic, auth->FTInfo.MIC,
5830  			     FT_MIC_LEN);
5831  		auth_frame->ft_ie.element_count = auth->FTInfo.IECount;
5832  	}
5833  }
5834  
5835  /* sir_update_auth_frame2_struct_fils_conf: API to update fils info from auth
5836   * packet type 2
5837   * @auth: auth packet pointer received from AP
5838   * @auth_frame: data structure needs to be updated
5839   *
5840   * Return: None
5841   */
5842  static void
5843  sir_update_auth_frame2_struct_fils_conf(tDot11fAuthentication *auth,
5844  					tpSirMacAuthFrameBody auth_frame)
5845  {
5846  	if (auth->AuthAlgo.algo != SIR_FILS_SK_WITHOUT_PFS)
5847  		return;
5848  
5849  	if (auth->fils_assoc_delay_info.present)
5850  		auth_frame->assoc_delay_info =
5851  			auth->fils_assoc_delay_info.assoc_delay_info;
5852  
5853  	if (auth->fils_session.present)
5854  		qdf_mem_copy(auth_frame->session, auth->fils_session.session,
5855  			SIR_FILS_SESSION_LENGTH);
5856  
5857  	if (auth->fils_nonce.present)
5858  		qdf_mem_copy(auth_frame->nonce, auth->fils_nonce.nonce,
5859  			SIR_FILS_NONCE_LENGTH);
5860  
5861  	if (auth->fils_wrapped_data.present) {
5862  		qdf_mem_copy(auth_frame->wrapped_data,
5863  			auth->fils_wrapped_data.wrapped_data,
5864  			auth->fils_wrapped_data.num_wrapped_data);
5865  		auth_frame->wrapped_data_len =
5866  			auth->fils_wrapped_data.num_wrapped_data;
5867  	}
5868  	if (auth->RSNOpaque.present) {
5869  		qdf_mem_copy(auth_frame->rsn_ie.info, auth->RSNOpaque.data,
5870  			auth->RSNOpaque.num_data);
5871  		auth_frame->rsn_ie.length = auth->RSNOpaque.num_data;
5872  	}
5873  
5874  	update_ftie_in_fils_conf(auth, auth_frame);
5875  
5876  }
5877  #else
5878  static void sir_update_auth_frame2_struct_fils_conf(tDot11fAuthentication *auth,
5879  				tpSirMacAuthFrameBody auth_frame)
5880  { }
5881  #endif
5882  
5883  QDF_STATUS
5884  sir_convert_auth_frame2_struct(struct mac_context *mac,
5885  			       uint8_t *pFrame,
5886  			       uint32_t nFrame, tpSirMacAuthFrameBody pAuth)
5887  {
5888  	static tDot11fAuthentication auth;
5889  	uint32_t status;
5890  
5891  	/* Zero-init our [out] parameter, */
5892  	qdf_mem_zero((uint8_t *) pAuth, sizeof(tSirMacAuthFrameBody));
5893  
5894  	/* delegate to the framesc-generated code, */
5895  	status = dot11f_unpack_authentication(mac, pFrame, nFrame,
5896  					      &auth, false);
5897  	if (DOT11F_FAILED(status)) {
5898  		pe_err("Failed to parse an Authentication frame (0x%08x, %d bytes):",
5899  			status, nFrame);
5900  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
5901  				   pFrame, nFrame);
5902  		return QDF_STATUS_E_FAILURE;
5903  	} else if (DOT11F_WARNED(status)) {
5904  		pe_debug("There were warnings while unpacking an Authentication frame (0x%08x, %d bytes):",
5905  			status, nFrame);
5906  	}
5907  	/* & "transliterate" from a 'tDot11fAuthentication' to a 'tSirMacAuthFrameBody'... */
5908  	pAuth->authAlgoNumber = auth.AuthAlgo.algo;
5909  	pAuth->authTransactionSeqNumber = auth.AuthSeqNo.no;
5910  	pAuth->authStatusCode = auth.Status.status;
5911  
5912  	if (auth.ChallengeText.present) {
5913  		pAuth->type = WLAN_ELEMID_CHALLENGE;
5914  		pAuth->length = auth.ChallengeText.num_text;
5915  		qdf_mem_copy(pAuth->challengeText, auth.ChallengeText.text,
5916  			     auth.ChallengeText.num_text);
5917  	}
5918  
5919  	/* Copy MLO IE presence flag to pAuth in case of ML connection */
5920  	pAuth->is_mlo_ie_present = auth.mlo_ie.present;
5921  	/* The minimum length is set to 9 based on below calculation
5922  	 * Multi-Link Control Field => 2 Bytes
5923  	 * Minimum CInfo Field => CInfo Length (1 Byte) + MLD Addr (6 Bytes)
5924  	 * min_len = 2 + 1 + 6
5925  	 * MLD Offset = min_len - (2 + 1)
5926  	 */
5927  	if (pAuth->is_mlo_ie_present && auth.mlo_ie.num_data >= 9) {
5928  		qdf_copy_macaddr(&pAuth->peer_mld,
5929  				 (struct qdf_mac_addr *)(auth.mlo_ie.data + 3));
5930  	}
5931  
5932  	sir_update_auth_frame2_struct_fils_conf(&auth, pAuth);
5933  
5934  	return QDF_STATUS_SUCCESS;
5935  
5936  } /* End sir_convert_auth_frame2_struct. */
5937  
5938  QDF_STATUS
5939  sir_convert_addts_rsp2_struct(struct mac_context *mac,
5940  			      uint8_t *pFrame,
5941  			      uint32_t nFrame, tSirAddtsRspInfo *pAddTs)
5942  {
5943  	tDot11fAddTSResponse addts = { {0} };
5944  	tDot11fWMMAddTSResponse wmmaddts = { {0} };
5945  	uint8_t j;
5946  	uint16_t i;
5947  	uint32_t status;
5948  
5949  	if (QOS_ADD_TS_RSP != *(pFrame + 1)) {
5950  		pe_err("Action of %d; this is not supported & is probably an error",
5951  			*(pFrame + 1));
5952  		return QDF_STATUS_E_FAILURE;
5953  	}
5954  	/* Zero-init our [out] parameter, */
5955  	qdf_mem_zero((uint8_t *) pAddTs, sizeof(tSirAddtsRspInfo));
5956  	qdf_mem_zero((uint8_t *) &addts, sizeof(tDot11fAddTSResponse));
5957  	qdf_mem_zero((uint8_t *) &wmmaddts, sizeof(tDot11fWMMAddTSResponse));
5958  
5959  	/* delegate to the framesc-generated code, */
5960  	switch (*pFrame) {
5961  	case ACTION_CATEGORY_QOS:
5962  		status =
5963  			dot11f_unpack_add_ts_response(mac, pFrame, nFrame,
5964  						      &addts, false);
5965  		break;
5966  	case ACTION_CATEGORY_WMM:
5967  		status =
5968  			dot11f_unpack_wmm_add_ts_response(mac, pFrame, nFrame,
5969  							  &wmmaddts, false);
5970  		break;
5971  	default:
5972  		pe_err("Category of %d; this is not supported & is probably an error",
5973  			*pFrame);
5974  		return QDF_STATUS_E_FAILURE;
5975  	}
5976  
5977  	if (DOT11F_FAILED(status)) {
5978  		pe_err("Failed to parse an Add TS Response frame (0x%08x, %d bytes):",
5979  			status, nFrame);
5980  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
5981  				   pFrame, nFrame);
5982  		return QDF_STATUS_E_FAILURE;
5983  	} else if (DOT11F_WARNED(status)) {
5984  		pe_debug("There were warnings while unpacking an Add TS Response frame (0x%08x,%d bytes):",
5985  			status, nFrame);
5986  	}
5987  	/* & "transliterate" from a 'tDot11fAddTSResponse' or a */
5988  	/* 'tDot11WMMAddTSResponse' to a 'tSirMacAddtsRspInfo'... */
5989  	if (ACTION_CATEGORY_QOS == *pFrame) {
5990  		pAddTs->dialogToken = addts.DialogToken.token;
5991  		pAddTs->status = (enum wlan_status_code)addts.Status.status;
5992  
5993  		if (addts.TSDelay.present) {
5994  			convert_ts_delay(mac, &pAddTs->delay, &addts.TSDelay);
5995  		}
5996  		/* TS Delay is present iff status indicates its presence */
5997  		if (pAddTs->status == STATUS_TS_NOT_CREATED &&
5998  		    !addts.TSDelay.present) {
5999  			pe_warn("Missing TSDelay IE");
6000  		}
6001  
6002  		if (addts.TSPEC.present) {
6003  			convert_tspec(mac, &pAddTs->tspec, &addts.TSPEC);
6004  		} else {
6005  			pe_err("Mandatory TSPEC element missing in Add TS Response");
6006  			return QDF_STATUS_E_FAILURE;
6007  		}
6008  
6009  		if (addts.num_TCLAS) {
6010  			pAddTs->numTclas = (uint8_t) addts.num_TCLAS;
6011  
6012  			for (i = 0U; i < addts.num_TCLAS; ++i) {
6013  				if (QDF_STATUS_SUCCESS !=
6014  				    convert_tclas(mac, &(pAddTs->tclasInfo[i]),
6015  						  &(addts.TCLAS[i]))) {
6016  					pe_err("Failed to convert a TCLAS IE");
6017  					return QDF_STATUS_E_FAILURE;
6018  				}
6019  			}
6020  		}
6021  
6022  		if (addts.TCLASSPROC.present) {
6023  			pAddTs->tclasProcPresent = 1;
6024  			pAddTs->tclasProc = addts.TCLASSPROC.processing;
6025  		}
6026  #ifdef FEATURE_WLAN_ESE
6027  		if (addts.ESETrafStrmMet.present) {
6028  			pAddTs->tsmPresent = 1;
6029  			qdf_mem_copy(&pAddTs->tsmIE.tsid,
6030  				     &addts.ESETrafStrmMet.tsid,
6031  				     sizeof(struct ese_tsm_ie));
6032  		}
6033  #endif
6034  		if (addts.Schedule.present) {
6035  			pAddTs->schedulePresent = 1;
6036  			convert_schedule(mac, &pAddTs->schedule,
6037  					 &addts.Schedule);
6038  		}
6039  
6040  		if (addts.WMMSchedule.present) {
6041  			pAddTs->schedulePresent = 1;
6042  			convert_wmm_schedule(mac, &pAddTs->schedule,
6043  					     &addts.WMMSchedule);
6044  		}
6045  
6046  		if (addts.WMMTSPEC.present) {
6047  			pAddTs->wsmTspecPresent = 1;
6048  			convert_wmmtspec(mac, &pAddTs->tspec, &addts.WMMTSPEC);
6049  		}
6050  
6051  		if (addts.num_WMMTCLAS) {
6052  			j = (uint8_t) (pAddTs->numTclas + addts.num_WMMTCLAS);
6053  			if (SIR_MAC_TCLASIE_MAXNUM < j)
6054  				j = SIR_MAC_TCLASIE_MAXNUM;
6055  
6056  			for (i = pAddTs->numTclas; i < j; ++i) {
6057  				if (QDF_STATUS_SUCCESS !=
6058  				    convert_wmmtclas(mac,
6059  						     &(pAddTs->tclasInfo[i]),
6060  						     &(addts.WMMTCLAS[i]))) {
6061  					pe_err("Failed to convert a TCLAS IE");
6062  					return QDF_STATUS_E_FAILURE;
6063  				}
6064  			}
6065  		}
6066  
6067  		if (addts.WMMTCLASPROC.present) {
6068  			pAddTs->tclasProcPresent = 1;
6069  			pAddTs->tclasProc = addts.WMMTCLASPROC.processing;
6070  		}
6071  
6072  		if (1 < pAddTs->numTclas && (!pAddTs->tclasProcPresent)) {
6073  			pe_err("%d TCLAS IE but not TCLASPROC IE",
6074  				pAddTs->numTclas);
6075  			return QDF_STATUS_E_FAILURE;
6076  		}
6077  	} else {
6078  		pAddTs->dialogToken = wmmaddts.DialogToken.token;
6079  		pAddTs->status =
6080  			(enum wlan_status_code)wmmaddts.StatusCode.statusCode;
6081  
6082  		if (wmmaddts.WMMTSPEC.present) {
6083  			pAddTs->wmeTspecPresent = 1;
6084  			convert_wmmtspec(mac, &pAddTs->tspec,
6085  					 &wmmaddts.WMMTSPEC);
6086  		} else {
6087  			pe_err("Mandatory WME TSPEC element missing!");
6088  			return QDF_STATUS_E_FAILURE;
6089  		}
6090  
6091  #ifdef FEATURE_WLAN_ESE
6092  		if (wmmaddts.ESETrafStrmMet.present) {
6093  			pAddTs->tsmPresent = 1;
6094  			qdf_mem_copy(&pAddTs->tsmIE.tsid,
6095  				     &wmmaddts.ESETrafStrmMet.tsid,
6096  				     sizeof(struct ese_tsm_ie));
6097  		}
6098  #endif
6099  
6100  	}
6101  
6102  	return QDF_STATUS_SUCCESS;
6103  
6104  } /* End sir_convert_addts_rsp2_struct. */
6105  
6106  QDF_STATUS
6107  sir_convert_delts_req2_struct(struct mac_context *mac,
6108  			      uint8_t *pFrame,
6109  			      uint32_t nFrame, struct delts_req_info *pDelTs)
6110  {
6111  	tDot11fDelTS delts = { {0} };
6112  	tDot11fWMMDelTS wmmdelts = { {0} };
6113  	uint32_t status;
6114  
6115  	if (QOS_DEL_TS_REQ != *(pFrame + 1)) {
6116  		pe_err("sirConvertDeltsRsp2Struct invoked "
6117  			"with an Action of %d; this is not "
6118  			"supported & is probably an error",
6119  			*(pFrame + 1));
6120  		return QDF_STATUS_E_FAILURE;
6121  	}
6122  	/* Zero-init our [out] parameter, */
6123  	qdf_mem_zero(pDelTs, sizeof(*pDelTs));
6124  
6125  	/* delegate to the framesc-generated code, */
6126  	switch (*pFrame) {
6127  	case ACTION_CATEGORY_QOS:
6128  		status = dot11f_unpack_del_ts(mac, pFrame, nFrame,
6129  					      &delts, false);
6130  		break;
6131  	case ACTION_CATEGORY_WMM:
6132  		status = dot11f_unpack_wmm_del_ts(mac, pFrame, nFrame,
6133  						  &wmmdelts, false);
6134  		break;
6135  	default:
6136  		pe_err("sirConvertDeltsRsp2Struct invoked "
6137  		       "with a Category of %d; this is not"
6138  		       " supported & is probably an error",
6139  			*pFrame);
6140  		return QDF_STATUS_E_FAILURE;
6141  	}
6142  
6143  	if (DOT11F_FAILED(status)) {
6144  		pe_err("Failed to parse an Del TS Request frame (0x%08x, %d bytes):",
6145  			status, nFrame);
6146  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
6147  				   pFrame, nFrame);
6148  		return QDF_STATUS_E_FAILURE;
6149  	} else if (DOT11F_WARNED(status)) {
6150  		pe_debug("There were warnings while unpacking an Del TS Request frame (0x%08x,%d bytes):",
6151  			   status, nFrame);
6152  	}
6153  	/* & "transliterate" from a 'tDot11fDelTSResponse' or a */
6154  	/* 'tDot11WMMDelTSResponse' to a 'tSirMacDeltsReqInfo'... */
6155  	if (ACTION_CATEGORY_QOS == *pFrame) {
6156  		pDelTs->tsinfo.traffic.trafficType =
6157  			(uint16_t) delts.TSInfo.traffic_type;
6158  		pDelTs->tsinfo.traffic.tsid = (uint16_t) delts.TSInfo.tsid;
6159  		pDelTs->tsinfo.traffic.direction =
6160  			(uint16_t) delts.TSInfo.direction;
6161  		pDelTs->tsinfo.traffic.accessPolicy =
6162  			(uint16_t) delts.TSInfo.access_policy;
6163  		pDelTs->tsinfo.traffic.aggregation =
6164  			(uint16_t) delts.TSInfo.aggregation;
6165  		pDelTs->tsinfo.traffic.psb = (uint16_t) delts.TSInfo.psb;
6166  		pDelTs->tsinfo.traffic.userPrio =
6167  			(uint16_t) delts.TSInfo.user_priority;
6168  		pDelTs->tsinfo.traffic.ackPolicy =
6169  			(uint16_t) delts.TSInfo.tsinfo_ack_pol;
6170  
6171  		pDelTs->tsinfo.schedule.schedule =
6172  			(uint8_t) delts.TSInfo.schedule;
6173  	} else {
6174  		if (wmmdelts.WMMTSPEC.present) {
6175  			pDelTs->wmeTspecPresent = 1;
6176  			convert_wmmtspec(mac, &pDelTs->tspec,
6177  					 &wmmdelts.WMMTSPEC);
6178  		} else {
6179  			pe_err("Mandatory WME TSPEC element missing!");
6180  			return QDF_STATUS_E_FAILURE;
6181  		}
6182  	}
6183  
6184  	return QDF_STATUS_SUCCESS;
6185  
6186  } /* End sir_convert_delts_req2_struct. */
6187  
6188  QDF_STATUS
6189  sir_convert_qos_map_configure_frame2_struct(struct mac_context *mac,
6190  					    uint8_t *pFrame,
6191  					    uint32_t nFrame,
6192  					    struct qos_map_set *pQosMapSet)
6193  {
6194  	tDot11fQosMapConfigure mapConfigure;
6195  	uint32_t status;
6196  
6197  	status =
6198  		dot11f_unpack_qos_map_configure(mac, pFrame, nFrame,
6199  						&mapConfigure, false);
6200  	if (DOT11F_FAILED(status) || !mapConfigure.QosMapSet.present) {
6201  		pe_err("Failed to parse Qos Map Configure frame (0x%08x, %d bytes):",
6202  			   status, nFrame);
6203  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
6204  				   pFrame, nFrame);
6205  		return QDF_STATUS_E_FAILURE;
6206  	} else if (DOT11F_WARNED(status)) {
6207  		pe_debug("There were warnings while unpacking Qos Map Configure frame (0x%08x, %d bytes):",
6208  			   status, nFrame);
6209  	}
6210  	pQosMapSet->present = mapConfigure.QosMapSet.present;
6211  	convert_qos_mapset_frame(mac, pQosMapSet, &mapConfigure.QosMapSet);
6212  	lim_log_qos_map_set(mac, pQosMapSet);
6213  	return QDF_STATUS_SUCCESS;
6214  }
6215  
6216  #ifdef ANI_SUPPORT_11H
6217  QDF_STATUS
6218  sir_convert_tpc_req_frame2_struct(struct mac_context *mac,
6219  				  uint8_t *pFrame,
6220  				  tpSirMacTpcReqActionFrame pTpcReqFrame,
6221  				  uint32_t nFrame)
6222  {
6223  	tDot11fTPCRequest req;
6224  	uint32_t status;
6225  
6226  	qdf_mem_zero((uint8_t *) pTpcReqFrame,
6227  			sizeof(tSirMacTpcReqActionFrame));
6228  	status = dot11f_unpack_tpc_request(mac, pFrame, nFrame, &req, false);
6229  	if (DOT11F_FAILED(status)) {
6230  		pe_err("Failed to parse a TPC Request frame (0x%08x, %d bytes):",
6231  			   status, nFrame);
6232  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
6233  				   pFrame, nFrame);
6234  		return QDF_STATUS_E_FAILURE;
6235  	} else if (DOT11F_WARNED(status)) {
6236  		pe_debug("There were warnings while unpacking a TPC Request frame (0x%08x, %d bytes):",
6237  			   status, nFrame);
6238  	}
6239  	/* & "transliterate" from a 'tDot11fTPCRequest' to a */
6240  	/* 'tSirMacTpcReqActionFrame'... */
6241  	pTpcReqFrame->actionHeader.category = req.Category.category;
6242  	pTpcReqFrame->actionHeader.actionID = req.Action.action;
6243  	pTpcReqFrame->actionHeader.dialogToken = req.DialogToken.token;
6244  	if (req.TPCRequest.present) {
6245  		pTpcReqFrame->type = DOT11F_EID_TPCREQUEST;
6246  		pTpcReqFrame->length = 0;
6247  	} else {
6248  		pe_warn("!!!Rcv TPC Req of invalid type!");
6249  		return QDF_STATUS_E_FAILURE;
6250  	}
6251  	return QDF_STATUS_SUCCESS;
6252  } /* End sir_convert_tpc_req_frame2_struct. */
6253  QDF_STATUS
6254  sir_convert_meas_req_frame2_struct(struct mac_context *mac,
6255  				   uint8_t *pFrame,
6256  				   tpSirMacMeasReqActionFrame pMeasReqFrame,
6257  				   uint32_t nFrame)
6258  {
6259  	tDot11fMeasurementRequest mr;
6260  	uint32_t status;
6261  
6262  	/* Zero-init our [out] parameter, */
6263  	qdf_mem_zero((uint8_t *) pMeasReqFrame,
6264  		    sizeof(tpSirMacMeasReqActionFrame));
6265  
6266  	/* delegate to the framesc-generated code, */
6267  	status = dot11f_unpack_measurement_request(mac, pFrame,
6268  						   nFrame, &mr, false);
6269  	if (DOT11F_FAILED(status)) {
6270  		pe_err("Failed to parse a Measurement Request frame (0x%08x, %d bytes):",
6271  			   status, nFrame);
6272  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
6273  				   pFrame, nFrame);
6274  		return QDF_STATUS_E_FAILURE;
6275  	} else if (DOT11F_WARNED(status)) {
6276  		pe_debug("There were warnings while unpacking a Measurement Request frame (0x%08x, %d bytes):",
6277  			   status, nFrame);
6278  	}
6279  	/* & "transliterate" from a 'tDot11fMeasurementRequest' to a */
6280  	/* 'tpSirMacMeasReqActionFrame'... */
6281  	pMeasReqFrame->actionHeader.category = mr.Category.category;
6282  	pMeasReqFrame->actionHeader.actionID = mr.Action.action;
6283  	pMeasReqFrame->actionHeader.dialogToken = mr.DialogToken.token;
6284  
6285  	if (0 == mr.num_MeasurementRequest) {
6286  		pe_err("Missing mandatory IE in Measurement Request Frame");
6287  		return QDF_STATUS_E_FAILURE;
6288  	} else if (1 < mr.num_MeasurementRequest) {
6289  		pe_warn(
6290  			FL("Warning: dropping extra Measurement Request IEs!"));
6291  	}
6292  
6293  	pMeasReqFrame->measReqIE.type = DOT11F_EID_MEASUREMENTREQUEST;
6294  	pMeasReqFrame->measReqIE.length = DOT11F_IE_MEASUREMENTREQUEST_MIN_LEN;
6295  	pMeasReqFrame->measReqIE.measToken =
6296  		mr.MeasurementRequest[0].measurement_token;
6297  	pMeasReqFrame->measReqIE.measReqMode =
6298  		(mr.MeasurementRequest[0].reserved << 3) | (mr.
6299  							    MeasurementRequest[0].
6300  							    enable << 2) | (mr.
6301  									    MeasurementRequest
6302  									    [0].
6303  									    request
6304  									    << 1) |
6305  		(mr.MeasurementRequest[0].report /*<< 0 */);
6306  	pMeasReqFrame->measReqIE.measType =
6307  		mr.MeasurementRequest[0].measurement_type;
6308  
6309  	pMeasReqFrame->measReqIE.measReqField.channelNumber =
6310  		mr.MeasurementRequest[0].channel_no;
6311  
6312  	qdf_mem_copy(pMeasReqFrame->measReqIE.measReqField.measStartTime,
6313  		     mr.MeasurementRequest[0].meas_start_time, 8);
6314  
6315  	pMeasReqFrame->measReqIE.measReqField.measDuration =
6316  		mr.MeasurementRequest[0].meas_duration;
6317  
6318  	return QDF_STATUS_SUCCESS;
6319  
6320  } /* End sir_convert_meas_req_frame2_struct. */
6321  #endif
6322  
6323  void populate_dot11f_tspec(struct mac_tspec_ie *pOld, tDot11fIETSPEC *pDot11f)
6324  {
6325  	pDot11f->traffic_type = pOld->tsinfo.traffic.trafficType;
6326  	pDot11f->tsid = pOld->tsinfo.traffic.tsid;
6327  	pDot11f->direction = pOld->tsinfo.traffic.direction;
6328  	pDot11f->access_policy = pOld->tsinfo.traffic.accessPolicy;
6329  	pDot11f->aggregation = pOld->tsinfo.traffic.aggregation;
6330  	pDot11f->psb = pOld->tsinfo.traffic.psb;
6331  	pDot11f->user_priority = pOld->tsinfo.traffic.userPrio;
6332  	pDot11f->tsinfo_ack_pol = pOld->tsinfo.traffic.ackPolicy;
6333  	pDot11f->schedule = pOld->tsinfo.schedule.schedule;
6334  	/* As defined in IEEE 802.11-2007, section 7.3.2.30
6335  	 * Nominal MSDU size: Bit[0:14]=Size, Bit[15]=Fixed
6336  	 */
6337  	pDot11f->size = (pOld->nomMsduSz & 0x7fff);
6338  	pDot11f->fixed = (pOld->nomMsduSz & 0x8000) ? 1 : 0;
6339  	pDot11f->max_msdu_size = pOld->maxMsduSz;
6340  	pDot11f->min_service_int = pOld->minSvcInterval;
6341  	pDot11f->max_service_int = pOld->maxSvcInterval;
6342  	pDot11f->inactivity_int = pOld->inactInterval;
6343  	pDot11f->suspension_int = pOld->suspendInterval;
6344  	pDot11f->service_start_time = pOld->svcStartTime;
6345  	pDot11f->min_data_rate = pOld->minDataRate;
6346  	pDot11f->mean_data_rate = pOld->meanDataRate;
6347  	pDot11f->peak_data_rate = pOld->peakDataRate;
6348  	pDot11f->burst_size = pOld->maxBurstSz;
6349  	pDot11f->delay_bound = pOld->delayBound;
6350  	pDot11f->min_phy_rate = pOld->minPhyRate;
6351  	pDot11f->surplus_bw_allowance = pOld->surplusBw;
6352  	pDot11f->medium_time = pOld->mediumTime;
6353  
6354  	pDot11f->present = 1;
6355  
6356  } /* End populate_dot11f_tspec. */
6357  
6358  #ifdef WLAN_FEATURE_MSCS
6359  void
6360  populate_dot11f_mscs_dec_element(struct mscs_req_info *mscs_req,
6361  				 tDot11fmscs_request_action_frame *dot11f)
6362  {
6363  	dot11f->descriptor_element.request_type =
6364  			mscs_req->dec.request_type;
6365  	dot11f->descriptor_element.user_priority_control =
6366  			mscs_req->dec.user_priority_control;
6367  	dot11f->descriptor_element.stream_timeout =
6368  			mscs_req->dec.stream_timeout;
6369  	dot11f->descriptor_element.tclas_mask.classifier_type =
6370  			mscs_req->dec.tclas_mask.classifier_type;
6371  	dot11f->descriptor_element.tclas_mask.classifier_mask =
6372  			mscs_req->dec.tclas_mask.classifier_mask;
6373  
6374  	dot11f->descriptor_element.present = 1;
6375  	dot11f->descriptor_element.tclas_mask.present = 1;
6376  
6377  } /* End populate_dot11f_descriptor_element */
6378  #endif
6379  
6380  void populate_dot11f_wmmtspec(struct mac_tspec_ie *pOld,
6381  			      tDot11fIEWMMTSPEC *pDot11f)
6382  {
6383  	pDot11f->traffic_type = pOld->tsinfo.traffic.trafficType;
6384  	pDot11f->tsid = pOld->tsinfo.traffic.tsid;
6385  	pDot11f->direction = pOld->tsinfo.traffic.direction;
6386  	pDot11f->access_policy = pOld->tsinfo.traffic.accessPolicy;
6387  	pDot11f->aggregation = pOld->tsinfo.traffic.aggregation;
6388  	pDot11f->psb = pOld->tsinfo.traffic.psb;
6389  	pDot11f->user_priority = pOld->tsinfo.traffic.userPrio;
6390  	pDot11f->tsinfo_ack_pol = pOld->tsinfo.traffic.ackPolicy;
6391  	pDot11f->burst_size_defn = pOld->tsinfo.traffic.burstSizeDefn;
6392  	/* As defined in IEEE 802.11-2007, section 7.3.2.30
6393  	 * Nominal MSDU size: Bit[0:14]=Size, Bit[15]=Fixed
6394  	 */
6395  	pDot11f->size = (pOld->nomMsduSz & 0x7fff);
6396  	pDot11f->fixed = (pOld->nomMsduSz & 0x8000) ? 1 : 0;
6397  	pDot11f->max_msdu_size = pOld->maxMsduSz;
6398  	pDot11f->min_service_int = pOld->minSvcInterval;
6399  	pDot11f->max_service_int = pOld->maxSvcInterval;
6400  	pDot11f->inactivity_int = pOld->inactInterval;
6401  	pDot11f->suspension_int = pOld->suspendInterval;
6402  	pDot11f->service_start_time = pOld->svcStartTime;
6403  	pDot11f->min_data_rate = pOld->minDataRate;
6404  	pDot11f->mean_data_rate = pOld->meanDataRate;
6405  	pDot11f->peak_data_rate = pOld->peakDataRate;
6406  	pDot11f->burst_size = pOld->maxBurstSz;
6407  	pDot11f->delay_bound = pOld->delayBound;
6408  	pDot11f->min_phy_rate = pOld->minPhyRate;
6409  	pDot11f->surplus_bw_allowance = pOld->surplusBw;
6410  	pDot11f->medium_time = pOld->mediumTime;
6411  
6412  	pDot11f->version = 1;
6413  	pDot11f->present = 1;
6414  
6415  } /* End populate_dot11f_wmmtspec. */
6416  
6417  #if defined(FEATURE_WLAN_ESE)
6418  /* Fill the ESE version currently supported */
6419  void populate_dot11f_ese_version(tDot11fIEESEVersion *pESEVersion)
6420  {
6421  	pESEVersion->present = 1;
6422  	pESEVersion->version = ESE_VERSION_SUPPORTED;
6423  }
6424  
6425  /* Fill the ESE ie for the station. */
6426  /* The State is Normal (1) */
6427  /* The MBSSID for station is set to 0. */
6428  void populate_dot11f_ese_rad_mgmt_cap(tDot11fIEESERadMgmtCap *pESERadMgmtCap)
6429  {
6430  	pESERadMgmtCap->present = 1;
6431  	pESERadMgmtCap->mgmt_state = RM_STATE_NORMAL;
6432  	pESERadMgmtCap->mbssid_mask = 0;
6433  	pESERadMgmtCap->reserved = 0;
6434  }
6435  
6436  QDF_STATUS
6437  populate_dot11f_ese_cckm_opaque(struct mac_context *mac,
6438  				struct mlme_connect_info *connect_info,
6439  				tDot11fIEESECckmOpaque *pDot11f)
6440  {
6441  	int idx;
6442  	tSirRSNie ie;
6443  
6444  	if (connect_info->cckm_ie_len &&
6445  	    connect_info->cckm_ie_len < DOT11F_IE_RSN_MAX_LEN) {
6446  		qdf_mem_copy(ie.rsnIEdata, connect_info->cckm_ie,
6447  			     connect_info->cckm_ie_len);
6448  		ie.length = connect_info->cckm_ie_len;
6449  		idx = find_ie_location(mac, &ie, DOT11F_EID_ESECCKMOPAQUE);
6450  		if (idx >= 0) {
6451  			pDot11f->present = 1;
6452  			/* Dont include OUI */
6453  			pDot11f->num_data = ie.rsnIEdata[idx + 1] - 4;
6454  			qdf_mem_copy(pDot11f->data, ie.rsnIEdata + idx + 2 + 4,  /* EID,len,OUI */
6455  				     ie.rsnIEdata[idx + 1] - 4); /* Skip OUI */
6456  		}
6457  	}
6458  	return QDF_STATUS_SUCCESS;
6459  } /* End populate_dot11f_ese_cckm_opaque. */
6460  
6461  void populate_dot11_tsrsie(struct mac_context *mac,
6462  			   struct ese_tsrs_ie *pOld,
6463  			   tDot11fIEESETrafStrmRateSet *pDot11f,
6464  			   uint8_t rate_length)
6465  {
6466  	pDot11f->tsid = pOld->tsid;
6467  	qdf_mem_copy(pDot11f->tsrates, pOld->rates, rate_length);
6468  	pDot11f->num_tsrates = rate_length;
6469  	pDot11f->present = 1;
6470  }
6471  #endif
6472  
6473  QDF_STATUS
6474  populate_dot11f_tclas(struct mac_context *mac,
6475  		      tSirTclasInfo *pOld, tDot11fIETCLAS *pDot11f)
6476  {
6477  	pDot11f->user_priority = pOld->tclas.userPrio;
6478  	pDot11f->classifier_type = pOld->tclas.classifierType;
6479  	pDot11f->classifier_mask = pOld->tclas.classifierMask;
6480  
6481  	switch (pDot11f->classifier_type) {
6482  	case SIR_MAC_TCLASTYPE_ETHERNET:
6483  		qdf_mem_copy((uint8_t *) &pDot11f->info.EthParams.source,
6484  			     (uint8_t *) &pOld->tclasParams.eth.srcAddr, 6);
6485  		qdf_mem_copy((uint8_t *) &pDot11f->info.EthParams.dest,
6486  			     (uint8_t *) &pOld->tclasParams.eth.dstAddr, 6);
6487  		pDot11f->info.EthParams.type = pOld->tclasParams.eth.type;
6488  		break;
6489  	case SIR_MAC_TCLASTYPE_TCPUDPIP:
6490  		pDot11f->info.IpParams.version = pOld->version;
6491  		if (SIR_MAC_TCLAS_IPV4 == pDot11f->info.IpParams.version) {
6492  			qdf_mem_copy(pDot11f->info.IpParams.params.IpV4Params.
6493  				     source, pOld->tclasParams.ipv4.srcIpAddr,
6494  				     4);
6495  			qdf_mem_copy(pDot11f->info.IpParams.params.IpV4Params.
6496  				     dest, pOld->tclasParams.ipv4.dstIpAddr, 4);
6497  			pDot11f->info.IpParams.params.IpV4Params.src_port =
6498  				pOld->tclasParams.ipv4.srcPort;
6499  			pDot11f->info.IpParams.params.IpV4Params.dest_port =
6500  				pOld->tclasParams.ipv4.dstPort;
6501  			pDot11f->info.IpParams.params.IpV4Params.DSCP =
6502  				pOld->tclasParams.ipv4.dscp;
6503  			pDot11f->info.IpParams.params.IpV4Params.proto =
6504  				pOld->tclasParams.ipv4.protocol;
6505  			pDot11f->info.IpParams.params.IpV4Params.reserved =
6506  				pOld->tclasParams.ipv4.rsvd;
6507  		} else {
6508  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6509  				     params.IpV6Params.source,
6510  				     (uint8_t *) pOld->tclasParams.ipv6.
6511  				     srcIpAddr, 16);
6512  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6513  				     params.IpV6Params.dest,
6514  				     (uint8_t *) pOld->tclasParams.ipv6.
6515  				     dstIpAddr, 16);
6516  			pDot11f->info.IpParams.params.IpV6Params.src_port =
6517  				pOld->tclasParams.ipv6.srcPort;
6518  			pDot11f->info.IpParams.params.IpV6Params.dest_port =
6519  				pOld->tclasParams.ipv6.dstPort;
6520  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6521  				     params.IpV6Params.flow_label,
6522  				     (uint8_t *) pOld->tclasParams.ipv6.
6523  				     flowLabel, 3);
6524  		}
6525  		break;
6526  	case SIR_MAC_TCLASTYPE_8021DQ:
6527  		pDot11f->info.Params8021dq.tag_type =
6528  			pOld->tclasParams.t8021dq.tag;
6529  		break;
6530  	default:
6531  		pe_err("Bad TCLAS type %d", pDot11f->classifier_type);
6532  		return QDF_STATUS_E_FAILURE;
6533  	}
6534  
6535  	pDot11f->present = 1;
6536  
6537  	return QDF_STATUS_SUCCESS;
6538  
6539  } /* End populate_dot11f_tclas. */
6540  
6541  QDF_STATUS
6542  populate_dot11f_wmmtclas(struct mac_context *mac,
6543  			 tSirTclasInfo *pOld, tDot11fIEWMMTCLAS *pDot11f)
6544  {
6545  	pDot11f->version = 1;
6546  	pDot11f->user_priority = pOld->tclas.userPrio;
6547  	pDot11f->classifier_type = pOld->tclas.classifierType;
6548  	pDot11f->classifier_mask = pOld->tclas.classifierMask;
6549  
6550  	switch (pDot11f->classifier_type) {
6551  	case SIR_MAC_TCLASTYPE_ETHERNET:
6552  		qdf_mem_copy((uint8_t *) &pDot11f->info.EthParams.source,
6553  			     (uint8_t *) &pOld->tclasParams.eth.srcAddr, 6);
6554  		qdf_mem_copy((uint8_t *) &pDot11f->info.EthParams.dest,
6555  			     (uint8_t *) &pOld->tclasParams.eth.dstAddr, 6);
6556  		pDot11f->info.EthParams.type = pOld->tclasParams.eth.type;
6557  		break;
6558  	case SIR_MAC_TCLASTYPE_TCPUDPIP:
6559  		pDot11f->info.IpParams.version = pOld->version;
6560  		if (SIR_MAC_TCLAS_IPV4 == pDot11f->info.IpParams.version) {
6561  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6562  				     params.IpV4Params.source,
6563  				     (uint8_t *) pOld->tclasParams.ipv4.
6564  				     srcIpAddr, 4);
6565  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6566  				     params.IpV4Params.dest,
6567  				     (uint8_t *) pOld->tclasParams.ipv4.
6568  				     dstIpAddr, 4);
6569  			pDot11f->info.IpParams.params.IpV4Params.src_port =
6570  				pOld->tclasParams.ipv4.srcPort;
6571  			pDot11f->info.IpParams.params.IpV4Params.dest_port =
6572  				pOld->tclasParams.ipv4.dstPort;
6573  			pDot11f->info.IpParams.params.IpV4Params.DSCP =
6574  				pOld->tclasParams.ipv4.dscp;
6575  			pDot11f->info.IpParams.params.IpV4Params.proto =
6576  				pOld->tclasParams.ipv4.protocol;
6577  			pDot11f->info.IpParams.params.IpV4Params.reserved =
6578  				pOld->tclasParams.ipv4.rsvd;
6579  		} else {
6580  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6581  				     params.IpV6Params.source,
6582  				     (uint8_t *) pOld->tclasParams.ipv6.
6583  				     srcIpAddr, 16);
6584  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6585  				     params.IpV6Params.dest,
6586  				     (uint8_t *) pOld->tclasParams.ipv6.
6587  				     dstIpAddr, 16);
6588  			pDot11f->info.IpParams.params.IpV6Params.src_port =
6589  				pOld->tclasParams.ipv6.srcPort;
6590  			pDot11f->info.IpParams.params.IpV6Params.dest_port =
6591  				pOld->tclasParams.ipv6.dstPort;
6592  			qdf_mem_copy((uint8_t *) &pDot11f->info.IpParams.
6593  				     params.IpV6Params.flow_label,
6594  				     (uint8_t *) pOld->tclasParams.ipv6.
6595  				     flowLabel, 3);
6596  		}
6597  		break;
6598  	case SIR_MAC_TCLASTYPE_8021DQ:
6599  		pDot11f->info.Params8021dq.tag_type =
6600  			pOld->tclasParams.t8021dq.tag;
6601  		break;
6602  	default:
6603  		pe_err("Bad TCLAS type %d in populate_dot11f_tclas",
6604  			pDot11f->classifier_type);
6605  		return QDF_STATUS_E_FAILURE;
6606  	}
6607  
6608  	pDot11f->present = 1;
6609  
6610  	return QDF_STATUS_SUCCESS;
6611  
6612  } /* End populate_dot11f_wmmtclas. */
6613  
6614  QDF_STATUS populate_dot11f_wsc(struct mac_context *mac,
6615  			       tDot11fIEWscBeacon *pDot11f)
6616  {
6617  
6618  	uint32_t wpsState;
6619  
6620  	pDot11f->Version.present = 1;
6621  	pDot11f->Version.major = 0x01;
6622  	pDot11f->Version.minor = 0x00;
6623  
6624  	wpsState = mac->mlme_cfg->wps_params.wps_state;
6625  
6626  	pDot11f->WPSState.present = 1;
6627  	pDot11f->WPSState.state = (uint8_t) wpsState;
6628  
6629  	pDot11f->APSetupLocked.present = 0;
6630  
6631  	pDot11f->SelectedRegistrar.present = 0;
6632  
6633  	pDot11f->DevicePasswordID.present = 0;
6634  
6635  	pDot11f->SelectedRegistrarConfigMethods.present = 0;
6636  
6637  	pDot11f->UUID_E.present = 0;
6638  
6639  	pDot11f->RFBands.present = 0;
6640  
6641  	pDot11f->present = 1;
6642  	return QDF_STATUS_SUCCESS;
6643  }
6644  
6645  QDF_STATUS populate_dot11f_wsc_registrar_info(struct mac_context *mac,
6646  					      tDot11fIEWscBeacon *pDot11f)
6647  {
6648  	const struct sLimWscIeInfo *const pWscIeInfo = &(mac->lim.wscIeInfo);
6649  
6650  	pDot11f->APSetupLocked.present = 1;
6651  	pDot11f->APSetupLocked.fLocked = pWscIeInfo->apSetupLocked;
6652  
6653  	pDot11f->SelectedRegistrar.present = 1;
6654  	pDot11f->SelectedRegistrar.selected = pWscIeInfo->selectedRegistrar;
6655  
6656  	pDot11f->DevicePasswordID.present = 1;
6657  	pDot11f->DevicePasswordID.id =
6658  		(uint16_t)mac->mlme_cfg->wps_params.wps_device_password_id;
6659  
6660  	pDot11f->SelectedRegistrarConfigMethods.present = 1;
6661  	pDot11f->SelectedRegistrarConfigMethods.methods =
6662  		pWscIeInfo->selectedRegistrarConfigMethods;
6663  
6664  	/* UUID_E and RF Bands are applicable only for dual band AP */
6665  
6666  	return QDF_STATUS_SUCCESS;
6667  }
6668  
6669  QDF_STATUS de_populate_dot11f_wsc_registrar_info(struct mac_context *mac,
6670  						 tDot11fIEWscBeacon *pDot11f)
6671  {
6672  	pDot11f->APSetupLocked.present = 0;
6673  	pDot11f->SelectedRegistrar.present = 0;
6674  	pDot11f->DevicePasswordID.present = 0;
6675  	pDot11f->SelectedRegistrarConfigMethods.present = 0;
6676  
6677  	return QDF_STATUS_SUCCESS;
6678  }
6679  
6680  QDF_STATUS populate_dot11f_probe_res_wpsi_es(struct mac_context *mac,
6681  					     tDot11fIEWscProbeRes *pDot11f,
6682  					     struct pe_session *pe_session)
6683  {
6684  
6685  	tSirWPSProbeRspIE *pSirWPSProbeRspIE;
6686  
6687  	pSirWPSProbeRspIE = &pe_session->APWPSIEs.SirWPSProbeRspIE;
6688  
6689  	if (pSirWPSProbeRspIE->FieldPresent & SIR_WPS_PROBRSP_VER_PRESENT) {
6690  		pDot11f->present = 1;
6691  		pDot11f->Version.present = 1;
6692  		pDot11f->Version.major =
6693  			(uint8_t) ((pSirWPSProbeRspIE->Version & 0xF0) >> 4);
6694  		pDot11f->Version.minor =
6695  			(uint8_t) (pSirWPSProbeRspIE->Version & 0x0F);
6696  	} else {
6697  		pDot11f->present = 0;
6698  		pDot11f->Version.present = 0;
6699  	}
6700  
6701  	if (pSirWPSProbeRspIE->FieldPresent & SIR_WPS_PROBRSP_STATE_PRESENT) {
6702  
6703  		pDot11f->WPSState.present = 1;
6704  		pDot11f->WPSState.state = (uint8_t) pSirWPSProbeRspIE->wpsState;
6705  	} else
6706  		pDot11f->WPSState.present = 0;
6707  
6708  	if (pSirWPSProbeRspIE->
6709  	    FieldPresent & SIR_WPS_PROBRSP_APSETUPLOCK_PRESENT) {
6710  		pDot11f->APSetupLocked.present = 1;
6711  		pDot11f->APSetupLocked.fLocked =
6712  			pSirWPSProbeRspIE->APSetupLocked;
6713  	} else
6714  		pDot11f->APSetupLocked.present = 0;
6715  
6716  	if (pSirWPSProbeRspIE->
6717  	    FieldPresent & SIR_WPS_PROBRSP_SELECTEDREGISTRA_PRESENT) {
6718  		pDot11f->SelectedRegistrar.present = 1;
6719  		pDot11f->SelectedRegistrar.selected =
6720  			pSirWPSProbeRspIE->SelectedRegistra;
6721  	} else
6722  		pDot11f->SelectedRegistrar.present = 0;
6723  
6724  	if (pSirWPSProbeRspIE->
6725  	    FieldPresent & SIR_WPS_PROBRSP_DEVICEPASSWORDID_PRESENT) {
6726  		pDot11f->DevicePasswordID.present = 1;
6727  		pDot11f->DevicePasswordID.id =
6728  			pSirWPSProbeRspIE->DevicePasswordID;
6729  	} else
6730  		pDot11f->DevicePasswordID.present = 0;
6731  
6732  	if (pSirWPSProbeRspIE->
6733  	    FieldPresent & SIR_WPS_PROBRSP_SELECTEDREGISTRACFGMETHOD_PRESENT) {
6734  		pDot11f->SelectedRegistrarConfigMethods.present = 1;
6735  		pDot11f->SelectedRegistrarConfigMethods.methods =
6736  			pSirWPSProbeRspIE->SelectedRegistraCfgMethod;
6737  	} else
6738  		pDot11f->SelectedRegistrarConfigMethods.present = 0;
6739  
6740  	if (pSirWPSProbeRspIE->
6741  	    FieldPresent & SIR_WPS_PROBRSP_RESPONSETYPE_PRESENT) {
6742  		pDot11f->ResponseType.present = 1;
6743  		pDot11f->ResponseType.resType = pSirWPSProbeRspIE->ResponseType;
6744  	} else
6745  		pDot11f->ResponseType.present = 0;
6746  
6747  	if (pSirWPSProbeRspIE->FieldPresent & SIR_WPS_PROBRSP_UUIDE_PRESENT) {
6748  		pDot11f->UUID_E.present = 1;
6749  		qdf_mem_copy(pDot11f->UUID_E.uuid, pSirWPSProbeRspIE->UUID_E,
6750  			     WNI_CFG_WPS_UUID_LEN);
6751  	} else
6752  		pDot11f->UUID_E.present = 0;
6753  
6754  	if (pSirWPSProbeRspIE->
6755  	    FieldPresent & SIR_WPS_PROBRSP_MANUFACTURE_PRESENT) {
6756  		pDot11f->Manufacturer.present = 1;
6757  		pDot11f->Manufacturer.num_name =
6758  			pSirWPSProbeRspIE->Manufacture.num_name;
6759  		qdf_mem_copy(pDot11f->Manufacturer.name,
6760  			     pSirWPSProbeRspIE->Manufacture.name,
6761  			     pSirWPSProbeRspIE->Manufacture.num_name);
6762  	} else
6763  		pDot11f->Manufacturer.present = 0;
6764  
6765  	if (pSirWPSProbeRspIE->
6766  	    FieldPresent & SIR_WPS_PROBRSP_MODELNUMBER_PRESENT) {
6767  		pDot11f->ModelName.present = 1;
6768  		pDot11f->ModelName.num_text =
6769  			pSirWPSProbeRspIE->ModelName.num_text;
6770  		qdf_mem_copy(pDot11f->ModelName.text,
6771  			     pSirWPSProbeRspIE->ModelName.text,
6772  			     pDot11f->ModelName.num_text);
6773  	} else
6774  		pDot11f->ModelName.present = 0;
6775  
6776  	if (pSirWPSProbeRspIE->
6777  	    FieldPresent & SIR_WPS_PROBRSP_MODELNUMBER_PRESENT) {
6778  		pDot11f->ModelNumber.present = 1;
6779  		pDot11f->ModelNumber.num_text =
6780  			pSirWPSProbeRspIE->ModelNumber.num_text;
6781  		qdf_mem_copy(pDot11f->ModelNumber.text,
6782  			     pSirWPSProbeRspIE->ModelNumber.text,
6783  			     pDot11f->ModelNumber.num_text);
6784  	} else
6785  		pDot11f->ModelNumber.present = 0;
6786  
6787  	if (pSirWPSProbeRspIE->
6788  	    FieldPresent & SIR_WPS_PROBRSP_SERIALNUMBER_PRESENT) {
6789  		pDot11f->SerialNumber.present = 1;
6790  		pDot11f->SerialNumber.num_text =
6791  			pSirWPSProbeRspIE->SerialNumber.num_text;
6792  		qdf_mem_copy(pDot11f->SerialNumber.text,
6793  			     pSirWPSProbeRspIE->SerialNumber.text,
6794  			     pDot11f->SerialNumber.num_text);
6795  	} else
6796  		pDot11f->SerialNumber.present = 0;
6797  
6798  	if (pSirWPSProbeRspIE->
6799  	    FieldPresent & SIR_WPS_PROBRSP_PRIMARYDEVICETYPE_PRESENT) {
6800  		pDot11f->PrimaryDeviceType.present = 1;
6801  		qdf_mem_copy(pDot11f->PrimaryDeviceType.oui,
6802  			     pSirWPSProbeRspIE->PrimaryDeviceOUI,
6803  			     sizeof(pSirWPSProbeRspIE->PrimaryDeviceOUI));
6804  		pDot11f->PrimaryDeviceType.primary_category =
6805  			(uint16_t) pSirWPSProbeRspIE->PrimaryDeviceCategory;
6806  		pDot11f->PrimaryDeviceType.sub_category =
6807  			(uint16_t) pSirWPSProbeRspIE->DeviceSubCategory;
6808  	} else
6809  		pDot11f->PrimaryDeviceType.present = 0;
6810  
6811  	if (pSirWPSProbeRspIE->
6812  	    FieldPresent & SIR_WPS_PROBRSP_DEVICENAME_PRESENT) {
6813  		pDot11f->DeviceName.present = 1;
6814  		pDot11f->DeviceName.num_text =
6815  			pSirWPSProbeRspIE->DeviceName.num_text;
6816  		qdf_mem_copy(pDot11f->DeviceName.text,
6817  			     pSirWPSProbeRspIE->DeviceName.text,
6818  			     pDot11f->DeviceName.num_text);
6819  	} else
6820  		pDot11f->DeviceName.present = 0;
6821  
6822  	if (pSirWPSProbeRspIE->
6823  	    FieldPresent & SIR_WPS_PROBRSP_CONFIGMETHODS_PRESENT) {
6824  		pDot11f->ConfigMethods.present = 1;
6825  		pDot11f->ConfigMethods.methods =
6826  			pSirWPSProbeRspIE->ConfigMethod;
6827  	} else
6828  		pDot11f->ConfigMethods.present = 0;
6829  
6830  	if (pSirWPSProbeRspIE->FieldPresent & SIR_WPS_PROBRSP_RF_BANDS_PRESENT) {
6831  		pDot11f->RFBands.present = 1;
6832  		pDot11f->RFBands.bands = pSirWPSProbeRspIE->RFBand;
6833  	} else
6834  		pDot11f->RFBands.present = 0;
6835  
6836  	return QDF_STATUS_SUCCESS;
6837  }
6838  
6839  QDF_STATUS populate_dot11f_beacon_wpsi_es(struct mac_context *mac,
6840  					  tDot11fIEWscBeacon *pDot11f,
6841  					  struct pe_session *pe_session)
6842  {
6843  
6844  	tSirWPSBeaconIE *pSirWPSBeaconIE;
6845  
6846  	pSirWPSBeaconIE = &pe_session->APWPSIEs.SirWPSBeaconIE;
6847  
6848  	if (pSirWPSBeaconIE->FieldPresent & SIR_WPS_PROBRSP_VER_PRESENT) {
6849  		pDot11f->present = 1;
6850  		pDot11f->Version.present = 1;
6851  		pDot11f->Version.major =
6852  			(uint8_t) ((pSirWPSBeaconIE->Version & 0xF0) >> 4);
6853  		pDot11f->Version.minor =
6854  			(uint8_t) (pSirWPSBeaconIE->Version & 0x0F);
6855  	} else {
6856  		pDot11f->present = 0;
6857  		pDot11f->Version.present = 0;
6858  	}
6859  
6860  	if (pSirWPSBeaconIE->FieldPresent & SIR_WPS_BEACON_STATE_PRESENT) {
6861  
6862  		pDot11f->WPSState.present = 1;
6863  		pDot11f->WPSState.state = (uint8_t) pSirWPSBeaconIE->wpsState;
6864  	} else
6865  		pDot11f->WPSState.present = 0;
6866  
6867  	if (pSirWPSBeaconIE->FieldPresent & SIR_WPS_BEACON_APSETUPLOCK_PRESENT) {
6868  		pDot11f->APSetupLocked.present = 1;
6869  		pDot11f->APSetupLocked.fLocked = pSirWPSBeaconIE->APSetupLocked;
6870  	} else
6871  		pDot11f->APSetupLocked.present = 0;
6872  
6873  	if (pSirWPSBeaconIE->
6874  	    FieldPresent & SIR_WPS_BEACON_SELECTEDREGISTRA_PRESENT) {
6875  		pDot11f->SelectedRegistrar.present = 1;
6876  		pDot11f->SelectedRegistrar.selected =
6877  			pSirWPSBeaconIE->SelectedRegistra;
6878  	} else
6879  		pDot11f->SelectedRegistrar.present = 0;
6880  
6881  	if (pSirWPSBeaconIE->
6882  	    FieldPresent & SIR_WPS_BEACON_DEVICEPASSWORDID_PRESENT) {
6883  		pDot11f->DevicePasswordID.present = 1;
6884  		pDot11f->DevicePasswordID.id =
6885  			pSirWPSBeaconIE->DevicePasswordID;
6886  	} else
6887  		pDot11f->DevicePasswordID.present = 0;
6888  
6889  	if (pSirWPSBeaconIE->
6890  	    FieldPresent & SIR_WPS_BEACON_SELECTEDREGISTRACFGMETHOD_PRESENT) {
6891  		pDot11f->SelectedRegistrarConfigMethods.present = 1;
6892  		pDot11f->SelectedRegistrarConfigMethods.methods =
6893  			pSirWPSBeaconIE->SelectedRegistraCfgMethod;
6894  	} else
6895  		pDot11f->SelectedRegistrarConfigMethods.present = 0;
6896  
6897  	if (pSirWPSBeaconIE->FieldPresent & SIR_WPS_BEACON_UUIDE_PRESENT) {
6898  		pDot11f->UUID_E.present = 1;
6899  		qdf_mem_copy(pDot11f->UUID_E.uuid, pSirWPSBeaconIE->UUID_E,
6900  			     WNI_CFG_WPS_UUID_LEN);
6901  	} else
6902  		pDot11f->UUID_E.present = 0;
6903  
6904  	if (pSirWPSBeaconIE->FieldPresent & SIR_WPS_BEACON_RF_BANDS_PRESENT) {
6905  		pDot11f->RFBands.present = 1;
6906  		pDot11f->RFBands.bands = pSirWPSBeaconIE->RFBand;
6907  	} else
6908  		pDot11f->RFBands.present = 0;
6909  
6910  	return QDF_STATUS_SUCCESS;
6911  }
6912  
6913  QDF_STATUS populate_dot11f_wsc_in_probe_res(struct mac_context *mac,
6914  					    tDot11fIEWscProbeRes *pDot11f)
6915  {
6916  	uint32_t cfgStrLen;
6917  	uint32_t val;
6918  	uint32_t wpsVersion, wpsState;
6919  
6920  	wpsVersion = mac->mlme_cfg->wps_params.wps_version;
6921  
6922  	pDot11f->Version.present = 1;
6923  	pDot11f->Version.major = (uint8_t) ((wpsVersion & 0xF0) >> 4);
6924  	pDot11f->Version.minor = (uint8_t) (wpsVersion & 0x0F);
6925  
6926  	wpsState = mac->mlme_cfg->wps_params.wps_state;
6927  	pDot11f->WPSState.present = 1;
6928  	pDot11f->WPSState.state = (uint8_t) wpsState;
6929  
6930  	pDot11f->APSetupLocked.present = 0;
6931  
6932  	pDot11f->SelectedRegistrar.present = 0;
6933  
6934  	pDot11f->DevicePasswordID.present = 0;
6935  
6936  	pDot11f->SelectedRegistrarConfigMethods.present = 0;
6937  
6938  	pDot11f->ResponseType.present = 1;
6939  	if ((mac->lim.wscIeInfo.reqType == REQ_TYPE_REGISTRAR) ||
6940  	    (mac->lim.wscIeInfo.reqType == REQ_TYPE_WLAN_MANAGER_REGISTRAR)) {
6941  		pDot11f->ResponseType.resType = RESP_TYPE_ENROLLEE_OPEN_8021X;
6942  	} else {
6943  		pDot11f->ResponseType.resType = RESP_TYPE_AP;
6944  	}
6945  
6946  	/* UUID is a 16 byte long binary*/
6947  	pDot11f->UUID_E.present = 1;
6948  	*pDot11f->UUID_E.uuid = '\0';
6949  
6950  	wlan_mlme_get_wps_uuid(&mac->mlme_cfg->wps_params,
6951  			       pDot11f->UUID_E.uuid);
6952  
6953  	pDot11f->Manufacturer.present = 1;
6954  	cfgStrLen = sizeof(pDot11f->Manufacturer.name);
6955  	if (wlan_mlme_get_manufacturer_name(mac->psoc,
6956  					    pDot11f->Manufacturer.name,
6957  					    &cfgStrLen) != QDF_STATUS_SUCCESS) {
6958  		pDot11f->Manufacturer.num_name = 0;
6959  	} else {
6960  		pDot11f->Manufacturer.num_name =
6961  			(uint8_t) (cfgStrLen & 0x000000FF);
6962  	}
6963  
6964  	pDot11f->ModelName.present = 1;
6965  	cfgStrLen = sizeof(pDot11f->ModelName.text);
6966  	if (wlan_mlme_get_model_name(mac->psoc,
6967  				     pDot11f->ModelName.text,
6968  				     &cfgStrLen) != QDF_STATUS_SUCCESS) {
6969  		pDot11f->ModelName.num_text = 0;
6970  	} else {
6971  		pDot11f->ModelName.num_text =
6972  			(uint8_t) (cfgStrLen & 0x000000FF);
6973  	}
6974  
6975  	pDot11f->ModelNumber.present = 1;
6976  	cfgStrLen = sizeof(pDot11f->ModelNumber.text);
6977  	if (wlan_mlme_get_model_number(mac->psoc,
6978  				       pDot11f->ModelNumber.text,
6979  				       &cfgStrLen) != QDF_STATUS_SUCCESS) {
6980  		pDot11f->ModelNumber.num_text = 0;
6981  	} else {
6982  		pDot11f->ModelNumber.num_text =
6983  			(uint8_t) (cfgStrLen & 0x000000FF);
6984  	}
6985  
6986  	pDot11f->SerialNumber.present = 1;
6987  	cfgStrLen = sizeof(pDot11f->SerialNumber.text);
6988  	if (wlan_mlme_get_manufacture_product_version
6989  				(mac->psoc,
6990  				 pDot11f->SerialNumber.text,
6991  				 &cfgStrLen) != QDF_STATUS_SUCCESS) {
6992  		pDot11f->SerialNumber.num_text = 0;
6993  	} else {
6994  		pDot11f->SerialNumber.num_text =
6995  			(uint8_t) (cfgStrLen & 0x000000FF);
6996  	}
6997  
6998  	pDot11f->PrimaryDeviceType.present = 1;
6999  
7000  	pDot11f->PrimaryDeviceType.primary_category =
7001  	       (uint16_t)mac->mlme_cfg->wps_params.wps_primary_device_category;
7002  
7003  		val = mac->mlme_cfg->wps_params.wps_primary_device_oui;
7004  		*(pDot11f->PrimaryDeviceType.oui) =
7005  			(uint8_t) ((val >> 24) & 0xff);
7006  		*(pDot11f->PrimaryDeviceType.oui + 1) =
7007  			(uint8_t) ((val >> 16) & 0xff);
7008  		*(pDot11f->PrimaryDeviceType.oui + 2) =
7009  			(uint8_t) ((val >> 8) & 0xff);
7010  		*(pDot11f->PrimaryDeviceType.oui + 3) =
7011  			(uint8_t) ((val & 0xff));
7012  
7013  	pDot11f->PrimaryDeviceType.sub_category =
7014  	       (uint16_t)mac->mlme_cfg->wps_params.wps_device_sub_category;
7015  
7016  
7017  	pDot11f->DeviceName.present = 1;
7018  	cfgStrLen = sizeof(pDot11f->DeviceName.text);
7019  	if (wlan_mlme_get_manufacture_product_name(mac->psoc,
7020  						   pDot11f->DeviceName.text,
7021  						   &cfgStrLen) !=
7022  						   QDF_STATUS_SUCCESS) {
7023  		pDot11f->DeviceName.num_text = 0;
7024  	} else {
7025  		pDot11f->DeviceName.num_text =
7026  			(uint8_t) (cfgStrLen & 0x000000FF);
7027  	}
7028  
7029  		pDot11f->ConfigMethods.present = 1;
7030  		pDot11f->ConfigMethods.methods =
7031  			(uint16_t)(mac->mlme_cfg->wps_params.wps_cfg_method &
7032  				   0x0000FFFF);
7033  
7034  	pDot11f->RFBands.present = 0;
7035  
7036  	pDot11f->present = 1;
7037  	return QDF_STATUS_SUCCESS;
7038  }
7039  
7040  QDF_STATUS
7041  populate_dot11f_wsc_registrar_info_in_probe_res(struct mac_context *mac,
7042  						tDot11fIEWscProbeRes *pDot11f)
7043  {
7044  	const struct sLimWscIeInfo *const pWscIeInfo = &(mac->lim.wscIeInfo);
7045  
7046  	pDot11f->APSetupLocked.present = 1;
7047  	pDot11f->APSetupLocked.fLocked = pWscIeInfo->apSetupLocked;
7048  
7049  	pDot11f->SelectedRegistrar.present = 1;
7050  	pDot11f->SelectedRegistrar.selected = pWscIeInfo->selectedRegistrar;
7051  
7052  	pDot11f->DevicePasswordID.present = 1;
7053  	pDot11f->DevicePasswordID.id =
7054  		(uint16_t)mac->mlme_cfg->wps_params.wps_device_password_id;
7055  
7056  	pDot11f->SelectedRegistrarConfigMethods.present = 1;
7057  	pDot11f->SelectedRegistrarConfigMethods.methods =
7058  		pWscIeInfo->selectedRegistrarConfigMethods;
7059  
7060  	/* UUID_E and RF Bands are applicable only for dual band AP */
7061  
7062  	return QDF_STATUS_SUCCESS;
7063  }
7064  
7065  QDF_STATUS
7066  de_populate_dot11f_wsc_registrar_info_in_probe_res(struct mac_context *mac,
7067  						   tDot11fIEWscProbeRes *
7068  								 pDot11f)
7069  {
7070  	pDot11f->APSetupLocked.present = 0;
7071  	pDot11f->SelectedRegistrar.present = 0;
7072  	pDot11f->DevicePasswordID.present = 0;
7073  	pDot11f->SelectedRegistrarConfigMethods.present = 0;
7074  
7075  	return QDF_STATUS_SUCCESS;
7076  }
7077  
7078  QDF_STATUS populate_dot11_assoc_res_p2p_ie(struct mac_context *mac,
7079  					   tDot11fIEP2PAssocRes *pDot11f,
7080  					   tpSirAssocReq pRcvdAssocReq)
7081  {
7082  	const uint8_t *p2pIe;
7083  
7084  	p2pIe = limGetP2pIEPtr(mac, pRcvdAssocReq->addIE.addIEdata,
7085  			       pRcvdAssocReq->addIE.length);
7086  	if (p2pIe) {
7087  		pDot11f->present = 1;
7088  		pDot11f->P2PStatus.present = 1;
7089  		pDot11f->P2PStatus.status = QDF_STATUS_SUCCESS;
7090  		pDot11f->ExtendedListenTiming.present = 0;
7091  	}
7092  	return QDF_STATUS_SUCCESS;
7093  }
7094  
7095  
7096  QDF_STATUS populate_dot11f_wfatpc(struct mac_context *mac,
7097  				  tDot11fIEWFATPC *pDot11f, uint8_t txPower,
7098  				  uint8_t linkMargin)
7099  {
7100  	pDot11f->txPower = txPower;
7101  	pDot11f->linkMargin = linkMargin;
7102  	pDot11f->present = 1;
7103  
7104  	return QDF_STATUS_SUCCESS;
7105  }
7106  
7107  void
7108  populate_dot11f_chan_load_report(struct mac_context *mac,
7109  				 tDot11fIEMeasurementReport *dot11f,
7110  				 struct chan_load_report *channel_load_report)
7111  {
7112  	dot11f->report.channel_load_report.op_class =
7113  					channel_load_report->op_class;
7114  	dot11f->report.channel_load_report.channel =
7115  					channel_load_report->channel;
7116  	qdf_mem_copy(dot11f->report.channel_load_report.meas_start_time,
7117  		&channel_load_report->rrm_scan_tsf,
7118  		sizeof(dot11f->report.channel_load_report.meas_start_time));
7119  	dot11f->report.channel_load_report.meas_duration =
7120  				channel_load_report->meas_duration;
7121  	dot11f->report.channel_load_report.chan_load =
7122  				channel_load_report->chan_load;
7123  
7124  	if (channel_load_report->wide_bw.is_wide_bw_chan_switch) {
7125  		dot11f->report.channel_load_report.wide_bw_chan_switch.present = 1;
7126  		dot11f->report.channel_load_report.wide_bw_chan_switch.new_chan_width = channel_load_report->wide_bw.channel_width;
7127  		dot11f->report.channel_load_report.wide_bw_chan_switch.new_center_chan_freq0 = channel_load_report->wide_bw.center_chan_freq0;
7128  		dot11f->report.channel_load_report.wide_bw_chan_switch.new_center_chan_freq1 = channel_load_report->wide_bw.center_chan_freq1;
7129  	}
7130  
7131  	if (channel_load_report->bw_ind.is_bw_ind_element) {
7132  		dot11f->report.channel_load_report.bw_indication.present = 1;
7133  		dot11f->report.channel_load_report.bw_indication.channel_width = channel_load_report->bw_ind.channel_width;
7134  		dot11f->report.channel_load_report.bw_indication.ccfs0 = channel_load_report->bw_ind.center_freq_seg0;
7135  		dot11f->report.channel_load_report.bw_indication.ccfs1 = channel_load_report->bw_ind.center_freq_seg1;
7136  	}
7137  
7138  	pe_debug("regClass %d chan %d meas_time %lu meas_dur %d, chan_load %d",
7139  		 dot11f->report.channel_load_report.op_class,
7140  		 dot11f->report.channel_load_report.channel,
7141  		 channel_load_report->rrm_scan_tsf,
7142  		 dot11f->report.channel_load_report.meas_duration,
7143  		 dot11f->report.channel_load_report.chan_load);
7144  }
7145  
7146  static void
7147  populate_dot11f_rrm_counter_stats(tDot11fIEMeasurementReport *pdot11f,
7148  				  struct counter_stats *counter_stats,
7149  				  bool *reporting_reason_present)
7150  {
7151  	tDot11fIEreporting_reason *reporting_reason;
7152  
7153  	reporting_reason = &pdot11f->report.sta_stats.reporting_reason;
7154  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.transmitted_fragment_count =
7155  		counter_stats->transmitted_fragment_count;
7156  
7157  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.group_transmitted_frame_count =
7158  		counter_stats->group_transmitted_frame_count;
7159  
7160  	if (counter_stats->failed_count) {
7161  		reporting_reason->failed_count = 1;
7162  		*reporting_reason_present = true;
7163  	}
7164  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.failed_count =
7165  			counter_stats->failed_count;
7166  
7167  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.received_fragment_count =
7168  		counter_stats->received_fragment_count;
7169  
7170  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.group_received_frame_count =
7171  		counter_stats->group_received_frame_count;
7172  
7173  	if (counter_stats->fcs_error_count) {
7174  		reporting_reason->fcs_error = 1;
7175  		*reporting_reason_present = true;
7176  	}
7177  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.fcs_error_count =
7178  			counter_stats->fcs_error_count;
7179  
7180  	pdot11f->report.sta_stats.statsgroupdata.dot11_counter_stats.transmitted_frame_count =
7181  			counter_stats->transmitted_frame_count;
7182  }
7183  
7184  static void
7185  populate_dot11f_rrm_mac_stats(tDot11fIEMeasurementReport *pdot11f,
7186  			      struct mac_stats *mac_stats,
7187  			      bool *reporting_reason_present)
7188  {
7189  	tDot11fIEreporting_reason *reporting_reason;
7190  
7191  	reporting_reason = &pdot11f->report.sta_stats.reporting_reason;
7192  	if (mac_stats->retry_count) {
7193  		reporting_reason->retry = 1;
7194  		*reporting_reason_present = true;
7195  	}
7196  	pdot11f->report.sta_stats.statsgroupdata.dot11_mac_stats.retry_count =
7197  			mac_stats->retry_count;
7198  
7199  	if (mac_stats->multiple_retry_count) {
7200  		reporting_reason->multiple_retry = 1;
7201  		*reporting_reason_present = true;
7202  	}
7203  	pdot11f->report.sta_stats.statsgroupdata.dot11_mac_stats.multiple_retry_count =
7204  			mac_stats->multiple_retry_count;
7205  
7206  	if (mac_stats->frame_duplicate_count) {
7207  		reporting_reason->frame_duplicate = 1;
7208  		*reporting_reason_present = true;
7209  	}
7210  	pdot11f->report.sta_stats.statsgroupdata.dot11_mac_stats.frame_duplicate_count =
7211  			mac_stats->frame_duplicate_count;
7212  
7213  	pdot11f->report.sta_stats.statsgroupdata.dot11_mac_stats.rts_success_count =
7214  			mac_stats->rts_success_count;
7215  
7216  	if (mac_stats->rts_failure_count) {
7217  		reporting_reason->rts_failure = 1;
7218  		*reporting_reason_present = true;
7219  	}
7220  	pdot11f->report.sta_stats.statsgroupdata.dot11_mac_stats.rts_failure_count =
7221  			mac_stats->rts_failure_count;
7222  
7223  	if (mac_stats->ack_failure_count) {
7224  		reporting_reason->ack_failure = 1;
7225  		*reporting_reason_present = true;
7226  	}
7227  	pdot11f->report.sta_stats.statsgroupdata.dot11_mac_stats.ack_failure_count =
7228  			mac_stats->ack_failure_count;
7229  }
7230  
7231  static void
7232  populate_dot11f_rrm_access_delay_stats(
7233  				tDot11fIEMeasurementReport *pdot11f,
7234  				struct access_delay_stats *access_delay_stats)
7235  {
7236  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.ap_average_access_delay =
7237  		access_delay_stats->ap_average_access_delay;
7238  
7239  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.average_access_delay_besteffort =
7240  		access_delay_stats->average_access_delay_besteffort;
7241  
7242  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.average_access_delay_background =
7243  		access_delay_stats->average_access_delay_background;
7244  
7245  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.average_access_delay_video =
7246  		access_delay_stats->average_access_delay_video;
7247  
7248  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.average_access_delay_voice =
7249  		access_delay_stats->average_access_delay_voice;
7250  
7251  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.station_count =
7252  		access_delay_stats->station_count;
7253  
7254  	pdot11f->report.sta_stats.statsgroupdata.dot11_bss_average_access_delay.channel_utilization =
7255  		access_delay_stats->channel_utilization;
7256  }
7257  
7258  QDF_STATUS
7259  populate_dot11f_rrm_sta_stats_report(
7260  		struct mac_context *mac, tDot11fIEMeasurementReport *pdot11f,
7261  		struct statistics_report *statistics_report)
7262  {
7263  	struct counter_stats counter_stats;
7264  	struct mac_stats mac_stats;
7265  	struct access_delay_stats access_delay_stats;
7266  	bool reporting_reason_present = false;
7267  
7268  	counter_stats = statistics_report->group_stats.counter_stats;
7269  	mac_stats = statistics_report->group_stats.mac_stats;
7270  	access_delay_stats = statistics_report->group_stats.access_delay_stats;
7271  
7272  	pdot11f->report.sta_stats.meas_duration =
7273  					statistics_report->meas_duration;
7274  	pdot11f->report.sta_stats.group_id = statistics_report->group_id;
7275  	pdot11f->report.sta_stats.reporting_reason.present = 0;
7276  
7277  	switch (statistics_report->group_id) {
7278  	case STA_STAT_GROUP_ID_COUNTER_STATS:
7279  		populate_dot11f_rrm_counter_stats(pdot11f, &counter_stats,
7280  						  &reporting_reason_present);
7281  		break;
7282  	case STA_STAT_GROUP_ID_MAC_STATS:
7283  		populate_dot11f_rrm_mac_stats(pdot11f, &mac_stats,
7284  					      &reporting_reason_present);
7285  		break;
7286  	case STA_STAT_GROUP_ID_DELAY_STATS:
7287  		populate_dot11f_rrm_access_delay_stats(pdot11f,
7288  						       &access_delay_stats);
7289  		break;
7290  	default:
7291  		pe_err("group id not supported %d",
7292  		       statistics_report->group_id);
7293  		return QDF_STATUS_SUCCESS;
7294  	}
7295  	if (reporting_reason_present)
7296  		pdot11f->report.sta_stats.reporting_reason.present = 1;
7297  
7298  	return QDF_STATUS_SUCCESS;
7299  }
7300  
7301  QDF_STATUS
7302  populate_dot11f_beacon_report(struct mac_context *mac,
7303  			      tDot11fIEMeasurementReport *pDot11f,
7304  			      tSirMacBeaconReport *pBeaconReport,
7305  			      bool is_last_frame)
7306  {
7307  	tDot11fIEbeacon_report_frm_body_fragment_id *frm_body_frag_id;
7308  
7309  	pDot11f->report.Beacon.regClass = pBeaconReport->regClass;
7310  	pDot11f->report.Beacon.channel = pBeaconReport->channel;
7311  	qdf_mem_copy(pDot11f->report.Beacon.meas_start_time,
7312  		     pBeaconReport->measStartTime,
7313  		     sizeof(pDot11f->report.Beacon.meas_start_time));
7314  	pDot11f->report.Beacon.meas_duration = pBeaconReport->measDuration;
7315  	pDot11f->report.Beacon.condensed_PHY = pBeaconReport->phyType;
7316  	pDot11f->report.Beacon.reported_frame_type =
7317  		!pBeaconReport->bcnProbeRsp;
7318  	pDot11f->report.Beacon.RCPI = pBeaconReport->rcpi;
7319  	pDot11f->report.Beacon.RSNI = pBeaconReport->rsni;
7320  	qdf_mem_copy(pDot11f->report.Beacon.BSSID, pBeaconReport->bssid,
7321  		     sizeof(tSirMacAddr));
7322  	pDot11f->report.Beacon.antenna_id = pBeaconReport->antennaId;
7323  	pDot11f->report.Beacon.parent_TSF = pBeaconReport->parentTSF;
7324  
7325  	if (pBeaconReport->numIes) {
7326  		pDot11f->report.Beacon.BeaconReportFrmBody.present = 1;
7327  		qdf_mem_copy(pDot11f->report.Beacon.BeaconReportFrmBody.
7328  			     reportedFields, pBeaconReport->Ies,
7329  			     pBeaconReport->numIes);
7330  		pDot11f->report.Beacon.BeaconReportFrmBody.num_reportedFields =
7331  			pBeaconReport->numIes;
7332  	}
7333  
7334  	if (pBeaconReport->last_bcn_report_ind_support) {
7335  		pe_debug("Including Last Beacon Report in RRM Frame");
7336  		frm_body_frag_id = &pDot11f->report.Beacon.
7337  			beacon_report_frm_body_fragment_id;
7338  
7339  		frm_body_frag_id->present = 1;
7340  		frm_body_frag_id->beacon_report_id =
7341  			pBeaconReport->frame_body_frag_id.id;
7342  		frm_body_frag_id->fragment_id_number =
7343  			pBeaconReport->frame_body_frag_id.frag_id;
7344  		frm_body_frag_id->more_fragments =
7345  			pBeaconReport->frame_body_frag_id.more_frags;
7346  
7347  		pDot11f->report.Beacon.last_beacon_report_indication.present =
7348  			1;
7349  
7350  		pDot11f->report.Beacon.last_beacon_report_indication.
7351  			last_fragment = is_last_frame;
7352  		pe_debug("id %d frag_id %d more_frags %d is_last_frame %d",
7353  			 frm_body_frag_id->beacon_report_id,
7354  			 frm_body_frag_id->fragment_id_number,
7355  			 frm_body_frag_id->more_fragments,
7356  			 is_last_frame);
7357  	}
7358  	return QDF_STATUS_SUCCESS;
7359  
7360  }
7361  
7362  QDF_STATUS populate_dot11f_rrm_ie(struct mac_context *mac,
7363  				  tDot11fIERRMEnabledCap *pDot11f,
7364  				  struct pe_session *pe_session)
7365  {
7366  	tpRRMCaps pRrmCaps;
7367  	uint8_t *bytes;
7368  
7369  	pRrmCaps = rrm_get_capabilities(mac, pe_session);
7370  
7371  	pDot11f->LinkMeasurement = pRrmCaps->LinkMeasurement;
7372  	pDot11f->NeighborRpt = pRrmCaps->NeighborRpt;
7373  	pDot11f->parallel = pRrmCaps->parallel;
7374  	pDot11f->repeated = pRrmCaps->repeated;
7375  	pDot11f->BeaconPassive = pRrmCaps->BeaconPassive;
7376  	pDot11f->BeaconActive = pRrmCaps->BeaconActive;
7377  	pDot11f->BeaconTable = pRrmCaps->BeaconTable;
7378  	pDot11f->BeaconRepCond = pRrmCaps->BeaconRepCond;
7379  	pDot11f->FrameMeasurement = pRrmCaps->FrameMeasurement;
7380  	pDot11f->ChannelLoad = pRrmCaps->ChannelLoad;
7381  	pDot11f->NoiseHistogram = pRrmCaps->NoiseHistogram;
7382  	pDot11f->statistics = pRrmCaps->statistics;
7383  	pDot11f->LCIMeasurement = pRrmCaps->LCIMeasurement;
7384  	pDot11f->LCIAzimuth = pRrmCaps->LCIAzimuth;
7385  	pDot11f->TCMCapability = pRrmCaps->TCMCapability;
7386  	pDot11f->triggeredTCM = pRrmCaps->triggeredTCM;
7387  	pDot11f->APChanReport = pRrmCaps->APChanReport;
7388  	pDot11f->RRMMIBEnabled = pRrmCaps->RRMMIBEnabled;
7389  	pDot11f->operatingChanMax = pRrmCaps->operatingChanMax;
7390  	pDot11f->nonOperatinChanMax = pRrmCaps->nonOperatingChanMax;
7391  	pDot11f->MeasurementPilot = pRrmCaps->MeasurementPilot;
7392  	pDot11f->MeasurementPilotEnabled = pRrmCaps->MeasurementPilotEnabled;
7393  	pDot11f->NeighborTSFOffset = pRrmCaps->NeighborTSFOffset;
7394  	pDot11f->RCPIMeasurement = pRrmCaps->RCPIMeasurement;
7395  	pDot11f->RSNIMeasurement = pRrmCaps->RSNIMeasurement;
7396  	pDot11f->BssAvgAccessDelay = pRrmCaps->BssAvgAccessDelay;
7397  	pDot11f->BSSAvailAdmission = pRrmCaps->BSSAvailAdmission;
7398  	pDot11f->AntennaInformation = pRrmCaps->AntennaInformation;
7399  	pDot11f->fine_time_meas_rpt = pRrmCaps->fine_time_meas_rpt;
7400  	pDot11f->lci_capability = pRrmCaps->lci_capability;
7401  	pDot11f->reserved = pRrmCaps->reserved;
7402  
7403  	bytes = (uint8_t *) pDot11f + 1; /* ignore present field */
7404  	pe_debug("RRM Enabled Cap IE: %02x %02x %02x %02x %02x",
7405  			   bytes[0], bytes[1], bytes[2], bytes[3], bytes[4]);
7406  
7407  	pDot11f->present = 1;
7408  	return QDF_STATUS_SUCCESS;
7409  }
7410  
7411  void populate_mdie(struct mac_context *mac,
7412  		   tDot11fIEMobilityDomain *pDot11f,
7413  		   uint8_t mdie[])
7414  {
7415  	pDot11f->present = 1;
7416  	pDot11f->MDID = (uint16_t) ((mdie[1] << 8) | (mdie[0]));
7417  
7418  	/* Plugfest fix */
7419  	pDot11f->overDSCap = (mdie[2] & 0x01);
7420  	pDot11f->resourceReqCap = ((mdie[2] >> 1) & 0x01);
7421  
7422  }
7423  
7424  #ifdef WLAN_FEATURE_FILS_SK
7425  void populate_fils_ft_info(struct mac_context *mac, tDot11fIEFTInfo *ft_info,
7426  			   struct pe_session *pe_session)
7427  {
7428  	struct pe_fils_session *ft_fils_info = pe_session->fils_info;
7429  
7430  	if (!ft_fils_info)
7431  		return;
7432  
7433  	if (!ft_fils_info->ft_ie.present) {
7434  		ft_info->present = 0;
7435  		pe_err("FT IE doesn't exist");
7436  		return;
7437  	}
7438  
7439  	ft_info->IECount = ft_fils_info->ft_ie.element_count;
7440  
7441  	qdf_mem_copy(ft_info->MIC, ft_fils_info->ft_ie.mic,
7442  		     FT_MIC_LEN);
7443  
7444  	qdf_mem_copy(ft_info->Anonce, ft_fils_info->ft_ie.anonce,
7445  		     FT_NONCE_LEN);
7446  
7447  	qdf_mem_copy(ft_info->Snonce, ft_fils_info->ft_ie.snonce,
7448  		     FT_NONCE_LEN);
7449  
7450  	if (ft_fils_info->ft_ie.r0kh_id_len > 0) {
7451  		ft_info->R0KH_ID.present = 1;
7452  		qdf_mem_copy(ft_info->R0KH_ID.PMK_R0_ID,
7453  			     ft_fils_info->ft_ie.r0kh_id,
7454  			     ft_fils_info->ft_ie.r0kh_id_len);
7455  		ft_info->R0KH_ID.num_PMK_R0_ID =
7456  				ft_fils_info->ft_ie.r0kh_id_len;
7457  	}
7458  
7459  	ft_info->R1KH_ID.present = 1;
7460  	qdf_mem_copy(ft_info->R1KH_ID.PMK_R1_ID,
7461  		     ft_fils_info->ft_ie.r1kh_id,
7462  		     FT_R1KH_ID_LEN);
7463  
7464  	qdf_mem_copy(&ft_info->GTK, &ft_fils_info->ft_ie.gtk_ie,
7465  		     sizeof(struct mac_ft_gtk_ie));
7466  	qdf_mem_copy(&ft_info->IGTK, &ft_fils_info->ft_ie.igtk_ie,
7467  		     sizeof(struct mac_ft_igtk_ie));
7468  
7469  	ft_info->present = 1;
7470  }
7471  #endif
7472  
7473  void populate_dot11f_assoc_rsp_rates(struct mac_context *mac,
7474  				     tDot11fIESuppRates *pSupp,
7475  				     tDot11fIEExtSuppRates *pExt,
7476  				     uint16_t *_11bRates, uint16_t *_11aRates)
7477  {
7478  	uint8_t num_supp = 0, num_ext = 0;
7479  	uint8_t i, j;
7480  
7481  	for (i = 0; (i < SIR_NUM_11B_RATES && _11bRates[i]); i++, num_supp++) {
7482  		pSupp->rates[num_supp] = (uint8_t) _11bRates[i];
7483  	}
7484  	for (j = 0; (j < SIR_NUM_11A_RATES && _11aRates[j]); j++) {
7485  		if (num_supp < 8)
7486  			pSupp->rates[num_supp++] = (uint8_t) _11aRates[j];
7487  		else
7488  			pExt->rates[num_ext++] = (uint8_t) _11aRates[j];
7489  	}
7490  
7491  	if (num_supp) {
7492  		pSupp->num_rates = num_supp;
7493  		pSupp->present = 1;
7494  	}
7495  	if (num_ext) {
7496  		pExt->num_rates = num_ext;
7497  		pExt->present = 1;
7498  	}
7499  }
7500  
7501  void populate_dot11f_timeout_interval(struct mac_context *mac,
7502  				      tDot11fIETimeoutInterval *pDot11f,
7503  				      uint8_t type, uint32_t value)
7504  {
7505  	pDot11f->present = 1;
7506  	pDot11f->timeoutType = type;
7507  	pDot11f->timeoutValue = value;
7508  }
7509  
7510  /**
7511   * populate_dot11f_timing_advert_frame() - Populate the TA mgmt frame fields
7512   * @mac_ctx: the MAC context
7513   * @frame: pointer to the TA frame
7514   *
7515   * Return: The SIR status.
7516   */
7517  QDF_STATUS
7518  populate_dot11f_timing_advert_frame(struct mac_context *mac_ctx,
7519  				    tDot11fTimingAdvertisementFrame *frame)
7520  {
7521  	uint32_t val = 0;
7522  
7523  	/* Capabilities */
7524  	val = mac_ctx->mlme_cfg->wep_params.is_privacy_enabled;
7525  	if (val)
7526  		frame->Capabilities.privacy = 1;
7527  
7528  	if (mac_ctx->mlme_cfg->ht_caps.short_preamble)
7529  		frame->Capabilities.shortPreamble = 1;
7530  
7531  	if (mac_ctx->mlme_cfg->gen.enabled_11h)
7532  		frame->Capabilities.spectrumMgt = 1;
7533  
7534  	if (mac_ctx->mlme_cfg->wmm_params.qos_enabled)
7535  		frame->Capabilities.qos = 1;
7536  
7537  	if (mac_ctx->mlme_cfg->roam_scoring.apsd_enabled)
7538  		frame->Capabilities.apsd = 1;
7539  
7540  	val = mac_ctx->mlme_cfg->feature_flags.enable_block_ack;
7541  	frame->Capabilities.delayedBA =
7542  		(uint16_t)((val >> WNI_CFG_BLOCK_ACK_ENABLED_DELAYED) & 1);
7543  	frame->Capabilities.immediateBA =
7544  		(uint16_t)((val >> WNI_CFG_BLOCK_ACK_ENABLED_IMMEDIATE) & 1);
7545  
7546  	/* Country */
7547  	populate_dot11f_country(mac_ctx, &frame->Country, NULL);
7548  
7549  	/* PowerConstraints */
7550  	frame->PowerConstraints.localPowerConstraints =
7551  		mac_ctx->mlme_cfg->power.local_power_constraint;
7552  
7553  	frame->PowerConstraints.present = 1;
7554  
7555  	/* TimeAdvertisement */
7556  	frame->TimeAdvertisement.present = 1;
7557  	frame->TimeAdvertisement.timing_capabilities = 1;
7558  
7559  	return QDF_STATUS_SUCCESS;
7560  }
7561  
7562  #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_FEATURE_11AX)
7563  #ifdef WLAN_TWT_CONV_SUPPORTED
7564  static bool
7565  twt_get_requestor_flag(struct mac_context *mac)
7566  {
7567  	bool req_flag = false;
7568  
7569  	wlan_twt_cfg_get_req_flag(mac->psoc, &req_flag);
7570  	return req_flag;
7571  }
7572  
7573  static bool
7574  twt_get_responder_flag(struct mac_context *mac)
7575  {
7576  	bool res_flag = false;
7577  
7578  	wlan_twt_cfg_get_res_flag(mac->psoc, &res_flag);
7579  	return res_flag;
7580  }
7581  #else
7582  static bool
7583  twt_get_requestor_flag(struct mac_context *mac)
7584  {
7585  	return mac->mlme_cfg->twt_cfg.req_flag;
7586  }
7587  
7588  static bool
7589  twt_get_responder_flag(struct mac_context *mac)
7590  {
7591  	return mac->mlme_cfg->twt_cfg.res_flag;
7592  }
7593  #endif
7594  #endif
7595  
7596  #ifdef WLAN_FEATURE_11AX
7597  #ifdef WLAN_SUPPORT_TWT
7598  static void
7599  populate_dot11f_twt_he_cap(struct mac_context *mac,
7600  			   struct pe_session *session,
7601  			   tDot11fIEhe_cap *he_cap)
7602  {
7603  	bool twt_requestor = false;
7604  	bool twt_responder = false;
7605  	bool bcast_requestor = false;
7606  	bool bcast_responder = false;
7607  
7608  	wlan_twt_get_bcast_requestor_cfg(mac->psoc, &bcast_requestor);
7609  	bcast_requestor = bcast_requestor &&
7610  			  !mac->mlme_cfg->twt_cfg.disable_btwt_usr_cfg;
7611  	wlan_twt_get_bcast_responder_cfg(mac->psoc, &bcast_responder);
7612  	wlan_twt_get_requestor_cfg(mac->psoc, &twt_requestor);
7613  	wlan_twt_get_responder_cfg(mac->psoc, &twt_responder);
7614  
7615  	he_cap->broadcast_twt = 0;
7616  	if (session->opmode == QDF_STA_MODE ||
7617  	    session->opmode == QDF_SAP_MODE) {
7618  		he_cap->twt_request =
7619  			twt_requestor && twt_get_requestor_flag(mac);
7620  		he_cap->twt_responder =
7621  			twt_responder && twt_get_responder_flag(mac);
7622  	}
7623  
7624  	if (session->opmode == QDF_STA_MODE) {
7625  		he_cap->broadcast_twt = bcast_requestor;
7626  	} else if (session->opmode == QDF_SAP_MODE) {
7627  		he_cap->broadcast_twt = bcast_responder;
7628  	}
7629  }
7630  #else
7631  static inline void
7632  populate_dot11f_twt_he_cap(struct mac_context *mac_ctx,
7633  			   struct pe_session *session,
7634  			   tDot11fIEhe_cap *he_cap)
7635  {
7636  	he_cap->broadcast_twt = 0;
7637  }
7638  #endif
7639  
7640  /**
7641   * populate_dot11f_he_caps() - pouldate HE Capability IE
7642   * @mac_ctx: Global MAC context
7643   * @session: PE session
7644   * @he_cap: pointer to HE capability IE
7645   *
7646   * Populdate the HE capability IE based on the session.
7647   */
7648  QDF_STATUS populate_dot11f_he_caps(struct mac_context *mac_ctx, struct pe_session *session,
7649  				   tDot11fIEhe_cap *he_cap)
7650  {
7651  	uint8_t *ppet;
7652  	uint32_t value = 0;
7653  
7654  	he_cap->present = 1;
7655  
7656  	if (!session) {
7657  		qdf_mem_copy(he_cap, &mac_ctx->mlme_cfg->he_caps.dot11_he_cap,
7658  			     sizeof(tDot11fIEhe_cap));
7659  		return QDF_STATUS_SUCCESS;
7660  	}
7661  
7662  	/** TODO: String items needs attention. **/
7663  	qdf_mem_copy(he_cap, &session->he_config, sizeof(*he_cap));
7664  	if (he_cap->ppet_present) {
7665  		value = WNI_CFG_HE_PPET_LEN;
7666  		/* if session is present, populate PPET based on band */
7667  		if (!wlan_reg_is_24ghz_ch_freq(session->curr_op_freq))
7668  			qdf_mem_copy(he_cap->ppet.ppe_threshold.ppe_th,
7669  				     mac_ctx->mlme_cfg->he_caps.he_ppet_5g,
7670  				     value);
7671  		else
7672  			qdf_mem_copy(he_cap->ppet.ppe_threshold.ppe_th,
7673  				     mac_ctx->mlme_cfg->he_caps.he_ppet_2g,
7674  				     value);
7675  
7676  		ppet = he_cap->ppet.ppe_threshold.ppe_th;
7677  		he_cap->ppet.ppe_threshold.num_ppe_th =
7678  						lim_truncate_ppet(ppet, value);
7679  	} else {
7680  		he_cap->ppet.ppe_threshold.num_ppe_th = 0;
7681  	}
7682  	populate_dot11f_twt_he_cap(mac_ctx, session, he_cap);
7683  
7684  	if (wlan_reg_is_5ghz_ch_freq(session->curr_op_freq) ||
7685  	    wlan_reg_is_6ghz_chan_freq(session->curr_op_freq)) {
7686  		if (session->ch_width <= CH_WIDTH_80MHZ) {
7687  			he_cap->chan_width_2 = 0;
7688  			he_cap->chan_width_3 = 0;
7689  		} else if (session->ch_width == CH_WIDTH_160MHZ) {
7690  			he_cap->chan_width_3 = 0;
7691  		}
7692  	}
7693  
7694  	return QDF_STATUS_SUCCESS;
7695  }
7696  
7697  QDF_STATUS
7698  populate_dot11f_he_caps_by_band(struct mac_context *mac_ctx,
7699  				bool is_2g,
7700  				tDot11fIEhe_cap *he_cap,
7701  				struct pe_session *session)
7702  {
7703  	if (is_2g)
7704  		qdf_mem_copy(he_cap, &mac_ctx->he_cap_2g, sizeof(*he_cap));
7705  	else
7706  		qdf_mem_copy(he_cap, &mac_ctx->he_cap_5g, sizeof(*he_cap));
7707  
7708  	if (session)
7709  		populate_dot11f_twt_he_cap(mac_ctx, session, he_cap);
7710  
7711  	return QDF_STATUS_SUCCESS;
7712  }
7713  
7714  /**
7715   * populate_dot11f_he_operation() - pouldate HE Operation IE
7716   * @mac_ctx: Global MAC context
7717   * @session: PE session
7718   * @he_op: pointer to HE Operation IE
7719   *
7720   * Populdate the HE Operation IE based on the session.
7721   */
7722  QDF_STATUS
7723  populate_dot11f_he_operation(struct mac_context *mac_ctx,
7724  			     struct pe_session *session, tDot11fIEhe_op *he_op)
7725  {
7726  	enum reg_6g_ap_type ap_pwr_type;
7727  	qdf_mem_copy(he_op, &session->he_op, sizeof(*he_op));
7728  
7729  	he_op->present = 1;
7730  	he_op->vht_oper_present = 0;
7731  	if (session->he_6ghz_band) {
7732  		he_op->oper_info_6g_present = 1;
7733  		if (session->bssType != eSIR_INFRA_AP_MODE) {
7734  			he_op->oper_info_6g.info.ch_width = session->ch_width;
7735  			he_op->oper_info_6g.info.center_freq_seg0 =
7736  						session->ch_center_freq_seg0;
7737  			if (session->ch_width == CH_WIDTH_80P80MHZ ||
7738  			    session->ch_width == CH_WIDTH_160MHZ) {
7739  				he_op->oper_info_6g.info.center_freq_seg1 =
7740  					session->ch_center_freq_seg1;
7741  				he_op->oper_info_6g.info.ch_width =
7742  							CH_WIDTH_160MHZ;
7743  			} else {
7744  				he_op->oper_info_6g.info.center_freq_seg1 = 0;
7745  			}
7746  		}
7747  		he_op->oper_info_6g.info.primary_ch =
7748  			wlan_reg_freq_to_chan(mac_ctx->pdev,
7749  					      session->curr_op_freq);
7750  		he_op->oper_info_6g.info.dup_bcon = 0;
7751  		he_op->oper_info_6g.info.min_rate = 0;
7752  		wlan_reg_get_cur_6g_ap_pwr_type(mac_ctx->pdev, &ap_pwr_type);
7753  		he_op->oper_info_6g.info.reg_info = ap_pwr_type;
7754  	}
7755  
7756  	return QDF_STATUS_SUCCESS;
7757  }
7758  
7759  QDF_STATUS
7760  populate_dot11f_sr_info(struct mac_context *mac_ctx,
7761  			struct pe_session *session,
7762  			tDot11fIEspatial_reuse *sr_info)
7763  {
7764  	uint8_t non_srg_pd_offset;
7765  	uint8_t sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(session->vdev);
7766  	bool sr_enabled = wlan_vdev_mlme_get_he_spr_enabled(session->vdev);
7767  
7768  	if (!sr_enabled)
7769  		return QDF_STATUS_SUCCESS;
7770  
7771  	sr_info->present = 1;
7772  	sr_info->psr_disallow = 1;
7773  	sr_info->srg_info_present = 0;
7774  	sr_info->non_srg_offset_present = 0;
7775  	sr_info->non_srg_pd_sr_disallow = !!(sr_ctrl &
7776  					   WLAN_HE_NON_SRG_PD_SR_DISALLOWED);
7777  
7778  	if ((!sr_info->non_srg_pd_sr_disallow) &&
7779  	    (sr_ctrl & WLAN_HE_NON_SRG_OFFSET_PRESENT)) {
7780  		non_srg_pd_offset =
7781  			wlan_vdev_mlme_get_non_srg_pd_offset(session->vdev);
7782  		sr_info->non_srg_offset_present = 1;
7783  		sr_info->non_srg_offset.info.non_srg_pd_max_offset =
7784  							non_srg_pd_offset;
7785  	}
7786  
7787  	if (sr_ctrl & WLAN_HE_SIGA_SR_VAL15_ALLOWED)
7788  		sr_info->sr_value15_allow = 1;
7789  
7790  	return QDF_STATUS_SUCCESS;
7791  }
7792  
7793  QDF_STATUS
7794  populate_dot11f_he_6ghz_cap(struct mac_context *mac_ctx,
7795  			    struct pe_session *session,
7796  			    tDot11fIEhe_6ghz_band_cap *he_6g_cap)
7797  {
7798  	struct mlme_ht_capabilities_info *ht_cap_info;
7799  	struct mlme_vht_capabilities_info *vht_cap_info;
7800  
7801  	if (session && !session->he_6ghz_band)
7802  		return QDF_STATUS_SUCCESS;
7803  
7804  	ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
7805  	vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
7806  
7807  	he_6g_cap->present = 1;
7808  	he_6g_cap->min_mpdu_start_spacing =
7809  		mac_ctx->mlme_cfg->ht_caps.ampdu_params.mpdu_density;
7810  	if (session)
7811  		he_6g_cap->max_ampdu_len_exp =
7812  			session->vht_config.max_ampdu_lenexp;
7813  	else
7814  		he_6g_cap->max_ampdu_len_exp =
7815  			vht_cap_info->ampdu_len_exponent & 0x7;
7816  	he_6g_cap->max_mpdu_len = vht_cap_info->ampdu_len;
7817  	he_6g_cap->sm_pow_save = ht_cap_info->mimo_power_save;
7818  	he_6g_cap->rd_responder = 0;
7819  	he_6g_cap->rx_ant_pattern_consistency = 0;
7820  	he_6g_cap->tx_ant_pattern_consistency = 0;
7821  
7822  	lim_log_he_6g_cap(mac_ctx, he_6g_cap);
7823  
7824  	return QDF_STATUS_SUCCESS;
7825  }
7826  
7827  #ifdef WLAN_FEATURE_11AX_BSS_COLOR
7828  /**
7829   * populate_dot11f_he_bss_color_change() - pouldate HE BSS color change IE
7830   * @mac_ctx: Global MAC context
7831   * @session: PE session
7832   * @he_bss_color: pointer to HE BSS color change IE
7833   *
7834   * Populdate the HE BSS color change IE based on the session.
7835   */
7836  QDF_STATUS
7837  populate_dot11f_he_bss_color_change(struct mac_context *mac_ctx,
7838  				    struct pe_session *session,
7839  				    tDot11fIEbss_color_change *he_bss_color)
7840  {
7841  	if (!session->bss_color_changing) {
7842  		he_bss_color->present = 0;
7843  		return QDF_STATUS_SUCCESS;
7844  	}
7845  
7846  	he_bss_color->present = 1;
7847  	he_bss_color->countdown = session->he_bss_color_change.countdown;
7848  	he_bss_color->new_color = session->he_bss_color_change.new_color;
7849  
7850  	lim_log_he_bss_color(mac_ctx, he_bss_color);
7851  
7852  	return QDF_STATUS_SUCCESS;
7853  }
7854  #endif /* WLAN_FEATURE_11AX_BSS_COLOR */
7855  #endif /* WLAN_FEATURE_11AX */
7856  
7857  #ifdef WLAN_FEATURE_11BE
7858  
7859  /**
7860   * lim_get_ext_ie_ptr_from_ext_id() - Find out ext ie
7861   * @ie: source ie address
7862   * @ie_len: source ie length
7863   * @oui: oui buffer
7864   * @oui_size: oui size
7865   *
7866   * This API is used to find out ext ie from ext id
7867   *
7868   * Return: vendor ie address - success
7869   *         NULL - failure
7870   */
7871  static
7872  const uint8_t *lim_get_ext_ie_ptr_from_ext_id(const uint8_t *ie,
7873  					      uint16_t ie_len,
7874  					      const uint8_t *oui,
7875  					      uint8_t oui_size)
7876  {
7877  	return wlan_get_ext_ie_ptr_from_ext_id(oui, oui_size,
7878  					       ie, ie_len);
7879  }
7880  
7881  /* EHT Operation */
7882  /* 1 byte ext id, 1 byte eht op params, 4 bytes basic EHT MCS and NSS set*/
7883  #define EHTOP_FIXED_LEN         6
7884  
7885  #define EHTOP_PARAMS_INFOP_IDX  0
7886  #define EHTOP_PARAMS_INFOP_BITS 1
7887  
7888  #define EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_IDX    1
7889  #define EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_BITS   1
7890  
7891  #define EHTOP_INFO_CHANWIDTH_IDX                   0
7892  #define EHTOP_INFO_CHANWIDTH_BITS                  3
7893  
7894  #define WLAN_MAX_DISABLED_SUB_CHAN_BITMAP          2
7895  
7896  #define ehtop_ie_set(eht_op, index, num_bits, val) \
7897  			QDF_SET_BITS((*eht_op), qdf_do_div_rem(index, 8),\
7898  				     (num_bits), (val))
7899  #define ehtop_ie_get(eht_op, index, num_bits) \
7900  			QDF_GET_BITS((eht_op), qdf_do_div_rem(index, 8), \
7901  				     (num_bits))
7902  
7903  /* byte 0 */
7904  #define EHTOP_PARAMS_INFOP_GET_FROM_IE(__eht_op_params) \
7905  			ehtop_ie_get(__eht_op_params, \
7906  				     EHTOP_PARAMS_INFOP_IDX, \
7907  				     EHTOP_PARAMS_INFOP_BITS)
7908  #define EHTOP_PARAMS_INFOP_SET_TO_IE(__eht_op_params, __value) \
7909  			ehtop_ie_set(&__eht_op_params, \
7910  				     EHTOP_PARAMS_INFOP_IDX, \
7911  				     EHTOP_PARAMS_INFOP_BITS, __value)
7912  
7913  #define EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_GET_FROM_IE(__eht_op_params) \
7914  			ehtop_ie_get(__eht_op_params, \
7915  				     EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_IDX, \
7916  				     EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_BITS)
7917  #define EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_SET_TO_IE(__eht_op_params, __value) \
7918  			ehtop_ie_set(&__eht_op_params, \
7919  				     EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_IDX, \
7920  				     EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_BITS, \
7921  				     __value)
7922  
7923  #define EHTOP_PARAMS_EHT_DEF_PE_DURATION_GET_FROM_IE(__eht_op_params) \
7924  			ehtop_ie_get(__eht_op_params, \
7925  				     EHTOP_DEFAULT_PE_DURATION_IDX, \
7926  				     EHTOP_DEFAULT_PE_DURATION_BITS)
7927  #define EHTOP_PARAMS_EHT_DEF_PE_DURATION_SET_TO_IE(__eht_op_params, __value) \
7928  			ehtop_ie_set(&__eht_op_params, \
7929  				     EHTOP_DEFAULT_PE_DURATION_IDX, \
7930  				     EHTOP_DEFAULT_PE_DURATION_BITS, __value)
7931  
7932  #define EHTOP_PARAMS_GROUP_ADDR_BU_IND_LIMIT_GET_FROM_IE(__eht_op_params) \
7933  			ehtop_ie_get(__eht_op_params, \
7934  				     EHTOP_GRP_ADDRESSED_BU_IND_LIMIT_IDX, \
7935  				     EHTOP_GRP_ADDRESSED_BU_IND_LIMIT_BITS)
7936  #define EHTOP_PARAMS_GROUP_ADDR_BU_IND_LIMIT_SET_TO_IE(__eht_op_params, __value) \
7937  			ehtop_ie_set(&__eht_op_params, \
7938  				     EHTOP_GRP_ADDRESSED_BU_IND_LIMIT_IDX, \
7939  				     EHTOP_GRP_ADDRESSED_BU_IND_LIMIT_BITS, \
7940  				     __value)
7941  
7942  #define EHTOP_PARAMS_GROUP_ADDR_BU_IND_EXPONENT_GET_FROM_IE(__eht_op_params) \
7943  			ehtop_ie_get(__eht_op_params, \
7944  				     EHTOP_GRP_ADDRESSED_BU_IND_EXPONENT_IDX, \
7945  				     EHTOP_GRP_ADDRESSED_BU_IND_EXPONENT_BITS)
7946  #define EHTOP_PARAMS_GROUP_ADDR_BU_IND_EXPONENT_SET_TO_IE(__eht_op_params, __value) \
7947  			ehtop_ie_set(&__eht_op_params, \
7948  				     EHTOP_GRP_ADDRESSED_BU_IND_EXPONENT_IDX, \
7949  				     EHTOP_GRP_ADDRESSED_BU_IND_EXPONENT_BITS, \
7950  				     __value)
7951  
7952  #define EHTOP_INFO_CHANWIDTH_GET_FROM_IE(__eht_op_control) \
7953  			ehtop_ie_get(__eht_op_control, \
7954  				     EHTOP_INFO_CHANWIDTH_IDX, \
7955  				     EHTOP_INFO_CHANWIDTH_BITS)
7956  #define EHTOP_INFO_CHANWIDTH_SET_TO_IE(__eht_op_control, __value) \
7957  			ehtop_ie_set(&__eht_op_control, \
7958  				     EHTOP_INFO_CHANWIDTH_IDX, \
7959  				     EHTOP_INFO_CHANWIDTH_BITS, __value)
7960  
7961  /* 1 byte ext id, 2 bytes mac cap, 9 bytes phy cap */
7962  #define EHTCAP_FIXED_LEN 12
7963  #define EHTCAP_MACBYTE_IDX0      0
7964  #define EHTCAP_MACBYTE_IDX1      1
7965  
7966  #define EHTCAP_PHYBYTE_IDX0      0
7967  #define EHTCAP_PHYBYTE_IDX1      1
7968  #define EHTCAP_PHYBYTE_IDX2      2
7969  #define EHTCAP_PHYBYTE_IDX3      3
7970  #define EHTCAP_PHYBYTE_IDX4      4
7971  #define EHTCAP_PHYBYTE_IDX5      5
7972  #define EHTCAP_PHYBYTE_IDX6      6
7973  #define EHTCAP_PHYBYTE_IDX7      7
7974  #define EHTCAP_PHYBYTE_IDX8      8
7975  
7976  #define WLAN_IE_HDR_LEN          2
7977  
7978  enum EHT_TXRX_MCS_NSS_IDX {
7979  	EHTCAP_TXRX_MCS_NSS_IDX0,
7980  	EHTCAP_TXRX_MCS_NSS_IDX1,
7981  	EHTCAP_TXRX_MCS_NSS_IDX2,
7982  	EHTCAP_TXRX_MCS_NSS_IDXMAX,
7983  };
7984  
7985  enum EHT_PER_BW_TXRX_MCS_NSS_MAP_IDX {
7986  	EHTCAP_TXRX_MCS_NSS_IDX_ONLY20,
7987  	EHTCAP_TXRX_MCS_NSS_IDX_80,
7988  	EHTCAP_TXRX_MCS_NSS_IDX_160,
7989  	EHTCAP_TXRX_MCS_NSS_IDX_320,
7990  	EHTCAP_TXRX_MCS_NSS_IDX_MAX,
7991  };
7992  
7993  #define EHT_MCS_MAP_RX_MCS_0_9_IDX 0
7994  #define EHT_MCS_MAP_RX_MCS_0_9_BITS 4
7995  #define EHT_MCS_MAP_TX_MCS_0_9_IDX 4
7996  #define EHT_MCS_MAP_TX_MCS_0_9_BITS 4
7997  #define EHT_MCS_MAP_RX_MCS_10_11_IDX 8
7998  #define EHT_MCS_MAP_RX_MCS_10_11_BITS 4
7999  #define EHT_MCS_MAP_TX_MCS_10_11_IDX 12
8000  #define EHT_MCS_MAP_TX_MCS_10_11_BITS 4
8001  #define EHT_MCS_MAP_RX_MCS_12_13_IDX 16
8002  #define EHT_MCS_MAP_RX_MCS_12_13_BITS 4
8003  #define EHT_MCS_MAP_TX_MCS_12_13_IDX 20
8004  #define EHT_MCS_MAP_TX_MCS_12_13_BITS 4
8005  
8006  #define EHT_MCS_MAP_20_ONLY_RX_MCS_0_7_IDX 0
8007  #define EHT_MCS_MAP_20_ONLY_RX_MCS_0_7_BITS 4
8008  #define EHT_MCS_MAP_20_ONLY_TX_MCS_0_7_IDX 4
8009  #define EHT_MCS_MAP_20_ONLY_TX_MCS_0_7_BITS 4
8010  #define EHT_MCS_MAP_20_ONLY_RX_MCS_8_9_IDX 8
8011  #define EHT_MCS_MAP_20_ONLY_RX_MCS_8_9_BITS 4
8012  #define EHT_MCS_MAP_20_ONLY_TX_MCS_8_9_IDX 12
8013  #define EHT_MCS_MAP_20_ONLY_TX_MCS_8_9_BITS 4
8014  #define EHT_MCS_MAP_20_ONLY_RX_MCS_10_11_IDX 16
8015  #define EHT_MCS_MAP_20_ONLY_RX_MCS_10_11_BITS 4
8016  #define EHT_MCS_MAP_20_ONLY_TX_MCS_10_11_IDX 20
8017  #define EHT_MCS_MAP_20_ONLY_TX_MCS_10_11_BITS 4
8018  #define EHT_MCS_MAP_20_ONLY_RX_MCS_12_13_IDX 24
8019  #define EHT_MCS_MAP_20_ONLY_RX_MCS_12_13_BITS 4
8020  #define EHT_MCS_MAP_20_ONLY_TX_MCS_12_13_IDX 28
8021  #define EHT_MCS_MAP_20_ONLY_TX_MCS_12_13_BITS 4
8022  
8023  #define EHT_TXMCS_MAP_MCS_0_7_IDX 0
8024  #define EHT_TXMCS_MAP_MCS_0_7_BITS 4
8025  #define EHT_TXMCS_MAP_MCS_8_9_IDX 4
8026  #define EHT_TXMCS_MAP_MCS_8_9_BITS 4
8027  #define EHT_TXMCS_MAP_MCS_10_11_IDX 8
8028  #define EHT_TXMCS_MAP_MCS_10_11_BITS 4
8029  #define EHT_TXMCS_MAP_MCS_12_13_IDX 12
8030  #define EHT_TXMCS_MAP_MCS_12_13_BITS 4
8031  
8032  #define EHT_RXMCS_MAP_MCS_0_7_IDX 0
8033  #define EHT_RXMCS_MAP_MCS_0_7_BITS 4
8034  #define EHT_RXMCS_MAP_MCS_8_9_IDX 4
8035  #define EHT_RXMCS_MAP_MCS_8_9_BITS 4
8036  #define EHT_RXMCS_MAP_MCS_10_11_IDX 8
8037  #define EHT_RXMCS_MAP_MCS_10_11_BITS 4
8038  #define EHT_RXMCS_MAP_MCS_12_13_IDX 12
8039  #define EHT_RXMCS_MAP_MCS_12_13_BITS 4
8040  
8041  #define EHT_MCS_MAP_LEN 3
8042  #define EHT_MCS_MAP_BW20_ONLY_LEN 4
8043  
8044  #define ehtcap_ie_set(eht_cap, index, num_bits, val) \
8045  			QDF_SET_BITS((*eht_cap), qdf_do_div_rem(index, 8),\
8046  				     (num_bits), (val))
8047  #define ehtcap_ie_get(eht_cap, index, num_bits) \
8048  			QDF_GET_BITS((eht_cap), qdf_do_div_rem(index, 8), \
8049  				     (num_bits))
8050  
8051  /* byte 0 */
8052  #define EHTCAP_MAC_EPCSPRIACCESS_GET_FROM_IE(__eht_cap_mac) \
8053  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8054  				      EHTCAP_MAC_EPCSPRIACCESS_IDX, \
8055  				      EHTCAP_MAC_EPCSPRIACCESS_BITS)
8056  #define EHTCAP_MAC_EPCSPRIACCESS_SET_TO_IE(__eht_cap_mac, __value) \
8057  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8058  				      EHTCAP_MAC_EPCSPRIACCESS_IDX, \
8059  				      EHTCAP_MAC_EPCSPRIACCESS_BITS, __value)
8060  
8061  #define EHTCAP_MAC_EHTOMCTRL_GET_FROM_IE(__eht_cap_mac) \
8062  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8063  				      EHTCAP_MAC_EHTOMCTRL_IDX, \
8064  				      EHTCAP_MAC_EHTOMCTRL_BITS)
8065  #define EHTCAP_MAC_EHTOMCTRL_SET_TO_IE(__eht_cap_mac, value) \
8066  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8067  				      EHTCAP_MAC_EHTOMCTRL_IDX, \
8068  				      EHTCAP_MAC_EHTOMCTRL_BITS, value)
8069  
8070  #define EHTCAP_MAC_TRIGTXOP_MODE1_GET_FROM_IE(__eht_cap_mac) \
8071  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8072  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE1_IDX, \
8073  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE1_BITS)
8074  #define EHTCAP_MAC_TRIGTXOP_MODE1_SET_TO_IE(__eht_cap_mac, value) \
8075  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8076  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE1_IDX, \
8077  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE1_BITS, \
8078  				      value)
8079  
8080  #define EHTCAP_MAC_TRIGTXOP_MODE2_GET_FROM_IE(__eht_cap_mac) \
8081  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8082  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE2_IDX, \
8083  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE2_BITS)
8084  #define EHTCAP_MAC_TRIGTXOP_MODE2_SET_TO_IE(__eht_cap_mac, value) \
8085  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8086  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE2_IDX, \
8087  				      EHTCAP_MAC_TRIGGERED_TXOP_MODE2_BITS, \
8088  				      value)
8089  
8090  #define EHTCAP_MAC_RESTRICTED_TWT_GET_FROM_IE(__eht_cap_mac) \
8091  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8092  				      EHTCAP_MAC_RESTRICTED_TWT_IDX, \
8093  				      EHTCAP_MAC_RESTRICTED_TWT_BITS)
8094  #define EHTCAP_MAC_RESTRICTED_TWT_SET_TO_IE(__eht_cap_mac, value) \
8095  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8096  				      EHTCAP_MAC_RESTRICTED_TWT_IDX, \
8097  				      EHTCAP_MAC_RESTRICTED_TWT_BITS, value)
8098  
8099  #define EHTCAP_MAC_SCS_TRAFFIC_DESC_GET_FROM_IE(__eht_cap_mac) \
8100  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8101  				      EHTCAP_MAC_SCS_TRAFFIC_DESC_IDX, \
8102  				      EHTCAP_MAC_SCS_TRAFFIC_DESC_BITS)
8103  #define EHTCAP_MAC_SCS_TRAFFIC_DESC_SET_TO_IE(__eht_cap_mac, value) \
8104  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8105  				      EHTCAP_MAC_SCS_TRAFFIC_DESC_IDX, \
8106  				      EHTCAP_MAC_SCS_TRAFFIC_DESC_BITS, value)
8107  
8108  #define EHTCAP_MAC_MAX_MPDU_LEN_GET_FROM_IE(__eht_cap_mac) \
8109  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8110  				      EHTCAP_MAC_MAX_MPDU_LEN_IDX, \
8111  				      EHTCAP_MAC_MAX_MPDU_LEN_BITS)
8112  #define EHTCAP_MAC_MAX_MPDU_LEN_SET_TO_IE(__eht_cap_mac, value) \
8113  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX0], \
8114  				      EHTCAP_MAC_MAX_MPDU_LEN_IDX, \
8115  				      EHTCAP_MAC_MAX_MPDU_LEN_BITS, value)
8116  
8117  #define EHTCAP_MAC_MAX_A_MPDU_LEN_EXPONENT_EXT_GET_FROM_IE(__eht_cap_mac) \
8118  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8119  				      EHTCAP_MAC_MAX_A_MPDU_LEN_IDX, \
8120  				      EHTCAP_MAC_MAX_A_MPDU_LEN_BITS)
8121  #define EHTCAP_MAC_MAX_A_MPDU_LEN_EXPONENT_EXT_SET_TO_IE(__eht_cap_mac, value) \
8122  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8123  				      EHTCAP_MAC_MAX_A_MPDU_LEN_IDX, \
8124  				      EHTCAP_MAC_MAX_A_MPDU_LEN_BITS, value)
8125  
8126  #define EHTCAP_MAC_EHT_TRS_SUPPORT_GET_FROM_IE(__eht_cap_mac) \
8127  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8128  				      EHTCAP_MAC_TRS_SUPPORT_IDX, \
8129  				      EHTCAP_MAC_TRS_SUPPORT_BITS)
8130  #define EHTCAP_MAC_EHT_TRS_SUPPORT_SET_TO_IE(__eht_cap_mac, value) \
8131  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8132  				      EHTCAP_MAC_TRS_SUPPORT_IDX, \
8133  				      EHTCAP_MAC_TRS_SUPPORT_BITS, value)
8134  
8135  #define EHTCAP_MAC_TXOP_RETURN_SUPPORT_SHARE_M2_GET_FROM_IE(__eht_cap_mac) \
8136  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8137  				      EHTCAP_MAC_TXOP_RET_SUPPP_IN_SHARING_MODE2_IDX, \
8138  				      EHTCAP_MAC_TXOP_RET_SUPPP_IN_SHARING_MODE2_BITS)
8139  #define EHTCAP_MAC_TXOP_RETURN_SUPPORT_SHARE_M2_SET_FROM_IE(__eht_cap_mac, value) \
8140  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8141  				      EHTCAP_MAC_TXOP_RET_SUPPP_IN_SHARING_MODE2_IDX, \
8142  				      EHTCAP_MAC_TXOP_RET_SUPPP_IN_SHARING_MODE2_BITS, \
8143  				      value)
8144  
8145  #define EHTCAP_MAC_TWO_BQRS_SUPP_GET_FROM_IE(__eht_cap_mac) \
8146  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8147  				      EHTCAP_MAC_TWO_BQRS_SUPP_IDX, \
8148  				      EHTCAP_MAC_TWO_BQRS_SUPP_BITS)
8149  #define EHTCAP_MAC_TWO_BQRS_SUPP_SET_FROM_IE(__eht_cap_mac, value) \
8150  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8151  				      EHTCAP_MAC_TWO_BQRS_SUPP_IDX, \
8152  				      EHTCAP_MAC_TWO_BQRS_SUPP_BITS, \
8153  				      value)
8154  
8155  #define EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_GET_FROM_IE(__eht_cap_mac) \
8156  			ehtcap_ie_get(__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8157  				      EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_IDX, \
8158  				      EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_BITS)
8159  #define EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_SET_FROM_IE(__eht_cap_mac, value) \
8160  			ehtcap_ie_set(&__eht_cap_mac[EHTCAP_MACBYTE_IDX1], \
8161  				      EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_IDX, \
8162  				      EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_BITS, \
8163  				      value)
8164  
8165  /* byte 0 */
8166  #define EHTCAP_PHY_320MHZIN6GHZ_GET_FROM_IE(__eht_cap_phy) \
8167  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8168  				      EHTCAP_PHY_320MHZIN6GHZ_IDX, \
8169  				      EHTCAP_PHY_320MHZIN6GHZ_BITS)
8170  #define EHTCAP_PHY_320MHZIN6GHZ_SET_TO_IE(__eht_cap_phy, value) \
8171  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8172  				      EHTCAP_PHY_320MHZIN6GHZ_IDX, \
8173  				      EHTCAP_PHY_320MHZIN6GHZ_BITS, value)
8174  
8175  #define EHTCAP_PHY_242TONERUBWGT20MHZ_GET_FROM_IE(__eht_cap_phy) \
8176  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8177  				      EHTCAP_PHY_242TONERUBWLT20MHZ_IDX, \
8178  				      EHTCAP_PHY_242TONERUBWLT20MHZ_BITS)
8179  #define EHTCAP_PHY_242TONERUBWGT20MHZ_SET_TO_IE(__eht_cap_phy, value) \
8180  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8181  				      EHTCAP_PHY_242TONERUBWLT20MHZ_IDX, \
8182  				      EHTCAP_PHY_242TONERUBWLT20MHZ_BITS, value)
8183  
8184  #define EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_GET_FROM_IE(__eht_cap_phy) \
8185  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8186  				      EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_IDX, \
8187  				      EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_BITS)
8188  #define EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_SET_TO_IE(__eht_cap_phy, value) \
8189  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8190  				      EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_IDX, \
8191  				      EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_BITS, \
8192  				      value)
8193  
8194  #define EHTCAP_PHY_PARTIALBWULMU_GET_FROM_IE(__eht_cap_phy) \
8195  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8196  				      EHTCAP_PHY_PARTIALBWULMU_IDX, \
8197  				      EHTCAP_PHY_PARTIALBWULMU_BITS)
8198  #define EHTCAP_PHY_PARTIALBWULMU_SET_TO_IE(__eht_cap_phy, value) \
8199  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8200  				      EHTCAP_PHY_PARTIALBWULMU_IDX, \
8201  				      EHTCAP_PHY_PARTIALBWULMU_BITS, value)
8202  
8203  #define EHTCAP_PHY_SUBFMR_GET_FROM_IE(__eht_cap_phy) \
8204  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8205  				      EHTCAP_PHY_SUBFMR_IDX, \
8206  				      EHTCAP_PHY_SUBFMR_BITS)
8207  #define EHTCAP_PHY_SUBFMR_SET_TO_IE(__eht_cap_phy, value) \
8208  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0],  \
8209  				      EHTCAP_PHY_SUBFMR_IDX, \
8210  				      EHTCAP_PHY_SUBFMR_BITS, value)
8211  
8212  #define EHTCAP_PHY_SUBFME_GET_FROM_IE(__eht_cap_phy) \
8213  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8214  				      EHTCAP_PHY_SUBFME_IDX, \
8215  				      EHTCAP_PHY_SUBFME_BITS)
8216  #define EHTCAP_PHY_SUBFME_SET_TO_IE(__eht_cap_phy, value) \
8217  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8218  				      EHTCAP_PHY_SUBFME_IDX, \
8219  				      EHTCAP_PHY_SUBFME_BITS, value)
8220  
8221  #define EHTCAP_PHY_BFMESSLT80MHZ_GET_FROM_IE_BYTE0(__eht_cap_phy) \
8222  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8223  				      EHTCAP_PHY_BFMESSLT80MHZ_IDX, \
8224  				      1)
8225  #define EHTCAP_PHY_BFMESSLT80MHZ_SET_TO_IE_BYTE0(__eht_cap_phy, __value) \
8226  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX0], \
8227  				      EHTCAP_PHY_BFMESSLT80MHZ_IDX, \
8228  				      1, __value)
8229  
8230  /* byte 1 */
8231  #define EHTCAP_PHY_BFMESSLT80MHZ_GET_FROM_IE_BYTE1(__eht_cap_phy) \
8232  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX1], \
8233  				      8, \
8234  				      2)
8235  #define EHTCAP_PHY_BFMESSLT80MHZ_SET_TO_IE_BYTE1(__eht_cap_phy, __value) \
8236  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX1], \
8237  				      8, \
8238  				      2, __value)
8239  #define EHTCAP_PHY_BFMESS160MHZ_GET_FROM_IE(__eht_cap_phy) \
8240  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX1], \
8241  				      EHTCAP_PHY_BFMESS160MHZ_IDX, \
8242  				      EHTCAP_PHY_BFMESS160MHZ_BITS)
8243  #define EHTCAP_PHY_BFMESS160MHZ_SET_TO_IE(__eht_cap_phy, value) \
8244  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX1], \
8245  				      EHTCAP_PHY_BFMESS160MHZ_IDX, \
8246  				      EHTCAP_PHY_BFMESS160MHZ_BITS, value)
8247  
8248  #define EHTCAP_PHY_BFMESS320MHZ_GET_FROM_IE(__eht_cap_phy) \
8249  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX1], \
8250  				      EHTCAP_PHY_BFMESS320MHZ_IDX, \
8251  				      EHTCAP_PHY_BFMESS320MHZ_BITS)
8252  #define EHTCAP_PHY_BFMESS320MHZ_SET_TO_IE(__eht_cap_phy, value) \
8253  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX1], \
8254  				      EHTCAP_PHY_BFMESS320MHZ_IDX, \
8255  				      EHTCAP_PHY_BFMESS320MHZ_BITS, value)
8256  
8257  /* byte 2 */
8258  #define EHTCAP_PHY_NUMSOUNDLT80MHZ_GET_FROM_IE(__eht_cap_phy) \
8259  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX2], \
8260  				      EHTCAP_PHY_NUMSOUNDLT80MHZ_IDX, \
8261  				      EHTCAP_PHY_NUMSOUNDLT80MHZ_BITS)
8262  #define EHTCAP_PHY_NUMSOUNDLT80MHZ_SET_TO_IE(__eht_cap_phy, value) \
8263  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX2], \
8264  				      EHTCAP_PHY_NUMSOUNDLT80MHZ_IDX, \
8265  				      EHTCAP_PHY_NUMSOUNDLT80MHZ_BITS, value)
8266  
8267  #define EHTCAP_PHY_NUMSOUND160MHZ_GET_FROM_IE(__eht_cap_phy) \
8268  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX2], \
8269  				      EHTCAP_PHY_NUMSOUND160MHZ_IDX, \
8270  				      EHTCAP_PHY_NUMSOUND160MHZ_BITS)
8271  #define EHTCAP_PHY_NUMSOUND160MHZ_SET_TO_IE(__eht_cap_phy, value) \
8272  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX2], \
8273  				      EHTCAP_PHY_NUMSOUND160MHZ_IDX, \
8274  				      EHTCAP_PHY_NUMSOUND160MHZ_BITS, value)
8275  
8276  #define EHTCAP_PHY_NUMSOUND320MHZ_GET_FROM_IE(__eht_cap_phy) \
8277  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX2], \
8278  				      EHTCAP_PHY_NUMSOUND320MHZ_IDX, \
8279  				      EHTCAP_PHY_NUMSOUND320MHZ_BITS)
8280  #define EHTCAP_PHY_NUMSOUND320MHZ_SET_TO_IE(__eht_cap_phy, value) \
8281  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX2], \
8282  				      EHTCAP_PHY_NUMSOUND320MHZ_IDX, \
8283  				      EHTCAP_PHY_NUMSOUND320MHZ_BITS, value)
8284  
8285  /* byte 3 */
8286  #define EHTCAP_PHY_NG16SUFB_GET_FROM_IE(__eht_cap_phy) \
8287  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8288  				      EHTCAP_PHY_NG16SUFB_IDX, \
8289  				      EHTCAP_PHY_NG16SUFB_BITS)
8290  #define EHTCAP_PHY_NG16SUFB_SET_TO_IE(__eht_cap_phy, value) \
8291  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8292  				      EHTCAP_PHY_NG16SUFB_IDX, \
8293  				      EHTCAP_PHY_NG16SUFB_BITS, value)
8294  
8295  #define EHTCAP_PHY_NG16MUFB_GET_FROM_IE(__eht_cap_phy) \
8296  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8297  				      EHTCAP_PHY_NG16MUFB_IDX, \
8298  				      EHTCAP_PHY_NG16MUFB_BITS)
8299  #define EHTCAP_PHY_NG16MUFB_SET_TO_IE(__eht_cap_phy, value) \
8300  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8301  				      EHTCAP_PHY_NG16MUFB_IDX, \
8302  				      EHTCAP_PHY_NG16MUFB_BITS, value)
8303  
8304  #define EHTCAP_PHY_CODBK42SUFB_GET_FROM_IE(__eht_cap_phy) \
8305  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8306  				      EHTCAP_PHY_CODBK42SUFB_IDX, \
8307  				      EHTCAP_PHY_CODBK42SUFB_BITS)
8308  #define EHTCAP_PHY_CODBK42SUFB_SET_TO_IE(__eht_cap_phy, value) \
8309  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8310  				      EHTCAP_PHY_CODBK42SUFB_IDX, \
8311  				      EHTCAP_PHY_CODBK42SUFB_BITS, value)
8312  
8313  #define EHTCAP_PHY_CODBK75MUFB_GET_FROM_IE(__eht_cap_phy) \
8314  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8315  				      EHTCAP_PHY_CODBK75MUFB_IDX, \
8316  				      EHTCAP_PHY_CODBK75MUFB_BITS)
8317  #define EHTCAP_PHY_CODBK75MUFB_SET_TO_IE(__eht_cap_phy, value) \
8318  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8319  				      EHTCAP_PHY_CODBK75MUFB_IDX, \
8320  				      EHTCAP_PHY_CODBK75MUFB_BITS, value)
8321  
8322  #define EHTCAP_PHY_TRIGSUBFFB_GET_FROM_IE(__eht_cap_phy) \
8323  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8324  				      EHTCAP_PHY_TRIGSUBFFB_IDX, \
8325  				      EHTCAP_PHY_TRIGSUBFFB_BITS)
8326  #define EHTCAP_PHY_TRIGSUBFFB_SET_TO_IE(__eht_cap_phy, value) \
8327  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8328  				      EHTCAP_PHY_TRIGSUBFFB_IDX, \
8329  				      EHTCAP_PHY_TRIGSUBFFB_BITS, value)
8330  
8331  #define EHTCAP_PHY_TRIGMUBFPARTBWFB_GET_FROM_IE(__eht_cap_phy) \
8332  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8333  				      EHTCAP_PHY_TRIGMUBFPARTBWFB_IDX, \
8334  				      EHTCAP_PHY_TRIGMUBFPARTBWFB_BITS)
8335  #define EHTCAP_PHY_TRIGMUBFPARTBWFB_SET_TO_IE(__eht_cap_phy, value) \
8336  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8337  				      EHTCAP_PHY_TRIGMUBFPARTBWFB_IDX, \
8338  				      EHTCAP_PHY_TRIGMUBFPARTBWFB_BITS, value)
8339  
8340  #define EHTCAP_PHY_TRIGCQIFB_GET_FROM_IE(__eht_cap_phy) \
8341  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8342  				      EHTCAP_PHY_TRIGCQIFB_IDX, \
8343  				      EHTCAP_PHY_TRIGCQIFB_BITS)
8344  #define EHTCAP_PHY_TRIGCQIFB_SET_TO_IE(__eht_cap_phy, value) \
8345  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX3], \
8346  				      EHTCAP_PHY_TRIGCQIFB_IDX, \
8347  				      EHTCAP_PHY_TRIGCQIFB_BITS, value)
8348  
8349  /* byte 4 */
8350  #define EHTCAP_PHY_PARTBWDLMUMIMO_GET_FROM_IE(__eht_cap_phy) \
8351  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8352  				      EHTCAP_PHY_PARTBWDLMUMIMO_IDX, \
8353  				      EHTCAP_PHY_PARTBWDLMUMIMO_BITS)
8354  #define EHTCAP_PHY_PARTBWDLMUMIMO_SET_TO_IE(__eht_cap_phy, value) \
8355  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8356  				      EHTCAP_PHY_PARTBWDLMUMIMO_IDX, \
8357  				      EHTCAP_PHY_PARTBWDLMUMIMO_BITS, value)
8358  
8359  #define EHTCAP_PHY_PSRSR_GET_FROM_IE(__eht_cap_phy) \
8360  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8361  				      EHTCAP_PHY_PSRSR_IDX, \
8362  				      EHTCAP_PHY_PSRSR_BITS)
8363  #define EHTCAP_PHY_PSRSR_SET_TO_IE(__eht_cap_phy, value) \
8364  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8365  				      EHTCAP_PHY_PSRSR_IDX, \
8366  				      EHTCAP_PHY_PSRSR_BITS, value)
8367  
8368  #define EHTCAP_PHY_PWRBSTFACTOR_GET_FROM_IE(__eht_cap_phy) \
8369  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8370  				      EHTCAP_PHY_PWRBSTFACTOR_IDX, \
8371  				      EHTCAP_PHY_PWRBSTFACTOR_BITS)
8372  #define EHTCAP_PHY_PWRBSTFACTOR_SET_TO_IE(__eht_cap_phy, value) \
8373  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8374  				      EHTCAP_PHY_PWRBSTFACTOR_IDX, \
8375  				      EHTCAP_PHY_PWRBSTFACTOR_BITS, value)
8376  
8377  #define EHTCAP_PHY_4XEHTMULTFAND800NSGI_GET_FROM_IE(__eht_cap_phy) \
8378  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8379  				      EHTCAP_PHY_4XEHTLTFAND800NSGI_IDX, \
8380  				      EHTCAP_PHY_4XEHTLTFAND800NSGI_BITS)
8381  #define EHTCAP_PHY_4XEHTMULTFAND800NSGI_SET_TO_IE(__eht_cap_phy, value) \
8382  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8383  				      EHTCAP_PHY_4XEHTLTFAND800NSGI_IDX, \
8384  				      EHTCAP_PHY_4XEHTLTFAND800NSGI_BITS, value)
8385  
8386  #define EHTCAP_PHY_MAXNC_GET_FROM_IE(__eht_cap_phy) \
8387  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8388  				      EHTCAP_PHY_MAXNC_IDX, \
8389  				      EHTCAP_PHY_MAXNC_BITS)
8390  #define EHTCAP_PHY_MAXNC_SET_TO_IE(__eht_cap_phy, value) \
8391  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX4], \
8392  				      EHTCAP_PHY_MAXNC_IDX, \
8393  				      EHTCAP_PHY_MAXNC_BITS, value)
8394  
8395  /* byte 5 */
8396  #define EHTCAP_PHY_NONTRIGCQIFB_GET_FROM_IE(__eht_cap_phy) \
8397  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8398  				      EHTCAP_PHY_NONTRIGCQIFB_IDX, \
8399  				      EHTCAP_PHY_NONTRIGCQIFB_BITS)
8400  #define EHTCAP_PHY_NONTRIGCQIFB_SET_TO_IE(__eht_cap_phy, value) \
8401  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8402  				      EHTCAP_PHY_NONTRIGCQIFB_IDX, \
8403  				      EHTCAP_PHY_NONTRIGCQIFB_BITS, value)
8404  
8405  #define EHTCAP_PHY_TX1024AND4096QAMLT242TONERU_GET_FROM_IE(__eht_cap_phy) \
8406  		    ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8407  				  EHTCAP_PHY_TX1024AND4096QAMLS242TONERU_IDX, \
8408  				  EHTCAP_PHY_TX1024AND4096QAMLS242TONERU_BITS)
8409  #define EHTCAP_PHY_TX1024AND4096QAMLT242TONERU_SET_TO_IE(__eht_cap_phy, value) \
8410  		    ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8411  				  EHTCAP_PHY_TX1024AND4096QAMLS242TONERU_IDX, \
8412  				  EHTCAP_PHY_TX1024AND4096QAMLS242TONERU_BITS, \
8413  				  value)
8414  
8415  #define EHTCAP_PHY_RX1024AND4096QAMLT242TONERU_GET_FROM_IE(__eht_cap_phy) \
8416  		    ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8417  				  EHTCAP_PHY_RX1024AND4096QAMLS242TONERU_IDX, \
8418  				  EHTCAP_PHY_RX1024AND4096QAMLS242TONERU_BITS)
8419  #define EHTCAP_PHY_RX1024AND4096QAMLT242TONERU_SET_TO_IE(__eht_cap_phy, value) \
8420  		    ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8421  				  EHTCAP_PHY_RX1024AND4096QAMLS242TONERU_IDX, \
8422  				  EHTCAP_PHY_RX1024AND4096QAMLS242TONERU_BITS, \
8423  				  value)
8424  
8425  #define EHTCAP_PHY_PPETHRESPRESENT_GET_FROM_IE(__eht_cap_phy) \
8426  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8427  				      EHTCAP_PHY_PPETHRESPRESENT_IDX, \
8428  				      EHTCAP_PHY_PPETHRESPRESENT_BITS)
8429  #define EHTCAP_PHY_PPETHRESPRESENT_SET_TO_IE(__eht_cap_phy, value) \
8430  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8431  				      EHTCAP_PHY_PPETHRESPRESENT_IDX, \
8432  				      EHTCAP_PHY_PPETHRESPRESENT_BITS, value)
8433  
8434  #define EHTCAP_PHY_CMNNOMPKTPAD_GET_FROM_IE(__eht_cap_phy) \
8435  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8436  				      EHTCAP_PHY_CMNNOMPKTPAD_IDX, \
8437  				      EHTCAP_PHY_CMNNOMPKTPAD_BITS)
8438  #define EHTCAP_PHY_CMNNOMPKTPAD_SET_TO_IE(__eht_cap_phy, value) \
8439  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8440  				      EHTCAP_PHY_CMNNOMPKTPAD_IDX, \
8441  				      EHTCAP_PHY_CMNNOMPKTPAD_BITS, value)
8442  
8443  #define EHTCAP_PHY_MAXNUMEHTLTF_GET_FROM_IE(__eht_cap_phy) \
8444  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8445  				      EHTCAP_PHY_MAXNUMEHTLTF_IDX, \
8446  				      EHTCAP_PHY_MAXNUMEHTLTF_BITS)
8447  #define EHTCAP_PHY_MAXNUMEHTLTF_SET_TO_IE(__eht_cap_phy, value) \
8448  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX5], \
8449  				      EHTCAP_PHY_MAXNUMEHTLTF_IDX, \
8450  				      EHTCAP_PHY_MAXNUMEHTLTF_BITS, value)
8451  
8452  /* byte 6 */
8453  #define EHTCAP_PHY_SUPMCS15_GET_FROM_IE(__eht_cap_phy) \
8454  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX6], \
8455  				      EHTCAP_PHY_SUPMCS15_IDX, \
8456  				      EHTCAP_PHY_SUPMCS15_BITS)
8457  #define EHTCAP_PHY_SUPMCS15_SET_TO_IE(__eht_cap_phy, value) \
8458  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX6], \
8459  				      EHTCAP_PHY_SUPMCS15_IDX, \
8460  				      EHTCAP_PHY_SUPMCS15_BITS, value)
8461  
8462  #define EHTCAP_PHY_EHTDUPIN6GHZ_GET_FROM_IE(__eht_cap_phy) \
8463  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX6], \
8464  				      EHTCAP_PHY_EHTDUPIN6GHZ_IDX, \
8465  				      EHTCAP_PHY_EHTDUPIN6GHZ_BITS)
8466  #define EHTCAP_PHY_EHTDUPIN6GHZ_SET_TO_IE(__eht_cap_phy, value) \
8467  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX6], \
8468  				      EHTCAP_PHY_EHTDUPIN6GHZ_IDX, \
8469  				      EHTCAP_PHY_EHTDUPIN6GHZ_BITS, value)
8470  
8471  /* byte 7 */
8472  #define EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_GET_FROM_IE(__eht_cap_phy) \
8473  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8474  				      EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_IDX, \
8475  				      EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_BITS)
8476  #define EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_SET_TO_IE(__eht_cap_phy, value) \
8477  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8478  				      EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_IDX, \
8479  				      EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_BITS, \
8480  				      value)
8481  
8482  #define EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_GET_FROM_IE(__eht_cap_phy) \
8483  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8484  				      EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_IDX, \
8485  				      EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_BITS)
8486  #define EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_SET_TO_IE(__eht_cap_phy, value) \
8487  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8488  				      EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_IDX, \
8489  				      EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_BITS, \
8490  				      value)
8491  
8492  #define EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_GET_FROM_IE(__eht_cap_phy) \
8493  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8494  				      EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_IDX, \
8495  				      EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_BITS)
8496  #define EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_SET_TO_IE(__eht_cap_phy, value) \
8497  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8498  				      EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_IDX, \
8499  				      EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_BITS, \
8500  				      value)
8501  
8502  #define EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_GET_FROM_IE(__eht_cap_phy) \
8503  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8504  				      EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_IDX, \
8505  				      EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_BITS)
8506  #define EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_SET_TO_IE(__eht_cap_phy, value) \
8507  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8508  				      EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_IDX, \
8509  				      EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_BITS, \
8510  				      value)
8511  
8512  #define EHTCAP_PHY_MUBFMRLT80MHZ_GET_FROM_IE(__eht_cap_phy) \
8513  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8514  				      EHTCAP_PHY_MUBFMRLT80MHZ_IDX, \
8515  				      EHTCAP_PHY_MUBFMRLT80MHZ_BITS)
8516  #define EHTCAP_PHY_MUBFMRLT80MHZ_SET_TO_IE(__eht_cap_phy, value) \
8517  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8518  				      EHTCAP_PHY_MUBFMRLT80MHZ_IDX, \
8519  				      EHTCAP_PHY_MUBFMRLT80MHZ_BITS, value)
8520  
8521  #define EHTCAP_PHY_MUBFMR160MHZ_GET_FROM_IE(__eht_cap_phy) \
8522  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8523  				      EHTCAP_PHY_MUBFMR160MHZ_IDX, \
8524  				      EHTCAP_PHY_MUBFMR160MHZ_BITS)
8525  #define EHTCAP_PHY_MUBFMR160MHZ_SET_TO_IE(__eht_cap_phy, value) \
8526  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8527  				      EHTCAP_PHY_MUBFMR160MHZ_IDX, \
8528  				      EHTCAP_PHY_MUBFMR160MHZ_BITS, value)
8529  
8530  #define EHTCAP_PHY_MUBFMR320MHZ_GET_FROM_IE(__eht_cap_phy) \
8531  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8532  				      EHTCAP_PHY_MUBFMR320MHZ_IDX, \
8533  				      EHTCAP_PHY_MUBFMR320MHZ_BITS)
8534  #define EHTCAP_PHY_MUBFMR320MHZ_SET_TO_IE(__eht_cap_phy, value) \
8535  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8536  				      EHTCAP_PHY_MUBFMR320MHZ_IDX, \
8537  				      EHTCAP_PHY_MUBFMR320MHZ_BITS, value)
8538  
8539  #define EHTCAP_PHY_TB_SOUNDING_FB_RL_GET_FROM_IE(__eht_cap_phy) \
8540  			ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8541  				      EHTCAP_PHY_TB_SOUNDING_FEEDBACK_RL_IDX, \
8542  				      EHTCAP_PHY_TB_SOUNDING_FEEDBACK_RL_BITS)
8543  #define EHTCAP_PHY_TB_SOUNDING_FB_RL_SET_TO_IE(__eht_cap_phy, value) \
8544  			ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX7], \
8545  				      EHTCAP_PHY_TB_SOUNDING_FEEDBACK_RL_IDX, \
8546  				      EHTCAP_PHY_TB_SOUNDING_FEEDBACK_RL_BITS, \
8547  				      value)
8548  #define EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_GET_FROM_IE(__eht_cap_phy) \
8549  		ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8550  			      EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_IDX, \
8551  			      EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_BITS)
8552  #define EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_SET_TO_IE(__eht_cap_phy, value) \
8553  		ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8554  			      EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_IDX, \
8555  			      EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_BITS, \
8556  			      value)
8557  
8558  #define EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_GET_FROM_IE(__eht_cap_phy) \
8559  		ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8560  			      EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_IDX, \
8561  			      EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_BITS)
8562  #define EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_SET_TO_IE(__eht_cap_phy, value) \
8563  		ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8564  			      EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_IDX, \
8565  			      EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_BITS, \
8566  			      value)
8567  
8568  #define EHTCAP_PHY_20MHZ_ONLY_CAPS_GET_FROM_IE(__eht_cap_phy) \
8569  		ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8570  			      EHTCAP_PHY_20MHZ_ONLY_CAPS_IDX, \
8571  			      EHTCAP_PHY_20MHZ_ONLY_CAPS_BITS)
8572  #define EHTCAP_PHY_20MHZ_ONLY_CAPS_SET_TO_IE(__eht_cap_phy, value) \
8573  		ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8574  			      EHTCAP_PHY_20MHZ_ONLY_CAPS_IDX, \
8575  			      EHTCAP_PHY_20MHZ_ONLY_CAPS_BITS, \
8576  			      value)
8577  
8578  #define EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FULL_BW_FB_AND_DLMUMIMO_GET_FROM_IE(__eht_cap_phy) \
8579  		ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8580  			      EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FL_BW_FB_DLMUMIMO_IDX, \
8581  			      EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FL_BW_FB_DLMUMIMO_BITS)
8582  
8583  #define EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FULL_BW_FB_AND_DLMUMIMO_SET_TO_IE(__eht_cap_phy, value) \
8584  		ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8585  			      EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FL_BW_FB_DLMUMIMO_IDX, \
8586  			      EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FL_BW_FB_DLMUMIMO_BITS, \
8587  			      value)
8588  
8589  #define EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_GET_FROM_IE(__eht_cap_phy) \
8590  		ehtcap_ie_get(__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8591  			      EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_IDX, \
8592  			      EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_BITS)
8593  #define EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_SET_TO_IE(__eht_cap_phy, value) \
8594  		ehtcap_ie_set(&__eht_cap_phy[EHTCAP_PHYBYTE_IDX8], \
8595  			      EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_IDX, \
8596  			      EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_BITS, \
8597  			      value)
8598  static
8599  QDF_STATUS lim_ieee80211_unpack_ehtop(const uint8_t *eht_op_ie,
8600  				      tDot11fIEeht_op *dot11f_eht_op,
8601  				      tDot11fIEVHTOperation dot11f_vht_op,
8602  				      tDot11fIEhe_op dot11f_he_op,
8603  				      tDot11fIEHTInfo dot11f_ht_info)
8604  {
8605  	struct wlan_ie_ehtops *ehtop = (struct wlan_ie_ehtops *)eht_op_ie;
8606  	uint8_t i;
8607  
8608  	if (!eht_op_ie || !(ehtop->elem_id == DOT11F_EID_EHT_OP &&
8609  			    ehtop->elem_id_extn == 0x6a)) {
8610  		pe_err("Invalid EHT op IE");
8611  		return QDF_STATUS_E_INVAL;
8612  	}
8613  
8614  	qdf_mem_zero(dot11f_eht_op, (sizeof(tDot11fIEeht_op)));
8615  
8616  	dot11f_eht_op->present = 1;
8617  	dot11f_eht_op->eht_op_information_present =
8618  		EHTOP_PARAMS_INFOP_GET_FROM_IE(ehtop->ehtop_param);
8619  
8620  	dot11f_eht_op->disabled_sub_chan_bitmap_present =
8621  		EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_GET_FROM_IE(
8622  							ehtop->ehtop_param);
8623  
8624  	dot11f_eht_op->eht_default_pe_duration =
8625  		EHTOP_PARAMS_EHT_DEF_PE_DURATION_GET_FROM_IE(
8626  							ehtop->ehtop_param);
8627  
8628  	dot11f_eht_op->group_addr_bu_indication_limit =
8629  		EHTOP_PARAMS_GROUP_ADDR_BU_IND_LIMIT_GET_FROM_IE(
8630  							ehtop->ehtop_param);
8631  
8632  	dot11f_eht_op->group_addr_bu_indication_exponent =
8633  		EHTOP_PARAMS_GROUP_ADDR_BU_IND_EXPONENT_GET_FROM_IE(
8634  							ehtop->ehtop_param);
8635  
8636  	dot11f_eht_op->basic_rx_max_nss_for_mcs_0_to_7 =
8637  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_0_7,
8638  			     EHTOP_RX_MCS_NSS_MAP_IDX,
8639  			     EHTOP_RX_MCS_NSS_MAP_BITS);
8640  	dot11f_eht_op->basic_tx_max_nss_for_mcs_0_to_7 =
8641  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_0_7,
8642  			     EHTOP_TX_MCS_NSS_MAP_IDX,
8643  			     EHTOP_TX_MCS_NSS_MAP_BITS);
8644  	dot11f_eht_op->basic_rx_max_nss_for_mcs_8_and_9 =
8645  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_8_9,
8646  			     EHTOP_RX_MCS_NSS_MAP_IDX,
8647  			     EHTOP_RX_MCS_NSS_MAP_BITS);
8648  	dot11f_eht_op->basic_tx_max_nss_for_mcs_8_and_9 =
8649  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_8_9,
8650  			     EHTOP_TX_MCS_NSS_MAP_IDX,
8651  			     EHTOP_TX_MCS_NSS_MAP_BITS);
8652  	dot11f_eht_op->basic_rx_max_nss_for_mcs_10_and_11 =
8653  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_10_11,
8654  			     EHTOP_RX_MCS_NSS_MAP_IDX,
8655  			     EHTOP_RX_MCS_NSS_MAP_BITS);
8656  	dot11f_eht_op->basic_tx_max_nss_for_mcs_10_and_11 =
8657  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_10_11,
8658  			     EHTOP_TX_MCS_NSS_MAP_IDX,
8659  			     EHTOP_TX_MCS_NSS_MAP_BITS);
8660  	dot11f_eht_op->basic_rx_max_nss_for_mcs_12_and_13 =
8661  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_12_13,
8662  			     EHTOP_RX_MCS_NSS_MAP_IDX,
8663  			     EHTOP_RX_MCS_NSS_MAP_BITS);
8664  	dot11f_eht_op->basic_tx_max_nss_for_mcs_12_and_13 =
8665  		ehtop_ie_get(ehtop->basic_mcs_nss_set.max_nss_mcs_12_13,
8666  			     EHTOP_TX_MCS_NSS_MAP_IDX,
8667  			     EHTOP_TX_MCS_NSS_MAP_BITS);
8668  
8669  	if (dot11f_eht_op->eht_op_information_present) {
8670  		dot11f_eht_op->channel_width =
8671  			EHTOP_INFO_CHANWIDTH_GET_FROM_IE(ehtop->control);
8672  
8673  		dot11f_eht_op->ccfs0 = ehtop->ccfs0;
8674  
8675  		dot11f_eht_op->ccfs1 = ehtop->ccfs1;
8676  
8677  		if (dot11f_eht_op->disabled_sub_chan_bitmap_present) {
8678  			for (i = 0; i < WLAN_MAX_DISABLED_SUB_CHAN_BITMAP;
8679  			     i++) {
8680  				dot11f_eht_op->disabled_sub_chan_bitmap[0][i] =
8681  					ehtop->disabled_sub_chan_bitmap[i];
8682  			}
8683  		}
8684  	}
8685  
8686  	return QDF_STATUS_SUCCESS;
8687  }
8688  
8689  static
8690  QDF_STATUS lim_ieee80211_unpack_ehtcap(const uint8_t *eht_cap_ie,
8691  				       tDot11fIEeht_cap *dot11f_eht_cap,
8692  				       tDot11fIEhe_cap dot11f_he_cap,
8693  				       bool is_band_2g)
8694  {
8695  	struct wlan_ie_ehtcaps *ehtcap  = (struct wlan_ie_ehtcaps *)eht_cap_ie;
8696  	uint32_t idx = 0;
8697  	uint32_t mcs_map_len;
8698  
8699  	if (!eht_cap_ie || !(ehtcap->elem_id == DOT11F_EID_EHT_CAP &&
8700  			     ehtcap->elem_id_extn == 0x6c)) {
8701  		pe_err("Invalid EHT cap IE");
8702  		return QDF_STATUS_E_INVAL;
8703  	}
8704  
8705  	qdf_mem_zero(dot11f_eht_cap, (sizeof(tDot11fIEeht_cap)));
8706  
8707  	dot11f_eht_cap->present = 1;
8708  	dot11f_eht_cap->epcs_pri_access =
8709  		    EHTCAP_MAC_EPCSPRIACCESS_GET_FROM_IE(ehtcap->eht_mac_cap);
8710  
8711  	dot11f_eht_cap->eht_om_ctl =
8712  		    EHTCAP_MAC_EHTOMCTRL_GET_FROM_IE(ehtcap->eht_mac_cap);
8713  
8714  	dot11f_eht_cap->triggered_txop_sharing_mode1 =
8715  		    EHTCAP_MAC_TRIGTXOP_MODE1_GET_FROM_IE(ehtcap->eht_mac_cap);
8716  
8717  	dot11f_eht_cap->triggered_txop_sharing_mode2 =
8718  		    EHTCAP_MAC_TRIGTXOP_MODE2_GET_FROM_IE(ehtcap->eht_mac_cap);
8719  
8720  	dot11f_eht_cap->restricted_twt =
8721  		    EHTCAP_MAC_RESTRICTED_TWT_GET_FROM_IE(ehtcap->eht_mac_cap);
8722  
8723  	dot11f_eht_cap->scs_traffic_desc =
8724  		  EHTCAP_MAC_SCS_TRAFFIC_DESC_GET_FROM_IE(ehtcap->eht_mac_cap);
8725  
8726  	dot11f_eht_cap->max_mpdu_len =
8727  		  EHTCAP_MAC_MAX_MPDU_LEN_GET_FROM_IE(ehtcap->eht_mac_cap);
8728  
8729  	dot11f_eht_cap->max_a_mpdu_len_exponent_ext =
8730  		  EHTCAP_MAC_MAX_A_MPDU_LEN_EXPONENT_EXT_GET_FROM_IE(
8731  				ehtcap->eht_mac_cap);
8732  
8733  	dot11f_eht_cap->eht_trs_support =
8734  		EHTCAP_MAC_EHT_TRS_SUPPORT_GET_FROM_IE(ehtcap->eht_mac_cap);
8735  
8736  	dot11f_eht_cap->txop_return_support_txop_share_m2 =
8737  		EHTCAP_MAC_TXOP_RETURN_SUPPORT_SHARE_M2_GET_FROM_IE(
8738  				ehtcap->eht_mac_cap);
8739  	dot11f_eht_cap->two_bqrs_support =
8740  			EHTCAP_MAC_TWO_BQRS_SUPP_GET_FROM_IE(
8741  					ehtcap->eht_mac_cap);
8742  
8743  	dot11f_eht_cap->eht_link_adaptation_support =
8744  			EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_GET_FROM_IE(
8745  					ehtcap->eht_mac_cap);
8746  
8747  	dot11f_eht_cap->support_320mhz_6ghz =
8748  			EHTCAP_PHY_320MHZIN6GHZ_GET_FROM_IE(
8749  				ehtcap->eht_phy_cap.phy_cap_bytes);
8750  
8751  	dot11f_eht_cap->ru_242tone_wt_20mhz =
8752  			EHTCAP_PHY_242TONERUBWGT20MHZ_GET_FROM_IE(
8753  					ehtcap->eht_phy_cap.phy_cap_bytes);
8754  
8755  	dot11f_eht_cap->ndp_4x_eht_ltf_3dot2_us_gi =
8756  			EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_GET_FROM_IE(
8757  					ehtcap->eht_phy_cap.phy_cap_bytes);
8758  
8759  	dot11f_eht_cap->partial_bw_mu_mimo =
8760  			EHTCAP_PHY_PARTIALBWULMU_GET_FROM_IE(
8761  				     ehtcap->eht_phy_cap.phy_cap_bytes);
8762  
8763  	dot11f_eht_cap->su_beamformer =
8764  	      EHTCAP_PHY_SUBFMR_GET_FROM_IE(ehtcap->eht_phy_cap.phy_cap_bytes);
8765  
8766  	dot11f_eht_cap->su_beamformee =
8767  	      EHTCAP_PHY_SUBFME_GET_FROM_IE(ehtcap->eht_phy_cap.phy_cap_bytes);
8768  
8769  	dot11f_eht_cap->bfee_ss_le_80mhz =
8770  			EHTCAP_PHY_BFMESSLT80MHZ_GET_FROM_IE_BYTE0(
8771  					ehtcap->eht_phy_cap.phy_cap_bytes);
8772  
8773  	dot11f_eht_cap->bfee_ss_le_80mhz |=
8774  			(EHTCAP_PHY_BFMESSLT80MHZ_GET_FROM_IE_BYTE1(
8775  				ehtcap->eht_phy_cap.phy_cap_bytes) << 1);
8776  	dot11f_eht_cap->bfee_ss_160mhz =
8777  			EHTCAP_PHY_BFMESS160MHZ_GET_FROM_IE(
8778  					ehtcap->eht_phy_cap.phy_cap_bytes);
8779  
8780  	dot11f_eht_cap->bfee_ss_320mhz =
8781  			EHTCAP_PHY_BFMESS320MHZ_GET_FROM_IE(
8782  					ehtcap->eht_phy_cap.phy_cap_bytes);
8783  
8784  	dot11f_eht_cap->num_sounding_dim_le_80mhz =
8785  			EHTCAP_PHY_NUMSOUNDLT80MHZ_GET_FROM_IE(
8786  					ehtcap->eht_phy_cap.phy_cap_bytes);
8787  
8788  	dot11f_eht_cap->num_sounding_dim_160mhz =
8789  			EHTCAP_PHY_NUMSOUND160MHZ_GET_FROM_IE(
8790  					ehtcap->eht_phy_cap.phy_cap_bytes);
8791  
8792  	dot11f_eht_cap->num_sounding_dim_320mhz =
8793  			EHTCAP_PHY_NUMSOUND320MHZ_GET_FROM_IE(
8794  					ehtcap->eht_phy_cap.phy_cap_bytes);
8795  
8796  	dot11f_eht_cap->ng_16_su_feedback =
8797  			EHTCAP_PHY_NG16SUFB_GET_FROM_IE(
8798  					ehtcap->eht_phy_cap.phy_cap_bytes);
8799  
8800  	dot11f_eht_cap->ng_16_mu_feedback =
8801  			EHTCAP_PHY_NG16MUFB_GET_FROM_IE(
8802  					ehtcap->eht_phy_cap.phy_cap_bytes);
8803  
8804  	dot11f_eht_cap->cb_sz_4_2_su_feedback =
8805  			EHTCAP_PHY_CODBK42SUFB_GET_FROM_IE(
8806  					ehtcap->eht_phy_cap.phy_cap_bytes);
8807  
8808  	dot11f_eht_cap->cb_sz_7_5_su_feedback =
8809  			EHTCAP_PHY_CODBK75MUFB_GET_FROM_IE(
8810  					ehtcap->eht_phy_cap.phy_cap_bytes);
8811  
8812  	dot11f_eht_cap->trig_su_bforming_feedback =
8813  			EHTCAP_PHY_TRIGSUBFFB_GET_FROM_IE(
8814  					ehtcap->eht_phy_cap.phy_cap_bytes);
8815  
8816  	dot11f_eht_cap->trig_mu_bforming_partial_bw_feedback =
8817  			EHTCAP_PHY_TRIGMUBFPARTBWFB_GET_FROM_IE(
8818  					ehtcap->eht_phy_cap.phy_cap_bytes);
8819  
8820  	dot11f_eht_cap->triggered_cqi_feedback =
8821  			EHTCAP_PHY_TRIGCQIFB_GET_FROM_IE(
8822  					ehtcap->eht_phy_cap.phy_cap_bytes);
8823  
8824  	dot11f_eht_cap->partial_bw_dl_mu_mimo =
8825  			EHTCAP_PHY_PARTBWDLMUMIMO_GET_FROM_IE(
8826  					ehtcap->eht_phy_cap.phy_cap_bytes);
8827  
8828  	dot11f_eht_cap->psr_based_sr =
8829  			EHTCAP_PHY_PSRSR_GET_FROM_IE(
8830  					ehtcap->eht_phy_cap.phy_cap_bytes);
8831  
8832  	dot11f_eht_cap->power_boost_factor =
8833  			EHTCAP_PHY_PWRBSTFACTOR_GET_FROM_IE(
8834  					ehtcap->eht_phy_cap.phy_cap_bytes);
8835  
8836  	dot11f_eht_cap->eht_mu_ppdu_4x_ltf_0_8_us_gi =
8837  			EHTCAP_PHY_4XEHTMULTFAND800NSGI_GET_FROM_IE(
8838  					ehtcap->eht_phy_cap.phy_cap_bytes);
8839  
8840  	dot11f_eht_cap->max_nc =
8841  			EHTCAP_PHY_MAXNC_GET_FROM_IE(
8842  					ehtcap->eht_phy_cap.phy_cap_bytes);
8843  
8844  	dot11f_eht_cap->non_trig_cqi_feedback =
8845  			EHTCAP_PHY_NONTRIGCQIFB_GET_FROM_IE(
8846  					ehtcap->eht_phy_cap.phy_cap_bytes);
8847  
8848  	dot11f_eht_cap->tx_1024_4096_qam_lt_242_tone_ru =
8849  			EHTCAP_PHY_TX1024AND4096QAMLT242TONERU_GET_FROM_IE(
8850  					ehtcap->eht_phy_cap.phy_cap_bytes);
8851  
8852  	dot11f_eht_cap->rx_1024_4096_qam_lt_242_tone_ru =
8853  			EHTCAP_PHY_RX1024AND4096QAMLT242TONERU_GET_FROM_IE(
8854  					ehtcap->eht_phy_cap.phy_cap_bytes);
8855  
8856  	dot11f_eht_cap->ppet_present =
8857  			EHTCAP_PHY_PPETHRESPRESENT_GET_FROM_IE(
8858  					ehtcap->eht_phy_cap.phy_cap_bytes);
8859  
8860  	dot11f_eht_cap->common_nominal_pkt_padding =
8861  			EHTCAP_PHY_CMNNOMPKTPAD_GET_FROM_IE(
8862  					ehtcap->eht_phy_cap.phy_cap_bytes);
8863  
8864  	dot11f_eht_cap->max_num_eht_ltf =
8865  			EHTCAP_PHY_MAXNUMEHTLTF_GET_FROM_IE(
8866  					ehtcap->eht_phy_cap.phy_cap_bytes);
8867  
8868  	dot11f_eht_cap->mcs_15 =
8869  			EHTCAP_PHY_SUPMCS15_GET_FROM_IE(
8870  					ehtcap->eht_phy_cap.phy_cap_bytes);
8871  
8872  	dot11f_eht_cap->eht_dup_6ghz =
8873  			EHTCAP_PHY_EHTDUPIN6GHZ_GET_FROM_IE(
8874  					ehtcap->eht_phy_cap.phy_cap_bytes);
8875  
8876  	dot11f_eht_cap->op_sta_rx_ndp_wider_bw_20mhz =
8877  			EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_GET_FROM_IE(
8878  					ehtcap->eht_phy_cap.phy_cap_bytes);
8879  
8880  	dot11f_eht_cap->non_ofdma_ul_mu_mimo_le_80mhz =
8881  			EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_GET_FROM_IE(
8882  					ehtcap->eht_phy_cap.phy_cap_bytes);
8883  
8884  	dot11f_eht_cap->non_ofdma_ul_mu_mimo_160mhz =
8885  			EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_GET_FROM_IE(
8886  					ehtcap->eht_phy_cap.phy_cap_bytes);
8887  
8888  	dot11f_eht_cap->non_ofdma_ul_mu_mimo_320mhz =
8889  			EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_GET_FROM_IE(
8890  					ehtcap->eht_phy_cap.phy_cap_bytes);
8891  
8892  	dot11f_eht_cap->mu_bformer_le_80mhz =
8893  			EHTCAP_PHY_MUBFMRLT80MHZ_GET_FROM_IE(
8894  					ehtcap->eht_phy_cap.phy_cap_bytes);
8895  
8896  	dot11f_eht_cap->mu_bformer_160mhz =
8897  			EHTCAP_PHY_MUBFMR160MHZ_GET_FROM_IE(
8898  					ehtcap->eht_phy_cap.phy_cap_bytes);
8899  
8900  	dot11f_eht_cap->mu_bformer_320mhz =
8901  			EHTCAP_PHY_MUBFMR320MHZ_GET_FROM_IE(
8902  					ehtcap->eht_phy_cap.phy_cap_bytes);
8903  
8904  	dot11f_eht_cap->tb_sounding_feedback_rl =
8905  			EHTCAP_PHY_TB_SOUNDING_FB_RL_GET_FROM_IE(
8906  					ehtcap->eht_phy_cap.phy_cap_bytes);
8907  
8908  	dot11f_eht_cap->rx_1k_qam_in_wider_bw_dl_ofdma =
8909  			EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_GET_FROM_IE(
8910  					ehtcap->eht_phy_cap.phy_cap_bytes);
8911  
8912  	dot11f_eht_cap->rx_4k_qam_in_wider_bw_dl_ofdma =
8913  			EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_GET_FROM_IE(
8914  					ehtcap->eht_phy_cap.phy_cap_bytes);
8915  
8916  	dot11f_eht_cap->limited_cap_support_20mhz =
8917  			EHTCAP_PHY_20MHZ_ONLY_CAPS_GET_FROM_IE(
8918  					ehtcap->eht_phy_cap.phy_cap_bytes);
8919  
8920  	dot11f_eht_cap->triggered_mu_bf_full_bw_fb_and_dl_mumimo =
8921  	EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FULL_BW_FB_AND_DLMUMIMO_GET_FROM_IE(
8922  					ehtcap->eht_phy_cap.phy_cap_bytes);
8923  
8924  	dot11f_eht_cap->mru_support_20mhz =
8925  			EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_GET_FROM_IE(
8926  					ehtcap->eht_phy_cap.phy_cap_bytes);
8927  
8928  	/* Fill EHT MCS and NSS set field */
8929  	if ((is_band_2g && !dot11f_he_cap.chan_width_0) ||
8930  	    (!is_band_2g && !dot11f_he_cap.chan_width_1 &&
8931  	     !dot11f_he_cap.chan_width_2 && !dot11f_he_cap.chan_width_3)) {
8932  		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_0_to_7 =
8933  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8934  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
8935  				      EHTCAP_RX_MCS_NSS_MAP_BITS);
8936  
8937  		dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_0_to_7 =
8938  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8939  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
8940  				      EHTCAP_TX_MCS_NSS_MAP_BITS);
8941  		idx++;
8942  
8943  		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_8_and_9 =
8944  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8945  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
8946  				      EHTCAP_RX_MCS_NSS_MAP_BITS);
8947  
8948  		dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_8_and_9 =
8949  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8950  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
8951  				      EHTCAP_TX_MCS_NSS_MAP_BITS);
8952  		idx++;
8953  
8954  		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_10_and_11 =
8955  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8956  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
8957  				      EHTCAP_RX_MCS_NSS_MAP_BITS);
8958  
8959  		dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_10_and_11 =
8960  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8961  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
8962  				      EHTCAP_TX_MCS_NSS_MAP_BITS);
8963  		idx++;
8964  
8965  		dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_12_and_13 =
8966  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8967  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
8968  				      EHTCAP_RX_MCS_NSS_MAP_BITS);
8969  
8970  		dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_12_and_13 =
8971  			ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8972  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
8973  				      EHTCAP_TX_MCS_NSS_MAP_BITS);
8974  		idx++;
8975  	} else {
8976  		if ((is_band_2g && dot11f_he_cap.chan_width_0) ||
8977  		    (!is_band_2g && dot11f_he_cap.chan_width_1)) {
8978  			dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_0_to_9 =
8979  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8980  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
8981  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
8982  			dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_0_to_7 =
8983  			     dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_0_to_9;
8984  			dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_8_and_9 =
8985  			     dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_0_to_9;
8986  
8987  			dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_0_to_9 =
8988  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8989  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
8990  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
8991  			dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_0_to_7 =
8992  			     dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_0_to_9;
8993  			dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_8_and_9 =
8994  			     dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_0_to_9;
8995  			idx++;
8996  
8997  			dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_10_and_11 =
8998  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
8999  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9000  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9001  			dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_10_and_11 =
9002  			  dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_10_and_11;
9003  
9004  			dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_10_and_11 =
9005  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9006  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9007  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9008  			dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_10_and_11 =
9009  			  dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_10_and_11;
9010  			idx++;
9011  
9012  			dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_12_and_13 =
9013  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9014  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9015  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9016  			dot11f_eht_cap->bw_20_rx_max_nss_for_mcs_12_and_13 =
9017  			  dot11f_eht_cap->bw_le_80_rx_max_nss_for_mcs_12_and_13;
9018  
9019  			dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_12_and_13 =
9020  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9021  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9022  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9023  			dot11f_eht_cap->bw_20_tx_max_nss_for_mcs_12_and_13 =
9024  			  dot11f_eht_cap->bw_le_80_tx_max_nss_for_mcs_12_and_13;
9025  			idx++;
9026  		}
9027  
9028  		if (dot11f_he_cap.chan_width_2 == 1) {
9029  			dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_0_to_9 =
9030  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9031  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9032  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9033  
9034  			dot11f_eht_cap->bw_160_tx_max_nss_for_mcs_0_to_9 =
9035  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9036  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9037  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9038  			idx++;
9039  
9040  			dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_10_and_11 =
9041  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9042  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9043  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9044  
9045  			dot11f_eht_cap->bw_160_tx_max_nss_for_mcs_10_and_11 =
9046  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9047  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9048  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9049  			idx++;
9050  
9051  			dot11f_eht_cap->bw_160_rx_max_nss_for_mcs_12_and_13 =
9052  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9053  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9054  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9055  
9056  			dot11f_eht_cap->bw_160_tx_max_nss_for_mcs_12_and_13 =
9057  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9058  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9059  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9060  			idx++;
9061  		}
9062  
9063  		if (dot11f_eht_cap->support_320mhz_6ghz) {
9064  			dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_0_to_9 =
9065  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9066  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9067  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9068  
9069  			dot11f_eht_cap->bw_320_tx_max_nss_for_mcs_0_to_9 =
9070  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9071  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9072  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9073  			idx++;
9074  
9075  			dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_10_and_11 =
9076  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9077  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9078  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9079  
9080  			dot11f_eht_cap->bw_320_tx_max_nss_for_mcs_10_and_11 =
9081  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9082  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9083  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9084  			idx++;
9085  
9086  			dot11f_eht_cap->bw_320_rx_max_nss_for_mcs_12_and_13 =
9087  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9088  					      EHTCAP_RX_MCS_NSS_MAP_IDX,
9089  					      EHTCAP_RX_MCS_NSS_MAP_BITS);
9090  
9091  			dot11f_eht_cap->bw_320_tx_max_nss_for_mcs_12_and_13 =
9092  				ehtcap_ie_get(ehtcap->mcs_nss_map_bytes[idx],
9093  					      EHTCAP_TX_MCS_NSS_MAP_IDX,
9094  					      EHTCAP_TX_MCS_NSS_MAP_BITS);
9095  			idx++;
9096  		}
9097  	}
9098  
9099  	/* Fill in TxRx EHT NSS & MCS support */
9100  	mcs_map_len = idx;
9101  	//ehtcap->elem_len = EHTCAP_FIXED_LEN + mcs_map_len;
9102  	//ehtcaplen = ehtcap->elem_len + WLAN_IE_HDR_LEN;
9103  
9104  	return QDF_STATUS_SUCCESS;
9105  }
9106  
9107  QDF_STATUS lim_strip_and_decode_eht_cap(uint8_t *ie, uint16_t ie_len,
9108  					tDot11fIEeht_cap *dot11f_eht_cap,
9109  					tDot11fIEhe_cap dot11f_he_cap,
9110  					uint16_t freq)
9111  {
9112  	const uint8_t *eht_cap_ie;
9113  	bool is_band_2g;
9114  	QDF_STATUS status;
9115  
9116  	eht_cap_ie = lim_get_ext_ie_ptr_from_ext_id(ie, ie_len,
9117  						    EHT_CAP_OUI_TYPE,
9118  						    EHT_CAP_OUI_SIZE);
9119  
9120  	if (!eht_cap_ie)
9121  		return QDF_STATUS_SUCCESS;
9122  
9123  	is_band_2g = WLAN_REG_IS_24GHZ_CH_FREQ(freq);
9124  
9125  	status = lim_ieee80211_unpack_ehtcap(eht_cap_ie, dot11f_eht_cap,
9126  					     dot11f_he_cap,
9127  					     is_band_2g);
9128  
9129  	if (status != QDF_STATUS_SUCCESS) {
9130  		pe_err("Failed to extract eht cap");
9131  		return QDF_STATUS_E_FAILURE;
9132  	}
9133  
9134  	return QDF_STATUS_SUCCESS;
9135  }
9136  
9137  void lim_ieee80211_pack_ehtcap(uint8_t *ie, tDot11fIEeht_cap dot11f_eht_cap,
9138  			       tDot11fIEhe_cap dot11f_he_cap, bool is_band_2g)
9139  {
9140  	struct wlan_ie_ehtcaps *ehtcap  = (struct wlan_ie_ehtcaps *)ie;
9141  	uint32_t ehtcaplen;
9142  	uint32_t val, idx = 0;
9143  	bool chwidth_320;
9144  	uint32_t mcs_map_len;
9145  
9146  	if (!ie) {
9147  		pe_err("ie is null");
9148  		return;
9149  	}
9150  
9151  	/* deduct the variable size fields before
9152  	 * memsetting hecap to 0
9153  	 */
9154  	qdf_mem_zero(ehtcap,
9155  		     (sizeof(struct wlan_ie_ehtcaps)));
9156  
9157  	ehtcap->elem_id = DOT11F_EID_EHT_CAP;
9158  	/* elem id + len = 2 bytes  readjust based on
9159  	 *  mcs-nss and ppet fields
9160  	 */
9161  	qdf_mem_copy(&ehtcap->elem_id_extn, EHT_CAP_OUI_TYPE, EHT_CAP_OUI_SIZE);
9162  
9163  	val = dot11f_eht_cap.epcs_pri_access;
9164  	EHTCAP_MAC_EPCSPRIACCESS_SET_TO_IE(ehtcap->eht_mac_cap, val);
9165  
9166  	val = dot11f_eht_cap.eht_om_ctl;
9167  	EHTCAP_MAC_EHTOMCTRL_SET_TO_IE(ehtcap->eht_mac_cap, val);
9168  
9169  	val = dot11f_eht_cap.triggered_txop_sharing_mode1;
9170  	EHTCAP_MAC_TRIGTXOP_MODE1_SET_TO_IE(ehtcap->eht_mac_cap, val);
9171  
9172  	val = dot11f_eht_cap.triggered_txop_sharing_mode2;
9173  	EHTCAP_MAC_TRIGTXOP_MODE2_SET_TO_IE(ehtcap->eht_mac_cap, val);
9174  
9175  	val = dot11f_eht_cap.restricted_twt;
9176  	EHTCAP_MAC_RESTRICTED_TWT_SET_TO_IE(ehtcap->eht_mac_cap, val);
9177  
9178  	val = dot11f_eht_cap.scs_traffic_desc;
9179  	EHTCAP_MAC_SCS_TRAFFIC_DESC_SET_TO_IE(ehtcap->eht_mac_cap, val);
9180  
9181  	val = dot11f_eht_cap.max_mpdu_len;
9182  	EHTCAP_MAC_MAX_MPDU_LEN_SET_TO_IE(ehtcap->eht_mac_cap, val);
9183  
9184  	val = dot11f_eht_cap.max_a_mpdu_len_exponent_ext;
9185  	EHTCAP_MAC_MAX_A_MPDU_LEN_EXPONENT_EXT_SET_TO_IE(ehtcap->eht_mac_cap,
9186  							 val);
9187  
9188  	val = dot11f_eht_cap.eht_trs_support;
9189  	EHTCAP_MAC_EHT_TRS_SUPPORT_SET_TO_IE(ehtcap->eht_mac_cap, val);
9190  
9191  	val = dot11f_eht_cap.txop_return_support_txop_share_m2;
9192  	EHTCAP_MAC_TXOP_RETURN_SUPPORT_SHARE_M2_SET_FROM_IE(ehtcap->eht_mac_cap,
9193  							    val);
9194  	val = dot11f_eht_cap.two_bqrs_support;
9195  	EHTCAP_MAC_TWO_BQRS_SUPP_SET_FROM_IE(ehtcap->eht_mac_cap,
9196  					     val);
9197  
9198  	val = dot11f_eht_cap.eht_link_adaptation_support;
9199  	EHTCAP_MAC_EHT_LINK_ADAPTATION_SUPP_SET_FROM_IE(ehtcap->eht_mac_cap,
9200  							val);
9201  
9202  	chwidth_320 = dot11f_eht_cap.support_320mhz_6ghz;
9203  	EHTCAP_PHY_320MHZIN6GHZ_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes,
9204  					  chwidth_320);
9205  
9206  	val = dot11f_eht_cap.ru_242tone_wt_20mhz;
9207  	EHTCAP_PHY_242TONERUBWGT20MHZ_SET_TO_IE(
9208  				      ehtcap->eht_phy_cap.phy_cap_bytes, val);
9209  
9210  	val = dot11f_eht_cap.ndp_4x_eht_ltf_3dot2_us_gi;
9211  	EHTCAP_PHY_NDP4XEHTLTFAND320NSGI_SET_TO_IE(
9212  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9213  
9214  	val = dot11f_eht_cap.partial_bw_mu_mimo;
9215  	EHTCAP_PHY_PARTIALBWULMU_SET_TO_IE(
9216  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9217  
9218  	val = dot11f_eht_cap.su_beamformer;
9219  	EHTCAP_PHY_SUBFMR_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9220  
9221  	val = dot11f_eht_cap.su_beamformee;
9222  	EHTCAP_PHY_SUBFME_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9223  
9224  	val = dot11f_eht_cap.bfee_ss_le_80mhz;
9225  	EHTCAP_PHY_BFMESSLT80MHZ_SET_TO_IE_BYTE0(
9226  				     ehtcap->eht_phy_cap.phy_cap_bytes,
9227  				     val & 1);
9228  
9229  	EHTCAP_PHY_BFMESSLT80MHZ_SET_TO_IE_BYTE1(
9230  				     ehtcap->eht_phy_cap.phy_cap_bytes,
9231  				     (val >> 1));
9232  	val = dot11f_eht_cap.bfee_ss_160mhz;
9233  	EHTCAP_PHY_BFMESS160MHZ_SET_TO_IE(
9234  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9235  
9236  	val = dot11f_eht_cap.bfee_ss_320mhz;
9237  	EHTCAP_PHY_BFMESS320MHZ_SET_TO_IE(
9238  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9239  
9240  	val = dot11f_eht_cap.num_sounding_dim_le_80mhz;
9241  	EHTCAP_PHY_NUMSOUNDLT80MHZ_SET_TO_IE(
9242  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9243  
9244  	val = dot11f_eht_cap.num_sounding_dim_160mhz;
9245  	EHTCAP_PHY_NUMSOUND160MHZ_SET_TO_IE(
9246  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9247  
9248  	val = dot11f_eht_cap.num_sounding_dim_320mhz;
9249  	EHTCAP_PHY_NUMSOUND320MHZ_SET_TO_IE(
9250  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9251  
9252  	val = dot11f_eht_cap.ng_16_su_feedback;
9253  	EHTCAP_PHY_NG16SUFB_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9254  
9255  	val = dot11f_eht_cap.ng_16_mu_feedback;
9256  	EHTCAP_PHY_NG16MUFB_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9257  
9258  	val = dot11f_eht_cap.cb_sz_4_2_su_feedback;
9259  	EHTCAP_PHY_CODBK42SUFB_SET_TO_IE(
9260  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9261  
9262  	val = dot11f_eht_cap.cb_sz_7_5_su_feedback;
9263  	EHTCAP_PHY_CODBK75MUFB_SET_TO_IE(
9264  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9265  
9266  	val = dot11f_eht_cap.trig_su_bforming_feedback;
9267  	EHTCAP_PHY_TRIGSUBFFB_SET_TO_IE(
9268  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9269  
9270  	val = dot11f_eht_cap.trig_mu_bforming_partial_bw_feedback;
9271  	EHTCAP_PHY_TRIGMUBFPARTBWFB_SET_TO_IE(
9272  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9273  
9274  	val = dot11f_eht_cap.triggered_cqi_feedback;
9275  	EHTCAP_PHY_TRIGCQIFB_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9276  
9277  	val = dot11f_eht_cap.partial_bw_dl_mu_mimo;
9278  	EHTCAP_PHY_PARTBWDLMUMIMO_SET_TO_IE(
9279  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9280  
9281  	val = dot11f_eht_cap.psr_based_sr;
9282  	EHTCAP_PHY_PSRSR_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9283  
9284  	val = dot11f_eht_cap.power_boost_factor;
9285  	EHTCAP_PHY_PWRBSTFACTOR_SET_TO_IE(
9286  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9287  
9288  	val = dot11f_eht_cap.eht_mu_ppdu_4x_ltf_0_8_us_gi;
9289  	EHTCAP_PHY_4XEHTMULTFAND800NSGI_SET_TO_IE(
9290  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9291  
9292  	val = dot11f_eht_cap.max_nc;
9293  	EHTCAP_PHY_MAXNC_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9294  
9295  	val = dot11f_eht_cap.non_trig_cqi_feedback;
9296  	EHTCAP_PHY_NONTRIGCQIFB_SET_TO_IE(
9297  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9298  
9299  	val = dot11f_eht_cap.tx_1024_4096_qam_lt_242_tone_ru;
9300  	EHTCAP_PHY_TX1024AND4096QAMLT242TONERU_SET_TO_IE(
9301  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9302  
9303  	val = dot11f_eht_cap.rx_1024_4096_qam_lt_242_tone_ru;
9304  	EHTCAP_PHY_RX1024AND4096QAMLT242TONERU_SET_TO_IE(
9305  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9306  
9307  	val = dot11f_eht_cap.ppet_present;
9308  	EHTCAP_PHY_PPETHRESPRESENT_SET_TO_IE(
9309  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9310  
9311  	val = dot11f_eht_cap.common_nominal_pkt_padding;
9312  	EHTCAP_PHY_CMNNOMPKTPAD_SET_TO_IE(
9313  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9314  
9315  	val = dot11f_eht_cap.max_num_eht_ltf;
9316  	EHTCAP_PHY_MAXNUMEHTLTF_SET_TO_IE(
9317  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9318  
9319  	val = dot11f_eht_cap.mcs_15;
9320  	EHTCAP_PHY_SUPMCS15_SET_TO_IE(ehtcap->eht_phy_cap.phy_cap_bytes, val);
9321  
9322  	val = dot11f_eht_cap.eht_dup_6ghz;
9323  	EHTCAP_PHY_EHTDUPIN6GHZ_SET_TO_IE(
9324  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9325  
9326  	val = dot11f_eht_cap.op_sta_rx_ndp_wider_bw_20mhz;
9327  	EHTCAP_PHY_20MHZOPSTARXNDPWIDERBW_SET_TO_IE(
9328  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9329  
9330  	val = dot11f_eht_cap.non_ofdma_ul_mu_mimo_le_80mhz;
9331  	EHTCAP_PHY_NONOFDMAULMUMIMOLT80MHZ_SET_TO_IE(
9332  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9333  
9334  	val = dot11f_eht_cap.non_ofdma_ul_mu_mimo_160mhz;
9335  	EHTCAP_PHY_NONOFDMAULMUMIMO160MHZ_SET_TO_IE(
9336  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9337  
9338  	val = dot11f_eht_cap.non_ofdma_ul_mu_mimo_320mhz;
9339  	EHTCAP_PHY_NONOFDMAULMUMIMO320MHZ_SET_TO_IE(
9340  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9341  
9342  	val = dot11f_eht_cap.mu_bformer_le_80mhz;
9343  	EHTCAP_PHY_MUBFMRLT80MHZ_SET_TO_IE(
9344  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9345  
9346  	val = dot11f_eht_cap.mu_bformer_160mhz;
9347  	EHTCAP_PHY_MUBFMR160MHZ_SET_TO_IE(
9348  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9349  
9350  	val = dot11f_eht_cap.mu_bformer_320mhz;
9351  	EHTCAP_PHY_MUBFMR320MHZ_SET_TO_IE(
9352  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9353  
9354  	val = dot11f_eht_cap.tb_sounding_feedback_rl;
9355  	EHTCAP_PHY_TB_SOUNDING_FB_RL_SET_TO_IE(
9356  				     ehtcap->eht_phy_cap.phy_cap_bytes,	val);
9357  
9358  	val = dot11f_eht_cap.rx_1k_qam_in_wider_bw_dl_ofdma;
9359  	EHTCAP_PHY_RX_1K_QAM_IN_WIDER_BW_DL_OFDMA_SET_TO_IE(
9360  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9361  
9362  	val = dot11f_eht_cap.rx_4k_qam_in_wider_bw_dl_ofdma;
9363  	EHTCAP_PHY_RX_4K_QAM_IN_WIDER_BW_DL_OFDMA_SET_TO_IE(
9364  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9365  
9366  	val = dot11f_eht_cap.limited_cap_support_20mhz;
9367  	EHTCAP_PHY_20MHZ_ONLY_CAPS_SET_TO_IE(
9368  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9369  
9370  	val = dot11f_eht_cap.triggered_mu_bf_full_bw_fb_and_dl_mumimo;
9371  	EHTCAP_PHY_20MHZ_ONLY_TRIGGER_MUBF_FULL_BW_FB_AND_DLMUMIMO_SET_TO_IE(
9372  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9373  
9374  	val = dot11f_eht_cap.mru_support_20mhz;
9375  	EHTCAP_PHY_20MHZ_ONLY_MRU_SUPP_SET_TO_IE(
9376  				     ehtcap->eht_phy_cap.phy_cap_bytes, val);
9377  
9378  	/* Fill EHT MCS and NSS set field */
9379  	if ((is_band_2g && !dot11f_he_cap.chan_width_0) ||
9380  	    (!is_band_2g && !dot11f_he_cap.chan_width_1 &&
9381  	     !dot11f_he_cap.chan_width_2 && !dot11f_he_cap.chan_width_3)) {
9382  		val = dot11f_eht_cap.bw_20_rx_max_nss_for_mcs_0_to_7;
9383  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9384  			      EHTCAP_RX_MCS_NSS_MAP_IDX,
9385  			      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9386  
9387  		val = dot11f_eht_cap.bw_20_tx_max_nss_for_mcs_0_to_7;
9388  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9389  			      EHTCAP_TX_MCS_NSS_MAP_IDX,
9390  			      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9391  		idx++;
9392  
9393  		val = dot11f_eht_cap.bw_20_rx_max_nss_for_mcs_8_and_9;
9394  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9395  			      EHTCAP_RX_MCS_NSS_MAP_IDX,
9396  			      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9397  
9398  		val = dot11f_eht_cap.bw_20_tx_max_nss_for_mcs_8_and_9;
9399  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9400  			      EHTCAP_TX_MCS_NSS_MAP_IDX,
9401  			      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9402  		idx++;
9403  
9404  		val = dot11f_eht_cap.bw_20_rx_max_nss_for_mcs_10_and_11;
9405  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9406  			      EHTCAP_RX_MCS_NSS_MAP_IDX,
9407  			      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9408  
9409  		val = dot11f_eht_cap.bw_20_tx_max_nss_for_mcs_10_and_11;
9410  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9411  			      EHTCAP_TX_MCS_NSS_MAP_IDX,
9412  			      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9413  		idx++;
9414  
9415  		val = dot11f_eht_cap.bw_20_rx_max_nss_for_mcs_12_and_13;
9416  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9417  			      EHTCAP_RX_MCS_NSS_MAP_IDX,
9418  			      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9419  
9420  		val = dot11f_eht_cap.bw_20_tx_max_nss_for_mcs_12_and_13;
9421  		ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9422  			      EHTCAP_TX_MCS_NSS_MAP_IDX,
9423  			      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9424  		idx++;
9425  	} else {
9426  		if ((is_band_2g && dot11f_he_cap.chan_width_0) ||
9427  		    (!is_band_2g && dot11f_he_cap.chan_width_1)) {
9428  			val = dot11f_eht_cap.bw_le_80_rx_max_nss_for_mcs_0_to_9;
9429  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9430  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9431  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9432  
9433  			val = dot11f_eht_cap.bw_le_80_tx_max_nss_for_mcs_0_to_9;
9434  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9435  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9436  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9437  			idx++;
9438  
9439  			val = dot11f_eht_cap.bw_le_80_rx_max_nss_for_mcs_10_and_11;
9440  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9441  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9442  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9443  
9444  			val = dot11f_eht_cap.bw_le_80_tx_max_nss_for_mcs_10_and_11;
9445  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9446  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9447  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9448  			idx++;
9449  
9450  			val = dot11f_eht_cap.bw_le_80_rx_max_nss_for_mcs_12_and_13;
9451  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9452  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9453  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9454  
9455  			val = dot11f_eht_cap.bw_le_80_tx_max_nss_for_mcs_12_and_13;
9456  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9457  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9458  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9459  			idx++;
9460  		}
9461  
9462  		if (dot11f_he_cap.chan_width_2 == 1) {
9463  			val = dot11f_eht_cap.bw_160_rx_max_nss_for_mcs_0_to_9;
9464  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9465  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9466  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9467  
9468  			val = dot11f_eht_cap.bw_160_tx_max_nss_for_mcs_0_to_9;
9469  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9470  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9471  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9472  			idx++;
9473  
9474  			val = dot11f_eht_cap.bw_160_rx_max_nss_for_mcs_10_and_11;
9475  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9476  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9477  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9478  
9479  			val = dot11f_eht_cap.bw_160_tx_max_nss_for_mcs_10_and_11;
9480  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9481  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9482  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9483  			idx++;
9484  
9485  			val = dot11f_eht_cap.bw_160_rx_max_nss_for_mcs_12_and_13;
9486  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9487  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9488  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9489  
9490  			val = dot11f_eht_cap.bw_160_tx_max_nss_for_mcs_12_and_13;
9491  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9492  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9493  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9494  			idx++;
9495  		}
9496  
9497  		if (chwidth_320) {
9498  			val = dot11f_eht_cap.bw_320_rx_max_nss_for_mcs_0_to_9;
9499  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9500  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9501  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9502  
9503  			val = dot11f_eht_cap.bw_320_tx_max_nss_for_mcs_0_to_9;
9504  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9505  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9506  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9507  			idx++;
9508  
9509  			val = dot11f_eht_cap.bw_320_rx_max_nss_for_mcs_10_and_11;
9510  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9511  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9512  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9513  
9514  			val = dot11f_eht_cap.bw_320_tx_max_nss_for_mcs_10_and_11;
9515  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9516  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9517  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9518  			idx++;
9519  
9520  			val = dot11f_eht_cap.bw_320_rx_max_nss_for_mcs_12_and_13;
9521  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9522  				      EHTCAP_RX_MCS_NSS_MAP_IDX,
9523  				      EHTCAP_RX_MCS_NSS_MAP_BITS, val);
9524  
9525  			val = dot11f_eht_cap.bw_320_tx_max_nss_for_mcs_12_and_13;
9526  			ehtcap_ie_set(&ehtcap->mcs_nss_map_bytes[idx],
9527  				      EHTCAP_TX_MCS_NSS_MAP_IDX,
9528  				      EHTCAP_TX_MCS_NSS_MAP_BITS, val);
9529  			idx++;
9530  		}
9531  	}
9532  
9533  	/* Fill in TxRx EHT NSS & MCS support */
9534  	mcs_map_len = idx;
9535  	ehtcap->elem_len = EHTCAP_FIXED_LEN + mcs_map_len;
9536  	ehtcaplen = ehtcap->elem_len + WLAN_IE_HDR_LEN;
9537  }
9538  
9539  #ifdef WLAN_SUPPORT_TWT
9540  static void
9541  populate_dot11f_rtwt_eht_cap(struct mac_context *mac,
9542  			    tDot11fIEeht_cap *eht_cap)
9543  {
9544  	bool restricted_support = false;
9545  
9546  	wlan_twt_get_rtwt_support(mac->psoc, &restricted_support);
9547  
9548  	pe_debug("rTWT support: %d", restricted_support);
9549  
9550  	eht_cap->restricted_twt = restricted_support;
9551  }
9552  #else
9553  static inline void
9554  populate_dot11f_rtwt_eht_cap(struct mac_context *mac,
9555  			    tDot11fIEeht_cap *eht_cap)
9556  {
9557  	eht_cap->restricted_twt = false;
9558  }
9559  #endif
9560  static void
9561  populate_dot11f_revise_eht_caps(struct pe_session *session,
9562  				tDot11fIEeht_cap *eht_cap)
9563  {
9564  	if (session->ch_width != CH_WIDTH_320MHZ)
9565  		eht_cap->support_320mhz_6ghz = 0;
9566  
9567  	if (wlan_epcs_get_config(session->vdev))
9568  		eht_cap->epcs_pri_access = 1;
9569  	else
9570  		eht_cap->epcs_pri_access = 0;
9571  }
9572  
9573  QDF_STATUS populate_dot11f_eht_caps(struct mac_context *mac_ctx,
9574  				    struct pe_session *session,
9575  				    tDot11fIEeht_cap *eht_cap)
9576  {
9577  	eht_cap->present = 1;
9578  
9579  	if (!session) {
9580  		qdf_mem_copy(eht_cap,
9581  			     &mac_ctx->mlme_cfg->eht_caps.dot11_eht_cap,
9582  			     sizeof(tDot11fIEeht_cap));
9583  		return QDF_STATUS_SUCCESS;
9584  	}
9585  
9586  	/** TODO: String items needs attention. **/
9587  	qdf_mem_copy(eht_cap, &session->eht_config, sizeof(*eht_cap));
9588  	populate_dot11f_revise_eht_caps(session, eht_cap);
9589  
9590  	populate_dot11f_rtwt_eht_cap(mac_ctx, eht_cap);
9591  	return QDF_STATUS_SUCCESS;
9592  }
9593  
9594  QDF_STATUS
9595  populate_dot11f_eht_caps_by_band(struct mac_context *mac_ctx,
9596  				 bool is_2g, tDot11fIEeht_cap *eht_cap,
9597  				 struct pe_session *session)
9598  {
9599  	pe_debug("is_2g %d", is_2g);
9600  	if (is_2g)
9601  		qdf_mem_copy(eht_cap,
9602  			     &mac_ctx->eht_cap_2g,
9603  			     sizeof(tDot11fIEeht_cap));
9604  	else
9605  		qdf_mem_copy(eht_cap,
9606  			     &mac_ctx->eht_cap_5g,
9607  			     sizeof(tDot11fIEeht_cap));
9608  	if (session)
9609  		populate_dot11f_revise_eht_caps(session, eht_cap);
9610  
9611  	populate_dot11f_rtwt_eht_cap(mac_ctx, eht_cap);
9612  	return QDF_STATUS_SUCCESS;
9613  }
9614  
9615  QDF_STATUS lim_strip_and_decode_eht_op(uint8_t *ie, uint16_t ie_len,
9616  				       tDot11fIEeht_op *dot11f_eht_op,
9617  				       tDot11fIEVHTOperation dot11f_vht_op,
9618  				       tDot11fIEhe_op dot11f_he_op,
9619  				       tDot11fIEHTInfo dot11f_ht_info)
9620  {
9621  	const uint8_t *eht_op_ie;
9622  	QDF_STATUS status;
9623  
9624  	eht_op_ie = lim_get_ext_ie_ptr_from_ext_id(ie, ie_len,
9625  						   EHT_OP_OUI_TYPE,
9626  						   EHT_OP_OUI_SIZE);
9627  
9628  	if (!eht_op_ie)
9629  		return QDF_STATUS_SUCCESS;
9630  
9631  	status = lim_ieee80211_unpack_ehtop(eht_op_ie, dot11f_eht_op,
9632  					    dot11f_vht_op, dot11f_he_op,
9633  					    dot11f_ht_info);
9634  
9635  	if (status != QDF_STATUS_SUCCESS) {
9636  		pe_err("Failed to extract eht op");
9637  		return QDF_STATUS_E_FAILURE;
9638  	}
9639  
9640  	return QDF_STATUS_SUCCESS;
9641  }
9642  
9643  void lim_ieee80211_pack_ehtop(uint8_t *ie, tDot11fIEeht_op dot11f_eht_op,
9644  			      tDot11fIEVHTOperation dot11f_vht_op,
9645  			      tDot11fIEhe_op dot11f_he_op,
9646  			      tDot11fIEHTInfo dot11f_ht_info)
9647  {
9648  	struct wlan_ie_ehtops *ehtop = (struct wlan_ie_ehtops *)ie;
9649  	uint32_t val;
9650  	uint32_t i;
9651  	uint32_t eht_op_info_len = 0;
9652  	uint32_t ehtoplen;
9653  	bool diff_chan_width = false;
9654  
9655  	if (!ie) {
9656  		pe_err("ie is null");
9657  		return;
9658  	}
9659  
9660  	qdf_mem_zero(ehtop, (sizeof(struct wlan_ie_ehtops)));
9661  
9662  	ehtop->elem_id = DOT11F_EID_EHT_OP;
9663  
9664  	qdf_mem_copy(&ehtop->elem_id_extn, EHT_OP_OUI_TYPE, EHT_OP_OUI_SIZE);
9665  
9666  	if (dot11f_he_op.present && dot11f_he_op.oper_info_6g_present &&
9667  	    (dot11f_he_op.oper_info_6g.info.ch_width !=
9668  	     dot11f_eht_op.channel_width)) {
9669  		diff_chan_width = true;
9670  	} else if (dot11f_vht_op.present &&
9671  		   (dot11f_vht_op.chanWidth != dot11f_eht_op.channel_width)) {
9672  		diff_chan_width = true;
9673  	} else if (dot11f_ht_info.present &&
9674  		   (dot11f_ht_info.recommendedTxWidthSet !=
9675  		    dot11f_eht_op.channel_width)) {
9676  		diff_chan_width = true;
9677  	}
9678  
9679  	if (diff_chan_width) {
9680  		val = dot11f_eht_op.eht_op_information_present;
9681  		EHTOP_PARAMS_INFOP_SET_TO_IE(ehtop->ehtop_param, val);
9682  	}
9683  
9684  	val = dot11f_eht_op.eht_default_pe_duration;
9685  	EHTOP_PARAMS_EHT_DEF_PE_DURATION_SET_TO_IE(ehtop->ehtop_param, val);
9686  
9687  	val = dot11f_eht_op.group_addr_bu_indication_limit;
9688  	EHTOP_PARAMS_GROUP_ADDR_BU_IND_LIMIT_SET_TO_IE(ehtop->ehtop_param, val);
9689  
9690  	val = dot11f_eht_op.group_addr_bu_indication_exponent;
9691  	EHTOP_PARAMS_GROUP_ADDR_BU_IND_EXPONENT_SET_TO_IE(ehtop->ehtop_param,
9692  							  val);
9693  
9694  	val = dot11f_eht_op.basic_rx_max_nss_for_mcs_0_to_7;
9695  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_0_7,
9696  		     EHTOP_RX_MCS_NSS_MAP_IDX,
9697  		     EHTOP_RX_MCS_NSS_MAP_BITS, val);
9698  	val = dot11f_eht_op.basic_tx_max_nss_for_mcs_0_to_7;
9699  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_0_7,
9700  		     EHTOP_TX_MCS_NSS_MAP_IDX,
9701  		     EHTOP_TX_MCS_NSS_MAP_BITS, val);
9702  
9703  	val = dot11f_eht_op.basic_rx_max_nss_for_mcs_8_and_9;
9704  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_8_9,
9705  		     EHTOP_RX_MCS_NSS_MAP_IDX,
9706  		     EHTOP_RX_MCS_NSS_MAP_BITS, val);
9707  	val = dot11f_eht_op.basic_tx_max_nss_for_mcs_8_and_9;
9708  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_8_9,
9709  		     EHTOP_TX_MCS_NSS_MAP_IDX,
9710  		     EHTOP_TX_MCS_NSS_MAP_BITS, val);
9711  
9712  	val = dot11f_eht_op.basic_rx_max_nss_for_mcs_10_and_11;
9713  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_10_11,
9714  		     EHTOP_RX_MCS_NSS_MAP_IDX,
9715  		     EHTOP_RX_MCS_NSS_MAP_BITS, val);
9716  	val = dot11f_eht_op.basic_tx_max_nss_for_mcs_10_and_11;
9717  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_10_11,
9718  		     EHTOP_TX_MCS_NSS_MAP_IDX,
9719  		     EHTOP_TX_MCS_NSS_MAP_BITS, val);
9720  
9721  	val = dot11f_eht_op.basic_rx_max_nss_for_mcs_12_and_13;
9722  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_12_13,
9723  		     EHTOP_RX_MCS_NSS_MAP_IDX,
9724  		     EHTOP_RX_MCS_NSS_MAP_BITS, val);
9725  	val = dot11f_eht_op.basic_tx_max_nss_for_mcs_12_and_13;
9726  	ehtop_ie_set(&ehtop->basic_mcs_nss_set.max_nss_mcs_12_13,
9727  		     EHTOP_TX_MCS_NSS_MAP_IDX,
9728  		     EHTOP_TX_MCS_NSS_MAP_BITS, val);
9729  
9730  	if (EHTOP_PARAMS_INFOP_GET_FROM_IE(ehtop->ehtop_param)) {
9731  		val = dot11f_eht_op.channel_width;
9732  		EHTOP_INFO_CHANWIDTH_SET_TO_IE(ehtop->control, val);
9733  
9734  		ehtop->ccfs0 = dot11f_eht_op.ccfs0;
9735  
9736  		ehtop->ccfs1 = dot11f_eht_op.ccfs1;
9737  		/*1 byte for Control, 1 byte for CCFS0, 1 bytes for CCFS1*/
9738  		eht_op_info_len += 3;
9739  
9740  		if (dot11f_eht_op.disabled_sub_chan_bitmap_present) {
9741  			val = dot11f_eht_op.disabled_sub_chan_bitmap_present;
9742  			EHTOP_PARAMS_DISABLEDSUBCHANBITMAPP_SET_TO_IE(ehtop->ehtop_param, val);
9743  
9744  			eht_op_info_len += WLAN_MAX_DISABLED_SUB_CHAN_BITMAP;
9745  
9746  			for (i = 0; i < WLAN_MAX_DISABLED_SUB_CHAN_BITMAP; i++)
9747  				ehtop->disabled_sub_chan_bitmap[i] =
9748  				dot11f_eht_op.disabled_sub_chan_bitmap[0][i];
9749  		}
9750  	}
9751  
9752  	ehtop->elem_len = EHTOP_FIXED_LEN + eht_op_info_len;
9753  	ehtoplen = ehtop->elem_len + WLAN_IE_HDR_LEN;
9754  }
9755  
9756  QDF_STATUS populate_dot11f_eht_operation(struct mac_context *mac_ctx,
9757  					 struct pe_session *session,
9758  					 tDot11fIEeht_op *eht_op)
9759  {
9760  	enum phy_ch_width oper_ch_width;
9761  
9762  	qdf_mem_copy(eht_op, &session->eht_op, sizeof(*eht_op));
9763  
9764  	eht_op->present = 1;
9765  
9766  	eht_op->eht_op_information_present = 1;
9767  
9768  	oper_ch_width = wlan_mlme_get_ap_oper_ch_width(session->vdev);
9769  	if (oper_ch_width == CH_WIDTH_320MHZ) {
9770  		eht_op->channel_width = WLAN_EHT_CHWIDTH_320;
9771  		eht_op->ccfs0 = session->ch_center_freq_seg0;
9772  		eht_op->ccfs1 = session->ch_center_freq_seg1;
9773  	} else if (oper_ch_width == CH_WIDTH_160MHZ ||
9774  		   oper_ch_width == CH_WIDTH_80P80MHZ) {
9775  		eht_op->channel_width = WLAN_EHT_CHWIDTH_160;
9776  		eht_op->ccfs0 = session->ch_center_freq_seg0;
9777  		eht_op->ccfs1 = session->ch_center_freq_seg1;
9778  	} else if (oper_ch_width == CH_WIDTH_80MHZ) {
9779  		eht_op->channel_width = WLAN_EHT_CHWIDTH_80;
9780  		eht_op->ccfs0 = session->ch_center_freq_seg0;
9781  		eht_op->ccfs1 = 0;
9782  	} else if (oper_ch_width == CH_WIDTH_40MHZ) {
9783  		eht_op->channel_width = WLAN_EHT_CHWIDTH_40;
9784  		eht_op->ccfs0 = session->ch_center_freq_seg0;
9785  		eht_op->ccfs1 = 0;
9786  	} else if (oper_ch_width == CH_WIDTH_20MHZ) {
9787  		eht_op->channel_width = WLAN_EHT_CHWIDTH_20;
9788  		eht_op->ccfs0 = session->ch_center_freq_seg0;
9789  		eht_op->ccfs1 = 0;
9790  	}
9791  
9792  	lim_log_eht_op(mac_ctx, eht_op, session);
9793  
9794  	return QDF_STATUS_SUCCESS;
9795  }
9796  
9797  
9798  QDF_STATUS populate_dot11f_bw_ind_element(struct mac_context *mac_ctx,
9799  					  struct pe_session *session,
9800  					  tDot11fIEbw_ind_element *bw_ind)
9801  {
9802  	tLimChannelSwitchInfo *ch_switch;
9803  
9804  	ch_switch = &session->gLimChannelSwitch;
9805  	bw_ind->present = true;
9806  	bw_ind->channel_width =	wlan_mlme_convert_phy_ch_width_to_eht_op_bw(
9807  							ch_switch->ch_width);
9808  	if (ch_switch->puncture_bitmap) {
9809  		bw_ind->disabled_sub_chan_bitmap_present = 1;
9810  		bw_ind->disabled_sub_chan_bitmap[0][0] =
9811  				QDF_GET_BITS(ch_switch->puncture_bitmap, 0, 8);
9812  		bw_ind->disabled_sub_chan_bitmap[0][1] =
9813  				QDF_GET_BITS(ch_switch->puncture_bitmap, 8, 8);
9814  	}
9815  	bw_ind->ccfs0 = ch_switch->ch_center_freq_seg0;
9816  	bw_ind->ccfs1 = ch_switch->ch_center_freq_seg1;
9817  
9818  	return QDF_STATUS_SUCCESS;
9819  }
9820  
9821  #endif /* WLAN_FEATURE_11BE */
9822  
9823  #ifdef WLAN_FEATURE_11BE_MLO
9824  QDF_STATUS
9825  populate_dot11f_probe_req_mlo_ie(struct mac_context *mac,
9826  				 struct pe_session *session)
9827  {
9828  	struct wlan_mlo_ie *mlo_ie;
9829  	uint8_t *p_ml_ie, *sta_data;
9830  	uint16_t len_remaining, sta_len_left;
9831  	struct wlan_mlo_sta_profile *sta_pro;
9832  	int num_sta_pro = 0;
9833  	struct mlo_partner_info partner_info;
9834  	uint8_t link;
9835  
9836  	if (!session || !session->vdev || !session->vdev->mlo_dev_ctx) {
9837  		pe_err("Null value");
9838  		return QDF_STATUS_E_NULL_VALUE;
9839  	}
9840  
9841  	mlo_ie = &session->mlo_ie;
9842  	p_ml_ie = mlo_ie->data;
9843  	len_remaining = sizeof(mlo_ie->data);
9844  
9845  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
9846  	len_remaining--;
9847  
9848  	/* set length later */
9849  	*p_ml_ie++ = 0;
9850  	len_remaining--;
9851  
9852  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
9853  	len_remaining--;
9854  
9855  	/* Set ML IE multi link control bitmap:
9856  	 * ML probe variant type = 1
9857  	 * In presence bitmap, set MLD ID presence bit = 1
9858  	 */
9859  	mlo_ie->type = WLAN_ML_VARIANT_PROBEREQ;
9860  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
9861  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
9862  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
9863  		     WLAN_ML_CTRL_PBM_BITS, 1);
9864  
9865  	p_ml_ie += WLAN_ML_CTRL_SIZE;
9866  	len_remaining -= WLAN_ML_CTRL_SIZE;
9867  
9868  	/* common info length is 2 */
9869  	*p_ml_ie++ = 2;
9870  	len_remaining--;
9871  
9872  	/* mld id is always 0 for tx link for SAP or AP */
9873  	*p_ml_ie++ = 0;
9874  	len_remaining--;
9875  
9876  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
9877  
9878  	if (wlan_vdev_mlme_cap_get(session->vdev,
9879  				   WLAN_VDEV_C_EXCL_STA_PROF_PRB_REQ)) {
9880  		pe_debug("Do not populate sta profile in MLO IE");
9881  		goto no_sta_prof;
9882  	}
9883  
9884  	partner_info = session->lim_join_req->partner_info;
9885  	for (link = 0; link < partner_info.num_partner_links; link++) {
9886  		sta_pro = &mlo_ie->sta_profile[num_sta_pro];
9887  		sta_data = sta_pro->data;
9888  		sta_len_left = sizeof(sta_pro->data);
9889  
9890  		*sta_data++ = WLAN_ML_LINFO_SUBELEMID_PERSTAPROFILE;
9891  		sta_len_left--;
9892  		/* length of subelement, filled at last */
9893  		*sta_data++ = 0;
9894  		sta_len_left--;
9895  
9896  		QDF_SET_BITS(*(uint16_t *)sta_data,
9897  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_IDX,
9898  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_BITS,
9899  			     partner_info.partner_link_info[link].link_id);
9900  
9901  		QDF_SET_BITS(*(uint16_t *)sta_data,
9902  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_CMPLTPROF_IDX,
9903  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_CMPLTPROF_BITS,
9904  			     1);
9905  		sta_data += WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_SIZE;
9906  		sta_len_left -= WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_SIZE;
9907  
9908  		sta_pro->num_data = sta_data - sta_pro->data;
9909  		sta_pro->data[TAG_LEN_POS] = sta_pro->num_data - MIN_IE_LEN;
9910  
9911  		num_sta_pro++;
9912  	}
9913  
9914  no_sta_prof:
9915  	mlo_ie->num_sta_profile = num_sta_pro;
9916  	session->lim_join_req->is_ml_probe_req_sent = true;
9917  
9918  	return QDF_STATUS_SUCCESS;
9919  }
9920  
9921  #if defined(SAP_MULTI_LINK_EMULATION)
9922  QDF_STATUS populate_dot11f_assoc_rsp_mlo_ie(struct mac_context *mac_ctx,
9923  					    struct pe_session *session,
9924  					    tpDphHashNode sta,
9925  					    tDot11fAssocResponse *frm)
9926  {
9927  	struct wlan_mlo_ie *mlo_ie;
9928  	struct wlan_mlo_sta_profile *sta_pro;
9929  	tpSirAssocReq assoc_req;
9930  	uint8_t *sta_data;
9931  	uint32_t sta_len_left;
9932  	uint8_t common_info_len = 0;
9933  	uint8_t *p_ml_ie;
9934  	uint16_t len_remaining;
9935  	uint16_t presence_bitmap = 0;
9936  	uint16_t sta_prof_len;
9937  	uint8_t sta_prof_[] = {0x00, 0xff, 0xf1, 0x01, 0x13, 0x02, 0x03, 0x7f, 0x95, 0xaf, 0x62, 0x64, 0x00, 0x54, 0x00, 0x00,
9938  		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x31, 0x04, 0x00, 0x00, 0x01, 0x08, 0x8c, 0x12, 0x98, 0x24, 0xb0,
9939  		0x48, 0x60, 0x6c, 0x07, 0x0a, 0x55, 0x53, 0x04, 0xc9, 0x83, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x20,
9940  		0x01, 0x00, 0x23, 0x02, 0x0a, 0x00, 0x32, 0x01, 0xfb, 0x7f, 0x0b, 0x04, 0x00, 0x4f, 0x02, 0x00,
9941  		0x00, 0x00, 0x40, 0x00, 0x40, 0x19, 0xc3, 0x02, 0x58, 0x0a, 0xc3, 0x02, 0x18, 0xfe, 0xff, 0x23,
9942  		0x23, 0x0d, 0x01, 0x08, 0x1a, 0x40, 0x10, 0x00, 0x63, 0x40, 0x88, 0x1f, 0x43, 0x81, 0x1c, 0x11,
9943  		0x08, 0x00, 0xaa, 0xff, 0xaa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71,
9944  		0x1c, 0xc7, 0x71, 0xff, 0x0c, 0x24, 0xf4, 0x3f, 0x02, 0x28, 0xfc, 0xff, 0x25, 0x00, 0x25, 0x00,
9945  		0x01, 0xff, 0x0e, 0x26, 0x00, 0x03, 0xa4, 0xff, 0x27, 0xa4, 0xff, 0x42, 0x43, 0xff, 0x62, 0x32,
9946  		0xff, 0xff, 0x03, 0x3b, 0xb8, 0x36, 0xff, 0x0f, 0x6c, 0x17, 0x00, 0xe0, 0x03, 0x03, 0x00, 0x18,
9947  		0x76, 0xd8, 0x12, 0x00, 0x44, 0x44, 0x44, 0xff, 0x06, 0x6a, 0x04, 0x11, 0x00, 0x00, 0x00};
9948  	QDF_STATUS status;
9949  
9950  	if (!mac_ctx || !session || !frm)
9951  		return QDF_STATUS_E_NULL_VALUE;
9952  
9953  	mlo_ie = &session->mlo_ie;
9954  
9955  	p_ml_ie = mlo_ie->data;
9956  	len_remaining = sizeof(mlo_ie->data);
9957  
9958  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
9959  	len_remaining--;
9960  	/* set length later */
9961  	*p_ml_ie++ = 0;
9962  	len_remaining--;
9963  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
9964  	len_remaining--;
9965  
9966  	mlo_ie->type = 0;
9967  	/* Common Info Length*/
9968  	common_info_len += WLAN_ML_BV_CINFO_LENGTH_SIZE;
9969  	qdf_mem_copy(mlo_ie->mld_mac_addr,
9970  		     session->vdev->mlo_dev_ctx->mld_addr.bytes,
9971  		     sizeof(mlo_ie->mld_mac_addr));
9972  	common_info_len += QDF_MAC_ADDR_SIZE;
9973  
9974  	mlo_ie->link_id_info_present = 1;
9975  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_LINKIDINFO_P;
9976  	mlo_ie->link_id = wlan_vdev_get_link_id(session->vdev);
9977  	common_info_len += WLAN_ML_BV_CINFO_LINKIDINFO_SIZE;
9978  
9979  	mlo_ie->bss_param_change_cnt_present = 1;
9980  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P;
9981  	mlo_ie->bss_param_change_count =
9982  			session->mlo_link_info.link_ie.bss_param_change_cnt;
9983  	common_info_len += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
9984  
9985  	mlo_ie->mld_capab_and_op_present = 1;
9986  	mlo_ie->mld_id_present = 1;
9987  	mlo_ie->ext_mld_capab_and_op_present = 1;
9988  	common_info_len += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
9989  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_MLDCAPANDOP_P;
9990  
9991  	common_info_len += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
9992  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_EMLCAP_P;
9993  
9994  	common_info_len += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
9995  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_MEDIUMSYNCDELAYINFO_P;
9996  
9997  	mlo_ie->common_info_length = common_info_len;
9998  
9999  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
10000  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
10001  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
10002  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
10003  	p_ml_ie += WLAN_ML_CTRL_SIZE;
10004  	len_remaining -= WLAN_ML_CTRL_SIZE;
10005  
10006  	*p_ml_ie++ = common_info_len;
10007  	len_remaining--;
10008  
10009  	qdf_mem_copy(p_ml_ie, mlo_ie->mld_mac_addr, QDF_MAC_ADDR_SIZE);
10010  	p_ml_ie += QDF_MAC_ADDR_SIZE;
10011  	len_remaining -= QDF_MAC_ADDR_SIZE;
10012  
10013  	QDF_SET_BITS(*p_ml_ie, WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_IDX,
10014  		     WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_BITS, mlo_ie->link_id);
10015  	p_ml_ie++;
10016  	len_remaining--;
10017  
10018  	*p_ml_ie++ = mlo_ie->bss_param_change_count;
10019  	len_remaining--;
10020  
10021  	p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10022  	p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10023  	len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10024  	len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10025  
10026  	if (mlo_ie->mld_capab_and_op_present) {
10027  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
10028  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_IDX,
10029  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_BITS,
10030  		     mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num);
10031  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
10032  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_IDX,
10033  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_BITS,
10034  		     mlo_ie->mld_capab_and_op_info.tid_link_map_supported);
10035  		p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10036  		len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10037  	}
10038  
10039  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
10040  
10041  	sta_prof_[5] = session->self_mac_addr[0];
10042  	sta_prof_[6] = session->self_mac_addr[1];
10043  	sta_prof_[7] = session->self_mac_addr[2];
10044  	sta_prof_[8] = session->self_mac_addr[3];
10045  
10046  	sta_prof_[9] = 0xaf;
10047  	sta_prof_[10] = 0x62;
10048  
10049  	sta_pro = &mlo_ie->sta_profile[0];
10050  	sta_data = sta_pro->data;
10051  	sta_len_left = sizeof(sta_pro->data);
10052  
10053  	sta_prof_len = ARRAY_SIZE(sta_prof_);
10054  	qdf_mem_copy(sta_data, sta_prof_, sta_prof_len);
10055  	sta_data += sta_prof_len;
10056  	sta_len_left -= sta_prof_len;
10057  
10058  	sta_pro->num_data = sta_data - sta_pro->data;
10059  	pe_debug("num data: %d, sta_prof_len: %d, sta_data len: %d",
10060  		 sta_pro->num_data, sta_prof_len, sizeof(sta_pro->data));
10061  	sta_pro->data[TAG_LEN_POS] = sta_pro->num_data - MIN_IE_LEN;
10062  
10063  	mlo_ie->num_sta_profile = 1;
10064  	mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num = 1;
10065  
10066  		if (sta_pro->num_data > WLAN_MAX_IE_LEN + MIN_IE_LEN) {
10067  			sta_pro->data[TAG_LEN_POS] = WLAN_MAX_IE_LEN;
10068  			status =
10069  			    lim_add_frag_ie_for_sta_profile(sta_pro->data,
10070  							    &sta_pro->num_data);
10071  			if (status != QDF_STATUS_SUCCESS) {
10072  				pe_debug("add frg ie for sta profile error.");
10073  				sta_pro->num_data =
10074  					WLAN_MAX_IE_LEN + MIN_IE_LEN;
10075  			}
10076  		} else {
10077  			sta_pro->data[TAG_LEN_POS] =
10078  					sta_pro->num_data - MIN_IE_LEN;
10079  		}
10080  	assoc_req = session->parsedAssocReq[sta->assocId];
10081  
10082  	pe_debug("num partner links: %d", assoc_req->mlo_info.num_partner_links);
10083  	return QDF_STATUS_SUCCESS;
10084  }
10085  
10086  QDF_STATUS populate_dot11f_bcn_mlo_ie(struct mac_context *mac_ctx,
10087  				      struct pe_session *session)
10088  {
10089  	struct wlan_mlo_ie *mlo_ie;
10090  	struct wlan_mlo_sta_profile *sta_pro;
10091  	uint16_t vdev_count;
10092  	struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS];
10093  	uint16_t tmp_offset = 0;
10094  	struct ml_sch_partner_info *tmp_info;
10095  	struct mlo_sch_partner_links *sch_info;
10096  	uint8_t *sta_data;
10097  	uint8_t common_info_length = 0;
10098  	uint8_t *p_ml_ie;
10099  	uint16_t len_remaining;
10100  	uint16_t presence_bitmap = 0;
10101  	uint32_t sta_len_left;
10102  	QDF_STATUS status;
10103  	uint16_t sta_prof_len;
10104  	uint8_t sta_prof_[] = {0x00, 0xff, 0xf1, 0x01, 0x13, 0x02, 0x03, 0x7f, 0x95, 0xaf, 0x62, 0x64, 0x00, 0x54, 0x00, 0x00,
10105  		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x05, 0x01, 0x08, 0x8c, 0x12, 0x98, 0x24, 0xb0,
10106  		0x48, 0x60, 0x6c, 0x07, 0x0a, 0x55, 0x53, 0x04, 0xc9, 0x83, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x20,
10107  		0x01, 0x00, 0x23, 0x02, 0x0a, 0x00, 0x32, 0x01, 0xfb, 0x7f, 0x0b, 0x04, 0x00, 0x4f, 0x02, 0x00,
10108  		0x00, 0x00, 0x40, 0x00, 0x40, 0x19, 0xc3, 0x02, 0x58, 0x0a, 0xc3, 0x02, 0x18, 0xfe, 0xff, 0x23,
10109  		0x23, 0x0d, 0x01, 0x08, 0x1a, 0x40, 0x10, 0x00, 0x63, 0x40, 0x88, 0x1f, 0x43, 0x81, 0x1c, 0x11,
10110  		0x08, 0x00, 0xaa, 0xff, 0xaa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71,
10111  		0x1c, 0xc7, 0x71, 0xff, 0x0c, 0x24, 0xf4, 0x3f, 0x02, 0x28, 0xfc, 0xff, 0x25, 0x00, 0x25, 0x00,
10112  		0x01, 0xff, 0x0e, 0x26, 0x00, 0x03, 0xa4, 0xff, 0x27, 0xa4, 0xff, 0x42, 0x43, 0xff, 0x62, 0x32,
10113  		0xff, 0xff, 0x03, 0x3b, 0xb8, 0x36, 0xff, 0x0f, 0x6c, 0x17, 0x00, 0xe0, 0x03, 0x03, 0x00, 0x18,
10114  		0x76, 0xd8, 0x12, 0x00, 0x44, 0x44, 0x44, 0xff, 0x06, 0x6a, 0x04, 0x11, 0x00, 0x00, 0x00};
10115  	if (!mac_ctx || !session)
10116  		return QDF_STATUS_E_NULL_VALUE;
10117  
10118  	mlo_ie = &session->mlo_ie;
10119  
10120  	/* Common Info Length */
10121  	common_info_length += WLAN_ML_BV_CINFO_LENGTH_SIZE;
10122  	qdf_mem_zero(&mac_ctx->sch.sch_mlo_partner,
10123  		     sizeof(mac_ctx->sch.sch_mlo_partner));
10124  	sch_info = &mac_ctx->sch.sch_mlo_partner;
10125  	mlo_ie->type = 0;
10126  	tmp_offset += 1; /* Element ID */
10127  	tmp_offset += 1; /* length */
10128  	tmp_offset += 1; /* Element ID extension */
10129  	tmp_offset += 2; /* Multi-link control */
10130  	qdf_mem_copy(mlo_ie->mld_mac_addr,
10131  		     session->vdev->mlo_dev_ctx->mld_addr.bytes,
10132  		     sizeof(mlo_ie->mld_mac_addr));
10133  	tmp_offset += 1; /* Common Info Length */
10134  	tmp_offset += 6; /* mld mac addr */
10135  	common_info_length += QDF_MAC_ADDR_SIZE;
10136  	mlo_ie->link_id_info_present = 1;
10137  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_LINKIDINFO_P;
10138  	mlo_ie->link_id = wlan_vdev_get_link_id(session->vdev);
10139  	tmp_offset += 1; /* link id */
10140  	common_info_length += WLAN_ML_BV_CINFO_LINKIDINFO_SIZE;
10141  	mlo_ie->bss_param_change_cnt_present = 1;
10142  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P;
10143  	mlo_ie->bss_param_change_count =
10144  			session->mlo_link_info.link_ie.bss_param_change_cnt;
10145  	tmp_offset += 1; /* bss parameters change count */
10146  	common_info_length += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
10147  
10148  	tmp_offset += 2;/* MLD Parameters */
10149  	mlo_ie->mld_capab_and_op_present = 1;
10150  	mlo_ie->mld_id_present = 1;
10151  	mlo_ie->ext_mld_capab_and_op_present = 1;
10152  	sch_info->num_links = 1;
10153  	common_info_length += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10154  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_MLDCAPANDOP_P;
10155  
10156  	tmp_offset += 2;
10157  	common_info_length += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
10158  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_EMLCAP_P;
10159  
10160  	tmp_offset += 2;
10161  	common_info_length += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10162  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_MEDIUMSYNCDELAYINFO_P;
10163  
10164  	lim_get_mlo_vdev_list(session, &vdev_count, wlan_vdev_list);
10165  	mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num =
10166  							vdev_count;
10167  
10168  	mlo_ie->mld_capab_and_op_info.tid_link_map_supported = 1;
10169  
10170  	mlo_ie->common_info_length = common_info_length;
10171  	sch_info->mlo_ie_link_info_ofst = tmp_offset;
10172  
10173  	p_ml_ie = mlo_ie->data;
10174  	len_remaining = sizeof(mlo_ie->data);
10175  
10176  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
10177  	len_remaining--;
10178  	*p_ml_ie++ = 0;
10179  	len_remaining--;
10180  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
10181  	len_remaining--;
10182  
10183  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
10184  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
10185  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
10186  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
10187  	p_ml_ie += WLAN_ML_CTRL_SIZE;
10188  	len_remaining -= WLAN_ML_CTRL_SIZE;
10189  
10190  	*p_ml_ie++ = common_info_length;
10191  	len_remaining--;
10192  
10193  	qdf_mem_copy(p_ml_ie, mlo_ie->mld_mac_addr, QDF_MAC_ADDR_SIZE);
10194  	p_ml_ie += QDF_MAC_ADDR_SIZE;
10195  	len_remaining -= QDF_MAC_ADDR_SIZE;
10196  
10197  	QDF_SET_BITS(*p_ml_ie, WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_IDX,
10198  		     WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_BITS,
10199  		     mlo_ie->link_id);
10200  	p_ml_ie++;
10201  	len_remaining--;
10202  
10203  	*p_ml_ie++ = mlo_ie->bss_param_change_count;
10204  	len_remaining--;
10205  
10206  	p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10207  	p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10208  	len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10209  	len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10210  
10211  	if (mlo_ie->mld_capab_and_op_present) {
10212  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
10213  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_IDX,
10214  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_BITS,
10215  		     mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num);
10216  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
10217  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_IDX,
10218  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_BITS,
10219  		     mlo_ie->mld_capab_and_op_info.tid_link_map_supported);
10220  		p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10221  		len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
10222  	}
10223  
10224  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
10225  
10226  	sta_prof_[5] = session->self_mac_addr[0];
10227  	sta_prof_[6] = session->self_mac_addr[1];
10228  	sta_prof_[7] = session->self_mac_addr[2];
10229  	sta_prof_[8] = session->self_mac_addr[3];
10230  
10231  	sta_prof_[9] = 0xaf;
10232  	sta_prof_[10] = 0x62;
10233  
10234  	sta_pro = &mlo_ie->sta_profile[0];
10235  	sta_data = sta_pro->data;
10236  	sta_len_left = sizeof(sta_pro->data);
10237  
10238  	sta_prof_len = ARRAY_SIZE(sta_prof_);
10239  	qdf_mem_copy(sta_data, sta_prof_, sta_prof_len);
10240  	sta_data += sta_prof_len;
10241  	sta_len_left -= sta_prof_len;
10242  	sch_info->num_links = 1;
10243  	mlo_ie->num_sta_profile = 1;
10244  
10245  	sta_pro->num_data = sta_data - sta_pro->data;
10246  	pe_debug("num data: %d, sta_prof_len: %d, sta_data len: %d",
10247  		 sta_pro->num_data, sta_prof_len, sizeof(sta_pro->data));
10248  	sta_pro->data[TAG_LEN_POS] =	sta_pro->num_data - MIN_IE_LEN;
10249  	tmp_info = &sch_info->partner_info[0];
10250  	tmp_info->link_info_sta_prof_ofst = sta_prof_len;
10251  
10252  	mlo_ie->num_sta_profile = 1;
10253  	status = QDF_STATUS_SUCCESS;
10254  
10255  	return status;
10256  }
10257  #else
10258  QDF_STATUS populate_dot11f_assoc_rsp_mlo_ie(struct mac_context *mac_ctx,
10259  					    struct pe_session *session,
10260  					    tpDphHashNode sta,
10261  					    tDot11fAssocResponse *frm)
10262  {
10263  	int link;
10264  	int num_sta_pro = 0;
10265  	struct wlan_mlo_ie *mlo_ie;
10266  	struct wlan_mlo_sta_profile *sta_pro;
10267  	struct mlo_link_ie_info *link_info;
10268  	struct mlo_link_ie *link_ie;
10269  	tpSirAssocReq assoc_req;
10270  	tpSirAssocReq link_assoc_req;
10271  	const uint8_t *reported_p2p_ie;
10272  	uint8_t non_inher_ie_lists[255];
10273  	uint8_t non_inher_len;
10274  	uint8_t non_inher_ext_len;
10275  	uint8_t non_inher_ext_ie_lists[255];
10276  	bool same_ie, reported_vendor_vht_ie_pres;
10277  	bool reported_wmm_caps_pres, reported_wmm_param_pres;
10278  	tDot11fIEvendor_vht_ie vendor_vht_ie;
10279  	tpDphHashNode link_sta;
10280  	tDot11fIESuppRates supp_rates;
10281  	tDot11fIEExtSuppRates ext_supp_rates;
10282  	uint8_t lle_mode;
10283  	struct pe_session *link_session;
10284  	uint16_t assoc_id = 0;
10285  	uint8_t link_id;
10286  	uint8_t *sta_addr;
10287  	uint8_t *sta_data;
10288  	uint32_t sta_len_left;
10289  	uint32_t sta_len_consumed;
10290  	tDot11fFfStatus sta_status;
10291  	tDot11fIEP2PAssocRes sta_p2p_assoc_res;
10292  	tDot11fIEnon_inheritance sta_non_inheritance;
10293  	uint8_t common_info_len = 0, len = 0;
10294  	uint8_t *p_ml_ie;
10295  	uint16_t len_remaining;
10296  	uint16_t presence_bitmap = 0;
10297  	QDF_STATUS status;
10298  
10299  	if (!mac_ctx || !session || !frm)
10300  		return QDF_STATUS_E_NULL_VALUE;
10301  
10302  	mlo_ie = &session->mlo_ie;
10303  
10304  	p_ml_ie = mlo_ie->data;
10305  	len_remaining = sizeof(mlo_ie->data);
10306  
10307  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
10308  	len_remaining--;
10309  	/* set length later */
10310  	*p_ml_ie++ = 0;
10311  	len_remaining--;
10312  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
10313  	len_remaining--;
10314  
10315  	mlo_ie->type = 0;
10316  	/* Common Info Length*/
10317  	common_info_len += WLAN_ML_BV_CINFO_LENGTH_SIZE;
10318  	qdf_mem_copy(mlo_ie->mld_mac_addr,
10319  		     session->vdev->mlo_dev_ctx->mld_addr.bytes,
10320  		     sizeof(mlo_ie->mld_mac_addr));
10321  	common_info_len += QDF_MAC_ADDR_SIZE;
10322  
10323  	mlo_ie->link_id_info_present = 1;
10324  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_LINKIDINFO_P;
10325  	mlo_ie->link_id = wlan_vdev_get_link_id(session->vdev);
10326  	common_info_len += WLAN_ML_BV_CINFO_LINKIDINFO_SIZE;
10327  
10328  	mlo_ie->bss_param_change_cnt_present = 1;
10329  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P;
10330  	mlo_ie->bss_param_change_count =
10331  			session->mlo_link_info.link_ie.bss_param_change_cnt;
10332  	common_info_len += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
10333  
10334  	mlo_ie->mld_capab_and_op_present = 0;
10335  	mlo_ie->mld_id_present = 0;
10336  	mlo_ie->ext_mld_capab_and_op_present = 0;
10337  
10338  	mlo_ie->common_info_length = common_info_len;
10339  
10340  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
10341  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
10342  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
10343  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
10344  	p_ml_ie += WLAN_ML_CTRL_SIZE;
10345  	len_remaining -= WLAN_ML_CTRL_SIZE;
10346  
10347  	*p_ml_ie++ = common_info_len;
10348  	len_remaining--;
10349  
10350  	qdf_mem_copy(p_ml_ie, mlo_ie->mld_mac_addr, QDF_MAC_ADDR_SIZE);
10351  	p_ml_ie += QDF_MAC_ADDR_SIZE;
10352  	len_remaining -= QDF_MAC_ADDR_SIZE;
10353  
10354  	QDF_SET_BITS(*p_ml_ie, WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_IDX,
10355  		     WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_BITS, mlo_ie->link_id);
10356  	p_ml_ie++;
10357  	len_remaining--;
10358  
10359  	*p_ml_ie++ = mlo_ie->bss_param_change_count;
10360  	len_remaining--;
10361  
10362  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
10363  
10364  	assoc_req = session->parsedAssocReq[sta->assocId];
10365  	if (!assoc_req)
10366  		goto no_partner;
10367  
10368  	for (link = 0; link < assoc_req->mlo_info.num_partner_links; link++) {
10369  		lle_mode = 0;
10370  		sta_pro = &mlo_ie->sta_profile[num_sta_pro];
10371  		link_id = assoc_req->mlo_info.partner_link_info[link].link_id;
10372  		link_session = pe_find_partner_session_by_link_id(session,
10373  								  link_id);
10374  		if (!link_session)
10375  			continue;
10376  		link_info = &link_session->mlo_link_info;
10377  		link_ie = &link_info->link_ie;
10378  		sta_addr =
10379  		    assoc_req->mlo_info.partner_link_info[link].link_addr.bytes;
10380  		link_sta = dph_lookup_hash_entry(
10381  				mac_ctx,
10382  				sta_addr,
10383  				&assoc_id,
10384  				&link_session->dph.dphHashTable);
10385  		if (!link_sta) {
10386  			lim_mlo_release_vdev_ref(link_session->vdev);
10387  			continue;
10388  		}
10389  		link_assoc_req =
10390  			link_session->parsedAssocReq[link_sta->assocId];
10391  		sta_data = sta_pro->data;
10392  		sta_len_left = sizeof(sta_pro->data);
10393  
10394  		*sta_data++ = WLAN_ML_LINFO_SUBELEMID_PERSTAPROFILE;
10395  		/* set length later */
10396  		*sta_data++ = 0;
10397  		sta_len_left -= 2;
10398  
10399  		QDF_SET_BITS(
10400  			*(uint16_t *)sta_data,
10401  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_IDX,
10402  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_BITS,
10403  			link_id);
10404  		QDF_SET_BITS(
10405  			*(uint16_t *)sta_data,
10406  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_CMPLTPROF_IDX,
10407  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_CMPLTPROF_BITS,
10408  			1);
10409  		QDF_SET_BITS(
10410  			*(uint16_t *)sta_data,
10411  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_MACADDRP_IDX,
10412  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_MACADDRP_BITS,
10413  			1);
10414  		QDF_SET_BITS(
10415  			*(uint16_t *)sta_data,
10416  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BCNINTP_IDX,
10417  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BCNINTP_BITS,
10418  			1);
10419  		QDF_SET_BITS(
10420  			*(uint16_t *)sta_data,
10421  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_DTIMINFOP_IDX,
10422  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_DTIMINFOP_BITS,
10423  			1);
10424  		/* sta control */
10425  		sta_data += 2;
10426  		sta_len_left -= 2;
10427  
10428  		/*
10429  		 * 1 Bytes for STA Info Length + 6 bytes for STA MAC Address +
10430  		 * 2 Bytes for Becon Interval + 2 Bytes for DTIM Info
10431  		 */
10432  		len = WLAN_ML_BV_LINFO_PERSTAPROF_STAINFO_LENGTH_SIZE +
10433  		      QDF_MAC_ADDR_SIZE + WLAN_BEACONINTERVAL_LEN +
10434  		      sizeof(struct wlan_ml_bv_linfo_perstaprof_stainfo_dtiminfo);
10435  		*sta_data = len;
10436  
10437  		/* STA Info Length */
10438  		sta_data += WLAN_ML_BV_LINFO_PERSTAPROF_STAINFO_LENGTH_SIZE;
10439  		sta_len_left -= WLAN_ML_BV_LINFO_PERSTAPROF_STAINFO_LENGTH_SIZE;
10440  
10441  		/*mac addr*/
10442  		qdf_mem_copy(sta_data, link_session->self_mac_addr,
10443  			     QDF_MAC_ADDR_SIZE);
10444  		sta_data += QDF_MAC_ADDR_SIZE;
10445  		sta_len_left -= QDF_MAC_ADDR_SIZE;
10446  		/* Beacon interval */
10447  		*(uint16_t *)sta_data =
10448  			link_session->beaconParams.beaconInterval;
10449  		sta_data += WLAN_BEACONINTERVAL_LEN;
10450  		sta_len_left -= WLAN_BEACONINTERVAL_LEN;
10451  		/* DTIM populated by FW */
10452  		sta_data += sizeof(
10453  			struct wlan_ml_bv_linfo_perstaprof_stainfo_dtiminfo);
10454  		sta_len_left -= sizeof(
10455  			struct wlan_ml_bv_linfo_perstaprof_stainfo_dtiminfo);
10456  		/* Capabilities */
10457  		dot11f_pack_ff_capabilities(mac_ctx, &link_ie->link_cap,
10458  					    sta_data);
10459  		sta_data += WLAN_CAPABILITYINFO_LEN;
10460  		sta_len_left -= WLAN_CAPABILITYINFO_LEN;
10461  		/* status */
10462  		sta_status.status = 0;
10463  		dot11f_pack_ff_status(mac_ctx, &sta_status, sta_data);
10464  		sta_data += WLAN_STATUSCODE_LEN;
10465  		sta_len_left -= WLAN_STATUSCODE_LEN;
10466  
10467  		qdf_mem_zero(non_inher_ie_lists, sizeof(non_inher_ie_lists));
10468  		qdf_mem_zero(non_inher_ext_ie_lists,
10469  			     sizeof(non_inher_ext_ie_lists));
10470  		qdf_mem_zero(&supp_rates, sizeof(tDot11fIESuppRates));
10471  		qdf_mem_zero(&ext_supp_rates, sizeof(tDot11fIEExtSuppRates));
10472  		qdf_mem_zero(&sta_p2p_assoc_res, sizeof(tDot11fIEP2PAssocRes));
10473  		qdf_mem_zero(&sta_non_inheritance,
10474  			     sizeof(tDot11fIEnon_inheritance));
10475  		non_inher_len = 0;
10476  		non_inher_ext_len = 0;
10477  
10478  		populate_dot11f_assoc_rsp_rates(
10479  			mac_ctx, &supp_rates,
10480  			&ext_supp_rates,
10481  			link_sta->supportedRates.llbRates,
10482  			link_sta->supportedRates.llaRates);
10483  		if ((supp_rates.present && frm->SuppRates.present &&
10484  		     qdf_mem_cmp(&supp_rates, &frm->SuppRates,
10485  				 sizeof(supp_rates))) ||
10486  		    (supp_rates.present && !frm->SuppRates.present)) {
10487  			sta_len_consumed = 0;
10488  			dot11f_pack_ie_supp_rates(mac_ctx, &supp_rates,
10489  						  sta_data,
10490  						  sta_len_left,
10491  						  &sta_len_consumed);
10492  			sta_data += sta_len_consumed;
10493  			sta_len_left -= sta_len_consumed;
10494  		} else if (frm->SuppRates.present && !supp_rates.present) {
10495  			non_inher_ie_lists[non_inher_len++] =
10496  				DOT11F_EID_SUPPRATES;
10497  		}
10498  
10499  		if (link_session->limQosEnabled && link_sta->lleEnabled) {
10500  			lle_mode = 1;
10501  			if ((link_ie->link_edca.present &&
10502  			     frm->EDCAParamSet.present &&
10503  			     qdf_mem_cmp(&link_ie->link_edca,
10504  					 &frm->EDCAParamSet,
10505  					 sizeof(link_ie->link_edca))) ||
10506  			    (link_ie->link_edca.present &&
10507  			     !frm->EDCAParamSet.present)) {
10508  				sta_len_consumed = 0;
10509  				dot11f_pack_ie_edca_param_set(
10510  					mac_ctx, &link_ie->link_edca,
10511  					sta_data, sta_len_left,
10512  					&sta_len_consumed);
10513  				sta_data += sta_len_consumed;
10514  				sta_len_left -= sta_len_consumed;
10515  			} else if (frm->EDCAParamSet.present &&
10516  				   !link_ie->link_edca.present) {
10517  				non_inher_ie_lists[non_inher_len++] =
10518  					DOT11F_EID_EDCAPARAMSET;
10519  			}
10520  		}
10521  
10522  		if ((link_ie->link_ht_cap.present && frm->HTCaps.present &&
10523  		     qdf_mem_cmp(&link_ie->link_ht_cap, &frm->HTCaps,
10524  				 sizeof(tDot11fIEHTCaps))) ||
10525  		    (link_ie->link_ht_cap.present && !frm->HTCaps.present)) {
10526  			sta_len_consumed = 0;
10527  			dot11f_pack_ie_ht_caps(
10528  				mac_ctx, &link_ie->link_ht_cap,
10529  				sta_data, sta_len_left, &sta_len_consumed);
10530  			sta_data += sta_len_consumed;
10531  			sta_len_left -= sta_len_consumed;
10532  		} else if (frm->HTCaps.present &&
10533  			   !link_ie->link_ht_cap.present) {
10534  			non_inher_ie_lists[non_inher_len++] = DOT11F_EID_HTCAPS;
10535  		}
10536  
10537  		if ((ext_supp_rates.present && frm->ExtSuppRates.present &&
10538  		     qdf_mem_cmp(&ext_supp_rates, &frm->ExtSuppRates,
10539  				 sizeof(ext_supp_rates))) ||
10540  		    (ext_supp_rates.present && !frm->ExtSuppRates.present)) {
10541  			sta_len_consumed = 0;
10542  			dot11f_pack_ie_ext_supp_rates(
10543  				mac_ctx, &ext_supp_rates, sta_data,
10544  				sta_len_left,
10545  				&sta_len_consumed);
10546  			sta_data += sta_len_consumed;
10547  			sta_len_left -= sta_len_consumed;
10548  		} else if (frm->SuppRates.present && !ext_supp_rates.present) {
10549  			non_inher_ie_lists[non_inher_len++] =
10550  				DOT11F_EID_EXTSUPPRATES;
10551  		}
10552  
10553  		if ((link_ie->link_ht_info.present && frm->HTInfo.present &&
10554  		     qdf_mem_cmp(&link_ie->link_ht_info, &frm->HTInfo,
10555  				 sizeof(tDot11fIEHTInfo))) ||
10556  		    (link_ie->link_ht_info.present && !frm->HTInfo.present)) {
10557  			sta_len_consumed = 0;
10558  			dot11f_pack_ie_ht_info(
10559  				mac_ctx, &link_ie->link_ht_info,
10560  				sta_data, sta_len_left,
10561  				&sta_len_consumed);
10562  			sta_data += sta_len_consumed;
10563  			sta_len_left -= sta_len_consumed;
10564  		} else if (frm->HTInfo.present &&
10565  			   !link_ie->link_ht_info.present) {
10566  			non_inher_ie_lists[non_inher_len++] = DOT11F_EID_HTINFO;
10567  		}
10568  
10569  		if ((link_ie->link_ext_cap.present && frm->ExtCap.present &&
10570  		     qdf_mem_cmp(&link_ie->link_ext_cap, &frm->ExtCap,
10571  				 sizeof(tDot11fIEExtCap))) ||
10572  		     (link_ie->link_ext_cap.present && !frm->ExtCap.present)) {
10573  			sta_len_consumed = 0;
10574  			dot11f_pack_ie_ext_cap(
10575  				mac_ctx, &link_ie->link_ext_cap,
10576  				sta_data, sta_len_left,
10577  				&sta_len_consumed);
10578  			sta_data += sta_len_consumed;
10579  			sta_len_left -= sta_len_consumed;
10580  		} else if (frm->ExtCap.present &&
10581  			   !link_ie->link_ext_cap.present) {
10582  			non_inher_ie_lists[non_inher_len++] = DOT11F_EID_EXTCAP;
10583  		}
10584  
10585  		if ((link_ie->link_vht_cap.present && frm->VHTCaps.present &&
10586  		     qdf_mem_cmp(&link_ie->link_vht_cap, &frm->VHTCaps,
10587  				 sizeof(frm->VHTCaps))) ||
10588  		    (link_ie->link_vht_cap.present && !frm->VHTCaps.present)) {
10589  			sta_len_consumed = 0;
10590  			dot11f_pack_ie_vht_caps(
10591  				mac_ctx, &link_ie->link_vht_cap,
10592  				sta_data, sta_len_left,
10593  				&sta_len_consumed);
10594  			sta_data += sta_len_consumed;
10595  			sta_len_left -= sta_len_consumed;
10596  		} else if (frm->VHTCaps.present &&
10597  			   !link_ie->link_vht_cap.present) {
10598  			non_inher_ie_lists[non_inher_len++] =
10599  				DOT11F_EID_VHTCAPS;
10600  		}
10601  
10602  		if ((link_ie->link_vht_op.present &&
10603  		     frm->VHTOperation.present &&
10604  		     qdf_mem_cmp(&link_ie->link_vht_op, &frm->VHTOperation,
10605  				 sizeof(tDot11fIEVHTOperation))) ||
10606  		    (link_ie->link_vht_op.present &&
10607  		     !frm->VHTOperation.present)) {
10608  			sta_len_consumed = 0;
10609  			dot11f_pack_ie_vht_operation(
10610  				mac_ctx, &link_ie->link_vht_op,
10611  				sta_data, sta_len_left,
10612  				&sta_len_consumed);
10613  			sta_data += sta_len_consumed;
10614  			sta_len_left -= sta_len_consumed;
10615  		} else if (frm->VHTOperation.present &&
10616  			   !link_ie->link_vht_op.present) {
10617  			non_inher_ie_lists[non_inher_len++] =
10618  				DOT11F_EID_VHTOPERATION;
10619  		}
10620  		/* Check every 221 EID whether it's the same with assoc link */
10621  		same_ie = false;
10622  		// P2PAssocRes is different or not
10623  		if (link_assoc_req)
10624  			reported_p2p_ie = limGetP2pIEPtr(
10625  						mac_ctx,
10626  						link_assoc_req->addIE.addIEdata,
10627  						link_assoc_req->addIE.length);
10628  		else
10629  			reported_p2p_ie = NULL;
10630  		if ((reported_p2p_ie && frm->P2PAssocRes.present) ||
10631  		    (!reported_p2p_ie && !frm->P2PAssocRes.present))
10632  			same_ie = true;
10633  		// vendor_vht_ie is different or not
10634  		reported_vendor_vht_ie_pres =
10635  			link_session->vhtCapability &&
10636  			link_session->vendor_vht_sap &&
10637  			link_assoc_req &&
10638  			link_assoc_req->vendor_vht_ie.VHTCaps.present;
10639  		if (same_ie && frm->vendor_vht_ie.VHTCaps.present &&
10640  		    reported_vendor_vht_ie_pres) {
10641  			if (qdf_mem_cmp(&link_ie->link_vht_cap,
10642  					&frm->vendor_vht_ie.VHTCaps,
10643  					sizeof(tDot11fIEVHTCaps)) ||
10644  			    qdf_mem_cmp(&link_ie->link_vht_op,
10645  					&frm->vendor_vht_ie.VHTOperation,
10646  					sizeof(tDot11fIEVHTOperation)))
10647  				same_ie = false;
10648  
10649  		} else if (same_ie && ((frm->vendor_vht_ie.VHTCaps.present &&
10650  					!reported_vendor_vht_ie_pres) ||
10651  				       (!frm->vendor_vht_ie.VHTCaps.present &&
10652  					reported_vendor_vht_ie_pres))) {
10653  			same_ie = false;
10654  		}
10655  		// qcn ie is different or not
10656  		if (same_ie && link_ie->link_qcn_ie.present &&
10657  		    frm->qcn_ie.present) {
10658  			if (qdf_mem_cmp(&link_ie->link_qcn_ie, &frm->qcn_ie,
10659  					sizeof(tDot11fIEqcn_ie)))
10660  				same_ie = false;
10661  		} else if (same_ie && ((link_ie->link_qcn_ie.present &&
10662  					!frm->qcn_ie.present) ||
10663  				       (!link_ie->link_qcn_ie.present &&
10664  					frm->qcn_ie.present))) {
10665  			same_ie = false;
10666  		}
10667  		/* wmm param and wmm caps are different or not*/
10668  		reported_wmm_caps_pres = false;
10669  		reported_wmm_param_pres = false;
10670  		if (!lle_mode && link_session->limWmeEnabled &&
10671  		    link_sta->wmeEnabled) {
10672  			if (link_ie->link_wmm_params.present)
10673  				reported_wmm_param_pres = true;
10674  
10675  			if (link_sta->wsmEnabled &&
10676  			    link_ie->link_wmm_caps.present)
10677  				reported_wmm_caps_pres = true;
10678  		}
10679  		if (same_ie && reported_wmm_param_pres &&
10680  		    frm->WMMParams.present) {
10681  			if (qdf_mem_cmp(&link_ie->link_wmm_params,
10682  					&frm->WMMParams,
10683  					sizeof(link_ie->link_wmm_params)))
10684  				same_ie = false;
10685  		} else if (same_ie && ((reported_wmm_param_pres &&
10686  					!frm->WMMParams.present) ||
10687  				       (!reported_wmm_param_pres &&
10688  					frm->WMMParams.present))) {
10689  			same_ie = false;
10690  		}
10691  		if (same_ie && reported_wmm_caps_pres &&
10692  		    frm->WMMCaps.present) {
10693  			if (qdf_mem_cmp(&link_ie->link_wmm_caps,
10694  					&frm->WMMCaps,
10695  					sizeof(link_ie->link_wmm_caps)))
10696  				same_ie = false;
10697  		} else if (same_ie && ((reported_wmm_caps_pres &&
10698  					!frm->WMMCaps.present) ||
10699  				       (!reported_wmm_caps_pres &&
10700  					frm->WMMCaps.present))) {
10701  			same_ie = false;
10702  		}
10703  		/*
10704  		 * Nothing need to do if all 221 ie in the reported assoc resp
10705  		 * are the same with reporting assoc resp.
10706  		 */
10707  		if (!same_ie) {
10708  			if (reported_p2p_ie && link_assoc_req) {
10709  				populate_dot11_assoc_res_p2p_ie(
10710  					mac_ctx,
10711  					&sta_p2p_assoc_res,
10712  					link_assoc_req);
10713  				sta_len_consumed = 0;
10714  				dot11f_pack_ie_p2_p_assoc_res(
10715  					mac_ctx, &sta_p2p_assoc_res,
10716  					sta_data, sta_len_left,
10717  					&sta_len_consumed);
10718  				sta_data += sta_len_consumed;
10719  				sta_len_left -= sta_len_consumed;
10720  			}
10721  			if (reported_vendor_vht_ie_pres) {
10722  				qdf_mem_zero(&vendor_vht_ie,
10723  					     sizeof(vendor_vht_ie));
10724  				vendor_vht_ie.present = 1;
10725  				vendor_vht_ie.sub_type =
10726  				link_session->vendor_specific_vht_ie_sub_type;
10727  				populate_dot11f_vht_caps(
10728  					mac_ctx, link_session,
10729  					&vendor_vht_ie.VHTCaps);
10730  				populate_dot11f_vht_operation(
10731  					mac_ctx, link_session,
10732  					&vendor_vht_ie.VHTOperation);
10733  
10734  				sta_len_consumed = 0;
10735  				dot11f_pack_ie_vendor_vht_ie(
10736  					mac_ctx, &vendor_vht_ie,
10737  					sta_data, sta_len_left,
10738  					&sta_len_consumed);
10739  				sta_data += sta_len_consumed;
10740  				sta_len_left -= sta_len_consumed;
10741  			}
10742  			sta_len_consumed = 0;
10743  			dot11f_pack_ie_qcn_ie(
10744  				mac_ctx, &link_ie->link_qcn_ie,
10745  				sta_data, sta_len_left,
10746  				&sta_len_consumed);
10747  			sta_data += sta_len_consumed;
10748  			sta_len_left -= sta_len_consumed;
10749  			if (reported_wmm_param_pres) {
10750  				sta_len_consumed = 0;
10751  				dot11f_pack_ie_wmm_params(
10752  					mac_ctx,
10753  					&link_ie->link_wmm_params,
10754  					sta_data, sta_len_left,
10755  					&sta_len_consumed);
10756  				sta_data += sta_len_consumed;
10757  				sta_len_left -= sta_len_consumed;
10758  			}
10759  			if (reported_wmm_caps_pres) {
10760  				sta_len_consumed = 0;
10761  				dot11f_pack_ie_wmm_caps(
10762  					mac_ctx,
10763  					&link_ie->link_wmm_caps,
10764  					sta_data, sta_len_left,
10765  					&sta_len_consumed);
10766  				sta_data += sta_len_consumed;
10767  				sta_len_left -= sta_len_consumed;
10768  			}
10769  			/*
10770  			 * if there is no 221 IE in partner link
10771  			 * while there is such IE in current link
10772  			 * include 221 in the non inheritance IE lists
10773  			 */
10774  			if (!reported_p2p_ie &&
10775  			    !link_ie->link_qcn_ie.present &&
10776  			    !reported_vendor_vht_ie_pres &&
10777  			    !reported_wmm_caps_pres && !reported_wmm_param_pres)
10778  				non_inher_ie_lists[non_inher_len++] =
10779  				DOT11F_EID_QCN_IE;
10780  		}
10781  
10782  		if ((link_ie->link_he_cap.present && frm->he_cap.present &&
10783  		     qdf_mem_cmp(&link_ie->link_he_cap, &frm->he_cap,
10784  				 sizeof(frm->he_cap))) ||
10785  		    (link_ie->link_he_cap.present && !frm->he_cap.present)) {
10786  			sta_len_consumed = 0;
10787  			dot11f_pack_ie_he_cap(
10788  				mac_ctx, &link_ie->link_he_cap,
10789  				sta_data, sta_len_left,
10790  				&sta_len_consumed);
10791  			sta_data += sta_len_consumed;
10792  			sta_len_left -= sta_len_consumed;
10793  		} else if (frm->he_cap.present &&
10794  			   !link_ie->link_he_cap.present) {
10795  			non_inher_ext_ie_lists[non_inher_ext_len++] =
10796  				WLAN_EXTN_ELEMID_HECAP;
10797  		}
10798  
10799  		if ((link_ie->link_he_op.present && frm->he_op.present &&
10800  		     qdf_mem_cmp(&link_ie->link_he_op, &frm->he_op,
10801  				 sizeof(tDot11fIEhe_op))) ||
10802  		    (link_ie->link_he_op.present && !frm->he_op.present)) {
10803  			sta_len_consumed = 0;
10804  			dot11f_pack_ie_he_op(
10805  				mac_ctx, &link_ie->link_he_op,
10806  				sta_data, sta_len_left,
10807  				&sta_len_consumed);
10808  			sta_data += sta_len_consumed;
10809  			sta_len_left -= sta_len_consumed;
10810  		} else if (frm->he_op.present && !link_ie->link_he_op.present) {
10811  			non_inher_ext_ie_lists[non_inher_ext_len++] =
10812  				WLAN_EXTN_ELEMID_HEOP;
10813  		}
10814  		if ((link_ie->link_he_6ghz_band_cap.present &&
10815  		     frm->he_6ghz_band_cap.present &&
10816  		     qdf_mem_cmp(&link_ie->link_he_6ghz_band_cap,
10817  				 &frm->he_6ghz_band_cap,
10818  				 sizeof(tDot11fIEhe_6ghz_band_cap))) ||
10819  		    (link_ie->link_he_6ghz_band_cap.present &&
10820  		     !frm->he_6ghz_band_cap.present)) {
10821  			sta_len_consumed = 0;
10822  			dot11f_pack_ie_he_6ghz_band_cap(
10823  				mac_ctx, &link_ie->link_he_6ghz_band_cap,
10824  				sta_data, sta_len_left,
10825  				&sta_len_consumed);
10826  			sta_data += sta_len_consumed;
10827  			sta_len_left -= sta_len_consumed;
10828  		} else if (frm->he_6ghz_band_cap.present &&
10829  			   !link_ie->link_he_6ghz_band_cap.present) {
10830  			non_inher_ext_ie_lists[non_inher_ext_len++] =
10831  				WLAN_EXTN_ELEMID_HE_6G_CAP;
10832  		}
10833  		if ((link_ie->link_eht_op.present && frm->eht_op.present &&
10834  		     qdf_mem_cmp(&link_ie->link_eht_op, &frm->eht_op,
10835  				 sizeof(tDot11fIEeht_op))) ||
10836  		    (link_ie->link_eht_op.present && !frm->eht_op.present)) {
10837  			sta_len_consumed = 0;
10838  			dot11f_pack_ie_eht_op(
10839  				mac_ctx, &link_ie->link_eht_op,
10840  				sta_data, sta_len_left,
10841  				&sta_len_consumed);
10842  			sta_data += sta_len_consumed;
10843  			sta_len_left -= sta_len_consumed;
10844  		} else if (frm->eht_op.present &&
10845  			   !link_ie->link_eht_op.present) {
10846  			non_inher_ext_ie_lists[non_inher_ext_len++] =
10847  				WLAN_EXTN_ELEMID_EHTOP;
10848  		}
10849  		if ((link_ie->link_eht_cap.present && frm->eht_cap.present &&
10850  		     qdf_mem_cmp(&link_ie->link_eht_cap, &frm->eht_cap,
10851  				 sizeof(frm->eht_cap))) ||
10852  		    (link_ie->link_eht_cap.present && !frm->eht_cap.present)) {
10853  			sta_len_consumed = 0;
10854  			dot11f_pack_ie_eht_cap(
10855  				mac_ctx, &link_ie->link_eht_cap,
10856  				sta_data, sta_len_left,
10857  				&sta_len_consumed);
10858  			sta_data += sta_len_consumed;
10859  			sta_len_left -= sta_len_consumed;
10860  		} else if (frm->eht_cap.present &&
10861  			   !link_ie->link_eht_cap.present) {
10862  			non_inher_ext_ie_lists[non_inher_ext_len++] =
10863  				WLAN_EXTN_ELEMID_EHTCAP;
10864  		}
10865  		populate_dot11f_non_inheritance(mac_ctx, &sta_non_inheritance,
10866  						non_inher_ie_lists,
10867  						non_inher_ext_ie_lists,
10868  						non_inher_len,
10869  						non_inher_ext_len);
10870  		if (sta_non_inheritance.present) {
10871  			sta_len_consumed = 0;
10872  			dot11f_pack_ie_non_inheritance(
10873  				mac_ctx, &sta_non_inheritance,
10874  				sta_data, sta_len_left,
10875  				&sta_len_consumed);
10876  			sta_data += sta_len_consumed;
10877  			sta_len_left -= sta_len_consumed;
10878  		}
10879  		sta_pro->num_data = sta_data - sta_pro->data;
10880  		if (sta_pro->num_data > WLAN_MAX_IE_LEN + MIN_IE_LEN) {
10881  			sta_pro->data[TAG_LEN_POS] = WLAN_MAX_IE_LEN;
10882  			status =
10883  			    lim_add_frag_ie_for_sta_profile(sta_pro->data,
10884  							    &sta_pro->num_data);
10885  			if (status != QDF_STATUS_SUCCESS) {
10886  				pe_debug("add frg ie for sta profile error.");
10887  				sta_pro->num_data =
10888  					WLAN_MAX_IE_LEN + MIN_IE_LEN;
10889  			}
10890  		} else {
10891  			sta_pro->data[TAG_LEN_POS] =
10892  					sta_pro->num_data - MIN_IE_LEN;
10893  		}
10894  		lim_mlo_release_vdev_ref(link_session->vdev);
10895  		num_sta_pro++;
10896  	}
10897  
10898  no_partner:
10899  	mlo_ie->num_sta_profile = num_sta_pro;
10900  	mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num = num_sta_pro;
10901  	return QDF_STATUS_SUCCESS;
10902  }
10903  
10904  QDF_STATUS populate_dot11f_bcn_mlo_ie(struct mac_context *mac_ctx,
10905  				      struct pe_session *session)
10906  {
10907  	int link;
10908  	int num_sta_pro = 0;
10909  	struct wlan_mlo_ie *mlo_ie;
10910  	struct wlan_mlo_sta_profile *sta_pro;
10911  	struct mlo_link_ie *link_ie;
10912  	uint16_t vdev_count;
10913  	struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS];
10914  	struct pe_session *link_session;
10915  	uint16_t tmp_offset = 0;
10916  	struct ml_sch_partner_info *tmp_info;
10917  	struct mlo_sch_partner_links *sch_info;
10918  	uint8_t *sta_data;
10919  	uint32_t sta_len_left;
10920  	uint32_t sta_len_consumed;
10921  	uint8_t common_info_length = 0;
10922  	uint8_t *p_ml_ie;
10923  	uint16_t len_remaining;
10924  	uint16_t presence_bitmap = 0;
10925  	bool sta_pro_present;
10926  	QDF_STATUS status;
10927  
10928  	if (!mac_ctx || !session)
10929  		return QDF_STATUS_E_NULL_VALUE;
10930  
10931  	mlo_ie = &session->mlo_ie;
10932  
10933  	/* Common Info Length */
10934  	common_info_length += WLAN_ML_BV_CINFO_LENGTH_SIZE;
10935  	qdf_mem_zero(&mac_ctx->sch.sch_mlo_partner,
10936  		     sizeof(mac_ctx->sch.sch_mlo_partner));
10937  	sch_info = &mac_ctx->sch.sch_mlo_partner;
10938  	mlo_ie->type = 0;
10939  	tmp_offset += 1; /* Element ID */
10940  	tmp_offset += 1; /* length */
10941  	tmp_offset += 1; /* Element ID extension */
10942  	tmp_offset += 2; /* Multi-link control */
10943  	qdf_mem_copy(mlo_ie->mld_mac_addr,
10944  		     session->vdev->mlo_dev_ctx->mld_addr.bytes,
10945  		     sizeof(mlo_ie->mld_mac_addr));
10946  	tmp_offset += 1; /* Common Info Length */
10947  	tmp_offset += 6; /* mld mac addr */
10948  	common_info_length += QDF_MAC_ADDR_SIZE;
10949  	mlo_ie->link_id_info_present = 1;
10950  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_LINKIDINFO_P;
10951  	mlo_ie->link_id = wlan_vdev_get_link_id(session->vdev);
10952  	tmp_offset += 1; /* link id */
10953  	common_info_length += WLAN_ML_BV_CINFO_LINKIDINFO_SIZE;
10954  	mlo_ie->bss_param_change_cnt_present = 1;
10955  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P;
10956  	mlo_ie->bss_param_change_count =
10957  			session->mlo_link_info.link_ie.bss_param_change_cnt;
10958  	tmp_offset += 1; /* bss parameters change count */
10959  	common_info_length += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
10960  	mlo_ie->mld_capab_and_op_present = 0;
10961  	mlo_ie->mld_id_present = 0;
10962  	mlo_ie->ext_mld_capab_and_op_present = 0;
10963  	sch_info->num_links = 0;
10964  
10965  	lim_get_mlo_vdev_list(session, &vdev_count, wlan_vdev_list);
10966  	mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num =
10967  							vdev_count - 1;
10968  
10969  	mlo_ie->common_info_length = common_info_length;
10970  	sch_info->mlo_ie_link_info_ofst = tmp_offset;
10971  
10972  	p_ml_ie = mlo_ie->data;
10973  	len_remaining = sizeof(mlo_ie->data);
10974  
10975  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
10976  	len_remaining--;
10977  	*p_ml_ie++ = 0;
10978  	len_remaining--;
10979  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
10980  	len_remaining--;
10981  
10982  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
10983  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
10984  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
10985  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
10986  	p_ml_ie += WLAN_ML_CTRL_SIZE;
10987  	len_remaining -= WLAN_ML_CTRL_SIZE;
10988  
10989  	*p_ml_ie++ = common_info_length;
10990  	len_remaining--;
10991  
10992  	qdf_mem_copy(p_ml_ie, mlo_ie->mld_mac_addr, QDF_MAC_ADDR_SIZE);
10993  	p_ml_ie += QDF_MAC_ADDR_SIZE;
10994  	len_remaining -= QDF_MAC_ADDR_SIZE;
10995  
10996  	QDF_SET_BITS(*p_ml_ie, WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_IDX,
10997  		     WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_BITS,
10998  		     mlo_ie->link_id);
10999  	p_ml_ie++;
11000  	len_remaining--;
11001  
11002  	*p_ml_ie++ = mlo_ie->bss_param_change_count;
11003  	len_remaining--;
11004  
11005  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
11006  
11007  	for (link = 0; link < vdev_count; link++) {
11008  		if (!wlan_vdev_list[link])
11009  			continue;
11010  		if (wlan_vdev_list[link] == session->vdev) {
11011  			lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11012  			continue;
11013  		}
11014  		if (!wlan_vdev_mlme_is_mlo_ap(wlan_vdev_list[link])) {
11015  			lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11016  			continue;
11017  		}
11018  		link_session = pe_find_session_by_vdev_id(
11019  			mac_ctx, wlan_vdev_list[link]->vdev_objmgr.vdev_id);
11020  		if (!link_session) {
11021  			lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11022  			continue;
11023  		}
11024  		sta_pro = &mlo_ie->sta_profile[num_sta_pro];
11025  		link_ie = &link_session->mlo_link_info.link_ie;
11026  		tmp_info = &sch_info->partner_info[sch_info->num_links++];
11027  		tmp_info->vdev_id = wlan_vdev_get_id(wlan_vdev_list[link]);
11028  		tmp_info->beacon_interval =
11029  			link_session->beaconParams.beaconInterval;
11030  		sta_pro_present = false;
11031  		sta_data = sta_pro->data;
11032  		sta_len_left = sizeof(sta_pro->data);
11033  		*sta_data++ = WLAN_ML_LINFO_SUBELEMID_PERSTAPROFILE;
11034  		*sta_data++ = 0;
11035  		sta_data += 2; /* sta control */
11036  		sta_len_left -= 4;
11037  		tmp_offset = 1; /* sub element id */
11038  		tmp_offset += 1; /* length */
11039  		if (link_ie->link_csa.present) {
11040  			sta_len_consumed = 0;
11041  			dot11f_pack_ie_chan_switch_ann(mac_ctx,
11042  						       &link_ie->link_csa,
11043  						       sta_data, sta_len_left,
11044  						       &sta_len_consumed);
11045  			sta_data += sta_len_consumed;
11046  			sta_len_left -= sta_len_consumed;
11047  			sta_pro_present = true;
11048  			tmp_info->csa_ext_csa_exist = true;
11049  		}
11050  		if (link_ie->link_ecsa.present) {
11051  			sta_len_consumed = 0;
11052  			dot11f_pack_ie_ext_chan_switch_ann(mac_ctx,
11053  							   &link_ie->link_ecsa,
11054  							   sta_data,
11055  							   sta_len_left,
11056  							   &sta_len_consumed);
11057  			sta_data += sta_len_consumed;
11058  			sta_len_left -= sta_len_consumed;
11059  			sta_pro_present = true;
11060  			tmp_info->csa_ext_csa_exist = true;
11061  		}
11062  		if (link_ie->link_quiet.present) {
11063  			sta_len_consumed = 0;
11064  			dot11f_pack_ie_quiet(mac_ctx, &link_ie->link_quiet,
11065  					     sta_data, sta_len_left,
11066  					     &sta_len_consumed);
11067  			sta_data += sta_len_consumed;
11068  			sta_len_left -= sta_len_consumed;
11069  			sta_pro_present = true;
11070  		}
11071  		if (link_ie->link_swt_time.present) {
11072  			sta_len_consumed = 0;
11073  			dot11f_pack_ie_max_chan_switch_time(
11074  				mac_ctx, &link_ie->link_swt_time, sta_data,
11075  				sta_len_left, &sta_len_consumed);
11076  			sta_data += sta_len_consumed;
11077  			sta_len_left -= sta_len_consumed;
11078  			sta_pro_present = true;
11079  		}
11080  		if (sta_pro_present) {
11081  			sta_pro->num_data = sta_data - sta_pro->data;
11082  			if (sta_pro->num_data > WLAN_MAX_IE_LEN + MIN_IE_LEN) {
11083  				sta_pro->data[TAG_LEN_POS] = WLAN_MAX_IE_LEN;
11084  				status =
11085  				  lim_add_frag_ie_for_sta_profile(sta_pro->data,
11086  							    &sta_pro->num_data);
11087  				if (status != QDF_STATUS_SUCCESS) {
11088  					pe_debug("STA profile flag error");
11089  					sta_pro->num_data =
11090  						  WLAN_MAX_IE_LEN + MIN_IE_LEN;
11091  				}
11092  			} else {
11093  				sta_pro->data[TAG_LEN_POS] =
11094  						sta_pro->num_data - MIN_IE_LEN;
11095  			}
11096  			QDF_SET_BITS(
11097  				*(uint16_t *)(sta_pro->data + MIN_IE_LEN),
11098  				WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_IDX,
11099  				WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_BITS,
11100  				wlan_vdev_get_link_id(link_session->vdev));
11101  
11102  			num_sta_pro++;
11103  			tmp_offset += 2; /* sta control */
11104  			tmp_info->link_info_sta_prof_ofst = tmp_offset;
11105  		}
11106  		lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11107  	}
11108  	mlo_ie->num_sta_profile = num_sta_pro;
11109  
11110  	return QDF_STATUS_SUCCESS;
11111  }
11112  #endif
11113  
11114  QDF_STATUS populate_dot11f_tdls_mgmt_mlo_ie(struct mac_context *mac_ctx,
11115  					    struct pe_session *session)
11116  {
11117  	struct wlan_mlo_ie *mlo_ie;
11118  	uint8_t *p_ml_ie;
11119  	uint16_t len_remaining;
11120  	uint16_t presence_bitmap = 0;
11121  	uint8_t common_info_length = 0;
11122  
11123  	if (!mac_ctx || !session)
11124  		return QDF_STATUS_E_NULL_VALUE;
11125  
11126  	mlo_ie = &session->mlo_ie;
11127  
11128  	p_ml_ie = mlo_ie->data;
11129  	len_remaining = sizeof(mlo_ie->data);
11130  
11131  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
11132  	len_remaining--;
11133  	*p_ml_ie++ = 0;
11134  	len_remaining--;
11135  
11136  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
11137  	len_remaining--;
11138  
11139  	common_info_length += WLAN_ML_BV_CINFO_LENGTH_SIZE;
11140  	presence_bitmap |= WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P;
11141  	common_info_length += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
11142  
11143  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
11144  		     WLAN_ML_CTRL_TYPE_BITS, WLAN_ML_VARIANT_TDLS);
11145  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
11146  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
11147  
11148  	p_ml_ie += WLAN_ML_CTRL_SIZE;
11149  	len_remaining -= WLAN_ML_CTRL_SIZE;
11150  
11151  	*p_ml_ie++ = common_info_length;
11152  	len_remaining--;
11153  
11154  	qdf_mem_copy(p_ml_ie, session->vdev->mlo_dev_ctx->mld_addr.bytes,
11155  		     QDF_MAC_ADDR_SIZE);
11156  
11157  	p_ml_ie += QDF_MAC_ADDR_SIZE;
11158  	len_remaining -= QDF_MAC_ADDR_SIZE;
11159  
11160  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
11161  
11162  	return QDF_STATUS_SUCCESS;
11163  }
11164  
11165  #if defined (SAP_MULTI_LINK_EMULATION)
11166  static void populate_2link_rnr_info(struct pe_session *session,
11167  				    tDot11fIEreduced_neighbor_report *dot11f)
11168  {
11169  	tSirMacAddr fake_mac_addr;
11170  
11171  	qdf_mem_copy(fake_mac_addr, session->self_mac_addr, sizeof(tSirMacAddr));
11172  
11173  	pe_debug(QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(fake_mac_addr));
11174  
11175  	dot11f->present = 1;
11176  	dot11f->op_class = 131;
11177  	dot11f->channel_num = 37;
11178  
11179  	dot11f->tbtt_info_count = 0;
11180  	dot11f->tbtt_info_len = 16;
11181  
11182  	fake_mac_addr[4] = 0xaf;
11183  	fake_mac_addr[5] = 0x62;
11184  	qdf_mem_copy(dot11f->tbtt_info.tbtt_info_16.bssid,
11185  		     fake_mac_addr, sizeof(tSirMacAddr));
11186  	dot11f->tbtt_info.tbtt_info_16.mld_id = 0;
11187  	dot11f->tbtt_info.tbtt_info_16.link_id = 1;
11188  
11189  	dot11f->tbtt_info.tbtt_info_16.bss_params = 0x4e;
11190  	dot11f->tbtt_info.tbtt_info_16.short_ssid = 0x558df58e;
11191  	dot11f->tbtt_info.tbtt_info_16.psd_20mhz = 0xfe;
11192  
11193  	dot11f->tbtt_info.tbtt_info_16.bss_param_change_cnt =
11194  		session->mlo_link_info.link_ie.bss_param_change_cnt;
11195  
11196  	pe_debug("Populated rnr IE...");
11197  }
11198  #else
11199  static inline void populate_2link_rnr_info(struct pe_session *session,
11200  					   tDot11fIEreduced_neighbor_report *dot11f)
11201  {
11202  }
11203  #endif
11204  
11205  void populate_dot11f_mlo_rnr(struct mac_context *mac_ctx,
11206  			     struct pe_session *session,
11207  			     tDot11fIEreduced_neighbor_report *dot11f)
11208  {
11209  	int link;
11210  	uint16_t vdev_count;
11211  	struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS];
11212  	struct pe_session *link_session;
11213  	bool rnr_populated = false;
11214  
11215  	lim_get_mlo_vdev_list(session, &vdev_count, wlan_vdev_list);
11216  	for (link = 0; link < vdev_count; link++) {
11217  		if (!wlan_vdev_list[link])
11218  			continue;
11219  		if (wlan_vdev_list[link] == session->vdev) {
11220  			lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11221  			continue;
11222  		}
11223  		if (!wlan_vdev_mlme_is_mlo_ap(wlan_vdev_list[link])) {
11224  			lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11225  			continue;
11226  		}
11227  		link_session = pe_find_session_by_vdev_id(
11228  			mac_ctx, wlan_vdev_get_id(wlan_vdev_list[link]));
11229  		if (!link_session) {
11230  			pe_debug("vdev id %d pe session is not created",
11231  				 wlan_vdev_get_id(wlan_vdev_list[link]));
11232  			lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11233  			continue;
11234  		}
11235  		if (!rnr_populated) {
11236  			populate_dot11f_rnr_tbtt_info_16(mac_ctx, session,
11237  							 link_session, dot11f);
11238  			pe_debug("mlo vdev id %d populate vdev id %d link id %d op class %d chan num %d in RNR IE",
11239  				 wlan_vdev_get_id(session->vdev),
11240  				 wlan_vdev_get_id(wlan_vdev_list[link]),
11241  				 dot11f->tbtt_info.tbtt_info_16.link_id,
11242  				 dot11f->op_class, dot11f->channel_num);
11243  			rnr_populated = true;
11244  		}
11245  		lim_mlo_release_vdev_ref(wlan_vdev_list[link]);
11246  	}
11247  
11248  	populate_2link_rnr_info(session, dot11f);
11249  
11250  }
11251  
11252  void populate_dot11f_rnr_tbtt_info_16(struct mac_context *mac_ctx,
11253  				      struct pe_session *pe_session,
11254  				      struct pe_session *rnr_session,
11255  				      tDot11fIEreduced_neighbor_report *dot11f)
11256  {
11257  	uint8_t reg_class;
11258  	uint8_t ch_offset;
11259  
11260  	dot11f->present = 1;
11261  	dot11f->tbtt_type = 0;
11262  	if (rnr_session->ch_width == CH_WIDTH_80MHZ) {
11263  		ch_offset = BW80;
11264  	} else {
11265  		switch (rnr_session->htSecondaryChannelOffset) {
11266  		case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
11267  			ch_offset = BW40_HIGH_PRIMARY;
11268  			break;
11269  		case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
11270  			ch_offset = BW40_LOW_PRIMARY;
11271  			break;
11272  		default:
11273  			ch_offset = BW20;
11274  			break;
11275  		}
11276  	}
11277  
11278  	reg_class = lim_op_class_from_bandwidth(mac_ctx,
11279  						rnr_session->curr_op_freq,
11280  						rnr_session->ch_width,
11281  						ch_offset);
11282  
11283  	dot11f->op_class = reg_class;
11284  	dot11f->channel_num = wlan_reg_freq_to_chan(mac_ctx->pdev,
11285  						    rnr_session->curr_op_freq);
11286  	dot11f->tbtt_info_count = 0;
11287  	dot11f->tbtt_info_len = 16;
11288  	qdf_mem_copy(dot11f->tbtt_info.tbtt_info_16.bssid,
11289  		     rnr_session->self_mac_addr, sizeof(tSirMacAddr));
11290  	dot11f->tbtt_info.tbtt_info_16.mld_id = 0;
11291  	dot11f->tbtt_info.tbtt_info_16.link_id = wlan_vdev_get_link_id(
11292  							rnr_session->vdev);
11293  	dot11f->tbtt_info.tbtt_info_16.bss_param_change_cnt =
11294  		rnr_session->mlo_link_info.link_ie.bss_param_change_cnt;
11295  }
11296  
11297  QDF_STATUS
11298  populate_dot11f_mlo_caps(struct mac_context *mac_ctx,
11299  			 struct pe_session *session,
11300  			 struct wlan_mlo_ie *mlo_ie)
11301  {
11302  	uint8_t *mld_addr;
11303  	uint8_t common_info_len = 0;
11304  
11305  	mlo_ie->type = 0;
11306  	/* Common Info Length */
11307  	common_info_len += WLAN_ML_BV_CINFO_LENGTH_SIZE;
11308  	mld_addr = wlan_vdev_mlme_get_mldaddr(session->vdev);
11309  	qdf_mem_copy(&mlo_ie->mld_mac_addr, mld_addr,
11310  		     sizeof(mlo_ie->mld_mac_addr));
11311  	common_info_len += QDF_MAC_ADDR_SIZE;
11312  	mlo_ie->link_id_info_present = 0;
11313  
11314  	mlo_ie->bss_param_change_cnt_present = 0;
11315  	mlo_ie->medium_sync_delay_info_present = 0;
11316  
11317  	if (wlan_vdev_mlme_cap_get(session->vdev, WLAN_VDEV_C_EMLSR_CAP)) {
11318  		mlo_ie->eml_capab_present = 1;
11319  		mlo_ie->eml_capabilities_info.emlmr_support = 0;
11320  		mlo_ie->eml_capabilities_info.emlsr_support = 1;
11321  		common_info_len += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
11322  	} else {
11323  		mlo_ie->eml_capab_present = 0;
11324  	}
11325  
11326  	common_info_len += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
11327  	mlo_ie->ext_mld_capab_and_op_present = 0;
11328  	mlo_ie->mld_id_present = 0;
11329  	mlo_ie->mld_capab_and_op_present = 1;
11330  	mlo_ie->mld_capab_and_op_info.tid_link_map_supported =
11331  		wlan_mlme_get_t2lm_negotiation_supported(mac_ctx->psoc);
11332  	mlo_ie->reserved = 0;
11333  	mlo_ie->reserved_1 = 0;
11334  	mlo_ie->common_info_length = common_info_len;
11335  
11336  	return QDF_STATUS_SUCCESS;
11337  }
11338  
11339  QDF_STATUS
11340  sir_convert_mlo_probe_rsp_frame2_struct(uint8_t *ml_ie,
11341  					uint32_t ml_ie_total_len,
11342  					struct sir_multi_link_ie *mlo_ie_ptr)
11343  {
11344  	bool link_id_found;
11345  	uint8_t link_id;
11346  	bool bss_param_change_cnt_found;
11347  	uint8_t bss_param_change_cnt;
11348  	struct qdf_mac_addr mld_mac_addr;
11349  	uint8_t *sta_prof;
11350  
11351  	if (!ml_ie)
11352  		return QDF_STATUS_E_NULL_VALUE;
11353  
11354  	if (!ml_ie_total_len)
11355  		return QDF_STATUS_E_NULL_VALUE;
11356  
11357  	qdf_mem_zero((uint8_t *)mlo_ie_ptr, sizeof(*mlo_ie_ptr));
11358  
11359  	util_get_mlie_common_info_len(ml_ie, ml_ie_total_len,
11360  				      &mlo_ie_ptr->mlo_ie.common_info_length);
11361  
11362  	sta_prof = ml_ie + sizeof(struct wlan_ie_multilink) +
11363  		   mlo_ie_ptr->mlo_ie.common_info_length;
11364  	lim_store_mlo_ie_raw_info(ml_ie, sta_prof,
11365  				  ml_ie_total_len, &mlo_ie_ptr->mlo_ie);
11366  
11367  	util_get_bvmlie_mldmacaddr(ml_ie, ml_ie_total_len, &mld_mac_addr);
11368  	qdf_mem_copy(mlo_ie_ptr->mlo_ie.mld_mac_addr, mld_mac_addr.bytes,
11369  		     QDF_MAC_ADDR_SIZE);
11370  
11371  	util_get_bvmlie_primary_linkid(ml_ie, ml_ie_total_len,
11372  				       &link_id_found, &link_id);
11373  	mlo_ie_ptr->mlo_ie.link_id_info_present = link_id_found;
11374  	mlo_ie_ptr->mlo_ie.link_id = link_id;
11375  
11376  	util_get_bvmlie_bssparamchangecnt(ml_ie, ml_ie_total_len,
11377  					  &bss_param_change_cnt_found,
11378  					  &bss_param_change_cnt);
11379  	mlo_ie_ptr->mlo_ie.bss_param_change_cnt_present =
11380  						bss_param_change_cnt_found;
11381  	mlo_ie_ptr->mlo_ie.bss_param_change_count = bss_param_change_cnt;
11382  	mlo_ie_ptr->mlo_ie_present = true;
11383  
11384  	return QDF_STATUS_SUCCESS;
11385  }
11386  #endif
11387  
11388  #if defined(WLAN_FEATURE_11AX) && defined(WLAN_SUPPORT_TWT)
11389  QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx,
11390  					     struct pe_session *pe_session,
11391  					     tDot11fIEExtCap *dot11f)
11392  {
11393  	struct s_ext_cap *p_ext_cap;
11394  	bool twt_responder = false;
11395  	bool twt_requestor = false;
11396  
11397  	if (pe_session->opmode == QDF_STA_MODE &&
11398  	    !pe_session->enable_session_twt_support) {
11399  		return QDF_STATUS_SUCCESS;
11400  	}
11401  
11402  	dot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
11403  	p_ext_cap = (struct s_ext_cap *)dot11f->bytes;
11404  	dot11f->present = 1;
11405  
11406  	if (pe_session->opmode == QDF_STA_MODE) {
11407  		wlan_twt_get_requestor_cfg(mac_ctx->psoc, &twt_requestor);
11408  		p_ext_cap->twt_requestor_support =
11409  			twt_requestor && twt_get_requestor_flag(mac_ctx);
11410  	}
11411  
11412  	if (pe_session->opmode == QDF_SAP_MODE) {
11413  		wlan_twt_get_responder_cfg(mac_ctx->psoc, &twt_responder);
11414  		p_ext_cap->twt_responder_support =
11415  			twt_responder && twt_get_responder_flag(mac_ctx);
11416  	}
11417  
11418  	dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f);
11419  	if (!dot11f->num_bytes) {
11420  		dot11f->present = 0;
11421  		pe_debug("ext ie length become 0, disable the ext caps");
11422  	}
11423  
11424  	return QDF_STATUS_SUCCESS;
11425  }
11426  #endif
11427  
11428  #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
11429  /**
11430   * wlan_fill_single_pmk_ap_cap_from_scan_entry() - WAP3_SPMK VSIE from scan
11431   * entry
11432   * @mac_ctx: pointer to mac_context
11433   * @bss_desc: BSS Descriptor
11434   * @scan_entry: scan entry
11435   *
11436   * Return: None
11437   */
11438  static void
11439  wlan_fill_single_pmk_ap_cap_from_scan_entry(struct mac_context *mac_ctx,
11440  					    struct bss_description *bss_desc,
11441  					    struct scan_cache_entry *scan_entry)
11442  {
11443  	bss_desc->is_single_pmk =
11444  		util_scan_entry_single_pmk(mac_ctx->psoc, scan_entry) &&
11445  		mac_ctx->mlme_cfg->lfr.sae_single_pmk_feature_enabled;
11446  }
11447  #else
11448  static inline void
11449  wlan_fill_single_pmk_ap_cap_from_scan_entry(struct mac_context *mac_ctx,
11450  					    struct bss_description *bss_desc,
11451  					    struct scan_cache_entry *scan_entry)
11452  {
11453  }
11454  #endif
11455  
11456  QDF_STATUS wlan_parse_bss_description_ies(struct mac_context *mac_ctx,
11457  					  struct bss_description *bss_desc,
11458  					  tDot11fBeaconIEs *ie_struct)
11459  {
11460  	int ie_len = wlan_get_ielen_from_bss_description(bss_desc);
11461  	QDF_STATUS status;
11462  
11463  	if (ie_len <= 0 || !ie_struct) {
11464  		pe_err("BSS description has invalid IE : %d", ie_len);
11465  		return QDF_STATUS_E_FAILURE;
11466  	}
11467  	if (DOT11F_FAILED(dot11f_unpack_beacon_i_es
11468  			  (mac_ctx, (uint8_t *)bss_desc->ieFields,
11469  			  ie_len, ie_struct, false))) {
11470  		pe_err("Beacon IE parsing failed");
11471  		return QDF_STATUS_E_FAILURE;
11472  	}
11473  
11474  	status = lim_strip_and_decode_eht_op((uint8_t *)bss_desc->ieFields,
11475  					     ie_len, &ie_struct->eht_op,
11476  					     ie_struct->VHTOperation,
11477  					     ie_struct->he_op,
11478  					     ie_struct->HTInfo);
11479  	if (status != QDF_STATUS_SUCCESS) {
11480  		pe_err("Failed to extract eht op");
11481  		return QDF_STATUS_E_FAILURE;
11482  	}
11483  
11484  	status = lim_strip_and_decode_eht_cap((uint8_t *)bss_desc->ieFields,
11485  					      ie_len, &ie_struct->eht_cap,
11486  					      ie_struct->he_cap,
11487  					      bss_desc->chan_freq);
11488  	if (status != QDF_STATUS_SUCCESS) {
11489  		pe_err("Failed to extract eht cap");
11490  		return QDF_STATUS_E_FAILURE;
11491  	}
11492  
11493  	return QDF_STATUS_SUCCESS;
11494  }
11495  
11496  QDF_STATUS
11497  wlan_get_parsed_bss_description_ies(struct mac_context *mac_ctx,
11498  				    struct bss_description *bss_desc,
11499  				    tDot11fBeaconIEs **ie_struct)
11500  {
11501  	QDF_STATUS status;
11502  
11503  	if (!bss_desc || !ie_struct)
11504  		return QDF_STATUS_E_INVAL;
11505  
11506  	*ie_struct = qdf_mem_malloc(sizeof(tDot11fBeaconIEs));
11507  	if (!*ie_struct)
11508  		return QDF_STATUS_E_NOMEM;
11509  
11510  	status = wlan_parse_bss_description_ies(mac_ctx, bss_desc,
11511  					        *ie_struct);
11512  	if (QDF_IS_STATUS_ERROR(status)) {
11513  		qdf_mem_free(*ie_struct);
11514  		*ie_struct = NULL;
11515  	}
11516  
11517  	return status;
11518  }
11519  
11520  void
11521  wlan_populate_basic_rates(tSirMacRateSet *rate_set, bool is_ofdm_rates,
11522  			  bool is_basic_rates)
11523  {
11524  	uint8_t ofdm_rates[8] = {
11525  		SIR_MAC_RATE_6,
11526  		SIR_MAC_RATE_9,
11527  		SIR_MAC_RATE_12,
11528  		SIR_MAC_RATE_18,
11529  		SIR_MAC_RATE_24,
11530  		SIR_MAC_RATE_36,
11531  		SIR_MAC_RATE_48,
11532  		SIR_MAC_RATE_54
11533  	};
11534  	uint8_t cck_rates[4] = {
11535  		SIR_MAC_RATE_1,
11536  		SIR_MAC_RATE_2,
11537  		SIR_MAC_RATE_5_5,
11538  		SIR_MAC_RATE_11
11539  	};
11540  
11541  	if (is_ofdm_rates == true) {
11542  		rate_set->numRates = 8;
11543  		qdf_mem_copy(rate_set->rate, ofdm_rates, sizeof(ofdm_rates));
11544  		if (is_basic_rates) {
11545  			rate_set->rate[0] |= WLAN_DOT11_BASIC_RATE_MASK;
11546  			rate_set->rate[2] |= WLAN_DOT11_BASIC_RATE_MASK;
11547  			rate_set->rate[4] |= WLAN_DOT11_BASIC_RATE_MASK;
11548  		}
11549  		pe_debug("Default OFDM Rates");
11550  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
11551  				   rate_set->rate, rate_set->numRates);
11552  	} else {
11553  		rate_set->numRates = 4;
11554  		qdf_mem_copy(rate_set->rate, cck_rates, sizeof(cck_rates));
11555  		if (is_basic_rates) {
11556  			rate_set->rate[0] |= WLAN_DOT11_BASIC_RATE_MASK;
11557  			rate_set->rate[1] |= WLAN_DOT11_BASIC_RATE_MASK;
11558  			rate_set->rate[2] |= WLAN_DOT11_BASIC_RATE_MASK;
11559  			rate_set->rate[3] |= WLAN_DOT11_BASIC_RATE_MASK;
11560  		}
11561  		pe_debug("Default CCK Rates");
11562  		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
11563  				   rate_set->rate, rate_set->numRates);
11564  	}
11565  }
11566  
11567  /**
11568   * wlan_is_aggregate_rate_supported() - to check if aggregate rate is supported
11569   * @mac_ctx: pointer to mac context
11570   * @rate: A rate in units of 500kbps
11571   *
11572   *
11573   * The rate encoding  is just as in 802.11  Information Elements, except
11574   * that the high bit is \em  not interpreted as indicating a Basic Rate,
11575   * and proprietary rates are allowed, too.
11576   *
11577   * Note  that if the  adapter's dot11Mode  is g,  we don't  restrict the
11578   * rates.  According to hwReadEepromParameters, this will happen when:
11579   * ... the  card is  configured for ALL  bands through  the property
11580   * page.  If this occurs, and the card is not an ABG card ,then this
11581   * code  is  setting the  dot11Mode  to  assume  the mode  that  the
11582   * hardware can support.   For example, if the card  is an 11BG card
11583   * and we  are configured to support  ALL bands, then  we change the
11584   * dot11Mode  to 11g  because  ALL in  this  case is  only what  the
11585   * hardware can support.
11586   *
11587   * Return: true if  the adapter is currently capable of supporting this rate
11588   */
11589  
11590  static bool wlan_is_aggregate_rate_supported(struct mac_context *mac_ctx,
11591  					     uint16_t rate)
11592  {
11593  	bool supported = false;
11594  	uint16_t idx, new_rate;
11595  	enum mlme_dot11_mode self_dot11_mode =
11596  				mac_ctx->mlme_cfg->dot11_mode.dot11_mode;
11597  
11598  	/* In case basic rate flag is set */
11599  	new_rate = BITS_OFF(rate, WLAN_DOT11_BASIC_RATE_MASK);
11600  	if (self_dot11_mode == MLME_DOT11_MODE_11A) {
11601  		switch (new_rate) {
11602  		case SUPP_RATE_6_MBPS:
11603  		case SUPP_RATE_9_MBPS:
11604  		case SUPP_RATE_12_MBPS:
11605  		case SUPP_RATE_18_MBPS:
11606  		case SUPP_RATE_24_MBPS:
11607  		case SUPP_RATE_36_MBPS:
11608  		case SUPP_RATE_48_MBPS:
11609  		case SUPP_RATE_54_MBPS:
11610  			supported = true;
11611  			break;
11612  		default:
11613  			supported = false;
11614  			break;
11615  		}
11616  	} else if (self_dot11_mode == MLME_DOT11_MODE_11B) {
11617  		switch (new_rate) {
11618  		case SUPP_RATE_1_MBPS:
11619  		case SUPP_RATE_2_MBPS:
11620  		case SUPP_RATE_5_MBPS:
11621  		case SUPP_RATE_11_MBPS:
11622  			supported = true;
11623  			break;
11624  		default:
11625  			supported = false;
11626  			break;
11627  		}
11628  	} else if (!mac_ctx->roam.configParam.ProprietaryRatesEnabled) {
11629  		switch (new_rate) {
11630  		case SUPP_RATE_1_MBPS:
11631  		case SUPP_RATE_2_MBPS:
11632  		case SUPP_RATE_5_MBPS:
11633  		case SUPP_RATE_6_MBPS:
11634  		case SUPP_RATE_9_MBPS:
11635  		case SUPP_RATE_11_MBPS:
11636  		case SUPP_RATE_12_MBPS:
11637  		case SUPP_RATE_18_MBPS:
11638  		case SUPP_RATE_24_MBPS:
11639  		case SUPP_RATE_36_MBPS:
11640  		case SUPP_RATE_48_MBPS:
11641  		case SUPP_RATE_54_MBPS:
11642  			supported = true;
11643  			break;
11644  		default:
11645  			supported = false;
11646  			break;
11647  		}
11648  	} else if (new_rate == SUPP_RATE_1_MBPS ||
11649  		   new_rate == SUPP_RATE_2_MBPS ||
11650  		   new_rate == SUPP_RATE_5_MBPS ||
11651  		   new_rate == SUPP_RATE_11_MBPS)
11652  		supported = true;
11653  	else {
11654  		idx = 0x1;
11655  
11656  		switch (new_rate) {
11657  		case SUPP_RATE_6_MBPS:
11658  			supported = g_phy_rates_suppt[0][idx];
11659  			break;
11660  		case SUPP_RATE_9_MBPS:
11661  			supported = g_phy_rates_suppt[1][idx];
11662  			break;
11663  		case SUPP_RATE_12_MBPS:
11664  			supported = g_phy_rates_suppt[2][idx];
11665  			break;
11666  		case SUPP_RATE_18_MBPS:
11667  			supported = g_phy_rates_suppt[3][idx];
11668  			break;
11669  		case SUPP_RATE_20_MBPS:
11670  			supported = g_phy_rates_suppt[4][idx];
11671  			break;
11672  		case SUPP_RATE_24_MBPS:
11673  			supported = g_phy_rates_suppt[5][idx];
11674  			break;
11675  		case SUPP_RATE_36_MBPS:
11676  			supported = g_phy_rates_suppt[6][idx];
11677  			break;
11678  		case SUPP_RATE_40_MBPS:
11679  			supported = g_phy_rates_suppt[7][idx];
11680  			break;
11681  		case SUPP_RATE_42_MBPS:
11682  			supported = g_phy_rates_suppt[8][idx];
11683  			break;
11684  		case SUPP_RATE_48_MBPS:
11685  			supported = g_phy_rates_suppt[9][idx];
11686  			break;
11687  		case SUPP_RATE_54_MBPS:
11688  			supported = g_phy_rates_suppt[10][idx];
11689  			break;
11690  		case SUPP_RATE_72_MBPS:
11691  			supported = g_phy_rates_suppt[11][idx];
11692  			break;
11693  		case SUPP_RATE_80_MBPS:
11694  			supported = g_phy_rates_suppt[12][idx];
11695  			break;
11696  		case SUPP_RATE_84_MBPS:
11697  			supported = g_phy_rates_suppt[13][idx];
11698  			break;
11699  		case SUPP_RATE_96_MBPS:
11700  			supported = g_phy_rates_suppt[14][idx];
11701  			break;
11702  		case SUPP_RATE_108_MBPS:
11703  			supported = g_phy_rates_suppt[15][idx];
11704  			break;
11705  		case SUPP_RATE_120_MBPS:
11706  			supported = g_phy_rates_suppt[16][idx];
11707  			break;
11708  		case SUPP_RATE_126_MBPS:
11709  			supported = g_phy_rates_suppt[17][idx];
11710  			break;
11711  		case SUPP_RATE_144_MBPS:
11712  			supported = g_phy_rates_suppt[18][idx];
11713  			break;
11714  		case SUPP_RATE_160_MBPS:
11715  			supported = g_phy_rates_suppt[19][idx];
11716  			break;
11717  		case SUPP_RATE_168_MBPS:
11718  			supported = g_phy_rates_suppt[20][idx];
11719  			break;
11720  		case SUPP_RATE_192_MBPS:
11721  			supported = g_phy_rates_suppt[21][idx];
11722  			break;
11723  		case SUPP_RATE_216_MBPS:
11724  			supported = g_phy_rates_suppt[22][idx];
11725  			break;
11726  		case SUPP_RATE_240_MBPS:
11727  			supported = g_phy_rates_suppt[23][idx];
11728  			break;
11729  		default:
11730  			supported = false;
11731  			break;
11732  		}
11733  	}
11734  
11735  	return supported;
11736  }
11737  
11738  bool wlan_rates_is_dot11_rate_supported(struct mac_context *mac_ctx,
11739  					uint8_t rate)
11740  {
11741  	uint16_t n = BITS_OFF(rate, WLAN_DOT11_BASIC_RATE_MASK);
11742  
11743  	return wlan_is_aggregate_rate_supported(mac_ctx, n);
11744  }
11745  
11746  bool wlan_check_rate_bitmap(uint8_t rate, uint16_t rate_bitmap)
11747  {
11748  	uint16_t n = BITS_OFF(rate, WLAN_DOT11_BASIC_RATE_MASK);
11749  
11750  	switch (n) {
11751  	case SIR_MAC_RATE_1:
11752  		rate_bitmap &= SIR_MAC_RATE_1_BITMAP;
11753  		break;
11754  	case SIR_MAC_RATE_2:
11755  		rate_bitmap &= SIR_MAC_RATE_2_BITMAP;
11756  		break;
11757  	case SIR_MAC_RATE_5_5:
11758  		rate_bitmap &= SIR_MAC_RATE_5_5_BITMAP;
11759  		break;
11760  	case SIR_MAC_RATE_11:
11761  		rate_bitmap &= SIR_MAC_RATE_11_BITMAP;
11762  		break;
11763  	case SIR_MAC_RATE_6:
11764  		rate_bitmap &= SIR_MAC_RATE_6_BITMAP;
11765  		break;
11766  	case SIR_MAC_RATE_9:
11767  		rate_bitmap &= SIR_MAC_RATE_9_BITMAP;
11768  		break;
11769  	case SIR_MAC_RATE_12:
11770  		rate_bitmap &= SIR_MAC_RATE_12_BITMAP;
11771  		break;
11772  	case SIR_MAC_RATE_18:
11773  		rate_bitmap &= SIR_MAC_RATE_18_BITMAP;
11774  		break;
11775  	case SIR_MAC_RATE_24:
11776  		rate_bitmap &= SIR_MAC_RATE_24_BITMAP;
11777  		break;
11778  	case SIR_MAC_RATE_36:
11779  		rate_bitmap &= SIR_MAC_RATE_36_BITMAP;
11780  		break;
11781  	case SIR_MAC_RATE_48:
11782  		rate_bitmap &= SIR_MAC_RATE_48_BITMAP;
11783  		break;
11784  	case SIR_MAC_RATE_54:
11785  		rate_bitmap &= SIR_MAC_RATE_54_BITMAP;
11786  		break;
11787  	}
11788  	return !!rate_bitmap;
11789  }
11790  
11791  void wlan_add_rate_bitmap(uint8_t rate, uint16_t *rate_bitmap)
11792  {
11793  	uint16_t n = BITS_OFF(rate, CSR_DOT11_BASIC_RATE_MASK);
11794  
11795  	switch (n) {
11796  	case SIR_MAC_RATE_1:
11797  		*rate_bitmap |= SIR_MAC_RATE_1_BITMAP;
11798  		break;
11799  	case SIR_MAC_RATE_2:
11800  		*rate_bitmap |= SIR_MAC_RATE_2_BITMAP;
11801  		break;
11802  	case SIR_MAC_RATE_5_5:
11803  		*rate_bitmap |= SIR_MAC_RATE_5_5_BITMAP;
11804  		break;
11805  	case SIR_MAC_RATE_11:
11806  		*rate_bitmap |= SIR_MAC_RATE_11_BITMAP;
11807  		break;
11808  	case SIR_MAC_RATE_6:
11809  		*rate_bitmap |= SIR_MAC_RATE_6_BITMAP;
11810  		break;
11811  	case SIR_MAC_RATE_9:
11812  		*rate_bitmap |= SIR_MAC_RATE_9_BITMAP;
11813  		break;
11814  	case SIR_MAC_RATE_12:
11815  		*rate_bitmap |= SIR_MAC_RATE_12_BITMAP;
11816  		break;
11817  	case SIR_MAC_RATE_18:
11818  		*rate_bitmap |= SIR_MAC_RATE_18_BITMAP;
11819  		break;
11820  	case SIR_MAC_RATE_24:
11821  		*rate_bitmap |= SIR_MAC_RATE_24_BITMAP;
11822  		break;
11823  	case SIR_MAC_RATE_36:
11824  		*rate_bitmap |= SIR_MAC_RATE_36_BITMAP;
11825  		break;
11826  	case SIR_MAC_RATE_48:
11827  		*rate_bitmap |= SIR_MAC_RATE_48_BITMAP;
11828  		break;
11829  	case SIR_MAC_RATE_54:
11830  		*rate_bitmap |= SIR_MAC_RATE_54_BITMAP;
11831  		break;
11832  	}
11833  }
11834  
11835  static bool is_ofdm_rates(uint16_t rate)
11836  {
11837  	uint16_t n = BITS_OFF(rate, WLAN_DOT11_BASIC_RATE_MASK);
11838  
11839  	switch (n) {
11840  	case SIR_MAC_RATE_6:
11841  	case SIR_MAC_RATE_9:
11842  	case SIR_MAC_RATE_12:
11843  	case SIR_MAC_RATE_18:
11844  	case SIR_MAC_RATE_24:
11845  	case SIR_MAC_RATE_36:
11846  	case SIR_MAC_RATE_48:
11847  	case SIR_MAC_RATE_54:
11848  		return true;
11849  	default:
11850  		break;
11851  	}
11852  
11853  	return false;
11854  }
11855  
11856  QDF_STATUS wlan_get_rate_set(struct mac_context *mac,
11857  			     tDot11fBeaconIEs *ie_struct,
11858  			     struct pe_session *pe_session)
11859  {
11860  	QDF_STATUS status = QDF_STATUS_E_FAILURE;
11861  	int i;
11862  	uint8_t *dst_rate;
11863  	uint16_t rateBitmap = 0;
11864  	bool is_24ghz_freq;
11865  	tSirMacRateSet *op_rate;
11866  	tSirMacRateSet *ext_rate;
11867  	tSirMacRateSet rate_set;
11868  
11869  
11870  	if (!pe_session) {
11871  		pe_err("pe session is NULL");
11872  		return QDF_STATUS_E_INVAL;
11873  	}
11874  	op_rate = &pe_session->rateSet;
11875  	ext_rate = &pe_session->extRateSet;
11876  	is_24ghz_freq = wlan_reg_is_24ghz_ch_freq(pe_session->curr_op_freq);
11877  
11878  	qdf_mem_zero(op_rate, sizeof(tSirMacRateSet));
11879  	qdf_mem_zero(ext_rate, sizeof(tSirMacRateSet));
11880  	qdf_mem_zero(&rate_set, sizeof(tSirMacRateSet));
11881  	QDF_ASSERT(ie_struct);
11882  
11883  	/*
11884  	 * Originally, we thought that for 11a networks, the 11a rates
11885  	 * are always in the Operational Rate set & for 11b and 11g
11886  	 * networks, the 11b rates appear in the Operational Rate set.
11887  	 * Consequently, in either case, we would blindly put the rates
11888  	 * we support into our Operational Rate set.
11889  	 * (including the basic rates, which we've already verified are
11890  	 * supported earlier in the roaming decision).
11891  	 * However, it turns out that this is not always the case.
11892  	 * Some AP's (e.g. D-Link DI-784) ram 11g rates into the
11893  	 * Operational Rate set too.  Now, we're a little more careful.
11894  	 */
11895  	dst_rate = op_rate->rate;
11896  	if (ie_struct->SuppRates.present) {
11897  		for (i = 0; i < ie_struct->SuppRates.num_rates; i++) {
11898  			if (!is_24ghz_freq &&
11899  			    !is_ofdm_rates(ie_struct->SuppRates.rates[i]))
11900  				continue;
11901  
11902  			if (wlan_rates_is_dot11_rate_supported(mac,
11903  				ie_struct->SuppRates.rates[i]) &&
11904  				!wlan_check_rate_bitmap(
11905  					ie_struct->SuppRates.rates[i],
11906  					rateBitmap)) {
11907  				wlan_add_rate_bitmap(ie_struct->SuppRates.
11908  						    rates[i], &rateBitmap);
11909  				*dst_rate++ = ie_struct->SuppRates.rates[i];
11910  				op_rate->numRates++;
11911  			}
11912  		}
11913  	}
11914  	/*
11915  	 * If there are Extended Rates in the beacon, we will reflect the
11916  	 * extended rates that we support in our Extended Operational Rate
11917  	 * set.
11918  	 */
11919  	if (ie_struct->ExtSuppRates.present) {
11920  		dst_rate = ext_rate->rate;
11921  		for (i = 0; i < ie_struct->ExtSuppRates.num_rates; i++) {
11922  			if (wlan_rates_is_dot11_rate_supported(mac,
11923  				ie_struct->ExtSuppRates.rates[i]) &&
11924  				!wlan_check_rate_bitmap(
11925  					ie_struct->ExtSuppRates.rates[i],
11926  					rateBitmap)) {
11927  				*dst_rate++ = ie_struct->ExtSuppRates.rates[i];
11928  				ext_rate->numRates++;
11929  			}
11930  		}
11931  	}
11932  	if (!op_rate->numRates) {
11933  		dst_rate = op_rate->rate;
11934  		wlan_populate_basic_rates(&rate_set, !is_24ghz_freq, true);
11935  		for (i = 0; i < rate_set.numRates; i++) {
11936  			if (!wlan_check_rate_bitmap(rate_set.rate[i],
11937  						    rateBitmap)) {
11938  				wlan_add_rate_bitmap(rate_set.rate[i],
11939  						     &rateBitmap);
11940  				*dst_rate++ = rate_set.rate[i];
11941  				op_rate->numRates++;
11942  			}
11943  		}
11944  		if (!is_24ghz_freq)
11945  			return QDF_STATUS_SUCCESS;
11946  
11947  		wlan_populate_basic_rates(&rate_set, true, false);
11948  		for (i = op_rate->numRates;
11949  		     i < WLAN_SUPPORTED_RATES_IE_MAX_LEN; i++) {
11950  			if (!wlan_check_rate_bitmap(rate_set.rate[i],
11951  						    rateBitmap)) {
11952  				wlan_add_rate_bitmap(rate_set.rate[i],
11953  						     &rateBitmap);
11954  				*dst_rate++ = rate_set.rate[i];
11955  				op_rate->numRates++;
11956  			}
11957  		}
11958  	}
11959  	if (op_rate->numRates > 0 || ext_rate->numRates > 0)
11960  		status = QDF_STATUS_SUCCESS;
11961  
11962  	return status;
11963  }
11964  
11965  uint32_t wlan_get_11h_power_constraint(struct mac_context *mac_ctx,
11966  				       tDot11fIEPowerConstraints *constraints)
11967  {
11968  	uint32_t local_power_constraint = 0;
11969  
11970  	/*
11971  	 * check if .11h support is enabled, if not,
11972  	 * the power constraint is 0.
11973  	 */
11974  	if (mac_ctx->mlme_cfg->gen.enabled_11h && constraints->present)
11975  		local_power_constraint = constraints->localPowerConstraints;
11976  
11977  	return local_power_constraint;
11978  }
11979  
11980  #ifdef FEATURE_WLAN_ESE
11981  static void wlan_fill_qbss_load_param(tDot11fBeaconIEs *bcn_ies,
11982  				      struct bss_description *bss_desc)
11983  {
11984  	if (!bcn_ies->QBSSLoad.present)
11985  		return;
11986  
11987  	bss_desc->QBSSLoad_present = true;
11988  	bss_desc->QBSSLoad_avail = bcn_ies->QBSSLoad.avail;
11989  }
11990  #else
11991  static void wlan_fill_qbss_load_param(tDot11fBeaconIEs *bcn_ies,
11992  				      struct bss_description *bss_desc)
11993  {
11994  }
11995  #endif
11996  
11997  #ifdef WLAN_FEATURE_FILS_SK
11998  static void wlan_update_bss_with_fils_data(struct mac_context *mac_ctx,
11999  					  struct scan_cache_entry *scan_entry,
12000  					  struct bss_description *bss_descr)
12001  {
12002  	int ret;
12003  	tDot11fIEfils_indication *fils_indication;
12004  	struct sir_fils_indication *fils_ind;
12005  
12006  	if (!scan_entry->ie_list.fils_indication)
12007  		return;
12008  
12009  	fils_indication = qdf_mem_malloc(sizeof(*fils_indication));
12010  	if (!fils_indication) {
12011  		pe_err("malloc failed for fils_indication");
12012  		return;
12013  	}
12014  
12015  	ret = dot11f_unpack_ie_fils_indication(mac_ctx,
12016  				scan_entry->ie_list.fils_indication +
12017  				SIR_FILS_IND_ELEM_OFFSET,
12018  				*(scan_entry->ie_list.fils_indication + 1),
12019  				fils_indication, false);
12020  	if (DOT11F_FAILED(ret)) {
12021  		pe_err("unpack failed ret: 0x%x", ret);
12022  		qdf_mem_free(fils_indication);
12023  		return;
12024  	}
12025  
12026  	fils_ind = qdf_mem_malloc(sizeof(*fils_ind));
12027  	if (!fils_ind) {
12028  		pe_err("malloc failed for fils_ind");
12029  		qdf_mem_free(fils_indication);
12030  		return;
12031  	}
12032  
12033  	update_fils_data(fils_ind, fils_indication);
12034  	if (fils_ind->realm_identifier.realm_cnt > SIR_MAX_REALM_COUNT)
12035  		fils_ind->realm_identifier.realm_cnt = SIR_MAX_REALM_COUNT;
12036  
12037  	bss_descr->fils_info_element.realm_cnt =
12038  		fils_ind->realm_identifier.realm_cnt;
12039  	qdf_mem_copy(bss_descr->fils_info_element.realm,
12040  			fils_ind->realm_identifier.realm,
12041  			bss_descr->fils_info_element.realm_cnt * SIR_REALM_LEN);
12042  	pe_debug("FILS: bssid:" QDF_MAC_ADDR_FMT "is_present:%d cache_id[0x%x%x]",
12043  		 QDF_MAC_ADDR_REF(bss_descr->bssId),
12044  		 fils_ind->cache_identifier.is_present,
12045  		 fils_ind->cache_identifier.identifier[0],
12046  		 fils_ind->cache_identifier.identifier[1]);
12047  	if (fils_ind->cache_identifier.is_present) {
12048  		bss_descr->fils_info_element.is_cache_id_present = true;
12049  		qdf_mem_copy(bss_descr->fils_info_element.cache_id,
12050  			fils_ind->cache_identifier.identifier, CACHE_ID_LEN);
12051  	}
12052  	if (fils_ind->is_fils_sk_auth_supported)
12053  		bss_descr->fils_info_element.is_fils_sk_supported = true;
12054  
12055  	qdf_mem_free(fils_ind);
12056  	qdf_mem_free(fils_indication);
12057  }
12058  #else
12059  static void wlan_update_bss_with_fils_data(struct mac_context *mac_ctx,
12060  					  struct scan_cache_entry *scan_entry,
12061  					  struct bss_description *bss_descr)
12062  { }
12063  #endif
12064  
12065  QDF_STATUS
12066  wlan_fill_bss_desc_from_scan_entry(struct mac_context *mac_ctx,
12067  				   struct bss_description *bss_desc,
12068  				   struct scan_cache_entry *scan_entry)
12069  {
12070  	uint8_t *ie_ptr;
12071  	uint32_t ie_len;
12072  	tpSirMacMgmtHdr hdr;
12073  	tDot11fBeaconIEs *bcn_ies;
12074  	QDF_STATUS status;
12075  
12076  	hdr = (tpSirMacMgmtHdr)scan_entry->raw_frame.ptr;
12077  
12078  	ie_len = util_scan_entry_ie_len(scan_entry);
12079  	ie_ptr = util_scan_entry_ie_data(scan_entry);
12080  
12081  	bss_desc->length = (uint16_t) (offsetof(struct bss_description,
12082  			   ieFields[0]) - sizeof(bss_desc->length) + ie_len);
12083  
12084  	qdf_mem_copy(bss_desc->bssId, scan_entry->bssid.bytes,
12085  		     QDF_MAC_ADDR_SIZE);
12086  	bss_desc->scansystimensec = scan_entry->boottime_ns;
12087  	qdf_mem_copy(bss_desc->timeStamp,
12088  		scan_entry->tsf_info.data, 8);
12089  
12090  	bss_desc->beaconInterval = scan_entry->bcn_int;
12091  	bss_desc->capabilityInfo = scan_entry->cap_info.value;
12092  
12093  	if (WLAN_REG_IS_5GHZ_CH_FREQ(scan_entry->channel.chan_freq) ||
12094  	    WLAN_REG_IS_6GHZ_CHAN_FREQ(scan_entry->channel.chan_freq))
12095  		bss_desc->nwType = eSIR_11A_NW_TYPE;
12096  	else if (scan_entry->phy_mode == WLAN_PHYMODE_11B)
12097  		bss_desc->nwType = eSIR_11B_NW_TYPE;
12098  	else
12099  		bss_desc->nwType = eSIR_11G_NW_TYPE;
12100  
12101  	bss_desc->rssi = scan_entry->rssi_raw;
12102  	bss_desc->rssi_raw = scan_entry->rssi_raw;
12103  
12104  	/* channel frequency what peer sent in beacon/probersp. */
12105  	bss_desc->chan_freq = scan_entry->channel.chan_freq;
12106  	bss_desc->received_time =
12107  		scan_entry->scan_entry_time;
12108  	bss_desc->startTSF[0] =
12109  		mac_ctx->rrm.rrmPEContext.startTSF[0];
12110  	bss_desc->startTSF[1] =
12111  		mac_ctx->rrm.rrmPEContext.startTSF[1];
12112  	bss_desc->parentTSF =
12113  		scan_entry->rrm_parent_tsf;
12114  	bss_desc->fProbeRsp = (scan_entry->frm_subtype ==
12115  			  MGMT_SUBTYPE_PROBE_RESP);
12116  	bss_desc->seq_ctrl = hdr->seqControl;
12117  	bss_desc->tsf_delta = scan_entry->tsf_delta;
12118  	bss_desc->adaptive_11r_ap = scan_entry->adaptive_11r_ap;
12119  
12120  	bss_desc->mbo_oce_enabled_ap =
12121  			util_scan_entry_mbo_oce(scan_entry) ? true : false;
12122  
12123  	wlan_fill_single_pmk_ap_cap_from_scan_entry(mac_ctx, bss_desc,
12124  						    scan_entry);
12125  
12126  	qdf_mem_copy(&bss_desc->mbssid_info, &scan_entry->mbssid_info,
12127  		     sizeof(struct scan_mbssid_info));
12128  
12129  	qdf_mem_copy((uint8_t *) &bss_desc->ieFields, ie_ptr, ie_len);
12130  
12131  	status = wlan_get_parsed_bss_description_ies(mac_ctx, bss_desc,
12132  						     &bcn_ies);
12133  	if (QDF_IS_STATUS_ERROR(status))
12134  		return status;
12135  
12136  	if (bcn_ies->MobilityDomain.present) {
12137  		bss_desc->mdiePresent = true;
12138  		qdf_mem_copy((uint8_t *)&(bss_desc->mdie[0]),
12139  			     (uint8_t *)&(bcn_ies->MobilityDomain.MDID),
12140  			     sizeof(uint16_t));
12141  		bss_desc->mdie[2] =
12142  			((bcn_ies->MobilityDomain.overDSCap << 0) |
12143  			(bcn_ies->MobilityDomain.resourceReqCap << 1));
12144  	}
12145  
12146  	wlan_fill_qbss_load_param(bcn_ies, bss_desc);
12147  	wlan_update_bss_with_fils_data(mac_ctx, scan_entry, bss_desc);
12148  
12149  	qdf_mem_free(bcn_ies);
12150  
12151  	return QDF_STATUS_SUCCESS;
12152  }
12153  
12154  uint16_t
12155  wlan_get_ielen_from_bss_description(struct bss_description *bss_desc)
12156  {
12157  	uint16_t ielen, ieFields_offset;
12158  
12159  	ieFields_offset = GET_FIELD_OFFSET(struct bss_description, ieFields);
12160  
12161  	if (!bss_desc) {
12162  		pe_err_rl("Bss_desc is NULL");
12163  		return 0;
12164  	}
12165  
12166  	if (bss_desc->length <= (ieFields_offset - sizeof(bss_desc->length))) {
12167  		pe_err_rl("Invalid bss_desc len:%d ie_fields_offset:%d",
12168  			  bss_desc->length, ieFields_offset);
12169  		return 0;
12170  	}
12171  
12172  	/*
12173  	 * Length of BSS description is without length of
12174  	 * length itself and length of pointer
12175  	 * that holds ieFields
12176  	 *
12177  	 * <------------sizeof(struct bss_description)-------------------->
12178  	 * +--------+---------------------------------+---------------+
12179  	 * | length | other fields                    | pointer to IEs|
12180  	 * +--------+---------------------------------+---------------+
12181  	 *                                            ^
12182  	 *                                            ieFields
12183  	 */
12184  
12185  	ielen = (uint16_t)(bss_desc->length + sizeof(bss_desc->length) -
12186  			   ieFields_offset);
12187  
12188  	return ielen;
12189  }
12190  
12191  QDF_STATUS populate_dot11f_btm_extended_caps(struct mac_context *mac_ctx,
12192  					     struct pe_session *pe_session,
12193  					     struct sDot11fIEExtCap *dot11f)
12194  {
12195  	struct s_ext_cap *p_ext_cap;
12196  	QDF_STATUS  status;
12197  	bool is_disable_btm;
12198  	struct cm_roam_values_copy temp;
12199  
12200  	dot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
12201  	p_ext_cap = (struct s_ext_cap *)dot11f->bytes;
12202  	dot11f->present = 1;
12203  
12204  	status = cm_akm_roam_allowed(mac_ctx->psoc, pe_session->vdev);
12205  	if (QDF_IS_STATUS_ERROR(status)) {
12206  		p_ext_cap->bss_transition = 0;
12207  		pe_debug("vdev:%d, Disable btm for roaming not suppprted",
12208  			 pe_session->vdev_id);
12209  	}
12210  
12211  	wlan_cm_roam_cfg_get_value(mac_ctx->psoc, pe_session->vdev_id,
12212  				   IS_DISABLE_BTM, &temp);
12213  	is_disable_btm = temp.bool_value;
12214  	if (is_disable_btm) {
12215  		pe_debug("vdev:%d, Disable BTM as BTM roam disabled by user",
12216  			 pe_session->vdev_id);
12217  		p_ext_cap->bss_transition = 0;
12218  	}
12219  
12220  	if (!pe_session->lim_join_req)
12221  		goto compute_len;
12222  
12223  	if (p_ext_cap->bss_transition && !cm_is_open_mode(pe_session->vdev) &&
12224  	    pe_session->lim_join_req->bssDescription.mbo_oce_enabled_ap &&
12225  	    !pe_session->limRmfEnabled) {
12226  		pe_debug("vdev:%d, Disable BTM as MBO AP doesn't support PMF",
12227  			 pe_session->vdev_id);
12228  		p_ext_cap->bss_transition = 0;
12229  	}
12230  
12231  compute_len:
12232  	dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f);
12233  	if (!dot11f->num_bytes) {
12234  		dot11f->present = 0;
12235  		pe_debug("ext ie length become 0, disable the ext caps");
12236  	}
12237  
12238  	wlan_cm_set_assoc_btm_cap(pe_session->vdev, p_ext_cap->bss_transition);
12239  	return QDF_STATUS_SUCCESS;
12240  }
12241  
12242  #ifdef WLAN_FEATURE_11BE_MLO
12243  /**
12244   * populate_dot11f_mlo_partner_sta_cap() - populate mlo sta partner capability
12245   * @mac: mac
12246   * @pDot11f: tDot11fFfCapabilities
12247   *
12248   * Return: QDF_STATUS
12249   */
12250  static QDF_STATUS
12251  populate_dot11f_mlo_partner_sta_cap(struct mac_context *mac,
12252  				    tDot11fFfCapabilities *pDot11f)
12253  {
12254  	uint16_t cap = 0;
12255  	uint32_t val = 0;
12256  	tpSirMacCapabilityInfo pcap_info;
12257  
12258  	pcap_info = (tpSirMacCapabilityInfo)&cap;
12259  
12260  	pcap_info->ess = 1;      /* ESS bit */
12261  
12262  	if (mac->mlme_cfg->wep_params.is_privacy_enabled)
12263  		pcap_info->privacy = 1;
12264  
12265  	/* Short preamble bit */
12266  	if (mac->mlme_cfg->ht_caps.short_preamble)
12267  		pcap_info->shortPreamble =
12268  			mac->mlme_cfg->ht_caps.short_preamble;
12269  
12270  	/* criticalUpdateFlag bit */
12271  	pcap_info->criticalUpdateFlag = 0;
12272  
12273  	/* Channel agility bit */
12274  	pcap_info->channelAgility = 0;
12275  
12276  	/* Short slot time bit */
12277  	if (mac->mlme_cfg->feature_flags.enable_short_slot_time_11g)
12278  		pcap_info->shortSlotTime = 1;
12279  
12280  	/* Spectrum Management bit */
12281  	if (mac->mlme_cfg->gen.enabled_11h)
12282  		pcap_info->spectrumMgt = 1;
12283  	/* QoS bit */
12284  	if (mac->mlme_cfg->wmm_params.qos_enabled)
12285  		pcap_info->qos = 1;
12286  
12287  	/* APSD bit */
12288  	if (mac->mlme_cfg->roam_scoring.apsd_enabled)
12289  		pcap_info->apsd = 1;
12290  
12291  	pcap_info->rrm = mac->rrm.rrmConfig.rrm_enabled;
12292  	/* DSSS-OFDM */
12293  	/* FIXME : no config defined yet. */
12294  
12295  	/* Block ack bit */
12296  	val = mac->mlme_cfg->feature_flags.enable_block_ack;
12297  	pcap_info->delayedBA =
12298  		(uint16_t)((val >> WNI_CFG_BLOCK_ACK_ENABLED_DELAYED) & 1);
12299  	pcap_info->immediateBA =
12300  		(uint16_t)((val >> WNI_CFG_BLOCK_ACK_ENABLED_IMMEDIATE) & 1);
12301  
12302  	swap_bit_field16(cap, (uint16_t *)pDot11f);
12303  
12304  	return QDF_STATUS_SUCCESS;
12305  }
12306  
12307  QDF_STATUS populate_dot11f_auth_mlo_ie(struct mac_context *mac_ctx,
12308  				       struct pe_session *pe_session,
12309  				       struct wlan_mlo_ie *mlo_ie)
12310  {
12311  	struct qdf_mac_addr *mld_addr;
12312  	uint8_t *p_ml_ie;
12313  	uint16_t len_remaining;
12314  
12315  	pe_debug("Populate Auth MLO IEs");
12316  
12317  	mlo_ie->type = 0;
12318  
12319  	mlo_ie->common_info_length = WLAN_ML_BV_CINFO_LENGTH_SIZE;
12320  	mld_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_mldaddr(
12321  							pe_session->vdev);
12322  	qdf_mem_copy(&mlo_ie->mld_mac_addr, mld_addr, QDF_MAC_ADDR_SIZE);
12323  	mlo_ie->common_info_length += QDF_MAC_ADDR_SIZE;
12324  
12325  	pe_debug("MLD mac addr: " QDF_MAC_ADDR_FMT,
12326  		 QDF_MAC_ADDR_REF(mld_addr->bytes));
12327  
12328  	mlo_ie->link_id_info_present = 0;
12329  	mlo_ie->bss_param_change_cnt_present = 0;
12330  	mlo_ie->medium_sync_delay_info_present = 0;
12331  	mlo_ie->eml_capab_present = 0;
12332  	mlo_ie->mld_capab_and_op_present = 0;
12333  	mlo_ie->mld_id_present = 0;
12334  	mlo_ie->ext_mld_capab_and_op_present = 0;
12335  
12336  	p_ml_ie = mlo_ie->data;
12337  	len_remaining = sizeof(mlo_ie->data);
12338  
12339  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
12340  	len_remaining--;
12341  	*p_ml_ie++ = 0;
12342  	len_remaining--;
12343  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
12344  	len_remaining--;
12345  
12346  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
12347  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
12348  	p_ml_ie += WLAN_ML_CTRL_SIZE;
12349  	len_remaining -= WLAN_ML_CTRL_SIZE;
12350  
12351  	*p_ml_ie++ = mlo_ie->common_info_length;
12352  	len_remaining--;
12353  
12354  	qdf_mem_copy(p_ml_ie, mlo_ie->mld_mac_addr, QDF_MAC_ADDR_SIZE);
12355  	p_ml_ie += QDF_MAC_ADDR_SIZE;
12356  	len_remaining -= QDF_MAC_ADDR_SIZE;
12357  
12358  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
12359  
12360  	return QDF_STATUS_SUCCESS;
12361  }
12362  
12363  QDF_STATUS populate_dot11f_assoc_req_mlo_ie(struct mac_context *mac_ctx,
12364  					    struct pe_session *pe_session,
12365  					    tDot11fAssocRequest *frm)
12366  {
12367  	uint8_t link;
12368  	uint8_t num_sta_prof = 0, total_sta_prof;
12369  	struct wlan_mlo_ie *mlo_ie;
12370  	struct wlan_mlo_sta_profile *sta_prof;
12371  	struct mlo_link_info *link_info = NULL;
12372  	struct mlo_partner_info *partner_info;
12373  	struct qdf_mac_addr *mld_addr;
12374  	struct wlan_mlo_dev_context *mlo_dev_ctx;
12375  	tSirMacRateSet b_rates;
12376  	tSirMacRateSet e_rates;
12377  	uint8_t non_inher_len;
12378  	uint8_t non_inher_ie_lists[255];
12379  	uint8_t non_inher_ext_len;
12380  	uint8_t non_inher_ext_ie_lists[255];
12381  	qdf_freq_t chan_freq = 0;
12382  	uint8_t chan;
12383  	uint8_t op_class;
12384  	uint8_t *p_sta_prof;
12385  	uint8_t *p_ml_ie;
12386  	uint32_t len_consumed;
12387  	uint16_t len_remaining, len;
12388  	QDF_STATUS status;
12389  	struct wlan_objmgr_psoc *psoc;
12390  	tDot11fIEnon_inheritance sta_prof_non_inherit;
12391  	tDot11fFfCapabilities mlo_cap;
12392  	tDot11fIEHTCaps ht_caps;
12393  	tDot11fIEVHTCaps vht_caps;
12394  	tDot11fIEExtCap ext_cap;
12395  	tDot11fIEhe_cap he_caps;
12396  	tDot11fIEhe_6ghz_band_cap he_6ghz_band_cap;
12397  	tDot11fIEeht_cap eht_caps;
12398  	tDot11fIESuppRates supp_rates;
12399  	tDot11fIEExtSuppRates ext_supp_rates;
12400  	struct wlan_mlo_eml_cap eml_cap = {0};
12401  	uint16_t presence_bitmap = 0;
12402  	bool is_2g;
12403  	uint32_t value = 0;
12404  	uint8_t *ppet, cb_mode;
12405  	uint8_t *eht_cap_ie = NULL;
12406  	bool sta_prof_he_ie = false;
12407  
12408  	if (!mac_ctx || !pe_session || !frm)
12409  		return QDF_STATUS_E_NULL_VALUE;
12410  
12411  	psoc = wlan_vdev_get_psoc(pe_session->vdev);
12412  	if (!psoc) {
12413  		pe_err("Invalid psoc");
12414  		return QDF_STATUS_E_FAILURE;
12415  	}
12416  
12417  	pe_debug("Populate Assoc req MLO IEs");
12418  
12419  	mlo_ie = &pe_session->mlo_ie;
12420  
12421  	mlo_ie->type = 0;
12422  	mlo_ie->common_info_length = WLAN_ML_BV_CINFO_LENGTH_SIZE;
12423  	mld_addr =
12424  	    (struct qdf_mac_addr *)wlan_vdev_mlme_get_mldaddr(pe_session->vdev);
12425  	qdf_mem_copy(&mlo_ie->mld_mac_addr, mld_addr, QDF_MAC_ADDR_SIZE);
12426  	mlo_ie->common_info_length += QDF_MAC_ADDR_SIZE;
12427  
12428  	mlo_ie->link_id_info_present = 0;
12429  	mlo_ie->bss_param_change_cnt_present = 0;
12430  	mlo_ie->medium_sync_delay_info_present = 0;
12431  	mlo_ie->eml_capab_present = 0;
12432  	mlo_ie->mld_capab_and_op_present = 1;
12433  	mlo_ie->mld_id_present = 0;
12434  	mlo_ie->ext_mld_capab_and_op_present = 0;
12435  
12436  	if (!pe_session->lim_join_req)
12437  		return QDF_STATUS_E_FAILURE;
12438  
12439  	partner_info = &pe_session->lim_join_req->partner_info;
12440  
12441  	if (mlo_ie->mld_capab_and_op_present) {
12442  		presence_bitmap |= WLAN_ML_BV_CTRL_PBM_MLDCAPANDOP_P;
12443  		mlo_ie->common_info_length += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
12444  		mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num =
12445  			QDF_MIN(partner_info->num_partner_links,
12446  				wlan_mlme_get_sta_mlo_simultaneous_links(psoc));
12447  		pe_debug("max_simultaneous_link_num %d",
12448  			 mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num);
12449  		mlo_ie->mld_capab_and_op_info.srs_support = 0;
12450  		mlo_ie->mld_capab_and_op_info.tid_link_map_supported =
12451  			wlan_mlme_get_t2lm_negotiation_supported(mac_ctx->psoc);
12452  		mlo_ie->mld_capab_and_op_info.str_freq_separation = 0;
12453  		mlo_ie->mld_capab_and_op_info.aar_support = 0;
12454  	}
12455  
12456  	/* Check if STA supports EMLSR and vendor command prefers EMLSR mode */
12457  	if (wlan_vdev_mlme_cap_get(pe_session->vdev, WLAN_VDEV_C_EMLSR_CAP)) {
12458  		wlan_mlme_get_eml_params(psoc, &eml_cap);
12459  		mlo_ie->eml_capab_present = 1;
12460  		presence_bitmap |= WLAN_ML_BV_CTRL_PBM_EMLCAP_P;
12461  		mlo_ie->common_info_length += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
12462  		mlo_ie->eml_capabilities_info.emlsr_support =
12463  						eml_cap.emlsr_supp;
12464  		mlo_ie->eml_capabilities_info.emlmr_support =
12465  						eml_cap.emlmr_supp;
12466  		mlo_ie->eml_capabilities_info.transition_timeout = 0;
12467  		mlo_ie->eml_capabilities_info.emlsr_padding_delay =
12468  						eml_cap.emlsr_pad_delay;
12469  		mlo_ie->eml_capabilities_info.emlsr_transition_delay =
12470  						eml_cap.emlsr_trans_delay;
12471  	}
12472  
12473  	p_ml_ie = mlo_ie->data;
12474  	len_remaining = sizeof(mlo_ie->data);
12475  
12476  	/* element ID, length and extension element ID */
12477  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
12478  	len_remaining--;
12479  	/* length will set later */
12480  	*p_ml_ie++ = 0;
12481  	len_remaining--;
12482  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
12483  	len_remaining--;
12484  
12485  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
12486  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
12487  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
12488  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
12489  	p_ml_ie += WLAN_ML_CTRL_SIZE;
12490  	len_remaining -= WLAN_ML_CTRL_SIZE;
12491  
12492  	*p_ml_ie++ = mlo_ie->common_info_length;
12493  	len_remaining--;
12494  
12495  	qdf_mem_copy(p_ml_ie, mld_addr, QDF_MAC_ADDR_SIZE);
12496  	p_ml_ie += QDF_MAC_ADDR_SIZE;
12497  	len_remaining -= QDF_MAC_ADDR_SIZE;
12498  
12499  	if (mlo_ie->eml_capab_present) {
12500  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12501  		     WLAN_ML_BV_CINFO_EMLCAP_EMLSRSUPPORT_IDX,
12502  		     WLAN_ML_BV_CINFO_EMLCAP_EMLSRSUPPORT_BITS,
12503  		     mlo_ie->eml_capabilities_info.emlsr_support);
12504  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12505  		     WLAN_ML_BV_CINFO_EMLCAP_EMLSR_PADDINGDELAY_IDX,
12506  		     WLAN_ML_BV_CINFO_EMLCAP_EMLSR_PADDINGDELAY_BITS,
12507  		     mlo_ie->eml_capabilities_info.emlsr_padding_delay);
12508  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12509  		     WLAN_ML_BV_CINFO_EMLCAP_EMLSRTRANSDELAY_IDX,
12510  		     WLAN_ML_BV_CINFO_EMLCAP_EMLSRTRANSDELAY_BITS,
12511  		     mlo_ie->eml_capabilities_info.emlsr_transition_delay);
12512  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12513  		     WLAN_ML_BV_CINFO_EMLCAP_EMLMRSUPPORT_IDX,
12514  		     WLAN_ML_BV_CINFO_EMLCAP_EMLMRSUPPORT_BITS,
12515  		     mlo_ie->eml_capabilities_info.emlmr_support);
12516  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12517  		     WLAN_ML_BV_CINFO_EMLCAP_EMLMRDELAY_IDX,
12518  		     WLAN_ML_BV_CINFO_EMLCAP_EMLMRDELAY_BITS,
12519  		     mlo_ie->eml_capabilities_info.emlmr_delay);
12520  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12521  		     WLAN_ML_BV_CINFO_EMLCAP_TRANSTIMEOUT_IDX,
12522  		     WLAN_ML_BV_CINFO_EMLCAP_TRANSTIMEOUT_BITS,
12523  		     mlo_ie->eml_capabilities_info.transition_timeout);
12524  
12525  		p_ml_ie += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
12526  		len_remaining -= WLAN_ML_BV_CINFO_EMLCAP_SIZE;
12527  	}
12528  
12529  	pe_debug("EMLSR support: %d, padding delay: %d, transition delay: %d",
12530  		 mlo_ie->eml_capabilities_info.emlsr_support,
12531  		 mlo_ie->eml_capabilities_info.emlsr_padding_delay,
12532  		 mlo_ie->eml_capabilities_info.emlsr_transition_delay);
12533  
12534  	if (mlo_ie->mld_capab_and_op_present) {
12535  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12536  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_IDX,
12537  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_BITS,
12538  		     mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num);
12539  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
12540  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_IDX,
12541  		     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_BITS,
12542  		     mlo_ie->mld_capab_and_op_info.tid_link_map_supported);
12543  		p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
12544  		len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
12545  	}
12546  
12547  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
12548  
12549  	/* find out number of links from bcn or prb rsp */
12550  	total_sta_prof = partner_info->num_partner_links;
12551  
12552  	mlo_dev_ctx = pe_session->vdev->mlo_dev_ctx;
12553  	if (!mlo_dev_ctx) {
12554  		pe_err("mlo_dev_ctx is null");
12555  		return QDF_STATUS_E_NULL_VALUE;
12556  	}
12557  
12558  	for (link = 0;
12559  	     link < total_sta_prof && total_sta_prof != num_sta_prof;
12560  	     link++) {
12561  		struct mlo_link_info *ml_link_info;
12562  
12563  		if (!partner_info->num_partner_links)
12564  			continue;
12565  
12566  		sta_prof = &mlo_ie->sta_profile[num_sta_prof];
12567  		link_info = &partner_info->partner_link_info[link];
12568  		p_sta_prof = sta_prof->data;
12569  		len_remaining = sizeof(sta_prof->data);
12570  		ml_link_info =
12571  			mlo_mgr_get_ap_link_by_link_id(
12572  					pe_session->vdev->mlo_dev_ctx,
12573  					link_info->link_id);
12574  		if (!ml_link_info)
12575  			continue;
12576  
12577  		/* subelement ID 0, length(sta_prof->num_data - 2) */
12578  		*p_sta_prof++ = WLAN_ML_LINFO_SUBELEMID_PERSTAPROFILE;
12579  		*p_sta_prof++ = 0;
12580  		len_remaining -= 2;
12581  
12582  		qdf_mem_zero(non_inher_ie_lists, sizeof(non_inher_ie_lists));
12583  		qdf_mem_zero(non_inher_ext_ie_lists,
12584  			     sizeof(non_inher_ext_ie_lists));
12585  		non_inher_len = 0;
12586  		non_inher_ext_len = 0;
12587  
12588  		QDF_SET_BITS(*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12589  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_IDX,
12590  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_LINKID_BITS,
12591  			     link_info->link_id);
12592  		QDF_SET_BITS(*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12593  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_CMPLTPROF_IDX,
12594  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_CMPLTPROF_BITS,
12595  			     1);
12596  		QDF_SET_BITS(*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12597  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_MACADDRP_IDX,
12598  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_MACADDRP_BITS,
12599  			     1);
12600  		/* 2 Bytes for sta control field*/
12601  		p_sta_prof += 2;
12602  		len_remaining -= 2;
12603  
12604  		/* 1 Bytes for STA Info Length + 6 bytes for STA MAC Address*/
12605  		len = WLAN_ML_BV_LINFO_PERSTAPROF_STAINFO_LENGTH_SIZE +
12606  		      QDF_MAC_ADDR_SIZE;
12607  		*p_sta_prof = len;
12608  
12609  		/* 1 Byte for STA Info Length */
12610  		p_sta_prof += WLAN_ML_BV_LINFO_PERSTAPROF_STAINFO_LENGTH_SIZE;
12611  		len_remaining -=
12612  			WLAN_ML_BV_LINFO_PERSTAPROF_STAINFO_LENGTH_SIZE;
12613  
12614  		/* Copying sta mac address in sta info field */
12615  		qdf_mem_copy(p_sta_prof, ml_link_info->link_addr.bytes,
12616  			     QDF_MAC_ADDR_SIZE);
12617  		p_sta_prof += QDF_MAC_ADDR_SIZE;
12618  		len_remaining -= QDF_MAC_ADDR_SIZE;
12619  
12620  		pe_debug("Sta profile mac: " QDF_MAC_ADDR_FMT,
12621  			 QDF_MAC_ADDR_REF(ml_link_info->link_addr.bytes));
12622  
12623  		/* TBD : populate beacon_interval, dtim_info
12624  		 * nstr_link_pair_present, nstr_bitmap_size
12625  		 */
12626  		QDF_SET_BITS(*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12627  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BCNINTP_IDX,
12628  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BCNINTP_BITS,
12629  			     0);
12630  		QDF_SET_BITS(*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12631  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_DTIMINFOP_IDX,
12632  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_DTIMINFOP_BITS,
12633  			     0);
12634  		QDF_SET_BITS(
12635  			*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12636  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRLINKPRP_IDX,
12637  			WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRLINKPRP_BITS,
12638  			0);
12639  		QDF_SET_BITS(*(uint16_t *)(sta_prof->data + MIN_IE_LEN),
12640  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRBMSZ_IDX,
12641  			     WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRBMSZ_BITS,
12642  			     0);
12643  
12644  		qdf_mem_zero(&mlo_cap, sizeof(tDot11fFfCapabilities));
12645  		qdf_mem_zero(&b_rates, sizeof(b_rates));
12646  		qdf_mem_zero(&e_rates, sizeof(e_rates));
12647  		qdf_mem_zero(&supp_rates, sizeof(supp_rates));
12648  		qdf_mem_zero(&ext_supp_rates, sizeof(ext_supp_rates));
12649  		qdf_mem_zero(&sta_prof_non_inherit,
12650  			     sizeof(tDot11fIEnon_inheritance));
12651  		qdf_mem_zero(&ht_caps, sizeof(tDot11fIEHTCaps));
12652  		qdf_mem_zero(&ext_cap, sizeof(tDot11fIEExtCap));
12653  		qdf_mem_zero(&vht_caps, sizeof(tDot11fIEVHTCaps));
12654  		qdf_mem_zero(&he_caps, sizeof(tDot11fIEhe_cap));
12655  		qdf_mem_zero(&he_6ghz_band_cap,
12656  			     sizeof(tDot11fIEhe_6ghz_band_cap));
12657  		qdf_mem_zero(&eht_caps, sizeof(tDot11fIEeht_cap));
12658  
12659  		// TBD: mlo_capab, supported oper classes
12660  		populate_dot11f_mlo_partner_sta_cap(mac_ctx, &mlo_cap);
12661  		dot11f_pack_ff_capabilities(mac_ctx, &mlo_cap, p_sta_prof);
12662  		p_sta_prof += WLAN_CAPABILITYINFO_LEN;
12663  		len_remaining -= WLAN_CAPABILITYINFO_LEN;
12664  
12665  		wlan_get_chan_by_bssid_from_rnr(pe_session->vdev,
12666  						pe_session->cm_id,
12667  						&link_info->link_addr,
12668  						&chan, &op_class);
12669  		if (!chan)
12670  			wlan_get_chan_by_link_id_from_rnr(pe_session->vdev,
12671  							  pe_session->cm_id,
12672  							  link_info->link_id,
12673  							  &chan, &op_class);
12674  		if (!chan) {
12675  			pe_err("Invalid parter link id %d link mac: " QDF_MAC_ADDR_FMT,
12676  			       link_info->link_id,
12677  			       QDF_MAC_ADDR_REF(link_info->link_addr.bytes));
12678  			continue;
12679  		}
12680  		chan_freq = wlan_reg_chan_opclass_to_freq_auto(chan, op_class,
12681  							       false);
12682  		is_2g = WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq);
12683  		if (is_2g) {
12684  			wlan_populate_basic_rates(&b_rates, false, true);
12685  			wlan_populate_basic_rates(&e_rates, true, false);
12686  		} else {
12687  			wlan_populate_basic_rates(&b_rates, true, true);
12688  		}
12689  
12690  		if ((b_rates.numRates && frm->SuppRates.present &&
12691  		     (qdf_mem_cmp(frm->SuppRates.rates, b_rates.rate,
12692  		      b_rates.numRates))) || (b_rates.numRates &&
12693  		      !frm->SuppRates.present)) {
12694  			supp_rates.num_rates = b_rates.numRates;
12695  			qdf_mem_copy(supp_rates.rates, b_rates.rate,
12696  				     b_rates.numRates);
12697  			supp_rates.present = 1;
12698  			len_consumed = 0;
12699  			dot11f_pack_ie_supp_rates(mac_ctx, &supp_rates,
12700  						  p_sta_prof, len_remaining,
12701  						  &len_consumed);
12702  			p_sta_prof += len_consumed;
12703  			len_remaining -= len_consumed;
12704  		} else if (frm->SuppRates.present && !b_rates.numRates) {
12705  			non_inher_ie_lists[non_inher_len++] =
12706  						DOT11F_EID_SUPPRATES;
12707  		}
12708  
12709  		if (!WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq)) {
12710  			cb_mode = lim_get_cb_mode_for_freq(mac_ctx, pe_session,
12711  							   chan_freq);
12712  			populate_dot11f_ht_caps(mac_ctx, NULL, &ht_caps);
12713  			if (!cb_mode) {
12714  				ht_caps.supportedChannelWidthSet = 0;
12715  				ht_caps.shortGI40MHz = 0;
12716  			} else {
12717  				ht_caps.supportedChannelWidthSet = 1;
12718  				ht_caps.shortGI40MHz = 1;
12719  			}
12720  		}
12721  
12722  		if ((ht_caps.present && frm->HTCaps.present &&
12723  		     qdf_mem_cmp(&ht_caps, &frm->HTCaps, sizeof(ht_caps))) ||
12724  		     (ht_caps.present && !frm->HTCaps.present)) {
12725  			len_consumed = 0;
12726  			dot11f_pack_ie_ht_caps(mac_ctx, &ht_caps, p_sta_prof,
12727  					       len_remaining, &len_consumed);
12728  			p_sta_prof += len_consumed;
12729  			len_remaining -= len_consumed;
12730  		} else if (frm->HTCaps.present && !ht_caps.present) {
12731  			non_inher_ie_lists[non_inher_len++] = DOT11F_EID_HTCAPS;
12732  		}
12733  
12734  		if ((e_rates.numRates && frm->ExtSuppRates.present &&
12735  		     (qdf_mem_cmp(frm->ExtSuppRates.rates, e_rates.rate,
12736  		      e_rates.numRates))) || (e_rates.numRates &&
12737  		     !frm->ExtSuppRates.present)) {
12738  			ext_supp_rates.num_rates = e_rates.numRates;
12739  			qdf_mem_copy(ext_supp_rates.rates, e_rates.rate,
12740  				     e_rates.numRates);
12741  			ext_supp_rates.present = 1;
12742  			len_consumed = 0;
12743  			dot11f_pack_ie_ext_supp_rates(mac_ctx, &ext_supp_rates,
12744  						      p_sta_prof,
12745  						      len_remaining,
12746  						      &len_consumed);
12747  			p_sta_prof += len_consumed;
12748  			len_remaining -= len_consumed;
12749  		} else if (frm->ExtSuppRates.present) {
12750  			non_inher_ie_lists[non_inher_len++] =
12751  						DOT11F_EID_EXTSUPPRATES;
12752  		}
12753  
12754  		populate_dot11f_ext_cap(mac_ctx, true, &ext_cap, NULL);
12755  		populate_dot11f_btm_extended_caps(mac_ctx, pe_session,
12756  						  &ext_cap);
12757  		if ((ext_cap.present && frm->ExtCap.present &&
12758  		     qdf_mem_cmp(&ext_cap, &frm->ExtCap, sizeof(ext_cap))) ||
12759  		     (ext_cap.present && !frm->ExtCap.present)) {
12760  			len_consumed = 0;
12761  			dot11f_pack_ie_ext_cap(mac_ctx, &ext_cap, p_sta_prof,
12762  					       len_remaining, &len_consumed);
12763  			p_sta_prof += len_consumed;
12764  			len_remaining -= len_consumed;
12765  		} else if (ext_cap.present && !frm->ExtCap.present) {
12766  			non_inher_ie_lists[non_inher_len++] = DOT11F_EID_EXTCAP;
12767  		}
12768  
12769  		if (!WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq))
12770  			populate_dot11f_vht_caps(mac_ctx, NULL, &vht_caps);
12771  		if ((vht_caps.present && frm->VHTCaps.present &&
12772  		     qdf_mem_cmp(&vht_caps, &frm->VHTCaps, sizeof(vht_caps))) ||
12773  		     (vht_caps.present && !frm->VHTCaps.present)) {
12774  			len_consumed = 0;
12775  			dot11f_pack_ie_vht_caps(mac_ctx, &vht_caps, p_sta_prof,
12776  						len_remaining, &len_consumed);
12777  			p_sta_prof += len_consumed;
12778  			len_remaining -= len_consumed;
12779  		} else if (frm->VHTCaps.present && !vht_caps.present) {
12780  			non_inher_ie_lists[non_inher_len++] =
12781  						DOT11F_EID_VHTCAPS;
12782  		}
12783  
12784  		populate_dot11f_he_caps_by_band(mac_ctx, is_2g, &he_caps,
12785  						pe_session);
12786  		if (he_caps.ppet_present) {
12787  			value = WNI_CFG_HE_PPET_LEN;
12788  			if (!is_2g)
12789  				qdf_mem_copy(he_caps.ppet.ppe_threshold.ppe_th,
12790  					mac_ctx->mlme_cfg->he_caps.he_ppet_5g,
12791  					value);
12792  			else
12793  				qdf_mem_copy(he_caps.ppet.ppe_threshold.ppe_th,
12794  					mac_ctx->mlme_cfg->he_caps.he_ppet_2g,
12795  					value);
12796  
12797  			ppet = he_caps.ppet.ppe_threshold.ppe_th;
12798  			he_caps.ppet.ppe_threshold.num_ppe_th =
12799  				lim_truncate_ppet(ppet, value);
12800  		} else {
12801  			he_caps.ppet.ppe_threshold.num_ppe_th = 0;
12802  		}
12803  		if ((he_caps.present && frm->he_cap.present &&
12804  		     qdf_mem_cmp(&he_caps, &frm->he_cap, sizeof(he_caps))) ||
12805  		     (he_caps.present && !frm->he_cap.present)) {
12806  			len_consumed = 0;
12807  			dot11f_pack_ie_he_cap(mac_ctx, &he_caps, p_sta_prof,
12808  					      len_remaining, &len_consumed);
12809  			p_sta_prof += len_consumed;
12810  			len_remaining -= len_consumed;
12811  			sta_prof_he_ie = true;
12812  		} else if (frm->he_cap.present && !he_caps.present) {
12813  			non_inher_ext_ie_lists[non_inher_ext_len++] =
12814  						WLAN_EXTN_ELEMID_HECAP;
12815  		}
12816  
12817  		if (WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq))
12818  			populate_dot11f_he_6ghz_cap(mac_ctx, NULL,
12819  						    &he_6ghz_band_cap);
12820  		if ((he_6ghz_band_cap.present &&
12821  		     frm->he_6ghz_band_cap.present &&
12822  		     qdf_mem_cmp(&he_6ghz_band_cap, &frm->he_6ghz_band_cap,
12823  				 sizeof(he_6ghz_band_cap))) ||
12824  				 (he_6ghz_band_cap.present &&
12825  				  !frm->he_6ghz_band_cap.present)) {
12826  			len_consumed = 0;
12827  			dot11f_pack_ie_he_6ghz_band_cap(
12828  				mac_ctx, &he_6ghz_band_cap, p_sta_prof,
12829  				len_remaining, &len_consumed);
12830  			p_sta_prof += len_consumed;
12831  			len_remaining -= len_consumed;
12832  		} else if (frm->he_6ghz_band_cap.present &&
12833  			   !he_6ghz_band_cap.present) {
12834  			non_inher_ext_ie_lists[non_inher_ext_len++] =
12835  						WLAN_EXTN_ELEMID_HE_6G_CAP;
12836  		}
12837  		populate_dot11f_eht_caps_by_band(mac_ctx, is_2g, &eht_caps,
12838  						 NULL);
12839  		if (!WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq))
12840  			eht_caps.support_320mhz_6ghz = 0;
12841  
12842  		if ((eht_caps.present && frm->eht_cap.present &&
12843  		     qdf_mem_cmp(&eht_caps, &frm->eht_cap, sizeof(eht_caps))) ||
12844  		     (eht_caps.present && !frm->eht_cap.present) ||
12845  		     sta_prof_he_ie) {
12846  			eht_cap_ie = qdf_mem_malloc(WLAN_MAX_IE_LEN + 2);
12847  			if (eht_cap_ie) {
12848  				len_consumed = 0;
12849  				lim_ieee80211_pack_ehtcap(eht_cap_ie, eht_caps,
12850  							  he_caps, is_2g);
12851  				len_consumed = eht_cap_ie[1] + 2;
12852  
12853  				qdf_mem_copy(p_sta_prof, eht_cap_ie,
12854  					     len_consumed);
12855  				qdf_mem_free(eht_cap_ie);
12856  				p_sta_prof += len_consumed;
12857  				len_remaining -= len_consumed;
12858  			} else {
12859  				pe_err("malloc failed for eht_cap_ie");
12860  			}
12861  		} else if (frm->eht_cap.present && !eht_caps.present) {
12862  			pe_debug("eht non inher");
12863  			non_inher_ext_ie_lists[non_inher_ext_len++] =
12864  						WLAN_EXTN_ELEMID_EHTCAP;
12865  		} else {
12866  			pe_debug("eht ie not included");
12867  		}
12868  		if (frm->OperatingMode.present) {
12869  			pe_info("opmode in assoc req, add to non inher list");
12870  			non_inher_ie_lists[non_inher_len++] =
12871  						DOT11F_EID_OPERATINGMODE;
12872  		}
12873  
12874  		populate_dot11f_non_inheritance(
12875  				mac_ctx, &sta_prof_non_inherit,
12876  				non_inher_ie_lists, non_inher_ext_ie_lists,
12877  				non_inher_len, non_inher_ext_len);
12878  		if (sta_prof_non_inherit.present) {
12879  			len_consumed = 0;
12880  			dot11f_pack_ie_non_inheritance(
12881  				mac_ctx, &sta_prof_non_inherit,
12882  				p_sta_prof, len_remaining, &len_consumed);
12883  			p_sta_prof += len_consumed;
12884  			len_remaining -= len_consumed;
12885  		}
12886  		sta_prof->num_data = p_sta_prof - sta_prof->data;
12887  		if (sta_prof->num_data > WLAN_MAX_IE_LEN + MIN_IE_LEN) {
12888  			sta_prof->data[TAG_LEN_POS] = WLAN_MAX_IE_LEN;
12889  			status =
12890  			    lim_add_frag_ie_for_sta_profile(sta_prof->data,
12891  							&sta_prof->num_data);
12892  			if (status != QDF_STATUS_SUCCESS) {
12893  				pe_debug("STA profile frag error");
12894  				sta_prof->num_data =
12895  						WLAN_MAX_IE_LEN + MIN_IE_LEN;
12896  			}
12897  		} else {
12898  			sta_prof->data[TAG_LEN_POS] =
12899  					sta_prof->num_data - MIN_IE_LEN;
12900  		}
12901  		num_sta_prof++;
12902  	}
12903  	mlo_ie->num_sta_profile = num_sta_prof;
12904  
12905  	return QDF_STATUS_SUCCESS;
12906  }
12907  
12908  QDF_STATUS populate_dot11f_mlo_ie(struct mac_context *mac_ctx,
12909  				  struct wlan_objmgr_vdev *vdev,
12910  				  struct wlan_mlo_ie *mlo_ie)
12911  {
12912  	struct qdf_mac_addr *mld_addr;
12913  	uint8_t *p_ml_ie;
12914  	uint16_t len_remaining;
12915  	struct wlan_objmgr_psoc *psoc;
12916  	struct wlan_mlo_eml_cap eml_cap = {0};
12917  	uint16_t presence_bitmap = 0;
12918  	bool emlsr_cap,  emlsr_enabled = false;
12919  
12920  	if (!mac_ctx || !mlo_ie)
12921  		return QDF_STATUS_E_NULL_VALUE;
12922  
12923  	psoc = wlan_vdev_get_psoc(vdev);
12924  	if (!psoc) {
12925  		pe_err("Invalid psoc");
12926  		return QDF_STATUS_E_FAILURE;
12927  	}
12928  
12929  	mlo_ie->type = 0;
12930  	mlo_ie->common_info_length = WLAN_ML_BV_CINFO_LENGTH_SIZE;
12931  	mld_addr =
12932  	    (struct qdf_mac_addr *)wlan_vdev_mlme_get_mldaddr(vdev);
12933  	qdf_mem_copy(&mlo_ie->mld_mac_addr, mld_addr, QDF_MAC_ADDR_SIZE);
12934  	mlo_ie->common_info_length += QDF_MAC_ADDR_SIZE;
12935  
12936  	mlo_ie->link_id_info_present = 0;
12937  	mlo_ie->bss_param_change_cnt_present = 0;
12938  	mlo_ie->medium_sync_delay_info_present = 0;
12939  	mlo_ie->eml_capab_present = 0;
12940  	mlo_ie->mld_capab_and_op_present = 1;
12941  	mlo_ie->mld_id_present = 0;
12942  	mlo_ie->ext_mld_capab_and_op_present = 0;
12943  
12944  	if (mlo_ie->mld_capab_and_op_present) {
12945  		presence_bitmap |= WLAN_ML_BV_CTRL_PBM_MLDCAPANDOP_P;
12946  		mlo_ie->common_info_length += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
12947  		mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num =
12948  				wlan_mlme_get_sta_mlo_simultaneous_links(psoc);
12949  		mlo_ie->mld_capab_and_op_info.srs_support = 0;
12950  		mlo_ie->mld_capab_and_op_info.tid_link_map_supported =
12951  			wlan_mlme_get_t2lm_negotiation_supported(mac_ctx->psoc);
12952  		mlo_ie->mld_capab_and_op_info.str_freq_separation = 0;
12953  		mlo_ie->mld_capab_and_op_info.aar_support = 0;
12954  	}
12955  
12956  	/* Check if HW supports eMLSR mode */
12957  	emlsr_cap = policy_mgr_is_hw_emlsr_capable(mac_ctx->psoc);
12958  
12959  	/* Check if vendor command chooses eMLSR mode */
12960  	wlan_mlme_get_emlsr_mode_enabled(mac_ctx->psoc, &emlsr_enabled);
12961  
12962  	/* Check if STA supports EMLSR and vendor command prefers EMLSR mode */
12963  	if (emlsr_cap && emlsr_enabled) {
12964  		wlan_mlme_get_eml_params(psoc, &eml_cap);
12965  		mlo_ie->eml_capab_present = 1;
12966  		presence_bitmap |= WLAN_ML_BV_CTRL_PBM_EMLCAP_P;
12967  		mlo_ie->common_info_length += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
12968  		mlo_ie->eml_capabilities_info.emlsr_support =
12969  						eml_cap.emlsr_supp;
12970  		mlo_ie->eml_capabilities_info.emlmr_support =
12971  						eml_cap.emlmr_supp;
12972  		mlo_ie->eml_capabilities_info.transition_timeout = 0;
12973  		mlo_ie->eml_capabilities_info.emlsr_padding_delay =
12974  						eml_cap.emlsr_pad_delay;
12975  		mlo_ie->eml_capabilities_info.emlsr_transition_delay =
12976  						eml_cap.emlsr_trans_delay;
12977  	}
12978  
12979  	p_ml_ie = mlo_ie->data;
12980  	len_remaining = sizeof(mlo_ie->data);
12981  
12982  	/* element ID, length and extension element ID */
12983  	*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
12984  	len_remaining--;
12985  	/* length will set later */
12986  	*p_ml_ie++ = 0;
12987  	len_remaining--;
12988  	*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
12989  	len_remaining--;
12990  
12991  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
12992  		     WLAN_ML_CTRL_TYPE_BITS, mlo_ie->type);
12993  	QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
12994  		     WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
12995  	p_ml_ie += WLAN_ML_CTRL_SIZE;
12996  	len_remaining -= WLAN_ML_CTRL_SIZE;
12997  
12998  	*p_ml_ie++ = mlo_ie->common_info_length;
12999  	len_remaining--;
13000  
13001  	qdf_mem_copy(p_ml_ie, mld_addr, QDF_MAC_ADDR_SIZE);
13002  	p_ml_ie += QDF_MAC_ADDR_SIZE;
13003  	len_remaining -= QDF_MAC_ADDR_SIZE;
13004  
13005  	if (mlo_ie->eml_capab_present) {
13006  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13007  			     WLAN_ML_BV_CINFO_EMLCAP_EMLSRSUPPORT_IDX,
13008  			     WLAN_ML_BV_CINFO_EMLCAP_EMLSRSUPPORT_BITS,
13009  			     mlo_ie->eml_capabilities_info.emlsr_support);
13010  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13011  			     WLAN_ML_BV_CINFO_EMLCAP_EMLSR_PADDINGDELAY_IDX,
13012  			     WLAN_ML_BV_CINFO_EMLCAP_EMLSR_PADDINGDELAY_BITS,
13013  			     mlo_ie->eml_capabilities_info.emlsr_padding_delay);
13014  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13015  			     WLAN_ML_BV_CINFO_EMLCAP_EMLSRTRANSDELAY_IDX,
13016  			     WLAN_ML_BV_CINFO_EMLCAP_EMLSRTRANSDELAY_BITS,
13017  			     mlo_ie->eml_capabilities_info.emlsr_transition_delay);
13018  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13019  			     WLAN_ML_BV_CINFO_EMLCAP_EMLMRSUPPORT_IDX,
13020  			     WLAN_ML_BV_CINFO_EMLCAP_EMLMRSUPPORT_BITS,
13021  			     mlo_ie->eml_capabilities_info.emlmr_support);
13022  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13023  			     WLAN_ML_BV_CINFO_EMLCAP_EMLMRDELAY_IDX,
13024  			     WLAN_ML_BV_CINFO_EMLCAP_EMLMRDELAY_BITS,
13025  			     mlo_ie->eml_capabilities_info.emlmr_delay);
13026  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13027  			     WLAN_ML_BV_CINFO_EMLCAP_TRANSTIMEOUT_IDX,
13028  			     WLAN_ML_BV_CINFO_EMLCAP_TRANSTIMEOUT_BITS,
13029  			     mlo_ie->eml_capabilities_info.transition_timeout);
13030  
13031  		p_ml_ie += WLAN_ML_BV_CINFO_EMLCAP_SIZE;
13032  		len_remaining -= WLAN_ML_BV_CINFO_EMLCAP_SIZE;
13033  	}
13034  
13035  	if (mlo_ie->mld_capab_and_op_present) {
13036  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13037  			     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_IDX,
13038  			     WLAN_ML_BV_CINFO_MLDCAPANDOP_MAXSIMULLINKS_BITS,
13039  			     mlo_ie->mld_capab_and_op_info.max_simultaneous_link_num);
13040  		QDF_SET_BITS(*(uint16_t *)p_ml_ie,
13041  			     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_IDX,
13042  			     WLAN_ML_BV_CINFO_MLDCAPANDOP_TIDTOLINKMAPNEGSUPPORT_BITS,
13043  			     mlo_ie->mld_capab_and_op_info.tid_link_map_supported);
13044  		p_ml_ie += WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
13045  		len_remaining -= WLAN_ML_BV_CINFO_MLDCAPANDOP_SIZE;
13046  	}
13047  
13048  	mlo_ie->num_data = p_ml_ie - mlo_ie->data;
13049  	pe_debug("VDEV %d ML-IE common info len %d eMLSR support %d pad_delay %d, trans_delay %d",
13050  		 wlan_vdev_get_id(vdev), mlo_ie->num_data,
13051  		 mlo_ie->eml_capabilities_info.emlsr_support,
13052  		 mlo_ie->eml_capabilities_info.emlsr_padding_delay,
13053  		 mlo_ie->eml_capabilities_info.emlsr_transition_delay);
13054  
13055  	return QDF_STATUS_SUCCESS;
13056  }
13057  #endif
13058  
13059  QDF_STATUS
13060  populate_dot11f_rnr_tbtt_info(struct mac_context *mac_ctx,
13061  			      struct pe_session *pe_session,
13062  			      struct pe_session *rnr_session,
13063  			      tDot11fIEreduced_neighbor_report *dot11f,
13064  			      uint8_t tbtt_len)
13065  {
13066  	uint8_t reg_class;
13067  	uint8_t ch_offset;
13068  	uint8_t psd_power;
13069  
13070  	dot11f->present = 1;
13071  	dot11f->tbtt_type = 0;
13072  	if (rnr_session->ch_width == CH_WIDTH_80MHZ) {
13073  		ch_offset = BW80;
13074  	} else {
13075  		switch (rnr_session->htSecondaryChannelOffset) {
13076  		case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
13077  			ch_offset = BW40_HIGH_PRIMARY;
13078  			break;
13079  		case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
13080  			ch_offset = BW40_LOW_PRIMARY;
13081  			break;
13082  		default:
13083  			ch_offset = BW20;
13084  			break;
13085  		}
13086  	}
13087  
13088  	reg_class = lim_op_class_from_bandwidth(mac_ctx,
13089  						rnr_session->curr_op_freq,
13090  						rnr_session->ch_width,
13091  						ch_offset);
13092  
13093  	psd_power = wlan_mlme_get_sap_psd_for_20mhz(rnr_session->vdev);
13094  
13095  	dot11f->op_class = reg_class;
13096  	dot11f->channel_num = wlan_reg_freq_to_chan(mac_ctx->pdev,
13097  						    rnr_session->curr_op_freq);
13098  	dot11f->tbtt_info_count = 0;
13099  	dot11f->tbtt_info_len = tbtt_len;
13100  
13101  	switch (tbtt_len) {
13102  	case 7:
13103  		dot11f->tbtt_info.tbtt_info_7.tbtt_offset =
13104  						WLAN_RNR_TBTT_OFFSET_INVALID;
13105  		qdf_mem_copy(dot11f->tbtt_info.tbtt_info_7.bssid,
13106  			     rnr_session->self_mac_addr, sizeof(tSirMacAddr));
13107  		break;
13108  	case 9:
13109  		dot11f->tbtt_info.tbtt_info_9.tbtt_offset =
13110  						WLAN_RNR_TBTT_OFFSET_INVALID;
13111  		qdf_mem_copy(dot11f->tbtt_info.tbtt_info_9.bssid,
13112  			     rnr_session->self_mac_addr, sizeof(tSirMacAddr));
13113  		dot11f->tbtt_info.tbtt_info_9.bss_params =
13114  							WLAN_RNR_BSS_PARAM_COLOCATED_AP;
13115  		if (!lim_cmp_ssid(&rnr_session->ssId, pe_session))
13116  			dot11f->tbtt_info.tbtt_info_9.bss_params |=
13117  							WLAN_RNR_BSS_PARAM_SAME_SSID;
13118  		if (psd_power)
13119  			dot11f->tbtt_info.tbtt_info_9.psd_20mhz = psd_power;
13120  		else
13121  			dot11f->tbtt_info.tbtt_info_9.psd_20mhz = 127;
13122  		break;
13123  	case 13:
13124  		dot11f->tbtt_info.tbtt_info_13.tbtt_offset =
13125  						WLAN_RNR_TBTT_OFFSET_INVALID;
13126  		qdf_mem_copy(dot11f->tbtt_info.tbtt_info_13.bssid,
13127  			     rnr_session->self_mac_addr, sizeof(tSirMacAddr));
13128  
13129  		dot11f->tbtt_info.tbtt_info_13.short_ssid =
13130  			wlan_construct_shortssid(rnr_session->ssId.ssId,
13131  						 rnr_session->ssId.length);
13132  
13133  		dot11f->tbtt_info.tbtt_info_13.bss_params =
13134  						WLAN_RNR_BSS_PARAM_COLOCATED_AP;
13135  		if (!lim_cmp_ssid(&rnr_session->ssId, pe_session))
13136  			dot11f->tbtt_info.tbtt_info_13.bss_params |=
13137  							WLAN_RNR_BSS_PARAM_SAME_SSID;
13138  
13139  		if (psd_power)
13140  			dot11f->tbtt_info.tbtt_info_13.psd_20mhz = psd_power;
13141  		else
13142  			dot11f->tbtt_info.tbtt_info_13.psd_20mhz = 127;
13143  		break;
13144  	default:
13145  		dot11f->tbtt_info_len = 0;
13146  		return QDF_STATUS_E_FAILURE;
13147  	}
13148  
13149  	return QDF_STATUS_SUCCESS;
13150  }
13151  
13152  /**
13153   * lim_is_6g_vdev() - loop every vdev to populate 6g vdev id
13154   * @psoc: pointer to psoc
13155   * @obj: vdev
13156   * @args: vdev list to record 6G vdev id
13157   *
13158   * Return: void
13159   */
13160  static void lim_is_6g_vdev(struct wlan_objmgr_psoc *psoc, void *obj, void *args)
13161  {
13162  	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)obj;
13163  	uint8_t *vdev_id_list = (uint8_t *)args;
13164  	int i;
13165  
13166  	if (!vdev || (wlan_vdev_mlme_get_opmode(vdev) != QDF_SAP_MODE))
13167  		return;
13168  	if (QDF_IS_STATUS_ERROR(wlan_vdev_chan_config_valid(vdev)))
13169  		return;
13170  	if (!wlan_reg_is_6ghz_chan_freq(wlan_get_operation_chan_freq(vdev)))
13171  		return;
13172  
13173  	for (i = 0; i < MAX_NUMBER_OF_CONC_CONNECTIONS; i++) {
13174  		if (vdev_id_list[i] == INVALID_VDEV_ID) {
13175  			vdev_id_list[i] = wlan_vdev_get_id(vdev);
13176  			break;
13177  		}
13178  	}
13179  }
13180  
13181  void populate_dot11f_6g_rnr(struct mac_context *mac_ctx,
13182  			    struct pe_session *session,
13183  			    tDot11fIEreduced_neighbor_report *dot11f)
13184  {
13185  	struct pe_session *co_session;
13186  	struct wlan_objmgr_psoc *psoc;
13187  	int vdev_id;
13188  	uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
13189  
13190  	if (!session || !mac_ctx || !dot11f || !session->vdev) {
13191  		pe_err("Invalid params");
13192  		return;
13193  	}
13194  
13195  	psoc = wlan_vdev_get_psoc(session->vdev);
13196  	if (!psoc) {
13197  		pe_err("Invalid psoc");
13198  		return;
13199  	}
13200  
13201  	for (vdev_id = 0; vdev_id < MAX_NUMBER_OF_CONC_CONNECTIONS; vdev_id++)
13202  		vdev_id_list[vdev_id] = INVALID_VDEV_ID;
13203  
13204  	wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
13205  				     lim_is_6g_vdev,
13206  				     vdev_id_list, 1,
13207  				     WLAN_LEGACY_MAC_ID);
13208  
13209  	if (vdev_id_list[0] == INVALID_VDEV_ID)
13210  		return;
13211  
13212  	co_session = pe_find_session_by_vdev_id(mac_ctx,
13213  						vdev_id_list[0]);
13214  	if (!co_session) {
13215  		pe_err("Invalid co located session");
13216  		return;
13217  	}
13218  	populate_dot11f_rnr_tbtt_info(mac_ctx, session, co_session, dot11f,
13219  				      CURRENT_RNR_TBTT_INFO_LEN);
13220  	pe_debug("vdev id %d populate RNR IE with 6G vdev id %d op class %d chan num %d",
13221  		 wlan_vdev_get_id(session->vdev),
13222  		 wlan_vdev_get_id(co_session->vdev),
13223  		 dot11f->op_class, dot11f->channel_num);
13224  }
13225  
13226  QDF_STATUS populate_dot11f_bcn_prot_extcaps(struct mac_context *mac_ctx,
13227  					    struct pe_session *pe_session,
13228  					    tDot11fIEExtCap *dot11f)
13229  {
13230  	struct s_ext_cap *p_ext_cap;
13231  
13232  	/*
13233  	 * Some legacy STA might not connect with SAP broadcasting
13234  	 * EXTCAP with size greater than 8bytes.
13235  	 * In such cases, disable the beacon protection only if
13236  	 * a) disable_sap_bcn_prot ini is set
13237  	 * b) The SAP is not operating in 6 GHz or 11be profile
13238  	 * where BP is mandatory.
13239  	 */
13240  	if (pe_session->opmode != QDF_SAP_MODE ||
13241  	    !wlan_mlme_is_bcn_prot_disabled_for_sap(mac_ctx->psoc) ||
13242  	    WLAN_REG_IS_6GHZ_CHAN_FREQ(pe_session->curr_op_freq) ||
13243  	    pe_session->dot11mode > MLME_DOT11_MODE_11AX_ONLY)
13244  		return QDF_STATUS_SUCCESS;
13245  
13246  	p_ext_cap = (struct s_ext_cap *)dot11f->bytes;
13247  	if (!dot11f->present || !p_ext_cap->beacon_protection_enable)
13248  		return QDF_STATUS_SUCCESS;
13249  
13250  	p_ext_cap->beacon_protection_enable = 0;
13251  	dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f);
13252  
13253  	return QDF_STATUS_SUCCESS;
13254  }
13255  /* parser_api.c ends here. */
13256