xref: /wlan-driver/qcacld-3.0/core/sme/src/csr/csr_util.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /*
21*5113495bSYour Name  * DOC: csr_util.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * Implementation supporting routines for CSR.
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include "ani_global.h"
27*5113495bSYour Name 
28*5113495bSYour Name #include "csr_support.h"
29*5113495bSYour Name #include "csr_inside_api.h"
30*5113495bSYour Name #include "sme_qos_internal.h"
31*5113495bSYour Name #include "wma_types.h"
32*5113495bSYour Name #include "cds_utils.h"
33*5113495bSYour Name #include "wlan_policy_mgr_api.h"
34*5113495bSYour Name #include "wlan_serialization_legacy_api.h"
35*5113495bSYour Name #include "wlan_reg_services_api.h"
36*5113495bSYour Name #include "wlan_crypto_global_api.h"
37*5113495bSYour Name #include "wlan_cm_roam_api.h"
38*5113495bSYour Name #include <../../core/src/wlan_cm_vdev_api.h>
39*5113495bSYour Name #include <wlan_mlo_mgr_public_structs.h>
40*5113495bSYour Name #include "wlan_objmgr_vdev_obj.h"
41*5113495bSYour Name #include "wlan_policy_mgr_ll_sap.h"
42*5113495bSYour Name 
43*5113495bSYour Name #define CASE_RETURN_STR(n) {\
44*5113495bSYour Name 	case (n): return (# n);\
45*5113495bSYour Name }
46*5113495bSYour Name 
get_e_roam_cmd_status_str(eRoamCmdStatus val)47*5113495bSYour Name const char *get_e_roam_cmd_status_str(eRoamCmdStatus val)
48*5113495bSYour Name {
49*5113495bSYour Name 	switch (val) {
50*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_LOSTLINK);
51*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_MIC_ERROR_IND);
52*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_SET_KEY_COMPLETE);
53*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_INFRA_IND);
54*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_WPS_PBC_PROBE_REQ_IND);
55*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS);
56*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_SEND_P2P_STOP_BSS);
57*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_UNPROT_MGMT_FRAME_IND);
58*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
59*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_TSM_IE_IND);
60*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_ESE_ADJ_AP_REPORT_IND);
61*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_ESE_BCN_REPORT_IND);
62*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
63*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_DFS_RADAR_IND);
64*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_SET_CHANNEL_RSP);
65*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_DFS_CHAN_SW_NOTIFY);
66*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_EXT_CHG_CHNL_IND);
67*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_STA_CHANNEL_SWITCH);
68*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_NDP_STATUS_UPDATE);
69*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_CHANNEL_COMPLETE_IND);
70*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_SAE_COMPUTE);
71*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_CHANNEL_INFO_EVENT_IND);
72*5113495bSYour Name 	default:
73*5113495bSYour Name 		return "unknown";
74*5113495bSYour Name 	}
75*5113495bSYour Name }
76*5113495bSYour Name 
get_e_csr_roam_result_str(eCsrRoamResult val)77*5113495bSYour Name const char *get_e_csr_roam_result_str(eCsrRoamResult val)
78*5113495bSYour Name {
79*5113495bSYour Name 	switch (val) {
80*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NONE);
81*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_FAILURE);
82*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_ASSOCIATED);
83*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NOT_ASSOCIATED);
84*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_MIC_FAILURE);
85*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_FORCED);
86*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_DISASSOC_IND);
87*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_DEAUTH_IND);
88*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_CAP_CHANGED);
89*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_LOSTLINK);
90*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_MIC_ERROR_UNICAST);
91*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_MIC_ERROR_GROUP);
92*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_AUTHENTICATED);
93*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NEW_RSN_BSS);
94*5113495bSYour Name  #ifdef FEATURE_WLAN_WAPI
95*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NEW_WAPI_BSS);
96*5113495bSYour Name  #endif /* FEATURE_WLAN_WAPI */
97*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_INFRA_STARTED);
98*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_INFRA_START_FAILED);
99*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_INFRA_STOPPED);
100*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
101*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
102*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
103*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
104*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_SEND_ACTION_FAIL);
105*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
106*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
107*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_ADD_TDLS_PEER);
108*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_UPDATE_TDLS_PEER);
109*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_DELETE_TDLS_PEER);
110*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND);
111*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND);
112*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP);
113*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_TDLS_SHOULD_DISCOVER);
114*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_TDLS_SHOULD_TEARDOWN);
115*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_TDLS_SHOULD_PEER_DISCONNECTED);
116*5113495bSYour Name 		CASE_RETURN_STR
117*5113495bSYour Name 			(eCSR_ROAM_RESULT_TDLS_CONNECTION_TRACKER_NOTIFICATION);
118*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND);
119*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS);
120*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE);
121*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_CSA_RESTART_RSP);
122*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS);
123*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND);
124*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDI_CREATE_RSP);
125*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDI_DELETE_RSP);
126*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_INITIATOR_RSP);
127*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_NEW_PEER_IND);
128*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_CONFIRM_IND);
129*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_INDICATION);
130*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_SCHED_UPDATE_RSP);
131*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_RESPONDER_RSP);
132*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_END_RSP);
133*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_PEER_DEPARTED_IND);
134*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_NDP_END_IND);
135*5113495bSYour Name 		CASE_RETURN_STR(eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE);
136*5113495bSYour Name 	default:
137*5113495bSYour Name 		return "unknown";
138*5113495bSYour Name 	}
139*5113495bSYour Name }
140*5113495bSYour Name 
csr_phy_mode_str(eCsrPhyMode phy_mode)141*5113495bSYour Name const char *csr_phy_mode_str(eCsrPhyMode phy_mode)
142*5113495bSYour Name {
143*5113495bSYour Name 	switch (phy_mode) {
144*5113495bSYour Name 	case eCSR_DOT11_MODE_abg:
145*5113495bSYour Name 		return "abg";
146*5113495bSYour Name 	case eCSR_DOT11_MODE_11a:
147*5113495bSYour Name 		return "11a";
148*5113495bSYour Name 	case eCSR_DOT11_MODE_11b:
149*5113495bSYour Name 		return "11b";
150*5113495bSYour Name 	case eCSR_DOT11_MODE_11g:
151*5113495bSYour Name 		return "11g";
152*5113495bSYour Name 	case eCSR_DOT11_MODE_11n:
153*5113495bSYour Name 		return "11n";
154*5113495bSYour Name 	case eCSR_DOT11_MODE_11g_ONLY:
155*5113495bSYour Name 		return "11g_only";
156*5113495bSYour Name 	case eCSR_DOT11_MODE_11n_ONLY:
157*5113495bSYour Name 		return "11n_only";
158*5113495bSYour Name 	case eCSR_DOT11_MODE_11b_ONLY:
159*5113495bSYour Name 		return "11b_only";
160*5113495bSYour Name 	case eCSR_DOT11_MODE_11ac:
161*5113495bSYour Name 		return "11ac";
162*5113495bSYour Name 	case eCSR_DOT11_MODE_11ac_ONLY:
163*5113495bSYour Name 		return "11ac_only";
164*5113495bSYour Name 	case eCSR_DOT11_MODE_AUTO:
165*5113495bSYour Name 		return "auto";
166*5113495bSYour Name 	case eCSR_DOT11_MODE_11ax:
167*5113495bSYour Name 		return "11ax";
168*5113495bSYour Name 	case eCSR_DOT11_MODE_11ax_ONLY:
169*5113495bSYour Name 		return "11ax_only";
170*5113495bSYour Name 	case eCSR_DOT11_MODE_11be:
171*5113495bSYour Name 		return "11be";
172*5113495bSYour Name 	case eCSR_DOT11_MODE_11be_ONLY:
173*5113495bSYour Name 		return "11be_only";
174*5113495bSYour Name 	default:
175*5113495bSYour Name 		return "unknown";
176*5113495bSYour Name 	}
177*5113495bSYour Name }
178*5113495bSYour Name 
csr_purge_pdev_all_ser_cmd_list(struct mac_context * mac_ctx)179*5113495bSYour Name void csr_purge_pdev_all_ser_cmd_list(struct mac_context *mac_ctx)
180*5113495bSYour Name {
181*5113495bSYour Name 	wlan_serialization_purge_all_pdev_cmd(mac_ctx->pdev);
182*5113495bSYour Name }
183*5113495bSYour Name 
csr_nonscan_active_ll_peek_head(struct mac_context * mac_ctx,bool inter_locked)184*5113495bSYour Name tListElem *csr_nonscan_active_ll_peek_head(struct mac_context *mac_ctx,
185*5113495bSYour Name 					   bool inter_locked)
186*5113495bSYour Name {
187*5113495bSYour Name 	struct wlan_serialization_command *cmd;
188*5113495bSYour Name 	tSmeCmd *sme_cmd;
189*5113495bSYour Name 
190*5113495bSYour Name 	cmd = wlan_serialization_peek_head_active_cmd_using_psoc(mac_ctx->psoc,
191*5113495bSYour Name 								 false);
192*5113495bSYour Name 	if (!cmd || cmd->source != WLAN_UMAC_COMP_MLME)
193*5113495bSYour Name 		return NULL;
194*5113495bSYour Name 
195*5113495bSYour Name 	sme_cmd = cmd->umac_cmd;
196*5113495bSYour Name 
197*5113495bSYour Name 	return &sme_cmd->Link;
198*5113495bSYour Name }
199*5113495bSYour Name 
csr_nonscan_pending_ll_peek_head(struct mac_context * mac_ctx,bool inter_locked)200*5113495bSYour Name tListElem *csr_nonscan_pending_ll_peek_head(struct mac_context *mac_ctx,
201*5113495bSYour Name 					    bool inter_locked)
202*5113495bSYour Name {
203*5113495bSYour Name 	struct wlan_serialization_command *cmd;
204*5113495bSYour Name 	tSmeCmd *sme_cmd;
205*5113495bSYour Name 
206*5113495bSYour Name 	cmd = wlan_serialization_peek_head_pending_cmd_using_psoc(mac_ctx->psoc,
207*5113495bSYour Name 								  false);
208*5113495bSYour Name 	while (cmd) {
209*5113495bSYour Name 		if (cmd->source == WLAN_UMAC_COMP_MLME) {
210*5113495bSYour Name 			sme_cmd = cmd->umac_cmd;
211*5113495bSYour Name 			return &sme_cmd->Link;
212*5113495bSYour Name 		}
213*5113495bSYour Name 		cmd = wlan_serialization_get_pending_list_next_node_using_psoc(
214*5113495bSYour Name 						mac_ctx->psoc, cmd, false);
215*5113495bSYour Name 	}
216*5113495bSYour Name 
217*5113495bSYour Name 	return NULL;
218*5113495bSYour Name }
219*5113495bSYour Name 
csr_nonscan_active_ll_remove_entry(struct mac_context * mac_ctx,tListElem * entry,bool inter_locked)220*5113495bSYour Name bool csr_nonscan_active_ll_remove_entry(struct mac_context *mac_ctx,
221*5113495bSYour Name 					tListElem *entry, bool inter_locked)
222*5113495bSYour Name {
223*5113495bSYour Name 	tListElem *head;
224*5113495bSYour Name 
225*5113495bSYour Name 	head = csr_nonscan_active_ll_peek_head(mac_ctx, inter_locked);
226*5113495bSYour Name 	if (head == entry)
227*5113495bSYour Name 	return true;
228*5113495bSYour Name 
229*5113495bSYour Name 	return false;
230*5113495bSYour Name }
231*5113495bSYour Name 
csr_nonscan_pending_ll_next(struct mac_context * mac_ctx,tListElem * entry,bool inter_locked)232*5113495bSYour Name tListElem *csr_nonscan_pending_ll_next(struct mac_context *mac_ctx,
233*5113495bSYour Name 				       tListElem *entry, bool inter_locked)
234*5113495bSYour Name {
235*5113495bSYour Name 	tSmeCmd *sme_cmd;
236*5113495bSYour Name 	struct wlan_serialization_command cmd, *tcmd;
237*5113495bSYour Name 
238*5113495bSYour Name 	if (!entry)
239*5113495bSYour Name 		return NULL;
240*5113495bSYour Name 	sme_cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
241*5113495bSYour Name 	cmd.cmd_id = sme_cmd->cmd_id;
242*5113495bSYour Name 	cmd.cmd_type = csr_get_cmd_type(sme_cmd);
243*5113495bSYour Name 	cmd.vdev = wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
244*5113495bSYour Name 				mac_ctx->psoc,
245*5113495bSYour Name 				sme_cmd->vdev_id, WLAN_LEGACY_SME_ID);
246*5113495bSYour Name 	tcmd = wlan_serialization_get_pending_list_next_node_using_psoc(
247*5113495bSYour Name 				mac_ctx->psoc, &cmd, false);
248*5113495bSYour Name 	if (cmd.vdev)
249*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(cmd.vdev, WLAN_LEGACY_SME_ID);
250*5113495bSYour Name 	while (tcmd) {
251*5113495bSYour Name 		if (tcmd->source == WLAN_UMAC_COMP_MLME) {
252*5113495bSYour Name 			sme_cmd = tcmd->umac_cmd;
253*5113495bSYour Name 			return &sme_cmd->Link;
254*5113495bSYour Name 		}
255*5113495bSYour Name 		tcmd = wlan_serialization_get_pending_list_next_node_using_psoc(
256*5113495bSYour Name 						mac_ctx->psoc, tcmd, false);
257*5113495bSYour Name 	}
258*5113495bSYour Name 
259*5113495bSYour Name 	return NULL;
260*5113495bSYour Name }
261*5113495bSYour Name 
csr_is_conn_state(struct mac_context * mac_ctx,uint32_t session_id,eCsrConnectState state)262*5113495bSYour Name static bool csr_is_conn_state(struct mac_context *mac_ctx, uint32_t session_id,
263*5113495bSYour Name 			      eCsrConnectState state)
264*5113495bSYour Name {
265*5113495bSYour Name 	QDF_BUG(session_id < WLAN_MAX_VDEVS);
266*5113495bSYour Name 	if (session_id >= WLAN_MAX_VDEVS)
267*5113495bSYour Name 		return false;
268*5113495bSYour Name 
269*5113495bSYour Name 	return mac_ctx->roam.roamSession[session_id].connectState == state;
270*5113495bSYour Name }
271*5113495bSYour Name 
csr_is_conn_state_connected(struct mac_context * mac,uint32_t sessionId)272*5113495bSYour Name bool csr_is_conn_state_connected(struct mac_context *mac, uint32_t sessionId)
273*5113495bSYour Name {
274*5113495bSYour Name 	return cm_is_vdevid_connected(mac->pdev, sessionId) ||
275*5113495bSYour Name 	       csr_is_conn_state_connected_wds(mac, sessionId);
276*5113495bSYour Name }
277*5113495bSYour Name 
csr_is_conn_state_connected_wds(struct mac_context * mac_ctx,uint32_t session_id)278*5113495bSYour Name bool csr_is_conn_state_connected_wds(struct mac_context *mac_ctx,
279*5113495bSYour Name 				     uint32_t session_id)
280*5113495bSYour Name {
281*5113495bSYour Name 	return csr_is_conn_state(mac_ctx, session_id,
282*5113495bSYour Name 				 eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED);
283*5113495bSYour Name }
284*5113495bSYour Name 
csr_is_conn_state_connected_infra_ap(struct mac_context * mac_ctx,uint32_t session_id)285*5113495bSYour Name bool csr_is_conn_state_connected_infra_ap(struct mac_context *mac_ctx,
286*5113495bSYour Name 					  uint32_t session_id)
287*5113495bSYour Name {
288*5113495bSYour Name 	return csr_is_conn_state(mac_ctx, session_id,
289*5113495bSYour Name 				 eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED) ||
290*5113495bSYour Name 		csr_is_conn_state(mac_ctx, session_id,
291*5113495bSYour Name 				  eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED);
292*5113495bSYour Name }
293*5113495bSYour Name 
csr_is_conn_state_disconnected_wds(struct mac_context * mac_ctx,uint32_t session_id)294*5113495bSYour Name bool csr_is_conn_state_disconnected_wds(struct mac_context *mac_ctx,
295*5113495bSYour Name 					uint32_t session_id)
296*5113495bSYour Name {
297*5113495bSYour Name 	return csr_is_conn_state(mac_ctx, session_id,
298*5113495bSYour Name 				 eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED);
299*5113495bSYour Name }
300*5113495bSYour Name 
csr_is_conn_state_wds(struct mac_context * mac,uint32_t sessionId)301*5113495bSYour Name bool csr_is_conn_state_wds(struct mac_context *mac, uint32_t sessionId)
302*5113495bSYour Name {
303*5113495bSYour Name 	return csr_is_conn_state_connected_wds(mac, sessionId) ||
304*5113495bSYour Name 	       csr_is_conn_state_disconnected_wds(mac, sessionId);
305*5113495bSYour Name }
306*5113495bSYour Name 
cm_csr_get_vdev_dot11_mode(uint8_t vdev_id)307*5113495bSYour Name uint16_t cm_csr_get_vdev_dot11_mode(uint8_t vdev_id)
308*5113495bSYour Name {
309*5113495bSYour Name 	mac_handle_t mac_handle;
310*5113495bSYour Name 	struct mac_context *mac_ctx;
311*5113495bSYour Name 	enum csr_cfgdot11mode curr_dot11_mode;
312*5113495bSYour Name 
313*5113495bSYour Name 	mac_handle = cds_get_context(QDF_MODULE_ID_SME);
314*5113495bSYour Name 	mac_ctx = MAC_CONTEXT(mac_handle);
315*5113495bSYour Name 	if (!mac_ctx)
316*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_AUTO;
317*5113495bSYour Name 
318*5113495bSYour Name 	curr_dot11_mode = mac_ctx->roam.configParam.uCfgDot11Mode;
319*5113495bSYour Name 
320*5113495bSYour Name 	return csr_get_vdev_dot11_mode(mac_ctx, vdev_id, curr_dot11_mode);
321*5113495bSYour Name }
322*5113495bSYour Name 
323*5113495bSYour Name enum csr_cfgdot11mode
csr_get_vdev_dot11_mode(struct mac_context * mac,uint8_t vdev_id,enum csr_cfgdot11mode curr_dot11_mode)324*5113495bSYour Name csr_get_vdev_dot11_mode(struct mac_context *mac,
325*5113495bSYour Name 			uint8_t vdev_id,
326*5113495bSYour Name 			enum csr_cfgdot11mode curr_dot11_mode)
327*5113495bSYour Name {
328*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
329*5113495bSYour Name 	struct vdev_mlme_obj *vdev_mlme;
330*5113495bSYour Name 	enum mlme_vdev_dot11_mode vdev_dot11_mode;
331*5113495bSYour Name 	enum csr_cfgdot11mode dot11_mode = curr_dot11_mode;
332*5113495bSYour Name 
333*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, vdev_id,
334*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
335*5113495bSYour Name 	if (!vdev)
336*5113495bSYour Name 		return curr_dot11_mode;
337*5113495bSYour Name 
338*5113495bSYour Name 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
339*5113495bSYour Name 	if (!vdev_mlme) {
340*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
341*5113495bSYour Name 		return curr_dot11_mode;
342*5113495bSYour Name 	}
343*5113495bSYour Name 
344*5113495bSYour Name 	vdev_dot11_mode = vdev_mlme->proto.vdev_dot11_mode;
345*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
346*5113495bSYour Name 
347*5113495bSYour Name 	if (vdev_dot11_mode == MLME_VDEV_DOT11_MODE_AUTO)
348*5113495bSYour Name 		dot11_mode = curr_dot11_mode;
349*5113495bSYour Name 
350*5113495bSYour Name 	if (CSR_IS_DOT11_MODE_11N(curr_dot11_mode) &&
351*5113495bSYour Name 	    vdev_dot11_mode == MLME_VDEV_DOT11_MODE_11N)
352*5113495bSYour Name 		dot11_mode = eCSR_CFG_DOT11_MODE_11N;
353*5113495bSYour Name 
354*5113495bSYour Name 	if (CSR_IS_DOT11_MODE_11AC(curr_dot11_mode) &&
355*5113495bSYour Name 	    vdev_dot11_mode == MLME_VDEV_DOT11_MODE_11AC)
356*5113495bSYour Name 		dot11_mode = eCSR_CFG_DOT11_MODE_11AC;
357*5113495bSYour Name 
358*5113495bSYour Name 	if (CSR_IS_DOT11_MODE_11AX(curr_dot11_mode) &&
359*5113495bSYour Name 	    vdev_dot11_mode == MLME_VDEV_DOT11_MODE_11AX)
360*5113495bSYour Name 		dot11_mode = eCSR_CFG_DOT11_MODE_11AX;
361*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
362*5113495bSYour Name 	if (CSR_IS_DOT11_MODE_11BE(curr_dot11_mode) &&
363*5113495bSYour Name 	    vdev_dot11_mode == MLME_VDEV_DOT11_MODE_11BE)
364*5113495bSYour Name 		dot11_mode = eCSR_CFG_DOT11_MODE_11BE;
365*5113495bSYour Name #endif
366*5113495bSYour Name 	sme_debug("INI vdev_dot11_mode %d new dot11_mode %d",
367*5113495bSYour Name 		  vdev_dot11_mode, dot11_mode);
368*5113495bSYour Name 
369*5113495bSYour Name 	return dot11_mode;
370*5113495bSYour Name }
371*5113495bSYour Name 
csr_is_conn_state_ap(struct mac_context * mac,uint32_t sessionId)372*5113495bSYour Name static bool csr_is_conn_state_ap(struct mac_context *mac, uint32_t sessionId)
373*5113495bSYour Name {
374*5113495bSYour Name 	enum QDF_OPMODE opmode;
375*5113495bSYour Name 
376*5113495bSYour Name 	opmode = wlan_get_opmode_from_vdev_id(mac->pdev, sessionId);
377*5113495bSYour Name 	if (opmode == QDF_SAP_MODE || opmode == QDF_P2P_GO_MODE)
378*5113495bSYour Name 		return true;
379*5113495bSYour Name 
380*5113495bSYour Name 	return false;
381*5113495bSYour Name }
382*5113495bSYour Name 
csr_is_any_session_in_connect_state(struct mac_context * mac)383*5113495bSYour Name bool csr_is_any_session_in_connect_state(struct mac_context *mac)
384*5113495bSYour Name {
385*5113495bSYour Name 	uint32_t i;
386*5113495bSYour Name 
387*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_VDEVS; i++) {
388*5113495bSYour Name 		if (CSR_IS_SESSION_VALID(mac, i) &&
389*5113495bSYour Name 		    (cm_is_vdevid_connected(mac->pdev, i) ||
390*5113495bSYour Name 		     csr_is_conn_state_ap(mac, i))) {
391*5113495bSYour Name 			return true;
392*5113495bSYour Name 		}
393*5113495bSYour Name 	}
394*5113495bSYour Name 
395*5113495bSYour Name 	return false;
396*5113495bSYour Name }
397*5113495bSYour Name 
csr_get_concurrent_operation_freq(struct mac_context * mac_ctx)398*5113495bSYour Name qdf_freq_t csr_get_concurrent_operation_freq(struct mac_context *mac_ctx)
399*5113495bSYour Name {
400*5113495bSYour Name 	uint8_t i = 0;
401*5113495bSYour Name 	qdf_freq_t freq;
402*5113495bSYour Name 	enum QDF_OPMODE op_mode;
403*5113495bSYour Name 
404*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_VDEVS; i++) {
405*5113495bSYour Name 		op_mode = wlan_get_opmode_from_vdev_id(mac_ctx->pdev, i);
406*5113495bSYour Name 		/* check only for STA, CLI, GO and SAP */
407*5113495bSYour Name 		if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE &&
408*5113495bSYour Name 		    op_mode != QDF_P2P_GO_MODE && op_mode != QDF_SAP_MODE)
409*5113495bSYour Name 			continue;
410*5113495bSYour Name 
411*5113495bSYour Name 		freq = wlan_get_operation_chan_freq_vdev_id(mac_ctx->pdev, i);
412*5113495bSYour Name 		if (!freq)
413*5113495bSYour Name 			continue;
414*5113495bSYour Name 
415*5113495bSYour Name 		return freq;
416*5113495bSYour Name 	}
417*5113495bSYour Name 
418*5113495bSYour Name 	return 0;
419*5113495bSYour Name }
420*5113495bSYour Name 
csr_get_beaconing_concurrent_channel(struct mac_context * mac_ctx,uint8_t vdev_id_to_skip)421*5113495bSYour Name uint32_t csr_get_beaconing_concurrent_channel(struct mac_context *mac_ctx,
422*5113495bSYour Name 					     uint8_t vdev_id_to_skip)
423*5113495bSYour Name {
424*5113495bSYour Name 	struct csr_roam_session *session = NULL;
425*5113495bSYour Name 	uint8_t i = 0;
426*5113495bSYour Name 	enum QDF_OPMODE persona;
427*5113495bSYour Name 
428*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_VDEVS; i++) {
429*5113495bSYour Name 		if (i == vdev_id_to_skip)
430*5113495bSYour Name 			continue;
431*5113495bSYour Name 		if (!CSR_IS_SESSION_VALID(mac_ctx, i))
432*5113495bSYour Name 			continue;
433*5113495bSYour Name 		session = CSR_GET_SESSION(mac_ctx, i);
434*5113495bSYour Name 		persona = wlan_get_opmode_from_vdev_id(mac_ctx->pdev, i);
435*5113495bSYour Name 		if (((persona == QDF_P2P_GO_MODE) ||
436*5113495bSYour Name 		     (persona == QDF_SAP_MODE)) &&
437*5113495bSYour Name 		     (session->connectState !=
438*5113495bSYour Name 		      eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED))
439*5113495bSYour Name 			return wlan_get_operation_chan_freq_vdev_id(mac_ctx->pdev, i);
440*5113495bSYour Name 	}
441*5113495bSYour Name 
442*5113495bSYour Name 	return 0;
443*5113495bSYour Name }
444*5113495bSYour Name 
445*5113495bSYour Name #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
446*5113495bSYour Name 
447*5113495bSYour Name #define HALF_BW_OF(eCSR_bw_val) ((eCSR_bw_val)/2)
448*5113495bSYour Name 
449*5113495bSYour Name /* calculation of center channel based on V/HT BW and WIFI channel bw=5MHz) */
450*5113495bSYour Name 
451*5113495bSYour Name #define CSR_GET_HT40_PLUS_CCH(och) ((och) + 10)
452*5113495bSYour Name #define CSR_GET_HT40_MINUS_CCH(och) ((och) - 10)
453*5113495bSYour Name 
454*5113495bSYour Name #define CSR_GET_HT80_PLUS_LL_CCH(och) ((och) + 30)
455*5113495bSYour Name #define CSR_GET_HT80_PLUS_HL_CCH(och) ((och) + 30)
456*5113495bSYour Name #define CSR_GET_HT80_MINUS_LH_CCH(och) ((och) - 10)
457*5113495bSYour Name #define CSR_GET_HT80_MINUS_HH_CCH(och) ((och) - 30)
458*5113495bSYour Name 
459*5113495bSYour Name /**
460*5113495bSYour Name  * csr_calc_chb_for_sap_phymode() - to calc channel bandwidth for sap phymode
461*5113495bSYour Name  * @mac_ctx: pointer to mac context
462*5113495bSYour Name  * @sap_ch: SAP operating channel
463*5113495bSYour Name  * @sap_phymode: SAP physical mode
464*5113495bSYour Name  * @sap_cch: concurrency channel
465*5113495bSYour Name  * @sap_hbw: SAP half bw
466*5113495bSYour Name  * @chb: channel bandwidth
467*5113495bSYour Name  *
468*5113495bSYour Name  * This routine is called to calculate channel bandwidth
469*5113495bSYour Name  *
470*5113495bSYour Name  * Return: none
471*5113495bSYour Name  */
csr_calc_chb_for_sap_phymode(struct mac_context * mac_ctx,uint32_t * sap_ch,eCsrPhyMode * sap_phymode,uint32_t * sap_cch,uint32_t * sap_hbw,uint8_t * chb)472*5113495bSYour Name static void csr_calc_chb_for_sap_phymode(struct mac_context *mac_ctx,
473*5113495bSYour Name 		uint32_t *sap_ch, eCsrPhyMode *sap_phymode,
474*5113495bSYour Name 		uint32_t *sap_cch, uint32_t *sap_hbw, uint8_t *chb)
475*5113495bSYour Name {
476*5113495bSYour Name 	if (*sap_phymode == eCSR_DOT11_MODE_11n ||
477*5113495bSYour Name 			*sap_phymode == eCSR_DOT11_MODE_11n_ONLY) {
478*5113495bSYour Name 
479*5113495bSYour Name 		*sap_hbw = HALF_BW_OF(eCSR_BW_40MHz_VAL);
480*5113495bSYour Name 		if (*chb == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
481*5113495bSYour Name 			*sap_cch = CSR_GET_HT40_PLUS_CCH(*sap_ch);
482*5113495bSYour Name 		else if (*chb == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
483*5113495bSYour Name 			*sap_cch = CSR_GET_HT40_MINUS_CCH(*sap_ch);
484*5113495bSYour Name 
485*5113495bSYour Name 	} else if (*sap_phymode == eCSR_DOT11_MODE_11ac ||
486*5113495bSYour Name 		   *sap_phymode == eCSR_DOT11_MODE_11ac_ONLY ||
487*5113495bSYour Name 		   *sap_phymode == eCSR_DOT11_MODE_11ax ||
488*5113495bSYour Name 		   *sap_phymode == eCSR_DOT11_MODE_11ax_ONLY ||
489*5113495bSYour Name 		   CSR_IS_DOT11_PHY_MODE_11BE(*sap_phymode) ||
490*5113495bSYour Name 		   CSR_IS_DOT11_PHY_MODE_11BE_ONLY(*sap_phymode)) {
491*5113495bSYour Name 		/*11AC only 80/40/20 Mhz supported in Rome */
492*5113495bSYour Name 		if (mac_ctx->roam.configParam.nVhtChannelWidth ==
493*5113495bSYour Name 				(WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1)) {
494*5113495bSYour Name 			*sap_hbw = HALF_BW_OF(eCSR_BW_80MHz_VAL);
495*5113495bSYour Name 			if (*chb ==
496*5113495bSYour Name 				(PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW - 1))
497*5113495bSYour Name 				*sap_cch = CSR_GET_HT80_PLUS_LL_CCH(*sap_ch);
498*5113495bSYour Name 			else if (*chb ==
499*5113495bSYour Name 				(PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW
500*5113495bSYour Name 				     - 1))
501*5113495bSYour Name 				*sap_cch = CSR_GET_HT80_PLUS_HL_CCH(*sap_ch);
502*5113495bSYour Name 			else if (*chb ==
503*5113495bSYour Name 				 (PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH
504*5113495bSYour Name 				     - 1))
505*5113495bSYour Name 				*sap_cch = CSR_GET_HT80_MINUS_LH_CCH(*sap_ch);
506*5113495bSYour Name 			else if (*chb ==
507*5113495bSYour Name 				(PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH
508*5113495bSYour Name 				     - 1))
509*5113495bSYour Name 				*sap_cch = CSR_GET_HT80_MINUS_HH_CCH(*sap_ch);
510*5113495bSYour Name 		} else {
511*5113495bSYour Name 			*sap_hbw = HALF_BW_OF(eCSR_BW_40MHz_VAL);
512*5113495bSYour Name 			if (*chb == (PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW
513*5113495bSYour Name 					- 1))
514*5113495bSYour Name 				*sap_cch = CSR_GET_HT40_PLUS_CCH(*sap_ch);
515*5113495bSYour Name 			else if (*chb ==
516*5113495bSYour Name 				(PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW
517*5113495bSYour Name 				     - 1))
518*5113495bSYour Name 				*sap_cch = CSR_GET_HT40_MINUS_CCH(*sap_ch);
519*5113495bSYour Name 			else if (*chb ==
520*5113495bSYour Name 				(PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH
521*5113495bSYour Name 				     - 1))
522*5113495bSYour Name 				*sap_cch = CSR_GET_HT40_PLUS_CCH(*sap_ch);
523*5113495bSYour Name 			else if (*chb ==
524*5113495bSYour Name 				(PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH
525*5113495bSYour Name 				     - 1))
526*5113495bSYour Name 				*sap_cch = CSR_GET_HT40_MINUS_CCH(*sap_ch);
527*5113495bSYour Name 		}
528*5113495bSYour Name 	}
529*5113495bSYour Name }
530*5113495bSYour Name 
csr_get_half_bw(enum phy_ch_width ch_width)531*5113495bSYour Name static eCSR_BW_Val csr_get_half_bw(enum phy_ch_width ch_width)
532*5113495bSYour Name {
533*5113495bSYour Name 	eCSR_BW_Val hw_bw = HALF_BW_OF(eCSR_BW_20MHz_VAL);
534*5113495bSYour Name 
535*5113495bSYour Name 	switch (ch_width) {
536*5113495bSYour Name 	case CH_WIDTH_40MHZ:
537*5113495bSYour Name 		hw_bw = HALF_BW_OF(eCSR_BW_40MHz_VAL);
538*5113495bSYour Name 		break;
539*5113495bSYour Name 	case CH_WIDTH_80MHZ:
540*5113495bSYour Name 		hw_bw = HALF_BW_OF(eCSR_BW_80MHz_VAL);
541*5113495bSYour Name 		break;
542*5113495bSYour Name 	case CH_WIDTH_160MHZ:
543*5113495bSYour Name 	case CH_WIDTH_80P80MHZ:
544*5113495bSYour Name 		hw_bw = HALF_BW_OF(eCSR_BW_160MHz_VAL);
545*5113495bSYour Name 		break;
546*5113495bSYour Name 	default:
547*5113495bSYour Name 		break;
548*5113495bSYour Name 	}
549*5113495bSYour Name 
550*5113495bSYour Name 	return hw_bw;
551*5113495bSYour Name }
552*5113495bSYour Name 
553*5113495bSYour Name /**
554*5113495bSYour Name  * csr_handle_conc_chnl_overlap_for_sap_go - To handle overlap for AP+AP
555*5113495bSYour Name  * @mac_ctx: pointer to mac context
556*5113495bSYour Name  * @session: Current session
557*5113495bSYour Name  * @sap_ch_freq: SAP/GO operating channel frequency
558*5113495bSYour Name  * @sap_hbw: SAP/GO half bw
559*5113495bSYour Name  * @sap_cfreq: SAP/GO channel frequency
560*5113495bSYour Name  * @intf_ch_freq: concurrent SAP/GO operating channel frequency
561*5113495bSYour Name  * @intf_hbw: concurrent SAP/GO half bw
562*5113495bSYour Name  * @intf_cfreq: concurrent SAP/GO channel frequency
563*5113495bSYour Name  * @op_mode: opmode
564*5113495bSYour Name  *
565*5113495bSYour Name  * This routine is called to check if one SAP/GO channel is overlapping with
566*5113495bSYour Name  * other SAP/GO channel
567*5113495bSYour Name  *
568*5113495bSYour Name  * Return: none
569*5113495bSYour Name  */
csr_handle_conc_chnl_overlap_for_sap_go(struct mac_context * mac_ctx,struct csr_roam_session * session,uint32_t * sap_ch_freq,uint32_t * sap_hbw,uint32_t * sap_cfreq,uint32_t * intf_ch_freq,uint32_t * intf_hbw,uint32_t * intf_cfreq,enum QDF_OPMODE op_mode,uint8_t cc_switch_mode)570*5113495bSYour Name static void csr_handle_conc_chnl_overlap_for_sap_go(
571*5113495bSYour Name 		struct mac_context *mac_ctx,
572*5113495bSYour Name 		struct csr_roam_session *session,
573*5113495bSYour Name 		uint32_t *sap_ch_freq, uint32_t *sap_hbw, uint32_t *sap_cfreq,
574*5113495bSYour Name 		uint32_t *intf_ch_freq, uint32_t *intf_hbw,
575*5113495bSYour Name 		uint32_t *intf_cfreq, enum QDF_OPMODE op_mode,
576*5113495bSYour Name 		uint8_t cc_switch_mode)
577*5113495bSYour Name {
578*5113495bSYour Name 	qdf_freq_t op_chan_freq;
579*5113495bSYour Name 	qdf_freq_t freq_seg_0;
580*5113495bSYour Name 	enum phy_ch_width ch_width;
581*5113495bSYour Name 
582*5113495bSYour Name 	wlan_get_op_chan_freq_info_vdev_id(mac_ctx->pdev, session->vdev_id,
583*5113495bSYour Name 					   &op_chan_freq, &freq_seg_0,
584*5113495bSYour Name 					   &ch_width);
585*5113495bSYour Name 	sme_debug("op_chan_freq:%d freq_seg_0:%d ch_width:%d",
586*5113495bSYour Name 		  op_chan_freq, freq_seg_0, ch_width);
587*5113495bSYour Name 	/*
588*5113495bSYour Name 	 * if conc_custom_rule1 is defined then we don't
589*5113495bSYour Name 	 * want p2pgo to follow SAP's channel or SAP to
590*5113495bSYour Name 	 * follow P2PGO's channel.
591*5113495bSYour Name 	 */
592*5113495bSYour Name 	if (0 == mac_ctx->roam.configParam.conc_custom_rule1 &&
593*5113495bSYour Name 		0 == mac_ctx->roam.configParam.conc_custom_rule2) {
594*5113495bSYour Name 		if (*sap_ch_freq == 0) {
595*5113495bSYour Name 			*sap_ch_freq = op_chan_freq;
596*5113495bSYour Name 			*sap_cfreq = freq_seg_0;
597*5113495bSYour Name 			*sap_hbw = csr_get_half_bw(ch_width);
598*5113495bSYour Name 		} else if (*sap_ch_freq != op_chan_freq ||
599*5113495bSYour Name 			   (cc_switch_mode ==
600*5113495bSYour Name 				QDF_MCC_TO_SCC_SWITCH_WITH_FAVORITE_CHANNEL &&
601*5113495bSYour Name 			    op_mode == QDF_P2P_GO_MODE)) {
602*5113495bSYour Name 			*intf_ch_freq = op_chan_freq;
603*5113495bSYour Name 			*intf_cfreq = freq_seg_0;
604*5113495bSYour Name 			*intf_hbw = csr_get_half_bw(ch_width);
605*5113495bSYour Name 		}
606*5113495bSYour Name 	} else if (*sap_ch_freq == 0 && op_mode == QDF_SAP_MODE) {
607*5113495bSYour Name 		*sap_ch_freq = op_chan_freq;
608*5113495bSYour Name 		*sap_cfreq = freq_seg_0;
609*5113495bSYour Name 		*sap_hbw = csr_get_half_bw(ch_width);
610*5113495bSYour Name 	}
611*5113495bSYour Name }
612*5113495bSYour Name 
csr_check_concurrent_channel_overlap(struct mac_context * mac_ctx,uint32_t sap_ch_freq,eCsrPhyMode sap_phymode,uint8_t cc_switch_mode,uint8_t vdev_id)613*5113495bSYour Name uint16_t csr_check_concurrent_channel_overlap(struct mac_context *mac_ctx,
614*5113495bSYour Name 			uint32_t sap_ch_freq, eCsrPhyMode sap_phymode,
615*5113495bSYour Name 			uint8_t cc_switch_mode, uint8_t vdev_id)
616*5113495bSYour Name {
617*5113495bSYour Name 	struct csr_roam_session *session = NULL;
618*5113495bSYour Name 	uint8_t i = 0, chb = PHY_SINGLE_CHANNEL_CENTERED;
619*5113495bSYour Name 	uint32_t intf_ch_freq = 0, sap_hbw = 0, intf_hbw = 0, intf_cfreq = 0;
620*5113495bSYour Name 	uint32_t sap_cfreq = 0;
621*5113495bSYour Name 	uint32_t sap_lfreq, sap_hfreq, intf_lfreq, intf_hfreq;
622*5113495bSYour Name 	QDF_STATUS status;
623*5113495bSYour Name 	enum QDF_OPMODE op_mode;
624*5113495bSYour Name 	enum phy_ch_width ch_width;
625*5113495bSYour Name 	enum channel_state state;
626*5113495bSYour Name 
627*5113495bSYour Name #ifdef WLAN_FEATURE_LL_LT_SAP
628*5113495bSYour Name 	qdf_freq_t new_sap_freq = 0;
629*5113495bSYour Name 	bool is_ll_lt_sap_present = false;
630*5113495bSYour Name #endif
631*5113495bSYour Name 
632*5113495bSYour Name 	if (mac_ctx->roam.configParam.cc_switch_mode ==
633*5113495bSYour Name 			QDF_MCC_TO_SCC_SWITCH_DISABLE)
634*5113495bSYour Name 		return 0;
635*5113495bSYour Name 
636*5113495bSYour Name 	/*
637*5113495bSYour Name 	 * This is temporary code and will be removed once this feature flag
638*5113495bSYour Name 	 * is enabled
639*5113495bSYour Name 	 */
640*5113495bSYour Name #ifndef WLAN_FEATURE_LL_LT_SAP
641*5113495bSYour Name 		if (policy_mgr_is_vdev_ll_lt_sap(mac_ctx->psoc, vdev_id))
642*5113495bSYour Name 			return 0;
643*5113495bSYour Name #else
644*5113495bSYour Name 	policy_mgr_ll_lt_sap_get_valid_freq(
645*5113495bSYour Name 				mac_ctx->psoc, mac_ctx->pdev,
646*5113495bSYour Name 				vdev_id, sap_ch_freq,
647*5113495bSYour Name 				mac_ctx->roam.configParam.cc_switch_mode,
648*5113495bSYour Name 				&new_sap_freq,
649*5113495bSYour Name 				&is_ll_lt_sap_present);
650*5113495bSYour Name 	/*
651*5113495bSYour Name 	 * If ll_lt_sap is present, then it has already updated the frequency
652*5113495bSYour Name 	 * according to current concurrency, so, return from here
653*5113495bSYour Name 	 */
654*5113495bSYour Name 	if (is_ll_lt_sap_present) {
655*5113495bSYour Name 		if (new_sap_freq == sap_ch_freq)
656*5113495bSYour Name 			return 0;
657*5113495bSYour Name 
658*5113495bSYour Name 		sme_debug("LL_LT_SAP concurrency updated freq %d for vdev %d",
659*5113495bSYour Name 			  new_sap_freq, vdev_id);
660*5113495bSYour Name 		return new_sap_freq;
661*5113495bSYour Name 	}
662*5113495bSYour Name #endif
663*5113495bSYour Name 
664*5113495bSYour Name 	if (sap_ch_freq != 0) {
665*5113495bSYour Name 		sap_cfreq = sap_ch_freq;
666*5113495bSYour Name 		sap_hbw = HALF_BW_OF(eCSR_BW_20MHz_VAL);
667*5113495bSYour Name 
668*5113495bSYour Name 		if (!WLAN_REG_IS_24GHZ_CH_FREQ(sap_ch_freq))
669*5113495bSYour Name 			chb = mac_ctx->roam.configParam.channelBondingMode5GHz;
670*5113495bSYour Name 		else
671*5113495bSYour Name 			chb = mac_ctx->roam.configParam.channelBondingMode24GHz;
672*5113495bSYour Name 
673*5113495bSYour Name 		if (chb)
674*5113495bSYour Name 			csr_calc_chb_for_sap_phymode(mac_ctx, &sap_ch_freq,
675*5113495bSYour Name 						     &sap_phymode, &sap_cfreq,
676*5113495bSYour Name 						     &sap_hbw, &chb);
677*5113495bSYour Name 	}
678*5113495bSYour Name 
679*5113495bSYour Name 	sme_debug("sap_ch:%d sap_phymode:%d sap_cch:%d sap_hbw:%d chb:%d",
680*5113495bSYour Name 		  sap_ch_freq, sap_phymode, sap_cfreq, sap_hbw, chb);
681*5113495bSYour Name 
682*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_VDEVS; i++) {
683*5113495bSYour Name 		if (!CSR_IS_SESSION_VALID(mac_ctx, i))
684*5113495bSYour Name 			continue;
685*5113495bSYour Name 
686*5113495bSYour Name 		session = CSR_GET_SESSION(mac_ctx, i);
687*5113495bSYour Name 		op_mode = wlan_get_opmode_from_vdev_id(mac_ctx->pdev, i);
688*5113495bSYour Name 		if ((op_mode == QDF_STA_MODE ||
689*5113495bSYour Name 		     op_mode == QDF_P2P_CLIENT_MODE) &&
690*5113495bSYour Name 		    cm_is_vdevid_connected(mac_ctx->pdev, i)) {
691*5113495bSYour Name 			if (op_mode == QDF_STA_MODE &&
692*5113495bSYour Name 			    policy_mgr_is_ml_vdev_id(mac_ctx->psoc,
693*5113495bSYour Name 						     session->vdev_id) &&
694*5113495bSYour Name 			    policy_mgr_vdev_is_force_inactive(
695*5113495bSYour Name 							mac_ctx->psoc,
696*5113495bSYour Name 							session->vdev_id)) {
697*5113495bSYour Name 				sme_debug("skip inactive ml sta vdev %d",
698*5113495bSYour Name 					  session->vdev_id);
699*5113495bSYour Name 				continue;
700*5113495bSYour Name 			}
701*5113495bSYour Name 			wlan_get_op_chan_freq_info_vdev_id(mac_ctx->pdev,
702*5113495bSYour Name 					   session->vdev_id,
703*5113495bSYour Name 					   &intf_ch_freq, &intf_cfreq,
704*5113495bSYour Name 					   &ch_width);
705*5113495bSYour Name 			intf_hbw = csr_get_half_bw(ch_width);
706*5113495bSYour Name 			sme_debug("%d: intf_ch:%d intf_cfreq:%d intf_hbw:%d ch_width %d",
707*5113495bSYour Name 				  i, intf_ch_freq, intf_cfreq, intf_hbw,
708*5113495bSYour Name 				  ch_width);
709*5113495bSYour Name 		} else if ((op_mode == QDF_P2P_GO_MODE ||
710*5113495bSYour Name 			    op_mode == QDF_SAP_MODE) &&
711*5113495bSYour Name 			   (session->connectState !=
712*5113495bSYour Name 			     eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED)) {
713*5113495bSYour Name 
714*5113495bSYour Name 			if (session->ch_switch_in_progress)
715*5113495bSYour Name 				continue;
716*5113495bSYour Name 
717*5113495bSYour Name 			csr_handle_conc_chnl_overlap_for_sap_go(mac_ctx,
718*5113495bSYour Name 					session, &sap_ch_freq, &sap_hbw,
719*5113495bSYour Name 					&sap_cfreq, &intf_ch_freq, &intf_hbw,
720*5113495bSYour Name 					&intf_cfreq, op_mode,
721*5113495bSYour Name 					cc_switch_mode);
722*5113495bSYour Name 		}
723*5113495bSYour Name 
724*5113495bSYour Name 		if (intf_ch_freq) {
725*5113495bSYour Name 			state = wlan_reg_get_channel_state_for_pwrmode(
726*5113495bSYour Name 					mac_ctx->pdev, intf_ch_freq,
727*5113495bSYour Name 					REG_CURRENT_PWR_MODE);
728*5113495bSYour Name 			if (state == CHANNEL_STATE_DISABLE ||
729*5113495bSYour Name 			    state == CHANNEL_STATE_INVALID) {
730*5113495bSYour Name 				sme_debug("skip vdev %d for intf_ch:%d",
731*5113495bSYour Name 					  i, intf_ch_freq);
732*5113495bSYour Name 				intf_ch_freq = 0;
733*5113495bSYour Name 				continue;
734*5113495bSYour Name 			}
735*5113495bSYour Name 		}
736*5113495bSYour Name 
737*5113495bSYour Name 		if (intf_ch_freq &&
738*5113495bSYour Name 		    ((intf_ch_freq <= wlan_reg_ch_to_freq(CHAN_ENUM_2484) &&
739*5113495bSYour Name 		     sap_ch_freq <= wlan_reg_ch_to_freq(CHAN_ENUM_2484)) ||
740*5113495bSYour Name 		    (intf_ch_freq > wlan_reg_ch_to_freq(CHAN_ENUM_2484) &&
741*5113495bSYour Name 		     sap_ch_freq > wlan_reg_ch_to_freq(CHAN_ENUM_2484))))
742*5113495bSYour Name 			break;
743*5113495bSYour Name 	}
744*5113495bSYour Name 
745*5113495bSYour Name 	sme_debug("intf_ch:%d sap_ch:%d cc_switch_mode:%d, dbs:%d",
746*5113495bSYour Name 		  intf_ch_freq, sap_ch_freq, cc_switch_mode,
747*5113495bSYour Name 		  policy_mgr_is_hw_dbs_capable(mac_ctx->psoc));
748*5113495bSYour Name 
749*5113495bSYour Name 	if (intf_ch_freq && sap_ch_freq != intf_ch_freq &&
750*5113495bSYour Name 	    !policy_mgr_is_force_scc(mac_ctx->psoc)) {
751*5113495bSYour Name 		sap_lfreq = sap_cfreq - sap_hbw;
752*5113495bSYour Name 		sap_hfreq = sap_cfreq + sap_hbw;
753*5113495bSYour Name 		intf_lfreq = intf_cfreq - intf_hbw;
754*5113495bSYour Name 		intf_hfreq = intf_cfreq + intf_hbw;
755*5113495bSYour Name 
756*5113495bSYour Name 		sme_debug("SAP:  OCH: %03d CCH: %03d BW: %d LF: %d HF: %d INTF: OCH: %03d CF: %d BW: %d LF: %d HF: %d",
757*5113495bSYour Name 			sap_ch_freq, sap_cfreq, sap_hbw * 2,
758*5113495bSYour Name 			sap_lfreq, sap_hfreq, intf_ch_freq,
759*5113495bSYour Name 			intf_cfreq, intf_hbw * 2, intf_lfreq, intf_hfreq);
760*5113495bSYour Name 
761*5113495bSYour Name 		if (!(((sap_lfreq > intf_lfreq && sap_lfreq < intf_hfreq) ||
762*5113495bSYour Name 			(sap_hfreq > intf_lfreq && sap_hfreq < intf_hfreq)) ||
763*5113495bSYour Name 			((intf_lfreq > sap_lfreq && intf_lfreq < sap_hfreq) ||
764*5113495bSYour Name 			(intf_hfreq > sap_lfreq && intf_hfreq < sap_hfreq))))
765*5113495bSYour Name 			intf_ch_freq = 0;
766*5113495bSYour Name 	} else if (intf_ch_freq && sap_ch_freq != intf_ch_freq &&
767*5113495bSYour Name 		   (policy_mgr_is_force_scc(mac_ctx->psoc))) {
768*5113495bSYour Name 		policy_mgr_check_scc_channel(mac_ctx->psoc, &intf_ch_freq,
769*5113495bSYour Name 					     sap_ch_freq, vdev_id,
770*5113495bSYour Name 					     cc_switch_mode);
771*5113495bSYour Name 	} else if ((intf_ch_freq == sap_ch_freq) && (cc_switch_mode ==
772*5113495bSYour Name 				QDF_MCC_TO_SCC_SWITCH_WITH_FAVORITE_CHANNEL)) {
773*5113495bSYour Name 		status = policy_mgr_handle_go_sap_fav_channel(
774*5113495bSYour Name 					mac_ctx->psoc, vdev_id,
775*5113495bSYour Name 					sap_ch_freq, &intf_ch_freq);
776*5113495bSYour Name 		if (QDF_IS_STATUS_SUCCESS(status) &&
777*5113495bSYour Name 		    intf_ch_freq && intf_ch_freq != sap_ch_freq)
778*5113495bSYour Name 			goto end;
779*5113495bSYour Name 
780*5113495bSYour Name 		if (WLAN_REG_IS_24GHZ_CH_FREQ(intf_ch_freq) ||
781*5113495bSYour Name 		    WLAN_REG_IS_6GHZ_CHAN_FREQ(sap_ch_freq)) {
782*5113495bSYour Name 			status =
783*5113495bSYour Name 				policy_mgr_get_sap_mandatory_channel(
784*5113495bSYour Name 					mac_ctx->psoc, sap_ch_freq,
785*5113495bSYour Name 					&intf_ch_freq, vdev_id);
786*5113495bSYour Name 			if (QDF_IS_STATUS_ERROR(status))
787*5113495bSYour Name 				sme_err("no mandatory channel");
788*5113495bSYour Name 		}
789*5113495bSYour Name 	}
790*5113495bSYour Name end:
791*5113495bSYour Name 	if (intf_ch_freq == sap_ch_freq)
792*5113495bSYour Name 		intf_ch_freq = 0;
793*5113495bSYour Name 
794*5113495bSYour Name 	sme_debug("##Concurrent Channels (%d, %d) %s Interfering", sap_ch_freq,
795*5113495bSYour Name 		  intf_ch_freq,
796*5113495bSYour Name 		  intf_ch_freq == 0 ? "Not" : "Are");
797*5113495bSYour Name 
798*5113495bSYour Name 	return intf_ch_freq;
799*5113495bSYour Name }
800*5113495bSYour Name #endif
801*5113495bSYour Name 
csr_is_all_session_disconnected(struct mac_context * mac)802*5113495bSYour Name bool csr_is_all_session_disconnected(struct mac_context *mac)
803*5113495bSYour Name {
804*5113495bSYour Name 	uint32_t i;
805*5113495bSYour Name 	bool fRc = true;
806*5113495bSYour Name 
807*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_VDEVS; i++) {
808*5113495bSYour Name 		if (CSR_IS_SESSION_VALID(mac, i)
809*5113495bSYour Name 		    && !csr_is_conn_state_disconnected(mac, i)) {
810*5113495bSYour Name 			fRc = false;
811*5113495bSYour Name 			break;
812*5113495bSYour Name 		}
813*5113495bSYour Name 	}
814*5113495bSYour Name 
815*5113495bSYour Name 	return fRc;
816*5113495bSYour Name }
817*5113495bSYour Name 
csr_is_infra_ap_started(struct mac_context * mac)818*5113495bSYour Name bool csr_is_infra_ap_started(struct mac_context *mac)
819*5113495bSYour Name {
820*5113495bSYour Name 	uint32_t sessionId;
821*5113495bSYour Name 	bool fRc = false;
822*5113495bSYour Name 
823*5113495bSYour Name 	for (sessionId = 0; sessionId < WLAN_MAX_VDEVS; sessionId++) {
824*5113495bSYour Name 		if (CSR_IS_SESSION_VALID(mac, sessionId) &&
825*5113495bSYour Name 				(csr_is_conn_state_connected_infra_ap(mac,
826*5113495bSYour Name 					sessionId))) {
827*5113495bSYour Name 			fRc = true;
828*5113495bSYour Name 			break;
829*5113495bSYour Name 		}
830*5113495bSYour Name 	}
831*5113495bSYour Name 
832*5113495bSYour Name 	return fRc;
833*5113495bSYour Name 
834*5113495bSYour Name }
835*5113495bSYour Name 
csr_is_conn_state_disconnected(struct mac_context * mac,uint8_t vdev_id)836*5113495bSYour Name bool csr_is_conn_state_disconnected(struct mac_context *mac, uint8_t vdev_id)
837*5113495bSYour Name {
838*5113495bSYour Name 	enum QDF_OPMODE opmode;
839*5113495bSYour Name 
840*5113495bSYour Name 	opmode = wlan_get_opmode_from_vdev_id(mac->pdev, vdev_id);
841*5113495bSYour Name 
842*5113495bSYour Name 	if (opmode == QDF_STA_MODE || opmode == QDF_P2P_CLIENT_MODE)
843*5113495bSYour Name 		return !cm_is_vdevid_connected(mac->pdev, vdev_id);
844*5113495bSYour Name 
845*5113495bSYour Name 	return eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED ==
846*5113495bSYour Name 	       mac->roam.roamSession[vdev_id].connectState;
847*5113495bSYour Name }
848*5113495bSYour Name 
csr_is11h_supported(struct mac_context * mac)849*5113495bSYour Name bool csr_is11h_supported(struct mac_context *mac)
850*5113495bSYour Name {
851*5113495bSYour Name 	return mac->mlme_cfg->gen.enabled_11h;
852*5113495bSYour Name }
853*5113495bSYour Name 
csr_is_wmm_supported(struct mac_context * mac)854*5113495bSYour Name bool csr_is_wmm_supported(struct mac_context *mac)
855*5113495bSYour Name {
856*5113495bSYour Name 	if (WMM_USER_MODE_NO_QOS == mac->roam.configParam.WMMSupportMode)
857*5113495bSYour Name 		return false;
858*5113495bSYour Name 	else
859*5113495bSYour Name 		return true;
860*5113495bSYour Name }
861*5113495bSYour Name 
862*5113495bSYour Name /* This function will allocate memory for the parsed IEs to the caller.
863*5113495bSYour Name  * Caller must free the memory after it is done with the data only if
864*5113495bSYour Name  * this function succeeds
865*5113495bSYour Name  */
csr_get_parsed_bss_description_ies(struct mac_context * mac_ctx,struct bss_description * bss_desc,tDot11fBeaconIEs ** ppIEStruct)866*5113495bSYour Name QDF_STATUS csr_get_parsed_bss_description_ies(struct mac_context *mac_ctx,
867*5113495bSYour Name 					      struct bss_description *bss_desc,
868*5113495bSYour Name 					      tDot11fBeaconIEs **ppIEStruct)
869*5113495bSYour Name {
870*5113495bSYour Name 	return wlan_get_parsed_bss_description_ies(mac_ctx, bss_desc,
871*5113495bSYour Name 						   ppIEStruct);
872*5113495bSYour Name }
873*5113495bSYour Name 
csr_get_frag_thresh(struct mac_context * mac_ctx)874*5113495bSYour Name uint32_t csr_get_frag_thresh(struct mac_context *mac_ctx)
875*5113495bSYour Name {
876*5113495bSYour Name 	return mac_ctx->mlme_cfg->threshold.frag_threshold;
877*5113495bSYour Name }
878*5113495bSYour Name 
csr_get_rts_thresh(struct mac_context * mac_ctx)879*5113495bSYour Name uint32_t csr_get_rts_thresh(struct mac_context *mac_ctx)
880*5113495bSYour Name {
881*5113495bSYour Name 	return mac_ctx->mlme_cfg->threshold.rts_threshold;
882*5113495bSYour Name }
883*5113495bSYour Name 
csr_translate_to_wni_cfg_dot11_mode(struct mac_context * mac,enum csr_cfgdot11mode csrDot11Mode)884*5113495bSYour Name uint32_t csr_translate_to_wni_cfg_dot11_mode(struct mac_context *mac,
885*5113495bSYour Name 					     enum csr_cfgdot11mode csrDot11Mode)
886*5113495bSYour Name {
887*5113495bSYour Name 	uint32_t ret;
888*5113495bSYour Name 
889*5113495bSYour Name 	switch (csrDot11Mode) {
890*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_AUTO:
891*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
892*5113495bSYour Name 		if (IS_FEATURE_11BE_SUPPORTED_BY_FW)
893*5113495bSYour Name 			ret = MLME_DOT11_MODE_11BE;
894*5113495bSYour Name 		else
895*5113495bSYour Name #endif
896*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
897*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AX;
898*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
899*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC;
900*5113495bSYour Name 		else
901*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
902*5113495bSYour Name 		break;
903*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11A:
904*5113495bSYour Name 		ret = MLME_DOT11_MODE_11A;
905*5113495bSYour Name 		break;
906*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11B:
907*5113495bSYour Name 		ret = MLME_DOT11_MODE_11B;
908*5113495bSYour Name 		break;
909*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11G:
910*5113495bSYour Name 		ret = MLME_DOT11_MODE_11G;
911*5113495bSYour Name 		break;
912*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11N:
913*5113495bSYour Name 		ret = MLME_DOT11_MODE_11N;
914*5113495bSYour Name 		break;
915*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11G_ONLY:
916*5113495bSYour Name 		ret = MLME_DOT11_MODE_11G_ONLY;
917*5113495bSYour Name 		break;
918*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11N_ONLY:
919*5113495bSYour Name 		ret = MLME_DOT11_MODE_11N_ONLY;
920*5113495bSYour Name 		break;
921*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11AC_ONLY:
922*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
923*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC_ONLY;
924*5113495bSYour Name 		else
925*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
926*5113495bSYour Name 		break;
927*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11AC:
928*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
929*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC;
930*5113495bSYour Name 		else
931*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
932*5113495bSYour Name 		break;
933*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11AX_ONLY:
934*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
935*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AX_ONLY;
936*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
937*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC;
938*5113495bSYour Name 		else
939*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
940*5113495bSYour Name 		break;
941*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11AX:
942*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
943*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AX;
944*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
945*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC;
946*5113495bSYour Name 		else
947*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
948*5113495bSYour Name 		break;
949*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
950*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11BE_ONLY:
951*5113495bSYour Name 		if (IS_FEATURE_11BE_SUPPORTED_BY_FW)
952*5113495bSYour Name 			ret = MLME_DOT11_MODE_11BE_ONLY;
953*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
954*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AX_ONLY;
955*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
956*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC;
957*5113495bSYour Name 		else
958*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
959*5113495bSYour Name 		break;
960*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_11BE:
961*5113495bSYour Name 		if (IS_FEATURE_11BE_SUPPORTED_BY_FW)
962*5113495bSYour Name 			ret = MLME_DOT11_MODE_11BE;
963*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
964*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AX;
965*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
966*5113495bSYour Name 			ret = MLME_DOT11_MODE_11AC;
967*5113495bSYour Name 		else
968*5113495bSYour Name 			ret = MLME_DOT11_MODE_11N;
969*5113495bSYour Name 		break;
970*5113495bSYour Name #endif
971*5113495bSYour Name 	case eCSR_CFG_DOT11_MODE_ABG:
972*5113495bSYour Name 		ret = MLME_DOT11_MODE_ABG;
973*5113495bSYour Name 		break;
974*5113495bSYour Name 	default:
975*5113495bSYour Name 		sme_warn("doesn't expect %d as csrDo11Mode", csrDot11Mode);
976*5113495bSYour Name 		ret = MLME_DOT11_MODE_ALL;
977*5113495bSYour Name 		break;
978*5113495bSYour Name 	}
979*5113495bSYour Name 
980*5113495bSYour Name 	return ret;
981*5113495bSYour Name }
982*5113495bSYour Name 
csr_convert_to_reg_phy_mode(eCsrPhyMode csr_phy_mode,qdf_freq_t freq)983*5113495bSYour Name enum reg_phymode csr_convert_to_reg_phy_mode(eCsrPhyMode csr_phy_mode,
984*5113495bSYour Name 				       qdf_freq_t freq)
985*5113495bSYour Name {
986*5113495bSYour Name 	if (csr_phy_mode == eCSR_DOT11_MODE_AUTO)
987*5113495bSYour Name 		return REG_PHYMODE_MAX - 1;
988*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
989*5113495bSYour Name 	else if (CSR_IS_DOT11_PHY_MODE_11BE(csr_phy_mode) ||
990*5113495bSYour Name 		 CSR_IS_DOT11_PHY_MODE_11BE_ONLY(csr_phy_mode))
991*5113495bSYour Name 		return REG_PHYMODE_11BE;
992*5113495bSYour Name #endif
993*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_11ax ||
994*5113495bSYour Name 		 csr_phy_mode == eCSR_DOT11_MODE_11ax_ONLY)
995*5113495bSYour Name 		return REG_PHYMODE_11AX;
996*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_11ac ||
997*5113495bSYour Name 		 csr_phy_mode == eCSR_DOT11_MODE_11ac_ONLY)
998*5113495bSYour Name 		return REG_PHYMODE_11AC;
999*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_11n ||
1000*5113495bSYour Name 		 csr_phy_mode == eCSR_DOT11_MODE_11n_ONLY)
1001*5113495bSYour Name 		return REG_PHYMODE_11N;
1002*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_11a)
1003*5113495bSYour Name 		return REG_PHYMODE_11A;
1004*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_11g ||
1005*5113495bSYour Name 		 csr_phy_mode == eCSR_DOT11_MODE_11g_ONLY)
1006*5113495bSYour Name 		return REG_PHYMODE_11G;
1007*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_11b ||
1008*5113495bSYour Name 		 csr_phy_mode == eCSR_DOT11_MODE_11b_ONLY)
1009*5113495bSYour Name 		return REG_PHYMODE_11B;
1010*5113495bSYour Name 	else if (csr_phy_mode == eCSR_DOT11_MODE_abg) {
1011*5113495bSYour Name 		if (WLAN_REG_IS_24GHZ_CH_FREQ(freq))
1012*5113495bSYour Name 			return REG_PHYMODE_11G;
1013*5113495bSYour Name 		else
1014*5113495bSYour Name 			return REG_PHYMODE_11A;
1015*5113495bSYour Name 	} else {
1016*5113495bSYour Name 		sme_err("Invalid eCsrPhyMode");
1017*5113495bSYour Name 		return REG_PHYMODE_INVALID;
1018*5113495bSYour Name 	}
1019*5113495bSYour Name }
1020*5113495bSYour Name 
csr_convert_from_reg_phy_mode(enum reg_phymode phymode)1021*5113495bSYour Name eCsrPhyMode csr_convert_from_reg_phy_mode(enum reg_phymode phymode)
1022*5113495bSYour Name {
1023*5113495bSYour Name 	switch (phymode) {
1024*5113495bSYour Name 	case REG_PHYMODE_INVALID:
1025*5113495bSYour Name 		return eCSR_DOT11_MODE_AUTO;
1026*5113495bSYour Name 	case REG_PHYMODE_11B:
1027*5113495bSYour Name 		return eCSR_DOT11_MODE_11b;
1028*5113495bSYour Name 	case REG_PHYMODE_11G:
1029*5113495bSYour Name 		return eCSR_DOT11_MODE_11g;
1030*5113495bSYour Name 	case REG_PHYMODE_11A:
1031*5113495bSYour Name 		return eCSR_DOT11_MODE_11a;
1032*5113495bSYour Name 	case REG_PHYMODE_11N:
1033*5113495bSYour Name 		return eCSR_DOT11_MODE_11n;
1034*5113495bSYour Name 	case REG_PHYMODE_11AC:
1035*5113495bSYour Name 		return eCSR_DOT11_MODE_11ac;
1036*5113495bSYour Name 	case REG_PHYMODE_11AX:
1037*5113495bSYour Name 		return eCSR_DOT11_MODE_11ax;
1038*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1039*5113495bSYour Name 	case REG_PHYMODE_11BE:
1040*5113495bSYour Name 		return eCSR_DOT11_MODE_11be;
1041*5113495bSYour Name #endif
1042*5113495bSYour Name 	case REG_PHYMODE_MAX:
1043*5113495bSYour Name 		return eCSR_DOT11_MODE_AUTO;
1044*5113495bSYour Name 	default:
1045*5113495bSYour Name 		return eCSR_DOT11_MODE_AUTO;
1046*5113495bSYour Name 	}
1047*5113495bSYour Name }
1048*5113495bSYour Name 
csr_is_auth_type_ese(enum csr_akm_type AuthType)1049*5113495bSYour Name bool csr_is_auth_type_ese(enum csr_akm_type AuthType)
1050*5113495bSYour Name {
1051*5113495bSYour Name 	switch (AuthType) {
1052*5113495bSYour Name 	case eCSR_AUTH_TYPE_CCKM_WPA:
1053*5113495bSYour Name 	case eCSR_AUTH_TYPE_CCKM_RSN:
1054*5113495bSYour Name 		return true;
1055*5113495bSYour Name 	default:
1056*5113495bSYour Name 		break;
1057*5113495bSYour Name 	}
1058*5113495bSYour Name 	return false;
1059*5113495bSYour Name }
1060*5113495bSYour Name 
csr_is_pmkid_found_for_peer(struct mac_context * mac,struct csr_roam_session * session,tSirMacAddr peer_mac_addr,uint8_t * pmkid,uint16_t pmkid_count)1061*5113495bSYour Name bool csr_is_pmkid_found_for_peer(struct mac_context *mac,
1062*5113495bSYour Name 				 struct csr_roam_session *session,
1063*5113495bSYour Name 				 tSirMacAddr peer_mac_addr,
1064*5113495bSYour Name 				 uint8_t *pmkid,
1065*5113495bSYour Name 				 uint16_t pmkid_count)
1066*5113495bSYour Name {
1067*5113495bSYour Name 	uint32_t i;
1068*5113495bSYour Name 	uint8_t *session_pmkid;
1069*5113495bSYour Name 	struct wlan_crypto_pmksa *pmkid_cache;
1070*5113495bSYour Name 
1071*5113495bSYour Name 	pmkid_cache = qdf_mem_malloc(sizeof(*pmkid_cache));
1072*5113495bSYour Name 	if (!pmkid_cache)
1073*5113495bSYour Name 		return false;
1074*5113495bSYour Name 
1075*5113495bSYour Name 	qdf_mem_copy(pmkid_cache->bssid.bytes, peer_mac_addr,
1076*5113495bSYour Name 		     QDF_MAC_ADDR_SIZE);
1077*5113495bSYour Name 
1078*5113495bSYour Name 	if (!cm_lookup_pmkid_using_bssid(mac->psoc, session->vdev_id,
1079*5113495bSYour Name 					 pmkid_cache)) {
1080*5113495bSYour Name 		qdf_mem_free(pmkid_cache);
1081*5113495bSYour Name 		return false;
1082*5113495bSYour Name 	}
1083*5113495bSYour Name 
1084*5113495bSYour Name 	session_pmkid = pmkid_cache->pmkid;
1085*5113495bSYour Name 	for (i = 0; i < pmkid_count; i++) {
1086*5113495bSYour Name 		if (!qdf_mem_cmp(pmkid + (i * PMKID_LEN),
1087*5113495bSYour Name 				 session_pmkid, PMKID_LEN)) {
1088*5113495bSYour Name 			qdf_mem_free(pmkid_cache);
1089*5113495bSYour Name 			return true;
1090*5113495bSYour Name 		}
1091*5113495bSYour Name 	}
1092*5113495bSYour Name 
1093*5113495bSYour Name 	sme_debug("PMKID in PmkidCacheInfo doesn't match with PMKIDs of peer");
1094*5113495bSYour Name 	qdf_mem_free(pmkid_cache);
1095*5113495bSYour Name 
1096*5113495bSYour Name 	return false;
1097*5113495bSYour Name }
1098*5113495bSYour Name 
csr_is_bssid_match(struct qdf_mac_addr * pProfBssid,struct qdf_mac_addr * BssBssid)1099*5113495bSYour Name bool csr_is_bssid_match(struct qdf_mac_addr *pProfBssid,
1100*5113495bSYour Name 			struct qdf_mac_addr *BssBssid)
1101*5113495bSYour Name {
1102*5113495bSYour Name 	bool fMatch = false;
1103*5113495bSYour Name 	struct qdf_mac_addr ProfileBssid;
1104*5113495bSYour Name 
1105*5113495bSYour Name 	/* for efficiency of the MAC_ADDRESS functions, move the */
1106*5113495bSYour Name 	/* Bssid's into MAC_ADDRESS structs. */
1107*5113495bSYour Name 	qdf_mem_copy(&ProfileBssid, pProfBssid, sizeof(struct qdf_mac_addr));
1108*5113495bSYour Name 
1109*5113495bSYour Name 	do {
1110*5113495bSYour Name 		/* Give the profile the benefit of the doubt... accept
1111*5113495bSYour Name 		 * either all 0 or the real broadcast Bssid (all 0xff)
1112*5113495bSYour Name 		 * as broadcast Bssids (meaning to match any Bssids).
1113*5113495bSYour Name 		 */
1114*5113495bSYour Name 		if (qdf_is_macaddr_zero(&ProfileBssid) ||
1115*5113495bSYour Name 		    qdf_is_macaddr_broadcast(&ProfileBssid)) {
1116*5113495bSYour Name 			fMatch = true;
1117*5113495bSYour Name 			break;
1118*5113495bSYour Name 		}
1119*5113495bSYour Name 
1120*5113495bSYour Name 		if (qdf_is_macaddr_equal(BssBssid, &ProfileBssid)) {
1121*5113495bSYour Name 			fMatch = true;
1122*5113495bSYour Name 			break;
1123*5113495bSYour Name 		}
1124*5113495bSYour Name 
1125*5113495bSYour Name 	} while (0);
1126*5113495bSYour Name 
1127*5113495bSYour Name 	return fMatch;
1128*5113495bSYour Name }
1129*5113495bSYour Name 
1130*5113495bSYour Name /* This function use the parameters to decide the CFG value. */
1131*5113495bSYour Name /* CSR never sets MLME_DOT11_MODE_ALL to the CFG */
1132*5113495bSYour Name /* So PE should not see MLME_DOT11_MODE_ALL when it gets the CFG value */
1133*5113495bSYour Name enum csr_cfgdot11mode
csr_get_cfg_dot11_mode_from_csr_phy_mode(bool is_ap,eCsrPhyMode phyMode)1134*5113495bSYour Name csr_get_cfg_dot11_mode_from_csr_phy_mode(bool is_ap, eCsrPhyMode phyMode)
1135*5113495bSYour Name {
1136*5113495bSYour Name 	uint32_t cfgDot11Mode = eCSR_CFG_DOT11_MODE_ABG;
1137*5113495bSYour Name 
1138*5113495bSYour Name 	switch (phyMode) {
1139*5113495bSYour Name 	case eCSR_DOT11_MODE_11a:
1140*5113495bSYour Name 		cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
1141*5113495bSYour Name 		break;
1142*5113495bSYour Name 	case eCSR_DOT11_MODE_11b:
1143*5113495bSYour Name 	case eCSR_DOT11_MODE_11b_ONLY:
1144*5113495bSYour Name 		cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
1145*5113495bSYour Name 		break;
1146*5113495bSYour Name 	case eCSR_DOT11_MODE_11g:
1147*5113495bSYour Name 	case eCSR_DOT11_MODE_11g_ONLY:
1148*5113495bSYour Name 		if (is_ap && (phyMode == eCSR_DOT11_MODE_11g_ONLY))
1149*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G_ONLY;
1150*5113495bSYour Name 		else
1151*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
1152*5113495bSYour Name 		break;
1153*5113495bSYour Name 	case eCSR_DOT11_MODE_11n:
1154*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1155*5113495bSYour Name 		break;
1156*5113495bSYour Name 	case eCSR_DOT11_MODE_11n_ONLY:
1157*5113495bSYour Name 		if (is_ap)
1158*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N_ONLY;
1159*5113495bSYour Name 		else
1160*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1161*5113495bSYour Name 		break;
1162*5113495bSYour Name 	case eCSR_DOT11_MODE_abg:
1163*5113495bSYour Name 		cfgDot11Mode = eCSR_CFG_DOT11_MODE_ABG;
1164*5113495bSYour Name 		break;
1165*5113495bSYour Name 	case eCSR_DOT11_MODE_AUTO:
1166*5113495bSYour Name 		cfgDot11Mode = eCSR_CFG_DOT11_MODE_AUTO;
1167*5113495bSYour Name 		break;
1168*5113495bSYour Name 
1169*5113495bSYour Name 	case eCSR_DOT11_MODE_11ac:
1170*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
1171*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
1172*5113495bSYour Name 		else
1173*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1174*5113495bSYour Name 		break;
1175*5113495bSYour Name 	case eCSR_DOT11_MODE_11ac_ONLY:
1176*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
1177*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC_ONLY;
1178*5113495bSYour Name 		else
1179*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1180*5113495bSYour Name 		break;
1181*5113495bSYour Name 	case eCSR_DOT11_MODE_11ax:
1182*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
1183*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX;
1184*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
1185*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
1186*5113495bSYour Name 		else
1187*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1188*5113495bSYour Name 		break;
1189*5113495bSYour Name 	case eCSR_DOT11_MODE_11ax_ONLY:
1190*5113495bSYour Name 		if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
1191*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX_ONLY;
1192*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
1193*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
1194*5113495bSYour Name 		else
1195*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1196*5113495bSYour Name 		break;
1197*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1198*5113495bSYour Name 	case eCSR_DOT11_MODE_11be:
1199*5113495bSYour Name 		if (IS_FEATURE_11BE_SUPPORTED_BY_FW)
1200*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11BE;
1201*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
1202*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX;
1203*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
1204*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
1205*5113495bSYour Name 		else
1206*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1207*5113495bSYour Name 		break;
1208*5113495bSYour Name 	case eCSR_DOT11_MODE_11be_ONLY:
1209*5113495bSYour Name 		if (IS_FEATURE_11BE_SUPPORTED_BY_FW)
1210*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11BE_ONLY;
1211*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
1212*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX_ONLY;
1213*5113495bSYour Name 		else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
1214*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
1215*5113495bSYour Name 		else
1216*5113495bSYour Name 			cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
1217*5113495bSYour Name 		break;
1218*5113495bSYour Name #endif
1219*5113495bSYour Name 	default:
1220*5113495bSYour Name 		/* No need to assign anything here */
1221*5113495bSYour Name 		break;
1222*5113495bSYour Name 	}
1223*5113495bSYour Name 
1224*5113495bSYour Name 	return cfgDot11Mode;
1225*5113495bSYour Name }
1226*5113495bSYour Name 
csr_get_modify_profile_fields(struct mac_context * mac,uint32_t sessionId,tCsrRoamModifyProfileFields * pModifyProfileFields)1227*5113495bSYour Name QDF_STATUS csr_get_modify_profile_fields(struct mac_context *mac,
1228*5113495bSYour Name 					uint32_t sessionId,
1229*5113495bSYour Name 					 tCsrRoamModifyProfileFields *
1230*5113495bSYour Name 					 pModifyProfileFields)
1231*5113495bSYour Name {
1232*5113495bSYour Name 	if (!pModifyProfileFields)
1233*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1234*5113495bSYour Name 
1235*5113495bSYour Name 	qdf_mem_copy(pModifyProfileFields,
1236*5113495bSYour Name 		     &mac->roam.roamSession[sessionId].modifyProfileFields,
1237*5113495bSYour Name 		     sizeof(tCsrRoamModifyProfileFields));
1238*5113495bSYour Name 
1239*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1240*5113495bSYour Name }
1241*5113495bSYour Name 
csr_set_modify_profile_fields(struct mac_context * mac,uint32_t sessionId,tCsrRoamModifyProfileFields * pModifyProfileFields)1242*5113495bSYour Name QDF_STATUS csr_set_modify_profile_fields(struct mac_context *mac,
1243*5113495bSYour Name 					uint32_t sessionId,
1244*5113495bSYour Name 					 tCsrRoamModifyProfileFields *
1245*5113495bSYour Name 					 pModifyProfileFields)
1246*5113495bSYour Name {
1247*5113495bSYour Name 	struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
1248*5113495bSYour Name 
1249*5113495bSYour Name 	if (!pSession) {
1250*5113495bSYour Name 		sme_err("Session_id invalid %d", sessionId);
1251*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1252*5113495bSYour Name 	}
1253*5113495bSYour Name 
1254*5113495bSYour Name 	qdf_mem_copy(&pSession->modifyProfileFields,
1255*5113495bSYour Name 		     pModifyProfileFields, sizeof(tCsrRoamModifyProfileFields));
1256*5113495bSYour Name 
1257*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1258*5113495bSYour Name }
1259*5113495bSYour Name 
1260*5113495bSYour Name /* no need to acquire lock for this basic function */
sme_chn_to_freq(uint8_t chanNum)1261*5113495bSYour Name uint16_t sme_chn_to_freq(uint8_t chanNum)
1262*5113495bSYour Name {
1263*5113495bSYour Name 	int i;
1264*5113495bSYour Name 
1265*5113495bSYour Name 	for (i = 0; i < NUM_CHANNELS; i++) {
1266*5113495bSYour Name 		if (WLAN_REG_CH_NUM(i) == chanNum)
1267*5113495bSYour Name 			return WLAN_REG_CH_TO_FREQ(i);
1268*5113495bSYour Name 	}
1269*5113495bSYour Name 
1270*5113495bSYour Name 	return 0;
1271*5113495bSYour Name }
1272*5113495bSYour Name 
sme_bss_type_to_string(const uint8_t bss_type)1273*5113495bSYour Name const char *sme_bss_type_to_string(const uint8_t bss_type)
1274*5113495bSYour Name {
1275*5113495bSYour Name 	switch (bss_type) {
1276*5113495bSYour Name 	CASE_RETURN_STRING(eCSR_BSS_TYPE_INFRASTRUCTURE);
1277*5113495bSYour Name 	CASE_RETURN_STRING(eCSR_BSS_TYPE_INFRA_AP);
1278*5113495bSYour Name 	CASE_RETURN_STRING(eCSR_BSS_TYPE_ANY);
1279*5113495bSYour Name 	default:
1280*5113495bSYour Name 		return "unknown bss type";
1281*5113495bSYour Name 	}
1282*5113495bSYour Name }
1283*5113495bSYour Name 
1284*5113495bSYour Name /**
1285*5113495bSYour Name  * csr_is_ndi_started() - function to check if NDI is started
1286*5113495bSYour Name  * @mac_ctx: handle to mac context
1287*5113495bSYour Name  * @session_id: session identifier
1288*5113495bSYour Name  *
1289*5113495bSYour Name  * returns: true if NDI is started, false otherwise
1290*5113495bSYour Name  */
csr_is_ndi_started(struct mac_context * mac_ctx,uint32_t session_id)1291*5113495bSYour Name bool csr_is_ndi_started(struct mac_context *mac_ctx, uint32_t session_id)
1292*5113495bSYour Name {
1293*5113495bSYour Name 	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
1294*5113495bSYour Name 
1295*5113495bSYour Name 	if (!session)
1296*5113495bSYour Name 		return false;
1297*5113495bSYour Name 
1298*5113495bSYour Name 	return eCSR_CONNECT_STATE_TYPE_NDI_STARTED == session->connectState;
1299*5113495bSYour Name }
1300*5113495bSYour Name 
csr_is_mcc_channel(struct mac_context * mac_ctx,uint32_t chan_freq)1301*5113495bSYour Name bool csr_is_mcc_channel(struct mac_context *mac_ctx, uint32_t chan_freq)
1302*5113495bSYour Name {
1303*5113495bSYour Name 	struct csr_roam_session *session;
1304*5113495bSYour Name 	enum QDF_OPMODE oper_mode;
1305*5113495bSYour Name 	uint32_t oper_chan_freq = 0;
1306*5113495bSYour Name 	uint8_t vdev_id;
1307*5113495bSYour Name 	bool hw_dbs_capable, same_band_freqs;
1308*5113495bSYour Name 
1309*5113495bSYour Name 	if (chan_freq == 0)
1310*5113495bSYour Name 		return false;
1311*5113495bSYour Name 
1312*5113495bSYour Name 	hw_dbs_capable = policy_mgr_is_hw_dbs_capable(mac_ctx->psoc);
1313*5113495bSYour Name 	for (vdev_id = 0; vdev_id < WLAN_MAX_VDEVS; vdev_id++) {
1314*5113495bSYour Name 		if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id))
1315*5113495bSYour Name 			continue;
1316*5113495bSYour Name 
1317*5113495bSYour Name 		session = CSR_GET_SESSION(mac_ctx, vdev_id);
1318*5113495bSYour Name 		oper_mode =
1319*5113495bSYour Name 			wlan_get_opmode_from_vdev_id(mac_ctx->pdev, vdev_id);
1320*5113495bSYour Name 		if ((((oper_mode == QDF_STA_MODE) ||
1321*5113495bSYour Name 		     (oper_mode == QDF_P2P_CLIENT_MODE)) &&
1322*5113495bSYour Name 		    cm_is_vdevid_connected(mac_ctx->pdev, vdev_id)) ||
1323*5113495bSYour Name 		    (((oper_mode == QDF_P2P_GO_MODE) ||
1324*5113495bSYour Name 		      (oper_mode == QDF_SAP_MODE)) &&
1325*5113495bSYour Name 		     (session->connectState !=
1326*5113495bSYour Name 		      eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED)))
1327*5113495bSYour Name 			oper_chan_freq =
1328*5113495bSYour Name 			    wlan_get_operation_chan_freq_vdev_id(mac_ctx->pdev,
1329*5113495bSYour Name 								 vdev_id);
1330*5113495bSYour Name 
1331*5113495bSYour Name 		if (!oper_chan_freq)
1332*5113495bSYour Name 			continue;
1333*5113495bSYour Name 		same_band_freqs = WLAN_REG_IS_SAME_BAND_FREQS(
1334*5113495bSYour Name 			chan_freq, oper_chan_freq);
1335*5113495bSYour Name 
1336*5113495bSYour Name 		if (oper_chan_freq && chan_freq != oper_chan_freq &&
1337*5113495bSYour Name 		    (!hw_dbs_capable || same_band_freqs))
1338*5113495bSYour Name 			return true;
1339*5113495bSYour Name 	}
1340*5113495bSYour Name 
1341*5113495bSYour Name 	return false;
1342*5113495bSYour Name }
1343*5113495bSYour Name 
csr_phy_mode_to_dot11mode(enum wlan_phymode phy_mode)1344*5113495bSYour Name enum csr_cfgdot11mode csr_phy_mode_to_dot11mode(enum wlan_phymode phy_mode)
1345*5113495bSYour Name {
1346*5113495bSYour Name 	switch (phy_mode) {
1347*5113495bSYour Name 	case WLAN_PHYMODE_AUTO:
1348*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_AUTO;
1349*5113495bSYour Name 	case WLAN_PHYMODE_11A:
1350*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11A;
1351*5113495bSYour Name 	case WLAN_PHYMODE_11B:
1352*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11B;
1353*5113495bSYour Name 	case WLAN_PHYMODE_11G:
1354*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11G;
1355*5113495bSYour Name 	case WLAN_PHYMODE_11G_ONLY:
1356*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11G_ONLY;
1357*5113495bSYour Name 	case WLAN_PHYMODE_11NA_HT20:
1358*5113495bSYour Name 	case WLAN_PHYMODE_11NG_HT20:
1359*5113495bSYour Name 	case WLAN_PHYMODE_11NA_HT40:
1360*5113495bSYour Name 	case WLAN_PHYMODE_11NG_HT40PLUS:
1361*5113495bSYour Name 	case WLAN_PHYMODE_11NG_HT40MINUS:
1362*5113495bSYour Name 	case WLAN_PHYMODE_11NG_HT40:
1363*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11N;
1364*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT20:
1365*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT20_2G:
1366*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT40:
1367*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT40PLUS_2G:
1368*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT40MINUS_2G:
1369*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT40_2G:
1370*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT80:
1371*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT80_2G:
1372*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT160:
1373*5113495bSYour Name 	case WLAN_PHYMODE_11AC_VHT80_80:
1374*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11AC;
1375*5113495bSYour Name 	case WLAN_PHYMODE_11AXA_HE20:
1376*5113495bSYour Name 	case WLAN_PHYMODE_11AXG_HE20:
1377*5113495bSYour Name 	case WLAN_PHYMODE_11AXA_HE40:
1378*5113495bSYour Name 	case WLAN_PHYMODE_11AXG_HE40PLUS:
1379*5113495bSYour Name 	case WLAN_PHYMODE_11AXG_HE40MINUS:
1380*5113495bSYour Name 	case WLAN_PHYMODE_11AXG_HE40:
1381*5113495bSYour Name 	case WLAN_PHYMODE_11AXA_HE80:
1382*5113495bSYour Name 	case WLAN_PHYMODE_11AXG_HE80:
1383*5113495bSYour Name 	case WLAN_PHYMODE_11AXA_HE160:
1384*5113495bSYour Name 	case WLAN_PHYMODE_11AXA_HE80_80:
1385*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11AX;
1386*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1387*5113495bSYour Name 	case WLAN_PHYMODE_11BEA_EHT20:
1388*5113495bSYour Name 	case WLAN_PHYMODE_11BEG_EHT20:
1389*5113495bSYour Name 	case WLAN_PHYMODE_11BEA_EHT40:
1390*5113495bSYour Name 	case WLAN_PHYMODE_11BEG_EHT40PLUS:
1391*5113495bSYour Name 	case WLAN_PHYMODE_11BEG_EHT40MINUS:
1392*5113495bSYour Name 	case WLAN_PHYMODE_11BEG_EHT40:
1393*5113495bSYour Name 	case WLAN_PHYMODE_11BEA_EHT80:
1394*5113495bSYour Name 	case WLAN_PHYMODE_11BEG_EHT80:
1395*5113495bSYour Name 	case WLAN_PHYMODE_11BEA_EHT160:
1396*5113495bSYour Name 	case WLAN_PHYMODE_11BEA_EHT320:
1397*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_11BE;
1398*5113495bSYour Name #endif
1399*5113495bSYour Name 	default:
1400*5113495bSYour Name 		sme_err("invalid phy mode %d", phy_mode);
1401*5113495bSYour Name 		return eCSR_CFG_DOT11_MODE_MAX;
1402*5113495bSYour Name 	}
1403*5113495bSYour Name }
1404*5113495bSYour Name 
csr_mlme_vdev_disconnect_all_p2p_client_event(uint8_t vdev_id)1405*5113495bSYour Name QDF_STATUS csr_mlme_vdev_disconnect_all_p2p_client_event(uint8_t vdev_id)
1406*5113495bSYour Name {
1407*5113495bSYour Name 	struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
1408*5113495bSYour Name 
1409*5113495bSYour Name 	if (!mac_ctx)
1410*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1411*5113495bSYour Name 
1412*5113495bSYour Name 	return csr_roam_call_callback(mac_ctx, vdev_id, NULL,
1413*5113495bSYour Name 				      eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS,
1414*5113495bSYour Name 				      eCSR_ROAM_RESULT_NONE);
1415*5113495bSYour Name }
1416*5113495bSYour Name 
csr_mlme_vdev_stop_bss(uint8_t vdev_id)1417*5113495bSYour Name QDF_STATUS csr_mlme_vdev_stop_bss(uint8_t vdev_id)
1418*5113495bSYour Name {
1419*5113495bSYour Name 	struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
1420*5113495bSYour Name 
1421*5113495bSYour Name 	if (!mac_ctx)
1422*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1423*5113495bSYour Name 
1424*5113495bSYour Name 	return csr_roam_call_callback(mac_ctx, vdev_id, NULL,
1425*5113495bSYour Name 				      eCSR_ROAM_SEND_P2P_STOP_BSS,
1426*5113495bSYour Name 				      eCSR_ROAM_RESULT_NONE);
1427*5113495bSYour Name }
1428*5113495bSYour Name 
csr_mlme_get_concurrent_operation_freq(void)1429*5113495bSYour Name qdf_freq_t csr_mlme_get_concurrent_operation_freq(void)
1430*5113495bSYour Name {
1431*5113495bSYour Name 	struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
1432*5113495bSYour Name 
1433*5113495bSYour Name 	if (!mac_ctx)
1434*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1435*5113495bSYour Name 
1436*5113495bSYour Name 	return csr_get_concurrent_operation_freq(mac_ctx);
1437*5113495bSYour Name }
1438