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