Merge "qcacld-3.0: Fix pmfComebackTimer during roaming" into wlan-cld3.driver.lnx.1.1-dev
diff --git a/core/mac/src/pe/lim/lim_ft.c b/core/mac/src/pe/lim/lim_ft.c
index c8abf32..ba6ef6c 100644
--- a/core/mac/src/pe/lim/lim_ft.c
+++ b/core/mac/src/pe/lim/lim_ft.c
@@ -493,6 +493,7 @@
 	tSchBeaconStruct *pBeaconStruct;
 	uint32_t selfDot11Mode;
 	ePhyChanBondState cbEnabledMode;
+	QDF_STATUS status;
 
 	pBeaconStruct = qdf_mem_malloc(sizeof(tSchBeaconStruct));
 	if (NULL == pBeaconStruct) {
@@ -678,6 +679,19 @@
 	pftSessionEntry->encryptType = psessionEntry->encryptType;
 #ifdef WLAN_FEATURE_11W
 	pftSessionEntry->limRmfEnabled = psessionEntry->limRmfEnabled;
+
+	if (pftSessionEntry->limRmfEnabled) {
+		pftSessionEntry->pmfComebackTimerInfo.pMac = pMac;
+		pftSessionEntry->pmfComebackTimerInfo.sessionID =
+				psessionEntry->smeSessionId;
+		status = qdf_mc_timer_init(&pftSessionEntry->pmfComebackTimer,
+			QDF_TIMER_TYPE_SW, lim_pmf_comeback_timer_callback,
+			(void *)&pftSessionEntry->pmfComebackTimerInfo);
+		if (!QDF_IS_STATUS_SUCCESS(status))
+			lim_log(pMac, LOGE,
+				FL("cannot init pmf comeback timer."));
+	}
+
 #endif
 	if ((pftSessionEntry->limRFBand == SIR_BAND_2_4_GHZ) &&
 		(pftSessionEntry->htSupportedChannelWidthSet ==
diff --git a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c
index 573a288..80c8974 100644
--- a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c
+++ b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c
@@ -810,11 +810,34 @@
 					timeout_value)) {
 				lim_log(mac_ctx, LOGE,
 					FL("Failed to start comeback timer."));
+
+				assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
+				assoc_cnf.protStatusCode =
+					eSIR_MAC_UNSPEC_FAILURE_STATUS;
+
+				/*
+				 * Delete Pre-auth context for the
+				 * associated BSS
+				 */
+				if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
+					lim_delete_pre_auth_node(mac_ctx,
+						hdr->sa);
+
+				goto assocReject;
 			}
 		} else {
 			lim_log(mac_ctx, LOGW,
-				FL("ASSOC resp with try again event recvd. "
-				"But try again time interval IE is wrong."));
+				FL("ASSOC resp with try again event recvd, but try again time interval IE is wrong"));
+
+			assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
+			assoc_cnf.protStatusCode =
+				eSIR_MAC_UNSPEC_FAILURE_STATUS;
+
+			/* Delete Pre-auth context for the associated BSS */
+			if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
+				lim_delete_pre_auth_node(mac_ctx, hdr->sa);
+
+			goto assocReject;
 		}
 		qdf_mem_free(beacon);
 		qdf_mem_free(assoc_rsp);