1  /*
2   * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-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   *   \file csr_internal.h
22   *
23   *   Define internal data structure for MAC.
24   */
25  #ifndef CSRINTERNAL_H__
26  #define CSRINTERNAL_H__
27  
28  #include "qdf_status.h"
29  #include "qdf_lock.h"
30  
31  #include "qdf_mc_timer.h"
32  #include "csr_support.h"
33  #include "cds_reg_service.h"
34  #include "wlan_scan_public_structs.h"
35  #include "wlan_cm_roam_api.h"
36  #include "sir_types.h"
37  #include "wlan_mlme_public_struct.h"
38  
39  /* No of sessions to be supported, and a session is for Infra, BT-AMP */
40  #define CSR_IS_SESSION_VALID(mac, sessionId) \
41  	((sessionId) < WLAN_MAX_VDEVS && \
42  	 (mac != NULL) && \
43  	 ((mac)->roam.roamSession != NULL) && \
44  	 (mac)->roam.roamSession[(sessionId)].sessionActive)
45  
46  #define CSR_GET_SESSION(mac, sessionId) \
47  	(sessionId < WLAN_MAX_VDEVS ? \
48  	 &(mac)->roam.roamSession[(sessionId)] : NULL)
49  
50  #define CSR_IS_SESSION_ANY(sessionId) (sessionId == SME_SESSION_ID_ANY)
51  #define CSR_IS_DFS_CH_ROAM_ALLOWED(mac_ctx) \
52  	( \
53  	  ((((mac_ctx)->mlme_cfg->lfr.roaming_dfs_channel) != \
54  	    ROAMING_DFS_CHANNEL_DISABLED) ? true : false) \
55  	)
56  #define CSR_IS_ROAM_PREFER_5GHZ(mac)	\
57  	( \
58  	  ((mac)->mlme_cfg->lfr.roam_prefer_5ghz) \
59  	)
60  
61  /* Used to determine what to set to the MLME_DOT11_MODE */
62  enum csr_cfgdot11mode {
63  	eCSR_CFG_DOT11_MODE_ABG,
64  	eCSR_CFG_DOT11_MODE_11A,
65  	eCSR_CFG_DOT11_MODE_11B,
66  	eCSR_CFG_DOT11_MODE_11G,
67  	eCSR_CFG_DOT11_MODE_11N,
68  	eCSR_CFG_DOT11_MODE_11AC,
69  	eCSR_CFG_DOT11_MODE_11G_ONLY,
70  	eCSR_CFG_DOT11_MODE_11N_ONLY,
71  	eCSR_CFG_DOT11_MODE_11AC_ONLY,
72  	/* This value can never set to CFG. Its for CSR's internal use */
73  	eCSR_CFG_DOT11_MODE_AUTO,
74  	eCSR_CFG_DOT11_MODE_11AX,
75  	eCSR_CFG_DOT11_MODE_11AX_ONLY,
76  	eCSR_CFG_DOT11_MODE_11BE,
77  	eCSR_CFG_DOT11_MODE_11BE_ONLY,
78  	eCSR_CFG_DOT11_MODE_MAX,
79  };
80  
81  enum csr_roam_reason {
82  	eCsrForcedDisassocSta = 1,
83  	eCsrForcedDeauthSta,
84  };
85  
86  enum csr_roam_substate {
87  	eCSR_ROAM_SUBSTATE_NONE = 0,
88  	eCSR_ROAM_SUBSTATE_START_BSS_REQ,
89  	eCSR_ROAM_SUBSTATE_DISASSOC_REQ,
90  	eCSR_ROAM_SUBSTATE_STOP_BSS_REQ,
91  	eCSR_ROAM_SUBSTATE_DEAUTH_REQ,
92  	eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY,
93  	/*  max is 15 unless the bitfield is expanded... */
94  };
95  
96  enum csr_roam_state {
97  	eCSR_ROAMING_STATE_STOP = 0,
98  	eCSR_ROAMING_STATE_IDLE,
99  	eCSR_ROAMING_STATE_JOINING,
100  	eCSR_ROAMING_STATE_JOINED,
101  };
102  
103  enum csr_join_state {
104  	eCsrContinueRoaming,
105  	eCsrStopRoaming,
106  };
107  
108  enum csr_roam_wmstatus_changetypes {
109  	eCsrDisassociated,
110  	eCsrDeauthenticated
111  };
112  
113  struct csr_channel {
114  	uint8_t numChannels;
115  	uint32_t channel_freq_list[CFG_VALID_CHANNEL_LIST_LEN];
116  };
117  
118  struct roam_cmd {
119  	enum csr_roam_reason roamReason;
120  	tSirMacAddr peerMac;
121  	struct qdf_mac_addr peer_mld_addr;
122  	enum wlan_reason_code reason;
123  };
124  
125  struct wmstatus_changecmd {
126  	enum csr_roam_wmstatus_changetypes Type;
127  	union {
128  		struct deauth_ind DeauthIndMsg;
129  		struct disassoc_ind DisassocIndMsg;
130  	} u;
131  
132  };
133  
134  struct csr_config {
135  	uint32_t channelBondingMode24GHz;
136  	uint32_t channelBondingMode5GHz;
137  	eCsrPhyMode phyMode;
138  	enum csr_cfgdot11mode uCfgDot11Mode;
139  	uint32_t HeartbeatThresh50;
140  	enum wmm_user_mode WMMSupportMode;
141  	bool Is11eSupportEnabled;
142  	bool ProprietaryRatesEnabled;
143  	bool fenableMCCMode;
144  	bool mcc_rts_cts_prot_enable;
145  	bool mcc_bcast_prob_resp_enable;
146  	uint8_t fAllowMCCGODiffBI;
147  	uint32_t nVhtChannelWidth;
148  	bool send_smps_action;
149  #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
150  	uint8_t cc_switch_mode;
151  #endif
152  	bool obssEnabled;
153  	uint8_t conc_custom_rule1;
154  	uint8_t conc_custom_rule2;
155  	uint8_t is_sta_connection_in_5gz_enabled;
156  	enum force_1x1_type is_force_1x1;
157  	bool wep_tkip_in_he;
158  };
159  
160  struct csr_channel_powerinfo {
161  	tListElem link;
162  	uint32_t first_chan_freq;
163  	uint8_t numChannels;
164  	uint8_t txPower;
165  	uint8_t interChannelOffset;
166  };
167  
168  struct csr_scanstruct {
169  	struct csr_channel channels11d;
170  	struct channel_power defaultPowerTable[CFG_VALID_CHANNEL_LIST_LEN];
171  	struct csr_channel base_channels;  /* The channel base to work on */
172  	tDblLinkList channelPowerInfoList24;
173  	tDblLinkList channelPowerInfoList5G;
174  	/*
175  	 * Customer wants to optimize the scan time. Avoiding scans(passive)
176  	 * on DFS channels while swipping through both bands can save some time
177  	 * (apprx 1.3 sec)
178  	 */
179  	uint8_t fEnableDFSChnlScan;
180  	bool fcc_constraint;
181  	bool pending_channel_list_req;
182  };
183  
184  /*
185   * Save the connected information. This structure + connectedProfile
186   * should contain all information about the connection
187   */
188  struct csr_roam_connectedinfo {
189  	uint32_t nBeaconLength;
190  	uint32_t nAssocReqLength;
191  	uint32_t nAssocRspLength;
192  	/* len of the parsed RIC resp IEs received in reassoc response */
193  	uint32_t nRICRspLength;
194  #ifdef FEATURE_WLAN_ESE
195  	uint32_t nTspecIeLength;
196  #endif
197  	/*
198  	 * Point to a buffer contain the beacon, assoc req, assoc rsp frame, in
199  	 * that order user needs to use nBeaconLength, nAssocReqLength,
200  	 * nAssocRspLength to desice where each frame starts and ends.
201  	 */
202  	uint8_t *pbFrames;
203  };
204  
205  /**
206   * struct csr_disconnect_stats - Disconnect Stats per session
207   * @disconnection_cnt: total no. of disconnections
208   * @disconnection_by_app: diconnections triggered by application
209   * @disassoc_by_peer: disassoc sent by peer
210   * @deauth_by_peer: deauth sent by peer
211   * @bmiss: disconnect triggered by beacon miss
212   * @peer_kickout: disconnect triggered by peer kickout
213   */
214  struct csr_disconnect_stats {
215  	uint32_t disconnection_cnt;
216  	uint32_t disconnection_by_app;
217  	uint32_t disassoc_by_peer;
218  	uint32_t deauth_by_peer;
219  	uint32_t bmiss;
220  	uint32_t peer_kickout;
221  };
222  
223  /**
224   * struct csr_roam_session - CSR per-vdev context
225   * @vdev_id: ID of the vdev for which this entry is applicable
226   * @cb_mode: channel bonding mode
227   * @bcn_int: beacon interval
228   * @update_bcn_int: updated beacon interval
229   * @is_bcn_recv_start: Allow to process bcn recv indication
230   * @beacon_report_do_not_resume: Do not resume the beacon reporting after scan
231   */
232  struct csr_roam_session {
233  	uint8_t vdev_id;
234  	bool sessionActive;     /* true if it is used */
235  
236  	eCsrConnectState connectState;
237  	struct csr_roam_connectedinfo connectedInfo;
238  	tCsrRoamModifyProfileFields modifyProfileFields;
239  	/*
240  	 * to remember some parameters needed for START_BSS.
241  	 * All member must be set every time we try to join
242  	 */
243  	ePhyChanBondState cb_mode;
244  	uint16_t bcn_int;
245  	bool update_bcn_int;
246  
247  #ifdef WLAN_BCN_RECV_FEATURE
248  	bool is_bcn_recv_start;
249  	bool beacon_report_do_not_resume;
250  #endif
251  #ifdef FEATURE_WLAN_ESE
252  	bool isPrevApInfoValid;
253  	uint32_t roamTS1;
254  #endif
255  	bool ch_switch_in_progress;
256  	uint8_t nss;
257  	bool dhcp_done;
258  	struct csr_disconnect_stats disconnect_stats;
259  };
260  
261  struct csr_roamstruct {
262  	struct csr_config configParam;
263  	enum csr_roam_state curState[WLAN_MAX_VDEVS];
264  	enum csr_roam_substate curSubState[WLAN_MAX_VDEVS];
265  	/*
266  	 * This may or may not have the up-to-date valid channel list. It is
267  	 * used to get CFG_VALID_CHANNEL_LIST and not alloc mem all time
268  	 */
269  	int32_t sPendingCommands;
270  	struct csr_roam_session *roamSession;
271  #if defined(WLAN_LOGGING_SOCK_SVC_ENABLE) && \
272  	defined(CONNECTIVITY_PKTLOG)
273  	qdf_mc_timer_t packetdump_timer;
274  #endif
275  	spinlock_t roam_state_lock;
276  };
277  
278  #define CSR_IS_ROAM_STATE(mac, state, sessionId) \
279  			((state) == (mac)->roam.curState[sessionId])
280  #define CSR_IS_ROAM_STOP(mac, sessionId) \
281  		CSR_IS_ROAM_STATE((mac), eCSR_ROAMING_STATE_STOP, sessionId)
282  #define CSR_IS_ROAM_JOINING(mac, sessionId)  \
283  		CSR_IS_ROAM_STATE(mac, eCSR_ROAMING_STATE_JOINING, sessionId)
284  #define CSR_IS_ROAM_JOINED(mac, sessionId) \
285  		CSR_IS_ROAM_STATE(mac, eCSR_ROAMING_STATE_JOINED, sessionId)
286  #define CSR_IS_ROAM_SUBSTATE(mac, subState, sessionId) \
287  		((subState) == (mac)->roam.curSubState[sessionId])
288  #define CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ(mac, sessionId) \
289  		CSR_IS_ROAM_SUBSTATE((mac), eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId)
290  #define CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ(mac, sessionId) \
291  		CSR_IS_ROAM_SUBSTATE((mac), \
292  			eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId)
293  #define CSR_IS_ROAM_SUBSTATE_START_BSS_REQ(mac, sessionId) \
294  		CSR_IS_ROAM_SUBSTATE((mac), \
295  			eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId)
296  #define CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ(mac, sessionId) \
297  		CSR_IS_ROAM_SUBSTATE((mac), \
298  			eCSR_ROAM_SUBSTATE_STOP_BSS_REQ, sessionId)
299  #define CSR_IS_ROAM_SUBSTATE_WAITFORKEY(mac, sessionId) \
300  		CSR_IS_ROAM_SUBSTATE((mac), \
301  			eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId)
302  
303  #define CSR_IS_PHY_MODE_DUAL_BAND(phyMode) \
304  	((eCSR_DOT11_MODE_abg & (phyMode)) || \
305  	 (eCSR_DOT11_MODE_11n & (phyMode)) || \
306  	 (eCSR_DOT11_MODE_11ac & (phyMode)) || \
307  	 (eCSR_DOT11_MODE_11ax & (phyMode)) || \
308  	 (eCSR_DOT11_MODE_11be & (phyMode)) || \
309  	 (eCSR_DOT11_MODE_AUTO & (phyMode)))
310  
311  #define CSR_IS_DOT11_MODE_11N(dot11mode) \
312  	((dot11mode == eCSR_CFG_DOT11_MODE_AUTO) || \
313  	 (dot11mode == eCSR_CFG_DOT11_MODE_11N) || \
314  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AC) || \
315  	 (dot11mode == eCSR_CFG_DOT11_MODE_11N_ONLY) || \
316  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AC_ONLY) || \
317  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AX) || \
318  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AX_ONLY) || \
319  	 (dot11mode == eCSR_CFG_DOT11_MODE_11BE) || \
320  	 (dot11mode == eCSR_CFG_DOT11_MODE_11BE_ONLY))
321  
322  #define CSR_IS_DOT11_MODE_11AC(dot11mode) \
323  	((dot11mode == eCSR_CFG_DOT11_MODE_AUTO) || \
324  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AC) || \
325  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AC_ONLY) || \
326  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AX) || \
327  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AX_ONLY) || \
328  	 (dot11mode == eCSR_CFG_DOT11_MODE_11BE) || \
329  	 (dot11mode == eCSR_CFG_DOT11_MODE_11BE_ONLY))
330  
331  #define CSR_IS_DOT11_MODE_11AX(dot11mode) \
332  	((dot11mode == eCSR_CFG_DOT11_MODE_AUTO) || \
333  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AX) || \
334  	 (dot11mode == eCSR_CFG_DOT11_MODE_11AX_ONLY) || \
335  	 (dot11mode == eCSR_CFG_DOT11_MODE_11BE) || \
336  	 (dot11mode == eCSR_CFG_DOT11_MODE_11BE_ONLY))
337  
338  #define CSR_IS_DOT11_MODE_11BE(dot11mode) \
339  	(((dot11mode) == eCSR_CFG_DOT11_MODE_AUTO) || \
340  	 ((dot11mode) == eCSR_CFG_DOT11_MODE_11BE) || \
341  	 ((dot11mode) == eCSR_CFG_DOT11_MODE_11BE_ONLY))
342  
343  #ifdef WLAN_FEATURE_11BE
344  #define CSR_IS_CFG_DOT11_PHY_MODE_11BE(dot11mode) \
345  	((dot11mode) == eCSR_CFG_DOT11_MODE_11BE)
346  
347  #define CSR_IS_CFG_DOT11_PHY_MODE_11BE_ONLY(dot11mode) \
348  	((dot11mode) == eCSR_CFG_DOT11_MODE_11BE_ONLY)
349  #else
350  #define CSR_IS_CFG_DOT11_PHY_MODE_11BE(dot11mode) 0
351  #define CSR_IS_CFG_DOT11_PHY_MODE_11BE_ONLY(dot11mode) 0
352  #endif
353  /*
354   * this function returns true if the NIC is operating exclusively in
355   * the 2.4 GHz band, meaning. it is NOT operating in the 5.0 GHz band.
356   */
357  #define CSR_IS_24_BAND_ONLY(mac) \
358  	(BIT(REG_BAND_2G) == (mac)->mlme_cfg->gen.band)
359  
360  #define CSR_IS_5G_BAND_ONLY(mac) \
361  	(BIT(REG_BAND_5G) == (mac)->mlme_cfg->gen.band)
362  
363  #define CSR_IS_RADIO_DUAL_BAND(mac) \
364  	((BIT(REG_BAND_2G) | BIT(REG_BAND_5G)) == \
365  		(mac)->mlme_cfg->gen.band_capability)
366  
367  #define CSR_IS_RADIO_BG_ONLY(mac) \
368  	(BIT(REG_BAND_2G) == (mac)->mlme_cfg->gen.band_capability)
369  
370  /*
371   * this function returns true if the NIC is operating exclusively in the 5.0 GHz
372   * band, meaning. it is NOT operating in the 2.4 GHz band
373   */
374  #define CSR_IS_RADIO_A_ONLY(mac) \
375  	(BAND_5G == (mac)->mlme_cfg->gen.band_capability)
376  /* this function returns true if the NIC is operating in both bands. */
377  #define CSR_IS_OPEARTING_DUAL_BAND(mac) \
378  	((BAND_ALL == (mac)->mlme_cfg->gen.band_capability) && \
379  		(BAND_ALL == (mac)->mlme_cfg->gen.band))
380  /*
381   * this function returns true if the NIC can operate in the 5.0 GHz band
382   * (could operate in the 2.4 GHz band also)
383   */
384  #define CSR_IS_OPERATING_A_BAND(mac) \
385  	(CSR_IS_OPEARTING_DUAL_BAND((mac)) || \
386  		CSR_IS_RADIO_A_ONLY((mac)) || CSR_IS_5G_BAND_ONLY((mac)))
387  
388  /*
389   * this function returns true if the NIC can operate in the 2.4 GHz band
390   * (could operate in the 5.0 GHz band also).
391   */
392  #define CSR_IS_OPERATING_BG_BAND(mac) \
393  	(CSR_IS_OPEARTING_DUAL_BAND((mac)) || \
394  		CSR_IS_RADIO_BG_ONLY((mac)) || CSR_IS_24_BAND_ONLY((mac)))
395  
396  #define CSR_IS_ADDTS_WHEN_ACMOFF_SUPPORTED(mac) \
397  	(mac->mlme_cfg->wmm_params.wmm_tspec_element.ts_acm_is_off)
398  
399  /**
400   * csr_get_vdev_dot11_mode() - get the supported dot11mode by vdev
401   * @mac_ctx:  pointer to global mac structure
402   * @vdev_id: vdev id
403   * @curr_dot11_mode: Current dot11 mode
404   *
405   * The function return the min of supported dot11 mode and vdev type dot11mode
406   * for given vdev type.
407   *
408   * Return:csr_cfgdot11mode
409   */
410  enum csr_cfgdot11mode
411  csr_get_vdev_dot11_mode(struct mac_context *mac,
412  			uint8_t vdev_id,
413  			enum csr_cfgdot11mode curr_dot11_mode);
414  
415  QDF_STATUS csr_get_channel_and_power_list(struct mac_context *mac);
416  
417  QDF_STATUS csr_set_modify_profile_fields(struct mac_context *mac,
418  		uint32_t sessionId, tCsrRoamModifyProfileFields *
419  		pModifyProfileFields);
420  QDF_STATUS csr_get_modify_profile_fields(struct mac_context *mac,
421  		uint32_t sessionId, tCsrRoamModifyProfileFields *
422  		pModifyProfileFields);
423  void csr_set_global_cfgs(struct mac_context *mac);
424  void csr_set_default_dot11_mode(struct mac_context *mac);
425  bool csr_is_conn_state_disconnected(struct mac_context *mac,
426  				    uint8_t vdev_id);
427  bool csr_is_conn_state_connected(struct mac_context *mac,
428  					       uint32_t sessionId);
429  bool csr_is_conn_state_wds(struct mac_context *mac, uint32_t sessionId);
430  bool csr_is_conn_state_connected_wds(struct mac_context *mac,
431  						    uint32_t sessionId);
432  bool csr_is_conn_state_disconnected_wds(struct mac_context *mac,
433  		uint32_t sessionId);
434  bool csr_is_any_session_in_connect_state(struct mac_context *mac);
435  bool csr_is_all_session_disconnected(struct mac_context *mac);
436  
437  bool csr_is_infra_ap_started(struct mac_context *mac);
438  bool csr_is_conn_state_connected_infra_ap(struct mac_context *mac,
439  		uint32_t sessionId);
440  QDF_STATUS csr_get_snr(struct mac_context *mac, tCsrSnrCallback callback,
441  			  struct qdf_mac_addr bssId, void *pContext);
442  QDF_STATUS csr_get_config_param(struct mac_context *mac,
443  					  struct csr_config_params *pParam);
444  QDF_STATUS csr_change_default_config_param(struct mac_context *mac,
445  		struct csr_config_params *pParam);
446  QDF_STATUS csr_msg_processor(struct mac_context *mac, void *msg_buf);
447  QDF_STATUS csr_open(struct mac_context *mac);
448  QDF_STATUS csr_init_chan_list(struct mac_context *mac);
449  QDF_STATUS csr_close(struct mac_context *mac);
450  QDF_STATUS csr_start(struct mac_context *mac);
451  QDF_STATUS csr_stop(struct mac_context *mac);
452  QDF_STATUS csr_ready(struct mac_context *mac);
453  
454  /**
455   * csr_get_concurrent_operation_freq() - To get concurrent operating freq
456   * @mac_ctx: Pointer to mac context
457   *
458   * This routine will return operating freq on FIRST BSS that is
459   * active/operating to be used for concurrency mode.
460   * If other BSS is not up or not connected it will return 0
461   *
462   * Return: uint32_t
463   */
464  uint32_t csr_get_concurrent_operation_freq(struct mac_context *mac_ctx);
465  
466  /**
467   * csr_get_beaconing_concurrent_channel() - To get concurrent operating channel
468   * frequency of beaconing interface
469   * @mac_ctx: Pointer to mac context
470   * @vdev_id_to_skip: channel of which vdev id to skip
471   *
472   * This routine will return operating channel of active AP/GO channel
473   * and will skip the channel of vdev_id_to_skip.
474   * If other no requested mode is active it will return 0
475   *
476   * Return: uint32_t
477   */
478  uint32_t csr_get_beaconing_concurrent_channel(struct mac_context *mac_ctx,
479  					      uint8_t vdev_id_to_skip);
480  
481  #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
482  /**
483   * csr_check_concurrent_channel_overlap() - To check concurrent overlap chnls
484   * @mac: Pointer to mac context
485   * @sap_freq: Requested SAP freq
486   * @sap_phymode: SAP phy mode
487   * @cc_switch_mode: concurrent switch mode
488   * @vdev_id: vdev id of SAP/GO requesting
489   *
490   * This routine will be called to check concurrent overlap channels
491   *
492   * Return: uint16_t
493   */
494  uint16_t csr_check_concurrent_channel_overlap(struct mac_context *mac,
495  				uint32_t sap_freq, eCsrPhyMode sap_phymode,
496  				uint8_t cc_switch_mode, uint8_t vdev_id);
497  #endif
498  
499  /* Returns whether the current association is a 11r assoc or not */
500  bool csr_roam_is11r_assoc(struct mac_context *mac, uint8_t sessionId);
501  
502  #ifdef FEATURE_WLAN_ESE
503  /* Returns whether the current association is a ESE assoc or not */
504  bool csr_roam_is_ese_assoc(struct mac_context *mac, uint32_t sessionId);
505  QDF_STATUS csr_get_tsm_stats(struct mac_context *mac,
506  		tCsrTsmStatsCallback callback,
507  		struct qdf_mac_addr bssId,
508  		void *pContext, uint8_t tid);
509  #endif
510  
511  /**
512   * csr_send_channel_change_req() - Post channel change request to LIM
513   * @mac : mac context
514   * @req : channel change request
515   *
516   * This API is primarily used to post Channel Change Req for SAP
517   *
518   *  Return: QDF_STATUS
519   */
520  QDF_STATUS csr_send_channel_change_req(struct mac_context *mac,
521  				       struct channel_change_req *req);
522  
523  /* Post Beacon Tx Start Indication */
524  QDF_STATUS csr_roam_start_beacon_req(struct mac_context *mac,
525  		struct qdf_mac_addr bssid, uint8_t dfsCacWaitStatus);
526  
527  /**
528   * csr_roam_send_chan_sw_ie_request() - Request to transmit CSA IE
529   * @mac_ctx:        Global MAC context
530   * @bssid:          BSSID
531   * @target_chan_freq: Channel frequency on which to send the IE
532   * @csa_ie_reqd:    Include/Exclude CSA IE.
533   * @ch_params:  operating Channel related information
534   * @new_cac_ms: cac duration of new channel
535   *
536   * This function sends request to transmit channel switch announcement
537   * IE to lower layers
538   *
539   * Return: success or failure
540   **/
541  QDF_STATUS csr_roam_send_chan_sw_ie_request(struct mac_context *mac,
542  					    struct qdf_mac_addr bssid,
543  					    uint32_t target_chan_freq,
544  					    uint8_t csaIeReqd,
545  					    struct ch_params *ch_params,
546  					    uint32_t new_cac_ms);
547  
548  QDF_STATUS csr_roam_modify_add_ies(struct mac_context *mac,
549  					tSirModifyIE *pModifyIE,
550  				   eUpdateIEsType updateType);
551  QDF_STATUS
552  csr_roam_update_add_ies(struct mac_context *mac,
553  		tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType);
554  
555  bool csr_nonscan_active_ll_remove_entry(
556  			struct mac_context *mac_ctx,
557  			tListElem *pEntryToRemove, bool inter_locked);
558  tListElem *csr_nonscan_active_ll_peek_head(
559  			struct mac_context *mac_ctx,
560  			bool inter_locked);
561  tListElem *csr_nonscan_pending_ll_peek_head(
562  			struct mac_context *mac_ctx,
563  			bool inter_locked);
564  tListElem *csr_nonscan_pending_ll_next(
565  			struct mac_context *mac_ctx,
566  		tListElem *entry, bool inter_locked);
567  
568  /**
569   * csr_purge_pdev_all_ser_cmd_list() - purge all scan and non-scan
570   * active and pending cmds for all vdevs in pdev
571   * @mac_ctx: pointer to global MAC context
572   *
573   * Return : none
574   */
575  void csr_purge_pdev_all_ser_cmd_list(struct mac_context *mac_ctx);
576  
577  void csr_roam_substate_change(
578  			struct mac_context *mac, enum csr_roam_substate
579  					NewSubstate, uint32_t sessionId);
580  
581  bool csr_is_ndi_started(struct mac_context *mac_ctx, uint32_t session_id);
582  
583  QDF_STATUS csr_roam_update_config(
584  			struct mac_context *mac_ctx, uint8_t session_id,
585  				  uint16_t capab, uint32_t value);
586  
587  /**
588   * csr_is_mcc_channel() - check if using the channel results into MCC
589   * @mac_ctx: pointer to global MAC context
590   * @chan_freq: channel frequency to check for MCC scenario
591   *
592   * Return : true if channel causes MCC, else false
593   */
594  bool csr_is_mcc_channel(struct mac_context *mac_ctx, uint32_t chan_freq);
595  
596  #ifdef WLAN_FEATURE_ROAM_OFFLOAD
597  /**
598   * csr_roam_auth_offload_callback() - Registered CSR Callback function to handle
599   * WPA3 roam pre-auth event from firmware.
600   * @mac_ctx: Global mac context pointer
601   * @vdev_id: Vdev id
602   * @bssid: candidate AP bssid
603   * @akm: candidate AKM
604   */
605  QDF_STATUS
606  csr_roam_auth_offload_callback(struct mac_context *mac_ctx,
607  			       uint8_t vdev_id,
608  			       struct qdf_mac_addr bssid,
609  			       uint32_t akm);
610  #else
611  static inline QDF_STATUS
csr_roam_auth_offload_callback(struct mac_context * mac_ctx,uint8_t vdev_id,struct qdf_mac_addr bssid,uint32_t akm)612  csr_roam_auth_offload_callback(struct mac_context *mac_ctx,
613  			       uint8_t vdev_id,
614  			       struct qdf_mac_addr bssid,
615  			       uint32_t akm)
616  {
617  	return QDF_STATUS_E_NOSUPPORT;
618  }
619  #endif
620  
621  /**
622   * csr_invoke_neighbor_report_request - Send neighbor report invoke command to
623   *					WMA
624   * @mac_ctx: MAC context
625   * @session_id: session id
626   *
627   * API called from IW to invoke neighbor report request to WMA then to FW
628   *
629   * Return: QDF_STATUS
630   */
631  QDF_STATUS csr_invoke_neighbor_report_request(uint8_t session_id,
632  				struct sRrmNeighborReq *neighbor_report_req,
633  				bool send_resp_to_host);
634  
635  /**
636   * csr_set_vdev_ies_per_band() - sends the per band IEs to vdev
637   * @mac_handle: Opaque handle to the global MAC context
638   * @vdev_id: vdev_id for which IE is targeted
639   * @device_mode: vdev mode
640   *
641   * Return: None
642   */
643  void csr_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id,
644  			       enum QDF_OPMODE device_mode);
645  #endif
646