diff --git a/Kbuild b/Kbuild
index 960559a..04f0759 100644
--- a/Kbuild
+++ b/Kbuild
@@ -2579,7 +2579,6 @@
 #CRYPTO Coverged Component
 cppflags-$(CONFIG_CRYPTO_COMPONENT) += -DWLAN_CONV_CRYPTO_SUPPORTED \
                                        -DCRYPTO_SET_KEY_CONVERGED \
-                                       -DWLAN_CONV_CRYPTO_IE_SUPPORT \
                                        -DWLAN_CRYPTO_WEP_OS_DERIVATIVE \
                                        -DWLAN_CRYPTO_TKIP_OS_DERIVATIVE \
                                        -DWLAN_CRYPTO_CCMP_OS_DERIVATIVE \
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index fb69cf2..f15c829 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -21727,7 +21727,6 @@
 	return errno;
 }
 
-#ifdef WLAN_CONV_CRYPTO_IE_SUPPORT
 static QDF_STATUS wlan_hdd_set_pmksa_cache(struct hdd_adapter *adapter,
 					   tPmkidCacheInfo *pmk_cache)
 {
@@ -21791,34 +21790,6 @@
 
 	return result;
 }
-#else
-static QDF_STATUS wlan_hdd_set_pmksa_cache(struct hdd_adapter *adapter,
-					   tPmkidCacheInfo *pmk_cache)
-{
-	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-
-	return sme_roam_set_pmkid_cache(
-		hdd_ctx->mac_handle, adapter->vdev_id, pmk_cache, 1, false);
-}
-
-static QDF_STATUS wlan_hdd_del_pmksa_cache(struct hdd_adapter *adapter,
-					   tPmkidCacheInfo *pmk_cache)
-{
-	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-
-	return sme_roam_del_pmkid_from_cache(
-			hdd_ctx->mac_handle, adapter->vdev_id, pmk_cache,
-			false);
-}
-
-QDF_STATUS wlan_hdd_flush_pmksa_cache(struct hdd_adapter *adapter)
-{
-	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-
-	return sme_roam_del_pmkid_from_cache(
-		hdd_ctx->mac_handle, adapter->vdev_id, NULL, true);
-}
-#endif
 
 #if defined(CFG80211_FILS_SK_OFFLOAD_SUPPORT) || \
 	 (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c
index 95baf3b..8fe7efa 100644
--- a/core/mac/src/pe/lim/lim_assoc_utils.c
+++ b/core/mac/src/pe/lim/lim_assoc_utils.c
@@ -301,260 +301,6 @@
 #define SECURITY_SUITE_TYPE_GCMP 0x8
 #define SECURITY_SUITE_TYPE_GCMP_256 0x9
 
-#ifndef WLAN_CONV_CRYPTO_IE_SUPPORT
-/**
- * is_non_rsn_cipher()- API to check whether cipher suit is rsn or not
- * @cipher_suite: cipher suit
- *
- * Return: True in case non ht cipher else false
- */
-static inline bool is_non_rsn_cipher(uint8_t cipher_suite)
-{
-	uint8_t cipher_mask;
-
-	cipher_mask = cipher_suite & SECURITY_SUITE_TYPE_MASK;
-	if ((cipher_mask == SECURITY_SUITE_TYPE_CCMP) ||
-	    (cipher_mask == SECURITY_SUITE_TYPE_GCMP) ||
-	    (cipher_mask == SECURITY_SUITE_TYPE_GCMP_256))
-		return false;
-
-	return true;
-}
-
-/**
- * lim_check_rx_rsn_ie_match()- validate received rsn ie with supported cipher
- *      suites.
- * @mac_ctx: pointer to global mac structure
- * @rx_rsn_ie: received rsn IE pointer
- * @session_entry: pe session entry
- * @sta_is_ht: peer station HT capability
- * @pmf_connection: set to true if this is pmf connection
- *
- * This function is called during Association/Reassociation
- * frame handling to determine whether received RSN in
- * Assoc/Reassoc request frames include supported cipher suites or not.
- *
- * Return: QDF_STATUS_SUCCESS if ALL supported cipher suites are present in the
- *                  received rsn IE else failure status.
- */
-
-uint8_t lim_check_rx_rsn_ie_match(struct mac_context *mac_ctx,
-				  tDot11fIERSN * const rx_rsn_ie,
-				  struct pe_session *session_entry, uint8_t sta_is_ht,
-				  bool *pmf_connection)
-{
-	tDot11fIERSN *rsn_ie;
-	bool match = false;
-	uint8_t i, j, only_non_ht_cipher = 1;
-#ifdef WLAN_FEATURE_11W
-	bool we_are_pmf_capable;
-	bool we_require_pmf;
-	bool they_are_pmf_capable;
-	bool they_require_pmf;
-#endif
-
-	/* RSN IE should be received from PE */
-	rsn_ie = &session_entry->gStartBssRSNIe;
-
-	if (!rx_rsn_ie) {
-		pe_debug("Rx RSN IE is NULL");
-		return eSIR_MAC_UNSPEC_FAILURE_STATUS;
-	}
-
-	/* We should have only one AKM in assoc/reassoc request */
-	if (rx_rsn_ie->akm_suite_cnt != 1) {
-		pe_debug("Invalid RX akm_suite_cnt %d",
-			 rx_rsn_ie->akm_suite_cnt);
-		return eSIR_MAC_INVALID_AKMP_STATUS;
-	}
-	/* Check if we support the received AKM */
-	for (i = 0; i < rsn_ie->akm_suite_cnt; i++)
-		if (!qdf_mem_cmp(&rx_rsn_ie->akm_suite[0],
-				 &rsn_ie->akm_suite[i],
-				 sizeof(rsn_ie->akm_suite[i]))) {
-			match = true;
-			break;
-		}
-	if (!match) {
-		pe_debug("Invalid RX akm_suite");
-		return eSIR_MAC_INVALID_AKMP_STATUS;
-	}
-
-	/* Check groupwise cipher suite */
-	for (i = 0; i < sizeof(rx_rsn_ie->gp_cipher_suite); i++)
-		if (rsn_ie->gp_cipher_suite[i] !=
-				 rx_rsn_ie->gp_cipher_suite[i]) {
-			pe_debug("Invalid groupwise cipher suite");
-			return eSIR_MAC_INVALID_GROUP_CIPHER_STATUS;
-		}
-
-	/*
-	 * For each Pairwise cipher suite check whether we support
-	 * received pairwise
-	 */
-	match = false;
-	for (i = 0; i < rx_rsn_ie->pwise_cipher_suite_count; i++) {
-		for (j = 0; j < rsn_ie->pwise_cipher_suite_count; j++) {
-			if (!qdf_mem_cmp(&rx_rsn_ie->pwise_cipher_suites[i],
-			    &rsn_ie->pwise_cipher_suites[j],
-			    sizeof(rsn_ie->pwise_cipher_suites[j]))) {
-				match = true;
-				break;
-			}
-		}
-
-		if (sta_is_ht)
-#ifdef ANI_LITTLE_BYTE_ENDIAN
-			only_non_ht_cipher = is_non_rsn_cipher(
-				rx_rsn_ie->pwise_cipher_suites[i][3]);
-#else
-			only_non_ht_cipher = is_non_rsn_cipher(
-				rx_rsn_ie->pwise_cipher_suites[i][0]);
-#endif
-	}
-
-	if ((!match) || ((sta_is_ht) && only_non_ht_cipher)) {
-		pe_debug("Invalid pairwise cipher suite");
-		return eSIR_MAC_INVALID_PAIRWISE_CIPHER_STATUS;
-	}
-	/*
-	 * Check RSN capabilities
-	 * Bit 0 of First Byte - PreAuthentication Capability
-	 */
-	if (((rx_rsn_ie->RSN_Cap[0] >> 0) & 0x1) == true) {
-		/* this is supported by AP only */
-		pe_debug("Invalid RSN information element capabilities");
-		return eSIR_MAC_INVALID_RSN_IE_CAPABILITIES_STATUS;
-	}
-
-	*pmf_connection = false;
-
-#ifdef WLAN_FEATURE_11W
-	we_are_pmf_capable = session_entry->pLimStartBssReq->pmfCapable;
-	we_require_pmf = session_entry->pLimStartBssReq->pmfRequired;
-	they_are_pmf_capable = (rx_rsn_ie->RSN_Cap[0] >> 7) & 0x1;
-	they_require_pmf = (rx_rsn_ie->RSN_Cap[0] >> 6) & 0x1;
-
-	if ((they_require_pmf && they_are_pmf_capable && !we_are_pmf_capable) ||
-	    (we_require_pmf && !they_are_pmf_capable)) {
-		pe_debug("Association fail, robust management frames policy"
-				" violation they_require_pmf =%d"
-				" theyArePMFCapable %d weArePMFCapable %d"
-				" weRequirePMF %d theyArePMFCapable %d",
-			they_require_pmf, they_are_pmf_capable,
-			we_are_pmf_capable, we_require_pmf,
-			they_are_pmf_capable);
-		return eSIR_MAC_ROBUST_MGMT_FRAMES_POLICY_VIOLATION;
-	}
-
-	if (they_are_pmf_capable && we_are_pmf_capable)
-		*pmf_connection = true;
-
-	pe_debug("weAreCapable %d, weRequire %d, theyAreCapable %d,"
-			" theyRequire %d, PMFconnection %d",
-		we_are_pmf_capable, we_require_pmf, they_are_pmf_capable,
-		they_require_pmf, *pmf_connection);
-#endif
-
-	return eSIR_MAC_SUCCESS_STATUS;
-}
-
-/**
- * lim_check_rx_wpa_ie_match() - to check supported cipher suites
- *
- * @mac: pointer to global mac structure
- * @rx_wpaie: Received WPA IE in (Re)Assco req
- * @session_entry: pointer to PE session
- * @sta_is_ht: peer station is HT
- *
- * This function is called during Association/Reassociation
- * frame handling to determine whether received RSN in
- * Assoc/Reassoc request frames include supported cipher suites or not.
- *
- * Return: Success if ALL supported cipher suites are present in the
- *                  received wpa IE else failure status.
- */
-
-uint8_t
-lim_check_rx_wpa_ie_match(struct mac_context *mac, tDot11fIEWPA *rx_wpaie,
-			  struct pe_session *session_entry, uint8_t sta_is_ht)
-{
-	tDot11fIEWPA *wpa_ie;
-	bool match = false;
-	uint8_t i, j, only_non_ht_cipher = 1;
-
-	/* WPA IE should be received from PE */
-	wpa_ie = &session_entry->gStartBssWPAIe;
-
-	/* We should have only one AKM in assoc/reassoc request */
-	if (rx_wpaie->auth_suite_count != 1) {
-		pe_debug("Invalid RX auth_suite_count %d",
-			 rx_wpaie->auth_suite_count);
-		return eSIR_MAC_INVALID_AKMP_STATUS;
-	}
-	/* Check if we support the received AKM */
-	for (i = 0; i < wpa_ie->auth_suite_count; i++)
-		if (!qdf_mem_cmp(&rx_wpaie->auth_suites[0],
-				 &wpa_ie->auth_suites[i],
-				 sizeof(wpa_ie->auth_suites[i]))) {
-			match = true;
-			break;
-		}
-	if (!match) {
-		pe_debug("Invalid RX auth_suites");
-		return eSIR_MAC_INVALID_AKMP_STATUS;
-	}
-
-	/* Check groupwise cipher suite */
-	for (i = 0; i < 4; i++) {
-		if (wpa_ie->multicast_cipher[i] !=
-				rx_wpaie->multicast_cipher[i]) {
-			pe_debug("Invalid groupwise cipher suite");
-			return eSIR_MAC_INVALID_GROUP_CIPHER_STATUS;
-		}
-	}
-
-	/*
-	 * For each Pairwise cipher suite check whether we support
-	 * received pairwise
-	 */
-	match = false;
-	for (i = 0; i < rx_wpaie->unicast_cipher_count; i++) {
-		for (j = 0; j < wpa_ie->unicast_cipher_count; j++) {
-			if (!qdf_mem_cmp(rx_wpaie->unicast_ciphers[i],
-					    wpa_ie->unicast_ciphers[j], 4)) {
-				match = true;
-				break;
-			}
-		}
-
-		if ((sta_is_ht)
-#ifdef ANI_LITTLE_BYTE_ENDIAN
-		    &&
-		    ((rx_wpaie->
-		      unicast_ciphers[i][3] & SECURITY_SUITE_TYPE_MASK) ==
-		     SECURITY_SUITE_TYPE_CCMP))
-#else
-		    &&
-		    ((rx_wpaie->
-		      unicast_ciphers[i][0] & SECURITY_SUITE_TYPE_MASK) ==
-		     SECURITY_SUITE_TYPE_CCMP))
-#endif
-		{
-			only_non_ht_cipher = 0;
-		}
-
-	}
-
-	if ((!match) || ((sta_is_ht) && only_non_ht_cipher)) {
-		pe_debug("Invalid pairwise cipher suite");
-		return eSIR_MAC_CIPHER_SUITE_REJECTED_STATUS;
-	}
-
-	return eSIR_MAC_SUCCESS_STATUS;
-}
-#endif
-
 /**
  * lim_cleanup_rx_path()
  *
diff --git a/core/mac/src/pe/lim/lim_assoc_utils.h b/core/mac/src/pe/lim/lim_assoc_utils.h
index 5e4e9c6..793d0d0 100644
--- a/core/mac/src/pe/lim/lim_assoc_utils.h
+++ b/core/mac/src/pe/lim/lim_assoc_utils.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -43,12 +43,6 @@
 				 tSirAssocReq *,
 				 tSirMacCapabilityInfo *, struct pe_session *);
 uint8_t lim_check_rx_basic_rates(struct mac_context *, tSirMacRateSet, struct pe_session *);
-uint8_t lim_check_rx_rsn_ie_match(struct mac_context *mac_ctx,
-				  tDot11fIERSN * const rx_rsn_ie,
-				  struct pe_session *session_entry, uint8_t sta_is_ht,
-				  bool *pmf_connection);
-uint8_t lim_check_rx_wpa_ie_match(struct mac_context *, tDot11fIEWPA *, struct pe_session *,
-				  uint8_t);
 uint8_t lim_check_mcs_set(struct mac_context *mac, uint8_t *supportedMCSSet);
 QDF_STATUS lim_cleanup_rx_path(struct mac_context *, tpDphHashNode,
 			       struct pe_session *);
diff --git a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c
index 11eb868..1225c37 100644
--- a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c
+++ b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -829,7 +829,6 @@
 	}
 }
 
-#ifdef WLAN_CONV_CRYPTO_IE_SUPPORT
 static
 enum mac_status_code lim_check_rsn_ie(struct pe_session *session,
 				      struct mac_context *mac_ctx,
@@ -895,27 +894,6 @@
 
 	return eSIR_MAC_INVALID_IE_STATUS;
 }
-#else
-static enum mac_status_code lim_check_rsn_ie(struct pe_session *session,
-					     struct mac_context *mac_ctx,
-					     tpSirAssocReq assoc_req,
-					     tDot11fIERSN *rsn,
-					     bool *pmf_connection)
-{
-	return lim_check_rx_rsn_ie_match(mac_ctx, rsn, session,
-					 assoc_req->HTCaps.present,
-					 pmf_connection);
-}
-
-static enum mac_status_code lim_check_wpa_ie(struct pe_session *session,
-					     struct mac_context *mac_ctx,
-					     tpSirAssocReq assoc_req,
-					     tDot11fIEWPA *wpa)
-{
-	return lim_check_rx_wpa_ie_match(mac_ctx, wpa, session,
-					 assoc_req->HTCaps.present);
-}
-#endif
 
 /**
   * lim_check_sae_pmf_cap() - check pmf capability for SAE STA
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index 80d931c..4684456 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -1165,7 +1165,6 @@
 }
 
 #ifdef WLAN_FEATURE_11W
-#ifdef WLAN_CONV_CRYPTO_IE_SUPPORT
 /**
  * lim_set_rmf_enabled() - set rmf enabled
  * @mac: mac context
@@ -1214,30 +1213,6 @@
  *
  * Return: void
  */
-static void lim_set_rmf_enabled(struct mac_context *mac,
-				struct pe_session *session,
-				struct join_req *csr_join_req)
-{
-	if ((eSIR_ED_AES_128_CMAC == csr_join_req->MgmtEncryptionType) ||
-	    (eSIR_ED_AES_GMAC_128 == csr_join_req->MgmtEncryptionType) ||
-	    (eSIR_ED_AES_GMAC_256 == csr_join_req->MgmtEncryptionType))
-		session->limRmfEnabled = 1;
-	else
-		session->limRmfEnabled = 0;
-
-	pe_debug("mgmt encryption type %d limRmfEnabled %d",
-		 csr_join_req->MgmtEncryptionType, session->limRmfEnabled);
-}
-#endif
-#else
-/**
- * lim_set_rmf_enabled() - set rmf enabled
- * @mac: mac context
- * @session: pe session
- * @csr_join_req: csr join req
- *
- * Return: void
- */
 static inline void lim_set_rmf_enabled(struct mac_context *mac,
 				       struct pe_session *session,
 				       struct join_req *csr_join_req)
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 63f5894..4d6489c 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -549,10 +549,6 @@
 					uint8_t sessionId,
 					tCsrRoamConnectedProfile *pProfile);
 void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile);
-QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
-		tPmkidCacheInfo *pPMKIDCache,
-		uint32_t numItems,
-		bool update_entire_cache);
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /**
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index 9844b76..af17a9e 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -3056,49 +3056,6 @@
 	csr_roam_free_connect_profile(profile);
 }
 
-/*
- * sme_roam_set_pmkid_cache() -
- * A wrapper function to request CSR to return the PMKID candidate list
- * This is a synchronous call.
-
- * pPMKIDCache - caller allocated buffer point to an array of
- *			 tPmkidCacheInfo
- * numItems - a variable that has the number of tPmkidCacheInfo
- *		      allocated when retruning, this is either the number needed
- *		      or number of items put into pPMKIDCache
- * update_entire_cache - this bool value specifies if the entire pmkid
- *				 cache should be overwritten or should it be
- *				 updated entry by entry.
- * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
- *			 big enough and pNumItems has the number of
- *			 tPmkidCacheInfo.
- *   \Note: pNumItems is a number of tPmkidCacheInfo,
- *	   not sizeof(tPmkidCacheInfo) * something
- */
-QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
-				    tPmkidCacheInfo *pPMKIDCache,
-				    uint32_t numItems, bool update_entire_cache)
-{
-	QDF_STATUS status = QDF_STATUS_E_FAILURE;
-	struct mac_context *mac = MAC_CONTEXT(mac_handle);
-
-	MTRACE(qdf_trace(QDF_MODULE_ID_SME,
-			 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
-			 numItems));
-	status = sme_acquire_global_lock(&mac->sme);
-	if (QDF_IS_STATUS_SUCCESS(status)) {
-		if (CSR_IS_SESSION_VALID(mac, sessionId))
-			status = csr_roam_set_pmkid_cache(mac, sessionId,
-						pPMKIDCache,
-						numItems, update_entire_cache);
-		else
-			status = QDF_STATUS_E_INVAL;
-		sme_release_global_lock(&mac->sme);
-	}
-
-	return status;
-}
-
 QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
 					 uint8_t sessionId,
 					 tPmkidCacheInfo *pmksa,
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 8d2a7e6..7276f45 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -14962,164 +14962,6 @@
 }
 #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
 
-#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
-static void
-csr_roam_diag_set_pmkid(struct csr_roam_session *pSession)
-{
-	WLAN_HOST_DIAG_EVENT_DEF(secEvent,
-				 host_event_wlan_security_payload_type);
-	qdf_mem_zero(&secEvent,
-	    sizeof(host_event_wlan_security_payload_type));
-	secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
-	secEvent.encryptionModeMulticast =
-		(uint8_t) diag_enc_type_from_csr_type(
-			pSession->connectedProfile.mcEncryptionType);
-	secEvent.encryptionModeUnicast =
-		(uint8_t) diag_enc_type_from_csr_type(
-			pSession->connectedProfile.EncryptionType);
-	qdf_mem_copy(secEvent.bssid,
-		     pSession->connectedProfile.bssid.bytes,
-			QDF_MAC_ADDR_SIZE);
-	secEvent.authMode = (uint8_t) diag_auth_type_from_csr_type(
-				pSession->connectedProfile.AuthType);
-	WLAN_HOST_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
-}
-#endif /* FEATURE_WLAN_DIAG_SUPPORT_CSR */
-
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
-/**
- * csr_update_session_psk_pmk - API to update PMK in csr session
- * @pSession: pointer to session
- * @pmksa: pointer to PMKSA struct
- *
- * Return : None
- */
-static void
-csr_update_session_psk_pmk(struct csr_roam_session *session,
-			   tPmkidCacheInfo *pmksa)
-{
-	/* For SAE authentication, pmk will be sent over the
-	 * set PMKSA vendor command. The set PMKSA command is sent
-	 * after SAE authentication is complete, before association
-	 * completion itself. So csr_roam_session will not be having
-	 * any parameters at this point. This pmk received is not
-	 * updated to csr session and when RSO update command is sent,
-	 * empty pmk will be sent, resulting in SAE roming failure. So
-	 * copy the pmk into csr session so that correct pmk will be
-	 * sent in RSO command.
-	 */
-	qdf_mem_copy(session->psk_pmk, pmksa->pmk, pmksa->pmk_len);
-	session->pmk_len = pmksa->pmk_len;
-}
-#else
-static inline void
-csr_update_session_psk_pmk(struct csr_roam_session *session,
-			   tPmkidCacheInfo *pmksa)
-{}
-#endif
-
-/**
- * csr_update_pmk_cache - API to update PMK cache
- * @pSession: pointer to session
- * @pmksa: pointer to PMKSA struct
- *
- * Return : None
- */
-static void csr_update_pmk_cache(struct csr_roam_session *session,
-			tPmkidCacheInfo *pmksa)
-{
-	uint16_t cache_idx = session->curr_cache_idx;
-
-	/* Add entry to the cache */
-	if (!pmksa->ssid_len) {
-		qdf_copy_macaddr(
-		    &session->PmkidCacheInfo[cache_idx].BSSID,
-		    &pmksa->BSSID);
-		session->PmkidCacheInfo[cache_idx].ssid_len = 0;
-	} else {
-		qdf_mem_copy(session->PmkidCacheInfo[cache_idx].ssid,
-			pmksa->ssid, pmksa->ssid_len);
-		session->PmkidCacheInfo[cache_idx].ssid_len =
-			pmksa->ssid_len;
-		qdf_mem_copy(session->PmkidCacheInfo[cache_idx].cache_id,
-			pmksa->cache_id, CACHE_ID_LEN);
-
-	}
-	qdf_mem_copy(
-	    session->PmkidCacheInfo[cache_idx].PMKID,
-	    pmksa->PMKID, PMKID_LEN);
-
-	if (pmksa->pmk_len) {
-		qdf_mem_copy(session->PmkidCacheInfo[cache_idx].pmk,
-			     pmksa->pmk, pmksa->pmk_len);
-
-		csr_update_session_psk_pmk(session, pmksa);
-	}
-
-	session->PmkidCacheInfo[cache_idx].pmk_len = pmksa->pmk_len;
-
-	/* Increment the CSR local cache index */
-	if (cache_idx < (CSR_MAX_PMKID_ALLOWED - 1))
-		session->curr_cache_idx++;
-	else {
-		sme_debug("max value reached, setting current index as 0");
-		session->curr_cache_idx = 0;
-	}
-
-	session->NumPmkidCache++;
-	if (session->NumPmkidCache > CSR_MAX_PMKID_ALLOWED) {
-		sme_debug("setting num pmkid cache to %d",
-			CSR_MAX_PMKID_ALLOWED);
-		session->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
-	}
-}
-
-QDF_STATUS
-csr_roam_set_pmkid_cache(struct mac_context *mac, uint32_t sessionId,
-			 tPmkidCacheInfo *pPMKIDCache, uint32_t numItems,
-			 bool update_entire_cache)
-{
-	struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
-	uint32_t i = 0;
-	tPmkidCacheInfo *pmksa;
-
-	if (!pSession) {
-		sme_err("session %d not found", sessionId);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	sme_debug("numItems = %d", numItems);
-
-	if (numItems > CSR_MAX_PMKID_ALLOWED)
-		return QDF_STATUS_E_INVAL;
-
-#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
-	csr_roam_diag_set_pmkid(pSession);
-#endif /* FEATURE_WLAN_DIAG_SUPPORT_CSR */
-
-	if (update_entire_cache) {
-		if (numItems && pPMKIDCache) {
-			pSession->NumPmkidCache = (uint16_t) numItems;
-			qdf_mem_copy(pSession->PmkidCacheInfo, pPMKIDCache,
-				sizeof(tPmkidCacheInfo) * numItems);
-			pSession->curr_cache_idx = (uint16_t)numItems;
-		}
-		return QDF_STATUS_SUCCESS;
-	}
-
-	for (i = 0; i < numItems; i++) {
-		pmksa = &pPMKIDCache[i];
-
-		/* Delete the entry if present */
-		csr_roam_del_pmkid_from_cache(mac, sessionId,
-				pmksa, false);
-		/* Update new entry */
-		csr_update_pmk_cache(pSession, pmksa);
-
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 static void csr_mem_zero_psk_pmk(struct csr_roam_session *session)
 {
diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h
index b63ecc0..cd529f9 100644
--- a/core/sme/src/csr/csr_inside_api.h
+++ b/core/sme/src/csr/csr_inside_api.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -729,23 +729,6 @@
 			    tCsrRoamModifyProfileFields modProfileFields,
 			    uint32_t *pRoamId);
 
-/*
- * csr_roam_set_pmkid_cache() -
- * return the PMKID candidate list
- *
- * pPMKIDCache - caller allocated buffer point to an array of tPmkidCacheInfo
- * numItems - a variable that has the number of tPmkidCacheInfo allocated
- * when retruning, this is either the number needed or number of items put
- * into pPMKIDCache
- * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
- * big enough and pNumItems has the number of tPmkidCacheInfo.
- * \Note: pNumItems is a number of tPmkidCacheInfo, not
- * sizeof(tPmkidCacheInfo) * something
- */
-QDF_STATUS csr_roam_set_pmkid_cache(struct mac_context *mac, uint32_t sessionId,
-				    tPmkidCacheInfo *pPMKIDCache,
-				   uint32_t numItems, bool update_entire_cache);
-
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /*
  * csr_get_pmk_info(): store PMK in pmk_cache
diff --git a/core/sme/src/csr/csr_util.c b/core/sme/src/csr/csr_util.c
index f6b5b5a..a294837 100644
--- a/core/sme/src/csr/csr_util.c
+++ b/core/sme/src/csr/csr_util.c
@@ -2714,7 +2714,6 @@
 	return false;
 }
 
-#ifdef WLAN_CONV_CRYPTO_IE_SUPPORT
 bool csr_lookup_pmkid_using_bssid(struct mac_context *mac,
 				  struct csr_roam_session *session,
 				  tPmkidCacheInfo *pmk_cache,
@@ -2848,1801 +2847,6 @@
 }
 #endif
 
-#else
-
-static bool csr_match_rsnoui_index(struct mac_context *mac,
-				   uint8_t AllCyphers[][CSR_RSN_OUI_SIZE],
-				   uint8_t cAllCyphers, uint8_t ouiIndex,
-				   uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllCyphers, cAllCyphers, csr_rsn_oui[ouiIndex], Oui);
-
-}
-
-#ifdef FEATURE_WLAN_WAPI
-static bool csr_is_wapi_oui_equal(struct mac_context *mac, uint8_t *Oui1,
-				  uint8_t *Oui2)
-{
-	return !qdf_mem_cmp(Oui1, Oui2, CSR_WAPI_OUI_SIZE);
-}
-
-static bool csr_is_wapi_oui_match(struct mac_context *mac,
-				  uint8_t AllCyphers[][CSR_WAPI_OUI_SIZE],
-				  uint8_t cAllCyphers, uint8_t Cypher[],
-				  uint8_t Oui[])
-{
-	bool fYes = false;
-	uint8_t idx;
-
-	for (idx = 0; idx < cAllCyphers; idx++) {
-		if (csr_is_wapi_oui_equal(mac, AllCyphers[idx], Cypher)) {
-			fYes = true;
-			break;
-		}
-	}
-
-	if (fYes && Oui)
-		qdf_mem_copy(Oui, AllCyphers[idx], CSR_WAPI_OUI_SIZE);
-
-	return fYes;
-}
-
-static bool csr_match_wapi_oui_index(struct mac_context *mac,
-				     uint8_t AllCyphers[][CSR_WAPI_OUI_SIZE],
-				     uint8_t cAllCyphers, uint8_t ouiIndex,
-				     uint8_t Oui[])
-{
-	return csr_is_wapi_oui_match
-		(mac, AllCyphers, cAllCyphers, csr_wapi_oui[ouiIndex], Oui);
-
-}
-#endif /* FEATURE_WLAN_WAPI */
-
-static bool csr_match_wpaoui_index(struct mac_context *mac,
-				   uint8_t AllCyphers[][CSR_RSN_OUI_SIZE],
-				   uint8_t cAllCyphers, uint8_t ouiIndex,
-				   uint8_t Oui[])
-{
-	if (ouiIndex < QDF_ARRAY_SIZE(csr_wpa_oui))
-		return csr_is_oui_match
-			(mac, AllCyphers, cAllCyphers,
-			 csr_wpa_oui[ouiIndex], Oui);
-	else
-		return false;
-}
-
-#ifdef FEATURE_WLAN_WAPI
-static bool csr_is_auth_wapi_cert(struct mac_context *mac,
-				  uint8_t AllSuites[][CSR_WAPI_OUI_SIZE],
-				  uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_wapi_oui_match
-		(mac, AllSuites, cAllSuites, csr_wapi_oui[1], Oui);
-}
-
-static bool csr_is_auth_wapi_psk(struct mac_context *mac,
-				 uint8_t AllSuites[][CSR_WAPI_OUI_SIZE],
-				 uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_wapi_oui_match
-		(mac, AllSuites, cAllSuites, csr_wapi_oui[2], Oui);
-}
-#endif /* FEATURE_WLAN_WAPI */
-
-
-/*
- * Function for 11R FT Authentication. We match the FT Authentication Cipher
- * suite here. This matches for FT Auth with the 802.1X exchange.
- */
-static bool csr_is_ft_auth_rsn(struct mac_context *mac,
-			       uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-			       uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[03], Oui);
-}
-
-/*
- * Function for 11R FT Authentication. We match the FT Authentication Cipher
- * suite here. This matches for FT Auth with the PSK.
- */
-static bool csr_is_ft_auth_rsn_psk(struct mac_context *mac,
-				   uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-				   uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[04], Oui);
-}
-
-
-#ifdef FEATURE_WLAN_ESE
-
-/*
- * Function for ESE CCKM AKM Authentication. We match the CCKM AKM
- * Authentication Key Management suite here. This matches for CCKM AKM Auth
- * with the 802.1X exchange.
- */
-static bool csr_is_ese_cckm_auth_rsn(struct mac_context *mac,
-				     uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-				     uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[06], Oui);
-}
-
-static bool csr_is_ese_cckm_auth_wpa(struct mac_context *mac,
-				     uint8_t AllSuites[][CSR_WPA_OUI_SIZE],
-				     uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_wpa_oui[06], Oui);
-}
-#endif
-
-static bool csr_is_auth_rsn(struct mac_context *mac,
-			    uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-			    uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[01], Oui);
-}
-
-static bool csr_is_auth_rsn_psk(struct mac_context *mac,
-				uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-				uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[02], Oui);
-}
-
-#ifdef WLAN_FEATURE_11W
-static bool csr_is_auth_rsn_psk_sha256(struct mac_context *mac,
-				       uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-				       uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[07], Oui);
-}
-static bool csr_is_auth_rsn8021x_sha256(struct mac_context *mac,
-					uint8_t AllSuites[][CSR_RSN_OUI_SIZE],
-					uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_rsn_oui[8], Oui);
-}
-#endif
-
-#ifdef WLAN_FEATURE_FILS_SK
-/*
- * csr_is_auth_fils_sha256() - check whether oui is fils sha256
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is FILS SHA256, false otherwise
- */
-static bool csr_is_auth_fils_sha256(struct mac_context *mac,
-					uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-					uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_FILS_SHA256], oui);
-}
-
-/*
- * csr_is_auth_fils_sha384() - check whether oui is fils sha384
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is FILS SHA384, false otherwise
- */
-static bool csr_is_auth_fils_sha384(struct mac_context *mac,
-					uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-					uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_FILS_SHA384], oui);
-}
-
-/*
- * csr_is_auth_fils_ft_sha256() - check whether oui is fils ft sha256
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is FT FILS SHA256, false otherwise
- */
-static bool csr_is_auth_fils_ft_sha256(struct mac_context *mac,
-					uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-					uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_FT_FILS_SHA256], oui);
-}
-
-/*
- * csr_is_auth_fils_ft_sha384() - check whether oui is fils ft sha384
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is FT FILS SHA384, false otherwise
- */
-static bool csr_is_auth_fils_ft_sha384(struct mac_context *mac,
-					uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-					uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_FT_FILS_SHA384], oui);
-}
-#endif
-
-/*
- * csr_is_auth_dpp_rsn() - check whether oui is dpp rsn
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is dpp rsn, false otherwise
- */
-static bool csr_is_auth_dpp_rsn(struct mac_context *mac,
-					uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-					uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_DPP_RSN], oui);
-}
-
-/*
- * csr_is_auth_wpa_owe() - check whether oui is OWE
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is OWE, false otherwise
- */
-static bool csr_is_auth_wpa_owe(struct mac_context *mac,
-			       uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-			       uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match
-		(mac, all_suites, suite_count, csr_rsn_oui[ENUM_OWE], oui);
-}
-
-/*
- * csr_is_auth_suiteb_eap_256() - check whether oui is SuiteB EAP256
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is SuiteB EAP256, false otherwise
- */
-static bool csr_is_auth_suiteb_eap_256(struct mac_context *mac,
-			       uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-			       uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_SUITEB_EAP256], oui);
-}
-
-/*
- * csr_is_auth_suiteb_eap_384() - check whether oui is SuiteB EAP384
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is SuiteB EAP384, false otherwise
- */
-static bool csr_is_auth_suiteb_eap_384(struct mac_context *mac,
-			       uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-			       uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_SUITEB_EAP384], oui);
-}
-
-/*
- * csr_is_auth_ft_suiteb_eap_384() - check whether oui is SuiteB EAP384
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is FT SuiteB EAP384, false otherwise
- */
-static
-bool csr_is_auth_ft_suiteb_eap_384(struct mac_context *mac,
-				   uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-				   uint8_t suite_count, uint8_t oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_FT_SUITEB_SHA384], oui);
-}
-
-#ifdef WLAN_FEATURE_SAE
-/*
- * csr_is_auth_wpa_sae() - check whether oui is SAE
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is SAE, false otherwise
- */
-static bool csr_is_auth_wpa_sae(struct mac_context *mac,
-			       uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-			       uint8_t suite_count, uint8_t oui[])
-{
-	bool is_sae_auth;
-
-	is_sae_auth = (csr_is_oui_match(mac, all_suites, suite_count,
-					csr_rsn_oui[ENUM_SAE], oui));
-	return is_sae_auth;
-}
-
-/*
- * csr_is_auth_ft_sae() - check whether oui is SAE
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is FT-SAE, false otherwise
- */
-static bool csr_is_auth_ft_sae(struct mac_context *mac,
-			       uint8_t all_suites[][CSR_RSN_OUI_SIZE],
-			       uint8_t suite_count, uint8_t oui[])
-{
-	bool is_ft_sae_auth;
-
-	is_ft_sae_auth = csr_is_oui_match(mac, all_suites, suite_count,
-					  csr_rsn_oui[ENUM_FT_SAE], oui);
-	return is_ft_sae_auth;
-}
-#endif
-
-/*
- * csr_is_auth_osen() - check whether oui is osen rsn
- * @mac: Global MAC context
- * @all_suites: pointer to all supported akm suites
- * @suite_count: all supported akm suites count
- * @oui: Oui needs to be matched
- *
- * Return: True if OUI is OSEN, false otherwise
- */
-static bool csr_is_auth_osen(struct mac_context *mac,
-			     u8 all_suites[][CSR_RSN_OUI_SIZE],
-			     u8 suite_count, u8 oui[])
-{
-	return csr_is_oui_match(mac, all_suites, suite_count,
-				csr_rsn_oui[ENUM_OSEN], oui);
-}
-
-static bool csr_is_auth_wpa(struct mac_context *mac,
-			    uint8_t AllSuites[][CSR_WPA_OUI_SIZE],
-			    uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_wpa_oui[01], Oui);
-}
-
-static bool csr_is_auth_wpa_psk(struct mac_context *mac,
-				uint8_t AllSuites[][CSR_WPA_OUI_SIZE],
-				uint8_t cAllSuites, uint8_t Oui[])
-{
-	return csr_is_oui_match
-		(mac, AllSuites, cAllSuites, csr_wpa_oui[02], Oui);
-}
-
-static uint8_t csr_get_oui_index_from_cipher(eCsrEncryptionType enType)
-{
-	uint8_t OUIIndex;
-
-	switch (enType) {
-	case eCSR_ENCRYPT_TYPE_WEP40:
-	case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
-		OUIIndex = CSR_OUI_WEP40_OR_1X_INDEX;
-		break;
-	case eCSR_ENCRYPT_TYPE_WEP104:
-	case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
-		OUIIndex = CSR_OUI_WEP104_INDEX;
-		break;
-	case eCSR_ENCRYPT_TYPE_TKIP:
-		OUIIndex = CSR_OUI_TKIP_OR_PSK_INDEX;
-		break;
-	case eCSR_ENCRYPT_TYPE_AES:
-		OUIIndex = CSR_OUI_AES_INDEX;
-		break;
-	case eCSR_ENCRYPT_TYPE_AES_GCMP:
-		OUIIndex = CSR_OUI_AES_GCMP_INDEX;
-		break;
-	case eCSR_ENCRYPT_TYPE_AES_GCMP_256:
-		OUIIndex = CSR_OUI_AES_GCMP_256_INDEX;
-		break;
-	case eCSR_ENCRYPT_TYPE_NONE:
-		OUIIndex = CSR_OUI_USE_GROUP_CIPHER_INDEX;
-		break;
-#ifdef FEATURE_WLAN_WAPI
-	case eCSR_ENCRYPT_TYPE_WPI:
-		OUIIndex = CSR_OUI_WAPI_WAI_CERT_OR_SMS4_INDEX;
-		break;
-#endif /* FEATURE_WLAN_WAPI */
-	default:                /* HOWTO handle this? */
-		OUIIndex = CSR_OUI_RESERVED_INDEX;
-		break;
-	} /* switch */
-
-	return OUIIndex;
-}
-
-#ifdef WLAN_FEATURE_FILS_SK
-/**
- * csr_is_fils_auth() - update negotiated auth if matches to FILS auth type
- * @mac_ctx: pointer to mac context
- * @authsuites: auth suites
- * @c_auth_suites: auth suites count
- * @authentication: authentication
- * @auth_type: authentication type list
- * @index: current counter
- * @neg_authtype: pointer to negotiated auth
- *
- * Return: None
- */
-static void csr_is_fils_auth(struct mac_context *mac_ctx,
-	uint8_t authsuites[][CSR_RSN_OUI_SIZE], uint8_t c_auth_suites,
-	uint8_t authentication[], tCsrAuthList *auth_type,
-	uint8_t index, enum csr_akm_type *neg_authtype)
-{
-	/*
-	 * TODO Always try with highest security
-	 * move this down once sha384 is validated
-	 */
-	if (csr_is_auth_fils_sha256(mac_ctx, authsuites,
-				c_auth_suites, authentication)) {
-		if (eCSR_AUTH_TYPE_FILS_SHA256 ==
-				auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_FILS_SHA256;
-	}
-	if ((*neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-			csr_is_auth_fils_sha384(mac_ctx, authsuites,
-				c_auth_suites, authentication)) {
-		if (eCSR_AUTH_TYPE_FILS_SHA384 ==
-				auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_FILS_SHA384;
-	}
-	if ((*neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-			csr_is_auth_fils_ft_sha256(mac_ctx, authsuites,
-				c_auth_suites, authentication)) {
-		if (eCSR_AUTH_TYPE_FT_FILS_SHA256 ==
-				auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_FT_FILS_SHA256;
-	}
-	if ((*neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-			csr_is_auth_fils_ft_sha384(mac_ctx, authsuites,
-				c_auth_suites, authentication)) {
-		if (eCSR_AUTH_TYPE_FT_FILS_SHA384 ==
-				auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_FT_FILS_SHA384;
-	}
-	sme_debug("negotiated auth type is %d", *neg_authtype);
-}
-#else
-static void csr_is_fils_auth(struct mac_context *mac_ctx,
-	uint8_t authsuites[][CSR_RSN_OUI_SIZE], uint8_t c_auth_suites,
-	uint8_t authentication[], tCsrAuthList *auth_type,
-	uint8_t index, enum csr_akm_type *neg_authtype)
-{
-}
-#endif
-
-#ifdef WLAN_FEATURE_SAE
-/**
- * csr_check_sae_auth() - update negotiated auth and oui if matches to SAE auth
- * type
- * @mac_ctx: pointer to mac context
- * @authsuites: auth suites
- * @c_auth_suites: auth suites count
- * @authentication: authentication
- * @auth_type: authentication type list
- * @index: current counter
- * @neg_authtype: pointer to negotiated auth
- *
- * Return: None
- */
-static void
-csr_check_sae_auth(struct mac_context *mac_ctx,
-		   uint8_t authsuites[][CSR_RSN_OUI_SIZE],
-		   uint8_t c_auth_suites,
-		   uint8_t authentication[], tCsrAuthList *auth_type,
-		   uint8_t index, enum csr_akm_type *neg_authtype)
-{
-	if ((*neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-	    csr_is_auth_ft_sae(mac_ctx, authsuites, c_auth_suites,
-			       authentication)) {
-		if (eCSR_AUTH_TYPE_FT_SAE == auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_FT_SAE;
-		if (eCSR_AUTH_TYPE_OPEN_SYSTEM == auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_OPEN_SYSTEM;
-	}
-
-	if ((*neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-	    csr_is_auth_wpa_sae(mac_ctx, authsuites,
-				c_auth_suites, authentication)) {
-		if (eCSR_AUTH_TYPE_SAE == auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_SAE;
-		if (eCSR_AUTH_TYPE_OPEN_SYSTEM == auth_type->authType[index])
-			*neg_authtype = eCSR_AUTH_TYPE_OPEN_SYSTEM;
-	}
-	sme_debug("negotiated auth type is %d", *neg_authtype);
-}
-#else
-static void csr_check_sae_auth(struct mac_context *mac_ctx,
-	uint8_t authsuites[][CSR_RSN_OUI_SIZE], uint8_t c_auth_suites,
-	uint8_t authentication[], tCsrAuthList *auth_type,
-	uint8_t index, enum csr_akm_type *neg_authtype)
-{
-}
-#endif
-
-/**
- * csr_get_rsn_information() - to get RSN information
- * @mac_ctx: pointer to global MAC context
- * @auth_type: auth type
- * @encr_type: encryption type
- * @mc_encryption: multicast encryption type
- * @rsn_ie: pointer to RSN IE
- * @ucast_cipher: Unicast cipher
- * @mcast_cipher: Multicast cipher
- * @auth_suite: Authentication suite
- * @capabilities: RSN capabilities
- * @negotiated_authtype: Negotiated auth type
- * @negotiated_mccipher: negotiated multicast cipher
- * @gp_mgmt_cipher: group management cipher
- * @mgmt_encryption_type: group management encryption type
- * @adaptive_11r: is adaptive 11r connection
- *
- * This routine will get all RSN information
- *
- * Return: bool
- */
-static bool csr_get_rsn_information(struct mac_context *mac_ctx,
-				    tCsrAuthList *auth_type,
-				    eCsrEncryptionType encr_type,
-				    tCsrEncryptionList *mc_encryption,
-				    tDot11fIERSN *rsn_ie, uint8_t *ucast_cipher,
-				    uint8_t *mcast_cipher, uint8_t *auth_suite,
-				    struct rsn_caps *capabilities,
-				    enum csr_akm_type *negotiated_authtype,
-				    eCsrEncryptionType *negotiated_mccipher,
-				    uint8_t *gp_mgmt_cipher,
-				    tAniEdType *mgmt_encryption_type,
-				    bool adaptive_11r)
-{
-	bool acceptable_cipher = false;
-	bool group_mgmt_acceptable_cipher = false;
-	uint8_t c_ucast_cipher = 0;
-	uint8_t c_mcast_cipher = 0;
-	uint8_t c_group_mgmt_cipher = 0;
-	uint8_t c_auth_suites = 0, i;
-	uint8_t unicast[CSR_RSN_OUI_SIZE];
-	uint8_t multicast[CSR_RSN_OUI_SIZE];
-	uint8_t group_mgmt[CSR_RSN_OUI_SIZE];
-	uint8_t authsuites[CSR_RSN_MAX_AUTH_SUITES][CSR_RSN_OUI_SIZE];
-	uint8_t authentication[CSR_RSN_OUI_SIZE];
-	uint8_t mccipher_arr[CSR_RSN_MAX_MULTICAST_CYPHERS][CSR_RSN_OUI_SIZE];
-	uint8_t group_mgmt_arr[CSR_RSN_MAX_MULTICAST_CYPHERS][CSR_RSN_OUI_SIZE];
-	enum csr_akm_type neg_authtype = eCSR_AUTH_TYPE_UNKNOWN;
-
-	if (!rsn_ie->present)
-		goto end;
-	c_mcast_cipher++;
-	qdf_mem_copy(mccipher_arr, rsn_ie->gp_cipher_suite,
-			CSR_RSN_OUI_SIZE);
-	c_ucast_cipher =
-		(uint8_t) (rsn_ie->pwise_cipher_suite_count);
-
-	c_auth_suites = (uint8_t) (rsn_ie->akm_suite_cnt);
-	for (i = 0; i < c_auth_suites && i < CSR_RSN_MAX_AUTH_SUITES; i++) {
-		qdf_mem_copy((void *)&authsuites[i],
-			(void *)&rsn_ie->akm_suite[i], CSR_RSN_OUI_SIZE);
-	}
-
-	/* Check - Is requested unicast Cipher supported by the BSS. */
-	acceptable_cipher = csr_match_rsnoui_index(mac_ctx,
-				rsn_ie->pwise_cipher_suites, c_ucast_cipher,
-				csr_get_oui_index_from_cipher(encr_type),
-				unicast);
-
-	if (!acceptable_cipher)
-		goto end;
-
-	/* unicast is supported. Pick the first matching Group cipher, if any */
-	for (i = 0; i < mc_encryption->numEntries; i++) {
-		acceptable_cipher = csr_match_rsnoui_index(mac_ctx,
-					mccipher_arr, c_mcast_cipher,
-					csr_get_oui_index_from_cipher(
-					    mc_encryption->encryptionType[i]),
-					multicast);
-		if (acceptable_cipher)
-			break;
-	}
-	if (!acceptable_cipher)
-		goto end;
-
-	if (negotiated_mccipher)
-		*negotiated_mccipher = mc_encryption->encryptionType[i];
-
-	/* Group Management Cipher only for 11w */
-	if (mgmt_encryption_type) {
-		c_group_mgmt_cipher++;
-		qdf_mem_copy(group_mgmt_arr, rsn_ie->gp_mgmt_cipher_suite,
-						CSR_RSN_OUI_SIZE);
-		if (csr_is_group_mgmt_gmac_128(mac_ctx, group_mgmt_arr,
-			  c_group_mgmt_cipher, group_mgmt)) {
-			group_mgmt_acceptable_cipher = true;
-			*mgmt_encryption_type = eSIR_ED_AES_GMAC_128;
-		} else if (csr_is_group_mgmt_gmac_256(mac_ctx, group_mgmt_arr,
-			  c_group_mgmt_cipher, group_mgmt)) {
-			group_mgmt_acceptable_cipher = true;
-			*mgmt_encryption_type = eSIR_ED_AES_GMAC_256;
-		} else {
-			/* Default is CMAC */
-			group_mgmt_acceptable_cipher = true;
-			*mgmt_encryption_type = eSIR_ED_AES_128_CMAC;
-			qdf_mem_copy(group_mgmt, csr_group_mgmt_oui[ENUM_CMAC],
-						CSR_RSN_OUI_SIZE);
-		}
-	}
-
-	/* Initializing with false as it has true value already */
-	acceptable_cipher = false;
-	for (i = 0; i < auth_type->numEntries; i++) {
-		/*
-		 * Ciphers are supported, Match authentication algorithm and
-		 * pick first matching authtype.
-		 */
-		/* Set FILS as first preference */
-		csr_is_fils_auth(mac_ctx, authsuites, c_auth_suites,
-			authentication, auth_type, i, &neg_authtype);
-		/* Changed the AKM suites according to order of preference */
-		csr_check_sae_auth(mac_ctx, authsuites, c_auth_suites,
-			authentication, auth_type, i, &neg_authtype);
-
-		if (neg_authtype == eCSR_AUTH_TYPE_UNKNOWN &&
-		    csr_is_auth_osen(mac_ctx, authsuites,
-				     c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_OSEN == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_OSEN;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-				csr_is_auth_dpp_rsn(mac_ctx, authsuites,
-						    c_auth_suites,
-						    authentication)) {
-			if (eCSR_AUTH_TYPE_DPP_RSN == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_DPP_RSN;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-				csr_is_ft_auth_rsn(mac_ctx, authsuites,
-					c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_FT_RSN == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_FT_RSN;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN)
-				&& csr_is_ft_auth_rsn_psk(mac_ctx, authsuites,
-					c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_FT_RSN_PSK ==
-					auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_FT_RSN_PSK;
-		}
-#ifdef FEATURE_WLAN_ESE
-		/* ESE only supports 802.1X.  No PSK. */
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-				csr_is_ese_cckm_auth_rsn(mac_ctx, authsuites,
-					c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_CCKM_RSN == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_CCKM_RSN;
-		}
-#endif
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		    csr_is_auth_rsn(mac_ctx, authsuites,
-				    c_auth_suites, authentication)) {
-			/*
-			 * For adaptive 11r connection send FT-802.1X akm in
-			 * association request
-			 */
-			if (adaptive_11r &&
-			    eCSR_AUTH_TYPE_FT_RSN == auth_type->authType[i]) {
-				neg_authtype = eCSR_AUTH_TYPE_FT_RSN;
-				qdf_mem_copy(authentication,
-					     csr_rsn_oui[FT_8021X_IDX],
-					     CSR_WPA_OUI_SIZE);
-			}
-
-			if (eCSR_AUTH_TYPE_RSN == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_RSN;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		    csr_is_auth_rsn_psk(mac_ctx, authsuites,
-					c_auth_suites, authentication)) {
-			/*
-			 * For adaptive 11r connection send FT-PSK akm in
-			 * association request
-			 */
-			if (adaptive_11r &&
-			    eCSR_AUTH_TYPE_FT_RSN_PSK == auth_type->authType[i]) {
-				neg_authtype = eCSR_AUTH_TYPE_FT_RSN_PSK;
-				qdf_mem_copy(authentication,
-					     csr_rsn_oui[FT_PSK_IDX],
-					     CSR_WPA_OUI_SIZE);
-			}
-
-			if (eCSR_AUTH_TYPE_RSN_PSK == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_RSN_PSK;
-		}
-#ifdef WLAN_FEATURE_11W
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		    csr_is_auth_rsn_psk_sha256(mac_ctx, authsuites,
-					       c_auth_suites, authentication)) {
-			/*
-			 * For adaptive 11r connection send AP advertises only
-			 * PSK AKM. STA can choose FT-PSK akm in association
-			 * request if FT capable.
-			 */
-			if (adaptive_11r &&
-			    eCSR_AUTH_TYPE_FT_RSN_PSK == auth_type->authType[i]) {
-				neg_authtype = eCSR_AUTH_TYPE_FT_RSN_PSK;
-				qdf_mem_copy(authentication,
-					     csr_rsn_oui[FT_PSK_IDX],
-					     CSR_WPA_OUI_SIZE);
-			}
-
-			if (eCSR_AUTH_TYPE_RSN_PSK_SHA256 ==
-					auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		    csr_is_auth_rsn8021x_sha256(mac_ctx,
-						authsuites, c_auth_suites,
-						authentication)) {
-			/*
-			 * For adaptive 11r connection send FT-802.1x akm in
-			 * association request
-			 */
-			if (adaptive_11r &&
-			    eCSR_AUTH_TYPE_FT_RSN == auth_type->authType[i]) {
-				neg_authtype = eCSR_AUTH_TYPE_FT_RSN;
-				qdf_mem_copy(authentication,
-					     csr_rsn_oui[FT_8021X_IDX],
-					     CSR_WPA_OUI_SIZE);
-			}
-			if (eCSR_AUTH_TYPE_RSN_8021X_SHA256 ==
-					auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_RSN_8021X_SHA256;
-		}
-#endif
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-				csr_is_auth_wpa_owe(mac_ctx, authsuites,
-					c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_OWE == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_OWE;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		   csr_is_auth_suiteb_eap_256(mac_ctx, authsuites,
-		   c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_SUITEB_EAP_SHA256 ==
-						auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_SUITEB_EAP_SHA256;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		   csr_is_auth_suiteb_eap_384(mac_ctx, authsuites,
-		   c_auth_suites, authentication)) {
-			if (eCSR_AUTH_TYPE_SUITEB_EAP_SHA384 ==
-						auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_SUITEB_EAP_SHA384;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-		    csr_is_auth_ft_suiteb_eap_384(mac_ctx, authsuites,
-						  c_auth_suites,
-						  authentication)) {
-			if (eCSR_AUTH_TYPE_FT_SUITEB_EAP_SHA384 ==
-						auth_type->authType[i])
-				neg_authtype =
-					eCSR_AUTH_TYPE_FT_SUITEB_EAP_SHA384;
-		}
-
-		/*
-		 * The 1st auth type in the APs RSN IE, to match stations
-		 * connecting profiles auth type will cause us to exit this
-		 * loop. This is added as some APs advertise multiple akms in
-		 * the RSN IE
-		 */
-		if (eCSR_AUTH_TYPE_UNKNOWN != neg_authtype) {
-			acceptable_cipher = true;
-			break;
-		}
-	} /* for */
-end:
-	if (acceptable_cipher) {
-		if (mcast_cipher)
-			qdf_mem_copy(mcast_cipher, multicast,
-					CSR_RSN_OUI_SIZE);
-
-		if (ucast_cipher)
-			qdf_mem_copy(ucast_cipher, unicast, CSR_RSN_OUI_SIZE);
-
-		if (gp_mgmt_cipher && group_mgmt_acceptable_cipher)
-			qdf_mem_copy(gp_mgmt_cipher, group_mgmt,
-				     CSR_RSN_OUI_SIZE);
-
-		if (auth_suite)
-			qdf_mem_copy(auth_suite, authentication,
-					CSR_RSN_OUI_SIZE);
-
-		if (negotiated_authtype)
-			*negotiated_authtype = neg_authtype;
-
-		if (capabilities) {
-			/* Bit 0 Preauthentication */
-			capabilities->PreAuthSupported =
-				(rsn_ie->RSN_Cap[0] >> 0) & 0x1;
-			/* Bit 1 No Pairwise */
-			capabilities->NoPairwise =
-				(rsn_ie->RSN_Cap[0] >> 1) & 0x1;
-			/* Bit 2, 3 PTKSA Replay Counter */
-			capabilities->PTKSAReplayCounter =
-				(rsn_ie->RSN_Cap[0] >> 2) & 0x3;
-			/* Bit 4, 5 GTKSA Replay Counter */
-			capabilities->GTKSAReplayCounter =
-				(rsn_ie->RSN_Cap[0] >> 4) & 0x3;
-#ifdef WLAN_FEATURE_11W
-			/* Bit 6 MFPR */
-			capabilities->MFPRequired =
-				(rsn_ie->RSN_Cap[0] >> 6) & 0x1;
-			/* Bit 7 MFPC */
-			capabilities->MFPCapable =
-				(rsn_ie->RSN_Cap[0] >> 7) & 0x1;
-#else
-			/* Bit 6 MFPR */
-			capabilities->MFPRequired = 0;
-			/* Bit 7 MFPC */
-			capabilities->MFPCapable = 0;
-#endif
-			/* remaining reserved */
-			capabilities->Reserved = rsn_ie->RSN_Cap[1] & 0xff;
-		}
-	}
-	return acceptable_cipher;
-}
-
-/**
- * csr_lookup_pmkid_using_ssid() - lookup pmkid using ssid and cache_id
- * @mac: pointer to mac
- * @session: sme session pointer
- * @pmk_cache: pointer to pmk cache
- * @index: index value needs to be seached
- *
- * Return: true if pmkid is found else false
- */
-static bool csr_lookup_pmkid_using_ssid(struct mac_context *mac,
-					struct csr_roam_session *session,
-					tPmkidCacheInfo *pmk_cache,
-					uint32_t *index)
-{
-	uint32_t i;
-	tPmkidCacheInfo *session_pmk;
-
-	for (i = 0; i < session->NumPmkidCache; i++) {
-		session_pmk = &session->PmkidCacheInfo[i];
-		sme_debug("match PMKID ssid %*.*s cache id %x %x ssid_len %d to ssid %s cache_id %x %x",
-			pmk_cache->ssid_len, pmk_cache->ssid_len,
-			pmk_cache->ssid, pmk_cache->cache_id[0],
-			pmk_cache->cache_id[1], pmk_cache->ssid_len,
-			session_pmk->ssid,
-			session_pmk->cache_id[0], session_pmk->cache_id[1]);
-
-		if ((!qdf_mem_cmp(pmk_cache->ssid, session_pmk->ssid,
-				  pmk_cache->ssid_len)) &&
-		    (!qdf_mem_cmp(session_pmk->cache_id,
-				  pmk_cache->cache_id, CACHE_ID_LEN))) {
-			/* match found */
-			*index = i;
-			sme_debug("PMKID found at index %d", i);
-			return true;
-		}
-	}
-
-	return false;
-}
-
-bool csr_lookup_pmkid_using_bssid(struct mac_context *mac,
-					struct csr_roam_session *session,
-					tPmkidCacheInfo *pmk_cache,
-					uint32_t *index)
-{
-	uint32_t i;
-	tPmkidCacheInfo *session_pmk;
-
-	for (i = 0; i < session->NumPmkidCache; i++) {
-		session_pmk = &session->PmkidCacheInfo[i];
-		sme_debug("Matching BSSID: " QDF_MAC_ADDR_STR " to cached BSSID:"
-			QDF_MAC_ADDR_STR, QDF_MAC_ADDR_ARRAY(pmk_cache->BSSID.bytes),
-			QDF_MAC_ADDR_ARRAY(session_pmk->BSSID.bytes));
-		if (qdf_is_macaddr_equal(&pmk_cache->BSSID,
-					 &session_pmk->BSSID)) {
-			/* match found */
-			*index = i;
-			sme_debug("PMKID found at index %d", i);
-			qdf_mem_copy(pmk_cache, session_pmk,
-				     sizeof(tPmkidCacheInfo));
-			return true;
-		}
-	}
-
-	return false;
-}
-
-/**
- * csr_lookup_pmkid() - lookup pmkid using bssid or ssid + cache_id
- * @mac: pointer to mac
- * @session: sme session pointer
- * @pmk_cache: pointer to pmk cache
- * @index: index value needs to be seached
- *
- * Return: true if pmkid is found else false
- */
-static bool csr_lookup_pmkid(struct mac_context *mac, uint32_t sessionId,
-				tPmkidCacheInfo *pmk_cache)
-{
-	bool fRC = false, fMatchFound = false;
-	uint32_t Index;
-	struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
-
-	if (!pSession) {
-		sme_err("session %d not found", sessionId);
-		return false;
-	}
-
-	if (pmk_cache->ssid_len) {
-		/* Try to find based on cache_id and ssid first */
-		fMatchFound = csr_lookup_pmkid_using_ssid(mac, pSession,
-							  pmk_cache, &Index);
-	}
-
-	/* If not able to find using cache id or ssid_len is not present */
-	if (!fMatchFound)
-		fMatchFound = csr_lookup_pmkid_using_bssid(mac,
-						pSession, pmk_cache, &Index);
-
-	if (!fMatchFound) {
-		sme_debug("no pmkid match found NumPmkidCache = %d",
-			pSession->NumPmkidCache);
-		return false;
-	}
-
-	qdf_mem_copy(pmk_cache->PMKID,
-		     pSession->PmkidCacheInfo[Index].PMKID,
-		     PMKID_LEN);
-
-	qdf_mem_copy(pmk_cache->pmk,
-		     pSession->PmkidCacheInfo[Index].pmk,
-		     pSession->PmkidCacheInfo[Index].pmk_len);
-	pmk_cache->pmk_len = pSession->PmkidCacheInfo[Index].pmk_len;
-
-	fRC = true;
-	sme_debug("match = %d NumPmkidCache = %d",
-		fRC, pSession->NumPmkidCache);
-
-	return fRC;
-}
-
-#ifdef WLAN_FEATURE_FILS_SK
-/*
- * csr_update_pmksa_for_cache_id: update tPmkidCacheInfo to lookup using
- * ssid and cache id
- * @bss_desc: bss description
- * @profile: csr roam profile
- * @pmkid_cache: pmksa cache
- *
- * Return: true if cache identifier present else false
- */
-static bool csr_update_pmksa_for_cache_id(struct bss_description *bss_desc,
-				struct csr_roam_profile *profile,
-				tPmkidCacheInfo *pmkid_cache)
-{
-	if (!bss_desc->fils_info_element.is_cache_id_present)
-		return false;
-
-	pmkid_cache->ssid_len =
-		profile->SSIDs.SSIDList[0].SSID.length;
-	qdf_mem_copy(pmkid_cache->ssid,
-		profile->SSIDs.SSIDList[0].SSID.ssId,
-		profile->SSIDs.SSIDList[0].SSID.length);
-	qdf_mem_copy(pmkid_cache->cache_id,
-		bss_desc->fils_info_element.cache_id,
-		CACHE_ID_LEN);
-	qdf_mem_copy(pmkid_cache->BSSID.bytes,
-		bss_desc->bssId, QDF_MAC_ADDR_SIZE);
-
-	return true;
-
-}
-
-/*
- * csr_update_pmksa_to_profile: update pmk and pmkid to profile which will be
- * used in case of fils session
- * @profile: profile
- * @pmkid_cache: pmksa cache
- *
- * Return: None
- */
-static inline void csr_update_pmksa_to_profile(struct csr_roam_profile *profile,
-					       tPmkidCacheInfo *pmkid_cache)
-{
-	if (!profile->fils_con_info)
-		return;
-
-	profile->fils_con_info->pmk_len = pmkid_cache->pmk_len;
-	qdf_mem_copy(profile->fils_con_info->pmk,
-			pmkid_cache->pmk, pmkid_cache->pmk_len);
-	qdf_mem_copy(profile->fils_con_info->pmkid,
-		pmkid_cache->PMKID, PMKID_LEN);
-
-}
-#else
-static inline
-bool csr_update_pmksa_for_cache_id(struct bss_description *bss_desc,
-				   struct csr_roam_profile *profile,
-				   tPmkidCacheInfo *pmkid_cache)
-{
-	return false;
-}
-
-static inline void csr_update_pmksa_to_profile(struct csr_roam_profile *profile,
-					       tPmkidCacheInfo *pmkid_cache)
-{
-}
-#endif
-
-/**
- * csr_update_session_pmk() - Update the pmk len and pmk in the roam session
- * @session: pointer to the CSR Roam session
- * @pmkid_cache: pointer to the pmkid cache
- *
- * Return: None
- */
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
-static void csr_update_session_pmk(struct csr_roam_session *session,
-				   tPmkidCacheInfo *pmkid_cache)
-{
-	session->pmk_len = pmkid_cache->pmk_len;
-	qdf_mem_zero(session->psk_pmk, sizeof(session->psk_pmk));
-	qdf_mem_copy(session->psk_pmk, pmkid_cache->pmk, session->pmk_len);
-}
-#else
-static inline void csr_update_session_pmk(struct csr_roam_session *session,
-					  tPmkidCacheInfo *pmkid_cache)
-{
-}
-#endif
-
-uint8_t csr_construct_rsn_ie(struct mac_context *mac, uint32_t sessionId,
-			     struct csr_roam_profile *pProfile,
-			     struct bss_description *pSirBssDesc,
-			     tDot11fBeaconIEs *pIes, tCsrRSNIe *pRSNIe)
-{
-	uint32_t ret;
-	bool fRSNMatch;
-	uint8_t cbRSNIe = 0;
-	uint8_t UnicastCypher[CSR_RSN_OUI_SIZE];
-	uint8_t MulticastCypher[CSR_RSN_OUI_SIZE];
-	uint8_t gp_mgmt_cipher_suite[CSR_RSN_OUI_SIZE];
-	uint8_t AuthSuite[CSR_RSN_OUI_SIZE];
-	tCsrRSNAuthIe *pAuthSuite;
-	struct rsn_caps RSNCapabilities;
-	tCsrRSNPMKIe *pPMK;
-	tPmkidCacheInfo pmkid_cache;
-#ifdef WLAN_FEATURE_11W
-	uint8_t *pGroupMgmtCipherSuite;
-#endif
-	tDot11fBeaconIEs *pIesLocal = pIes;
-	enum csr_akm_type negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
-	tDot11fIERSN rsn_ie = {0};
-	struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
-
-	if (!CSR_IS_SESSION_VALID(mac, sessionId) || !session)
-		return 0;
-	qdf_mem_zero(&pmkid_cache, sizeof(pmkid_cache));
-	qdf_mem_zero(&rsn_ie, sizeof(rsn_ie));
-
-	do {
-		if (!csr_is_profile_rsn(pProfile))
-			break;
-
-		if (!pIesLocal
-		    &&
-		    (!QDF_IS_STATUS_SUCCESS
-			     (csr_get_parsed_bss_description_ies
-				     (mac, pSirBssDesc, &pIesLocal)))) {
-			break;
-		}
-
-		/*
-		 * Use intersection of the RSN cap sent by user space and
-		 * the AP, so that only common capability are enabled.
-		 */
-		if (pProfile->pRSNReqIE && pProfile->nRSNReqIELength) {
-			ret = dot11f_unpack_ie_rsn(mac,
-						   pProfile->pRSNReqIE + 2,
-				  pProfile->nRSNReqIELength -2, &rsn_ie, false);
-			if (!DOT11F_FAILED(ret)) {
-				pIesLocal->RSN.RSN_Cap[0] =
-						pIesLocal->RSN.RSN_Cap[0] &
-						rsn_ie.RSN_Cap[0];
-				pIesLocal->RSN.RSN_Cap[1] =
-						pIesLocal->RSN.RSN_Cap[1] &
-						rsn_ie.RSN_Cap[1];
-			}
-		}
-		/* See if the cyphers in the Bss description match with the
-		 * settings in the profile.
-		 */
-		fRSNMatch = csr_get_rsn_information(mac, &pProfile->AuthType,
-					pProfile->negotiatedUCEncryptionType,
-					&pProfile->mcEncryptionType,
-					&pIesLocal->RSN, UnicastCypher,
-					MulticastCypher, AuthSuite,
-					&RSNCapabilities, &negAuthType, NULL,
-					gp_mgmt_cipher_suite,
-					&pProfile->mgmt_encryption_type,
-					session->is_adaptive_11r_connection);
-		if (!fRSNMatch)
-			break;
-
-		pRSNIe->IeHeader.ElementID = WLAN_ELEMID_RSN;
-
-		pRSNIe->Version = CSR_RSN_VERSION_SUPPORTED;
-
-		qdf_mem_copy(pRSNIe->MulticastOui, MulticastCypher,
-			     sizeof(MulticastCypher));
-
-		pRSNIe->cUnicastCyphers = 1;
-
-		qdf_mem_copy(&pRSNIe->UnicastOui[0], UnicastCypher,
-			     sizeof(UnicastCypher));
-
-		pAuthSuite =
-			(tCsrRSNAuthIe *) (&pRSNIe->
-					   UnicastOui[pRSNIe->cUnicastCyphers]);
-
-		pAuthSuite->cAuthenticationSuites = 1;
-		qdf_mem_copy(&pAuthSuite->AuthOui[0], AuthSuite,
-			     sizeof(AuthSuite));
-
-		/* PreAuthSupported is an AP only capability */
-		RSNCapabilities.PreAuthSupported = 0;
-		/*
-		 * Use the Management Frame Protection values given by the
-		 * supplicant, if AP and STA both are MFP capable.
-		 */
-#ifdef WLAN_FEATURE_11W
-		if (RSNCapabilities.MFPCapable && pProfile->MFPCapable) {
-			RSNCapabilities.MFPCapable = pProfile->MFPCapable;
-			RSNCapabilities.MFPRequired = pProfile->MFPRequired;
-		} else {
-			RSNCapabilities.MFPCapable = 0;
-			RSNCapabilities.MFPRequired = 0;
-		}
-#endif
-		*(uint16_t *) (&pAuthSuite->AuthOui[1]) =
-			*((uint16_t *) (&RSNCapabilities));
-
-		pPMK = (tCsrRSNPMKIe *) (((uint8_t *) (&pAuthSuite->AuthOui[1]))
-				+ sizeof(uint16_t));
-
-		if (!csr_update_pmksa_for_cache_id(pSirBssDesc,
-			pProfile, &pmkid_cache))
-			qdf_mem_copy(pmkid_cache.BSSID.bytes,
-				pSirBssDesc->bssId, QDF_MAC_ADDR_SIZE);
-		/* Don't include the PMK SA IDs for CCKM associations. */
-		if (
-#ifdef FEATURE_WLAN_ESE
-			(eCSR_AUTH_TYPE_CCKM_RSN != negAuthType) &&
-#endif
-			csr_lookup_pmkid(mac, sessionId, &pmkid_cache)) {
-			pPMK->cPMKIDs = 1;
-
-			qdf_trace_hex_dump(QDF_MODULE_ID_PE,
-				   QDF_TRACE_LEVEL_INFO,
-				   pmkid_cache.pmk, pmkid_cache.pmk_len);
-			qdf_mem_copy(pPMK->PMKIDList[0].PMKID,
-				     pmkid_cache.PMKID,
-				     PMKID_LEN);
-
-			/*
-			 * If a PMK cache is found for the BSSID, then
-			 * update the PMK in CSR session also as this
-			 * will be sent to the FW during RSO.
-			 */
-			csr_update_session_pmk(session, &pmkid_cache);
-
-			csr_update_pmksa_to_profile(pProfile, &pmkid_cache);
-		} else {
-			pPMK->cPMKIDs = 0;
-		}
-		session->rsn_caps = RSNCapabilities;
-
-		qdf_mem_zero(&pmkid_cache, sizeof(pmkid_cache));
-
-#ifdef WLAN_FEATURE_11W
-		/* Advertise BIP in group cipher key management only if PMF is
-		 * enabled and AP is capable.
-		 */
-		if (pProfile->MFPEnabled &&
-			(RSNCapabilities.MFPCapable && pProfile->MFPCapable)) {
-			pGroupMgmtCipherSuite =
-				(uint8_t *) pPMK + sizeof(uint16_t) +
-				(pPMK->cPMKIDs * PMKID_LEN);
-			qdf_mem_copy(pGroupMgmtCipherSuite,
-				     gp_mgmt_cipher_suite, CSR_RSN_OUI_SIZE);
-		}
-#endif
-	host_log_rsn_info(UnicastCypher, MulticastCypher,
-			  AuthSuite, gp_mgmt_cipher_suite);
-
-		/* Add in the fixed fields plus 1 Unicast cypher, less the
-		 * IE Header length Add in the size of the Auth suite (count
-		 * plus a single OUI) Add in the RSN caps field.
-		 * Add PMKID count and PMKID (if any)
-		 * Add group management cipher suite
-		 */
-		pRSNIe->IeHeader.Length =
-			(uint8_t) (sizeof(*pRSNIe) - sizeof(pRSNIe->IeHeader) +
-				   sizeof(*pAuthSuite) +
-				   sizeof(struct rsn_caps));
-		if (pPMK->cPMKIDs)
-			pRSNIe->IeHeader.Length += (uint8_t) (sizeof(uint16_t) +
-							      (pPMK->cPMKIDs *
-							PMKID_LEN));
-#ifdef WLAN_FEATURE_11W
-		if (pProfile->MFPEnabled &&
-			(RSNCapabilities.MFPCapable && pProfile->MFPCapable)) {
-			if (0 == pPMK->cPMKIDs)
-				pRSNIe->IeHeader.Length += sizeof(uint16_t);
-			pRSNIe->IeHeader.Length += CSR_WPA_OUI_SIZE;
-		}
-#endif
-
-		/* return the size of the IE header (total) constructed... */
-		cbRSNIe = pRSNIe->IeHeader.Length + sizeof(pRSNIe->IeHeader);
-
-	} while (0);
-
-	if (!pIes && pIesLocal)
-		/* locally allocated */
-		qdf_mem_free(pIesLocal);
-
-	return cbRSNIe;
-}
-
-#ifdef FEATURE_WLAN_WAPI
-/**
- * csr_get_wapi_information() - to get WAPI information
- * @mac_ctx: pointer to global MAC context
- * @auth_type: auth type
- * @encr_type: encryption type
- * @mc_encryption: multicast encryption type
- * @wapi_ie: pointer to WAPI IE
- * @ucast_cipher: Unicast cipher
- * @mcast_cipher: Multicast cipher
- * @auth_suite: Authentication suite
- * @negotiated_authtype: Negotiated auth type
- * @negotiated_mccipher: negotiated multicast cipher
- *
- * This routine will get all WAPI information
- *
- * Return: bool
- */
-static bool csr_get_wapi_information(struct mac_context *mac_ctx,
-				     tCsrAuthList *auth_type,
-				     eCsrEncryptionType encr_type,
-				     tCsrEncryptionList *mc_encryption,
-				     tDot11fIEWAPI *wapi_ie,
-				     uint8_t *ucast_cipher,
-				     uint8_t *mcast_cipher, uint8_t *auth_suite,
-				     enum csr_akm_type *negotiated_authtype,
-				     eCsrEncryptionType *negotiated_mccipher)
-{
-	bool acceptable_cipher = false;
-	uint8_t c_ucast_cipher = 0;
-	uint8_t c_mcast_cipher = 0;
-	uint8_t c_auth_suites = 0, i;
-	uint8_t unicast[CSR_WAPI_OUI_SIZE];
-	uint8_t multicast[CSR_WAPI_OUI_SIZE];
-	uint8_t authsuites[CSR_WAPI_MAX_AUTH_SUITES][CSR_WAPI_OUI_SIZE];
-	uint8_t authentication[CSR_WAPI_OUI_SIZE];
-	uint8_t mccipher_arr[CSR_WAPI_MAX_MULTICAST_CYPHERS][CSR_WAPI_OUI_SIZE];
-	enum csr_akm_type neg_authtype = eCSR_AUTH_TYPE_UNKNOWN;
-	uint8_t wapioui_idx = 0;
-
-	if (!wapi_ie->present)
-		goto end;
-
-	c_mcast_cipher++;
-	qdf_mem_copy(mccipher_arr, wapi_ie->multicast_cipher_suite,
-			CSR_WAPI_OUI_SIZE);
-	c_ucast_cipher = (uint8_t) (wapi_ie->unicast_cipher_suite_count);
-	c_auth_suites = (uint8_t) (wapi_ie->akm_suite_count);
-	for (i = 0; i < c_auth_suites && i < CSR_WAPI_MAX_AUTH_SUITES; i++)
-		qdf_mem_copy((void *)&authsuites[i],
-			(void *)&wapi_ie->akm_suites[i], CSR_WAPI_OUI_SIZE);
-
-	wapioui_idx = csr_get_oui_index_from_cipher(encr_type);
-	if (wapioui_idx >= CSR_OUI_WAPI_WAI_MAX_INDEX) {
-		sme_err("Wapi OUI index = %d out of limit",
-			wapioui_idx);
-		acceptable_cipher = false;
-		goto end;
-	}
-	/* Check - Is requested unicast Cipher supported by the BSS. */
-	acceptable_cipher = csr_match_wapi_oui_index(mac_ctx,
-				wapi_ie->unicast_cipher_suites,
-				c_ucast_cipher, wapioui_idx, unicast);
-	if (!acceptable_cipher)
-		goto end;
-
-	/* unicast is supported. Pick the first matching Group cipher, if any */
-	for (i = 0; i < mc_encryption->numEntries; i++) {
-		wapioui_idx = csr_get_oui_index_from_cipher(
-					mc_encryption->encryptionType[i]);
-		if (wapioui_idx >= CSR_OUI_WAPI_WAI_MAX_INDEX) {
-			sme_err("Wapi OUI index = %d out of limit",
-				wapioui_idx);
-			acceptable_cipher = false;
-			break;
-		}
-		acceptable_cipher = csr_match_wapi_oui_index(mac_ctx,
-						mccipher_arr, c_mcast_cipher,
-						wapioui_idx, multicast);
-		if (acceptable_cipher)
-			break;
-	}
-	if (!acceptable_cipher)
-		goto end;
-
-	if (negotiated_mccipher)
-		*negotiated_mccipher =
-			mc_encryption->encryptionType[i];
-
-	/*
-	 * Ciphers are supported, Match authentication algorithm and
-	 * pick first matching authtype
-	 */
-	if (csr_is_auth_wapi_cert
-			(mac_ctx, authsuites, c_auth_suites, authentication)) {
-		neg_authtype =
-			eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE;
-	} else if (csr_is_auth_wapi_psk(mac_ctx, authsuites,
-				c_auth_suites, authentication)) {
-		neg_authtype = eCSR_AUTH_TYPE_WAPI_WAI_PSK;
-	} else {
-		acceptable_cipher = false;
-		neg_authtype = eCSR_AUTH_TYPE_UNKNOWN;
-	}
-
-	/* Caller doesn't care about auth type, or BSS doesn't match */
-	if ((0 == auth_type->numEntries) || (false == acceptable_cipher))
-		goto end;
-
-	acceptable_cipher = false;
-	for (i = 0; i < auth_type->numEntries; i++) {
-		if (auth_type->authType[i] == neg_authtype) {
-			acceptable_cipher = true;
-			break;
-		}
-	}
-
-end:
-	if (acceptable_cipher) {
-		if (mcast_cipher)
-			qdf_mem_copy(mcast_cipher, multicast,
-					CSR_WAPI_OUI_SIZE);
-		if (ucast_cipher)
-			qdf_mem_copy(ucast_cipher, unicast, CSR_WAPI_OUI_SIZE);
-		if (auth_suite)
-			qdf_mem_copy(auth_suite, authentication,
-					CSR_WAPI_OUI_SIZE);
-		if (negotiated_authtype)
-			*negotiated_authtype = neg_authtype;
-	}
-	return acceptable_cipher;
-}
-
-static bool csr_lookup_bkid(struct mac_context *mac, uint32_t sessionId,
-			    uint8_t *pBSSId, uint8_t *pBKId)
-{
-	bool fRC = false, fMatchFound = false;
-	uint32_t Index;
-	struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
-
-	if (!pSession) {
-		sme_err("session %d not found", sessionId);
-		return false;
-	}
-
-	do {
-		for (Index = 0; Index < pSession->NumBkidCache; Index++) {
-			sme_debug("match BKID " QDF_MAC_ADDR_STR " to ",
-				QDF_MAC_ADDR_ARRAY(pBSSId));
-			if (!qdf_mem_cmp
-			    (pBSSId, pSession->BkidCacheInfo[Index].BSSID.bytes,
-				    sizeof(struct qdf_mac_addr))) {
-				/* match found */
-				fMatchFound = true;
-				break;
-			}
-		}
-
-		if (!fMatchFound)
-			break;
-
-		qdf_mem_copy(pBKId, pSession->BkidCacheInfo[Index].BKID,
-			     CSR_WAPI_BKID_SIZE);
-
-		fRC = true;
-	} while (0);
-	sme_debug(
-		"return match = %d mac->roam.NumBkidCache = %d",
-		fRC, pSession->NumBkidCache);
-
-	return fRC;
-}
-
-uint8_t csr_construct_wapi_ie(struct mac_context *mac, uint32_t sessionId,
-			      struct csr_roam_profile *pProfile,
-			      struct bss_description *pSirBssDesc,
-			      tDot11fBeaconIEs *pIes, tCsrWapiIe *pWapiIe)
-{
-	bool fWapiMatch = false;
-	uint8_t cbWapiIe = 0;
-	uint8_t UnicastCypher[CSR_WAPI_OUI_SIZE];
-	uint8_t MulticastCypher[CSR_WAPI_OUI_SIZE];
-	uint8_t AuthSuite[CSR_WAPI_OUI_SIZE];
-	uint8_t BKId[CSR_WAPI_BKID_SIZE];
-	uint8_t *pWapi = NULL;
-	bool fBKIDFound = false;
-	tDot11fBeaconIEs *pIesLocal = pIes;
-
-	do {
-		if (!csr_is_profile_wapi(pProfile))
-			break;
-
-		if (!pIesLocal
-		    &&
-		    (!QDF_IS_STATUS_SUCCESS
-			     (csr_get_parsed_bss_description_ies
-				     (mac, pSirBssDesc, &pIesLocal)))) {
-			break;
-		}
-		/* See if the cyphers in the Bss description match with the
-		 * settings in the profile.
-		 */
-		fWapiMatch =
-			csr_get_wapi_information(mac, &pProfile->AuthType,
-					pProfile->negotiatedUCEncryptionType,
-					&pProfile->mcEncryptionType,
-					&pIesLocal->WAPI, UnicastCypher,
-					MulticastCypher, AuthSuite, NULL,
-						 NULL);
-		if (!fWapiMatch)
-			break;
-
-		qdf_mem_zero(pWapiIe, sizeof(tCsrWapiIe));
-
-		pWapiIe->IeHeader.ElementID = DOT11F_EID_WAPI;
-
-		pWapiIe->Version = CSR_WAPI_VERSION_SUPPORTED;
-
-		pWapiIe->cAuthenticationSuites = 1;
-		qdf_mem_copy(&pWapiIe->AuthOui[0], AuthSuite,
-			     sizeof(AuthSuite));
-
-		pWapi = (uint8_t *) (&pWapiIe->AuthOui[1]);
-
-		*pWapi = (uint16_t) 1;  /* cUnicastCyphers */
-		pWapi += 2;
-		qdf_mem_copy(pWapi, UnicastCypher, sizeof(UnicastCypher));
-		pWapi += sizeof(UnicastCypher);
-
-		qdf_mem_copy(pWapi, MulticastCypher, sizeof(MulticastCypher));
-		pWapi += sizeof(MulticastCypher);
-
-		/* WAPI capabilities follows the Auth Suite (two octects)
-		 * we shouldn't EVER be sending out "pre-auth supported".
-		 * It is an AP only capability & since we already did a memset
-		 * pWapiIe to 0, skip these fields
-		 */
-		pWapi += 2;
-
-		fBKIDFound =
-			csr_lookup_bkid(mac, sessionId, pSirBssDesc->bssId,
-					&(BKId[0]));
-
-		if (fBKIDFound) {
-			/* Do we need to change the endianness here */
-			*pWapi = (uint16_t) 1;  /* cBKIDs */
-			pWapi += 2;
-			qdf_mem_copy(pWapi, BKId, CSR_WAPI_BKID_SIZE);
-		} else {
-			*pWapi = 0;
-			pWapi += 1;
-			*pWapi = 0;
-			pWapi += 1;
-		}
-
-		/* Add in the IE fields except the IE header */
-		/* Add BKID count and BKID (if any) */
-		pWapiIe->IeHeader.Length =
-			(uint8_t) (sizeof(*pWapiIe) -
-				sizeof(pWapiIe->IeHeader));
-
-		/*2 bytes for BKID Count field */
-		pWapiIe->IeHeader.Length += sizeof(uint16_t);
-
-		if (fBKIDFound)
-			pWapiIe->IeHeader.Length += CSR_WAPI_BKID_SIZE;
-
-		/* return the size of the IE header (total) constructed... */
-		cbWapiIe = pWapiIe->IeHeader.Length + sizeof(pWapiIe->IeHeader);
-
-	} while (0);
-
-	if (!pIes && pIesLocal)
-		/* locally allocated */
-		qdf_mem_free(pIesLocal);
-
-	return cbWapiIe;
-}
-#endif /* FEATURE_WLAN_WAPI */
-/**
- * csr_get_wpa_cyphers() - to get WPA cipher info
- * @mac_ctx: pointer to mac context
- * @auth_type: auth type
- * @encr_type: encryption type
- * @mc_encryption: multicast encryption type
- * @wpa_ie: pointer to WPA IE
- * @ucast_cipher: Unicast cipher
- * @mcast_cipher: Multicast cipher
- * @auth_suite: Authentication suite
- * @negotiated_authtype: Negotiated auth type
- * @negotiated_mccipher: negotiated multicast cipher
- *
- * This routine will get all WPA information
- *
- * Return: bool
- */
-static bool csr_get_wpa_cyphers(struct mac_context *mac_ctx, tCsrAuthList *auth_type,
-				eCsrEncryptionType encr_type,
-				tCsrEncryptionList *mc_encryption,
-				tDot11fIEWPA *wpa_ie, uint8_t *ucast_cipher,
-				uint8_t *mcast_cipher, uint8_t *auth_suite,
-				enum csr_akm_type *negotiated_authtype,
-				eCsrEncryptionType *negotiated_mccipher)
-{
-	bool acceptable_cipher = false;
-	uint8_t c_ucast_cipher = 0;
-	uint8_t c_mcast_cipher = 0;
-	uint8_t c_auth_suites = 0;
-	uint8_t unicast[CSR_WPA_OUI_SIZE];
-	uint8_t multicast[CSR_WPA_OUI_SIZE];
-	uint8_t authentication[CSR_WPA_OUI_SIZE];
-	uint8_t mccipher_arr[1][CSR_WPA_OUI_SIZE];
-	uint8_t i;
-	uint8_t index;
-	enum csr_akm_type neg_authtype = eCSR_AUTH_TYPE_UNKNOWN;
-
-	if (!wpa_ie->present)
-		goto end;
-	c_mcast_cipher = 1;
-	qdf_mem_copy(mccipher_arr, wpa_ie->multicast_cipher, CSR_WPA_OUI_SIZE);
-	c_ucast_cipher = (uint8_t) (wpa_ie->unicast_cipher_count);
-	c_auth_suites = (uint8_t) (wpa_ie->auth_suite_count);
-
-	/*
-	 * csr_match_wpaoui_index will provide the index of the
-	 * array csr_wpa_oui to be read and determine if it is
-	 * accepatable cipher or not. Below check ensures that
-	 * the index will not be out of range of the array size.
-	 */
-	index = csr_get_oui_index_from_cipher(encr_type);
-	if (!(index < (sizeof(csr_wpa_oui)/CSR_WPA_OUI_SIZE))) {
-		sme_debug("Unacceptable index: %d", index);
-		goto end;
-	}
-
-	sme_debug("kw_dbg: index: %d", index);
-	/* Check - Is requested unicast Cipher supported by the BSS. */
-	acceptable_cipher = csr_match_wpaoui_index(mac_ctx,
-				wpa_ie->unicast_ciphers, c_ucast_cipher,
-				index, unicast);
-	if (!acceptable_cipher)
-		goto end;
-	/* unicast is supported. Pick the first matching Group cipher, if any */
-	for (i = 0; i < mc_encryption->numEntries; i++) {
-		index = csr_get_oui_index_from_cipher(
-				mc_encryption->encryptionType[i]);
-		sme_debug("kw_dbg: index: %d", index);
-		if (!(index < (sizeof(csr_wpa_oui)/CSR_WPA_OUI_SIZE))) {
-			sme_debug("Unacceptable MC index: %d", index);
-			acceptable_cipher = false;
-			continue;
-		}
-		acceptable_cipher = csr_match_wpaoui_index(mac_ctx,
-					mccipher_arr, c_mcast_cipher,
-					index, multicast);
-		if (acceptable_cipher)
-			break;
-	}
-	if (!acceptable_cipher)
-		goto end;
-
-	if (negotiated_mccipher)
-		*negotiated_mccipher = mc_encryption->encryptionType[i];
-
-	/* Initializing with false as it has true value already */
-	acceptable_cipher = false;
-	for (i = 0; i < auth_type->numEntries; i++) {
-		/*
-		 * Ciphers are supported, Match authentication algorithm and
-		 * pick first matching authtype
-		 */
-		if (csr_is_auth_wpa(mac_ctx, wpa_ie->auth_suites, c_auth_suites,
-			authentication)) {
-			if (eCSR_AUTH_TYPE_WPA == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_WPA;
-		}
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) &&
-			csr_is_auth_wpa_psk(mac_ctx,
-				wpa_ie->auth_suites, c_auth_suites,
-				authentication)) {
-			if (eCSR_AUTH_TYPE_WPA_PSK == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_WPA_PSK;
-		}
-#ifdef FEATURE_WLAN_ESE
-		if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN)
-			&& csr_is_ese_cckm_auth_wpa(mac_ctx,
-				wpa_ie->auth_suites, c_auth_suites,
-				authentication)) {
-			if (eCSR_AUTH_TYPE_CCKM_WPA == auth_type->authType[i])
-				neg_authtype = eCSR_AUTH_TYPE_CCKM_WPA;
-		}
-#endif /* FEATURE_WLAN_ESE */
-
-		/*
-		 * The 1st auth type in the APs WPA IE, to match stations
-		 * connecting profiles auth type will cause us to exit this
-		 * loop. This is added as some APs advertise multiple akms in
-		 * the WPA IE
-		 */
-		if (eCSR_AUTH_TYPE_UNKNOWN != neg_authtype) {
-			acceptable_cipher = true;
-			break;
-		}
-	}
-
-end:
-	if (acceptable_cipher) {
-		if (mcast_cipher)
-			qdf_mem_copy((uint8_t **) mcast_cipher, multicast,
-					CSR_WPA_OUI_SIZE);
-
-		if (ucast_cipher)
-			qdf_mem_copy((uint8_t **) ucast_cipher, unicast,
-					CSR_WPA_OUI_SIZE);
-
-		if (auth_suite)
-			qdf_mem_copy((uint8_t **) auth_suite, authentication,
-					CSR_WPA_OUI_SIZE);
-
-		if (negotiated_authtype)
-			*negotiated_authtype = neg_authtype;
-	}
-
-	return acceptable_cipher;
-}
-
-uint8_t csr_construct_wpa_ie(struct mac_context *mac, uint8_t session_id,
-			     struct csr_roam_profile *pProfile,
-			     struct bss_description *pSirBssDesc,
-			     tDot11fBeaconIEs *pIes, tCsrWpaIe *pWpaIe)
-{
-	bool fWpaMatch;
-	uint8_t cbWpaIe = 0;
-	uint8_t UnicastCypher[CSR_WPA_OUI_SIZE];
-	uint8_t MulticastCypher[CSR_WPA_OUI_SIZE];
-	uint8_t AuthSuite[CSR_WPA_OUI_SIZE];
-	tCsrWpaAuthIe *pAuthSuite;
-	tDot11fBeaconIEs *pIesLocal = pIes;
-
-	do {
-		if (!csr_is_profile_wpa(pProfile))
-			break;
-
-		if (!pIesLocal
-		    &&
-		    (!QDF_IS_STATUS_SUCCESS
-			     (csr_get_parsed_bss_description_ies
-				     (mac, pSirBssDesc, &pIesLocal))))
-			break;
-		/* See if the cyphers in the Bss description match with the
-		 * settings in the profile.
-		 */
-		fWpaMatch =
-			csr_get_wpa_cyphers(mac, &pProfile->AuthType,
-					   pProfile->negotiatedUCEncryptionType,
-					    &pProfile->mcEncryptionType,
-					    &pIesLocal->WPA, UnicastCypher,
-					MulticastCypher, AuthSuite, NULL, NULL);
-		if (!fWpaMatch)
-			break;
-
-		pWpaIe->IeHeader.ElementID = SIR_MAC_WPA_EID;
-
-		qdf_mem_copy(pWpaIe->Oui, csr_wpa_oui[01], sizeof(pWpaIe->Oui));
-
-		pWpaIe->Version = CSR_WPA_VERSION_SUPPORTED;
-
-		qdf_mem_copy(pWpaIe->MulticastOui, MulticastCypher,
-			     sizeof(MulticastCypher));
-
-		pWpaIe->cUnicastCyphers = 1;
-
-		qdf_mem_copy(&pWpaIe->UnicastOui[0], UnicastCypher,
-			     sizeof(UnicastCypher));
-
-		pAuthSuite =
-			(tCsrWpaAuthIe *) (&pWpaIe->
-					   UnicastOui[pWpaIe->cUnicastCyphers]);
-
-		pAuthSuite->cAuthenticationSuites = 1;
-		qdf_mem_copy(&pAuthSuite->AuthOui[0], AuthSuite,
-			     sizeof(AuthSuite));
-
-		/* The WPA capabilities follows the Auth Suite (two octects)-
-		 * this field is optional, and we always "send" zero, so just
-		 * remove it.  This is consistent with our assumptions in the
-		 * frames compiler; c.f. bug 15234:
-		 * http://gold.woodsidenet.com/bugzilla/show_bug.cgi?id=15234
-		 * Add in the fixed fields plus 1 Unicast cypher, less the IE
-		 * Header length Add in the size of the Auth suite (count plus
-		 * a single OUI)
-		 */
-		pWpaIe->IeHeader.Length =
-			sizeof(*pWpaIe) - sizeof(pWpaIe->IeHeader) +
-			sizeof(*pAuthSuite);
-
-		/* return the size of the IE header (total) constructed... */
-		cbWpaIe = pWpaIe->IeHeader.Length + sizeof(pWpaIe->IeHeader);
-
-	} while (0);
-
-	if (!pIes && pIesLocal)
-		/* locally allocated */
-		qdf_mem_free(pIesLocal);
-
-	return cbWpaIe;
-}
-#endif
-
 /* If a WPAIE exists in the profile, just use it. Or else construct
  * one from the BSS Caller allocated memory for pWpaIe and guarrantee
  * it can contain a max length WPA IE
