瀏覽代碼

qcacld-3.0: Refactor sta add bss in wma and lim

Devide wma_add_bss_sta_mode into 4 functions for 4 cases:
1. wma_pre_assoc_req, called before sta assoc, config vdev
params.
2. wma_send_peer_assoc_req, called after sta associated, send
peer assoc cmd to F/W.
3. LFR3 add bss
4. LFR2 add bss and vdev start

Lim will call these functions directly instead of post msg to
wma.

Replace lim_set_link_state with wma_add_bss_peer_sta to create
peer for LFR2 roaming.

Clean up all link state usless code now.

Change-Id: I6ad19bb92e7b0334704ac9c930277e9c35abbee2
CRs-Fixed: 2510119
Jianmin Zhu 5 年之前
父節點
當前提交
9772c4a321

+ 0 - 7
core/mac/src/include/sir_params.h

@@ -137,11 +137,6 @@ enum cap_bitmap {
 	/* MAX_FEATURE_SUPPORTED = 32 */
 };
 
-typedef enum eSriLinkState {
-	eSIR_LINK_IDLE_STATE = 0,
-	eSIR_LINK_PREASSOC_STATE = 1,
-} tSirLinkState;
-
 /* / Mailbox Message Structure Define */
 typedef struct sSirMbMsg {
 	uint16_t type;
@@ -310,8 +305,6 @@ struct sir_cfg_action_frm_tb_ppdu {
 #define SIR_HAL_P2P_NOA_ATTR_IND           (SIR_HAL_ITC_MSG_TYPES_BEGIN + 112)
 /* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 113) is unused */
 
-#define SIR_HAL_SET_LINK_STATE_RSP         (SIR_HAL_ITC_MSG_TYPES_BEGIN + 114)
-
 #define SIR_HAL_WLAN_SUSPEND_IND           (SIR_HAL_ITC_MSG_TYPES_BEGIN + 115)
 #define SIR_HAL_WLAN_RESUME_REQ            (SIR_HAL_ITC_MSG_TYPES_BEGIN + 116)
 

+ 15 - 4
core/mac/src/pe/include/lim_ft.h

@@ -128,9 +128,20 @@ void lim_fill_ft_session(struct mac_context *mac,
 		struct pe_session *ft_session,
 		struct pe_session *pe_session);
 
-void lim_ft_prepare_add_bss_req(struct mac_context *mac, uint8_t updateEntry,
-		struct pe_session *ft_session,
-		struct bss_description *bssDescription);
+/**
+ * lim_ft_prepare_add_bss_req() - Create Add Bss Req to the new AP
+ * @mac: Global MAC context
+ * @add_bss_params: Bss params including rsp data
+ * @pe_session: PE Session
+ *
+ * This will be used when we are ready to FT to the new AP.
+ * The newly created ft Session entry is passed to this function
+ *
+ * Return: None
+ */
+void lim_ft_prepare_add_bss_req(struct mac_context *mac,
+				struct pe_session *ft_session,
+				struct bss_description *bssDescription);
 
 QDF_STATUS lim_send_preauth_scan_offload(struct mac_context *mac_ctx,
 		struct pe_session *session_entry, tSirFTPreAuthReq *ft_preauth_req);
@@ -141,7 +152,7 @@ static inline void lim_fill_ft_session(struct mac_context *mac,
 		struct pe_session *pe_session)
 {}
 static inline void lim_ft_prepare_add_bss_req(struct mac_context *mac,
-		uint8_t updateEntry, struct pe_session *ft_session,
+		struct pe_session *ft_session,
 		struct bss_description *bssDescription)
 {}
 #endif

+ 1 - 5
core/mac/src/pe/lim/lim_api.c

@@ -896,10 +896,6 @@ void pe_stop(struct mac_context *mac)
 static void pe_free_nested_messages(struct scheduler_msg *msg)
 {
 	switch (msg->type) {
-	case WMA_SET_LINK_STATE_RSP:
-		pe_debug("WMA_SET_LINK_STATE_RSP");
-		qdf_mem_free(((tpLinkStateParams) msg->bodyptr)->callbackArg);
-		break;
 	default:
 		break;
 	}
@@ -2406,7 +2402,7 @@ pe_roam_synch_callback(struct mac_context *mac_ctx,
 	lim_fill_ft_session(mac_ctx, bss_desc, ft_session_ptr, session_ptr);
 
 	/* Next routine may update nss based on dot11Mode */
-	lim_ft_prepare_add_bss_req(mac_ctx, false, ft_session_ptr, bss_desc);
+	lim_ft_prepare_add_bss_req(mac_ctx, ft_session_ptr, bss_desc);
 	if (session_ptr->is11Rconnection) {
 		ft_session_ptr->is11Rconnection = session_ptr->is11Rconnection;
 		if (session_ptr->fils_info &&

+ 16 - 78
core/mac/src/pe/lim/lim_assoc_utils.c

@@ -55,6 +55,7 @@
 #include "lim_types.h"
 #include "wlan_utility.h"
 #include "wlan_mlme_api.h"
+#include "wma.h"
 
 #ifdef FEATURE_WLAN_TDLS
 #define IS_TDLS_PEER(type)  ((type) == STA_ENTRY_TDLS_PEER)
@@ -3558,39 +3559,11 @@ void lim_sta_add_bss_update_ht_parameter(uint32_t bss_chan_freq,
 		 add_bss->fRIFSMode);
 }
 
-/**
- * limSendAddBss()
- *
- ***FUNCTION:
- *
- ***LOGIC:
- * 1) LIM receives eWNI_SME_JOIN_REQ
- * 2) For a valid eWNI_SME_JOIN_REQ, LIM sends
- * SIR_HAL_ADD_BSS_REQ to HAL
- *
- ***ASSUMPTIONS:
- * JOIN REQ parameters are saved in mac->lim.gLimMlmJoinReq
- * ADD BSS parameters can be obtained from two sources:
- * 1) mac->lim.gLimMlmJoinReq
- * 2) beaconStruct, passed as parameter
- * So, if a reqd parameter is found in bssDescriptions
- * then it is given preference over beaconStruct
- *
- ***NOTE:
- *
- * @param  mac Pointer to Global MAC structure
- *              pAssocRsp    contains the structured assoc/reassoc Response got from AP
- *              beaconstruct        Has the ProbeRsp/Beacon structured details
- *              bssDescription      bssDescription passed to PE from the SME
- * @return None
- */
-
 QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp,
 				   tpSchBeaconStruct pBeaconStruct,
 				   struct bss_description *bssDescription,
 				   uint8_t updateEntry, struct pe_session *pe_session)
 {
-	struct scheduler_msg msgQ = {0};
 	struct bss_params *pAddBssParams = NULL;
 	uint32_t retCode;
 	tpDphHashNode sta = NULL;
@@ -4062,36 +4035,22 @@ QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp
 	if (lim_is_fils_connection(pe_session))
 		pAddBssParams->no_ptk_4_way = true;
 
-	msgQ.type = WMA_ADD_BSS_REQ;
-	/** @ToDo : Update the Global counter to keeptrack of the PE <--> HAL messages*/
-	msgQ.reserved = 0;
-	msgQ.bodyptr = pAddBssParams;
-	msgQ.bodyval = 0;
-
-	pe_debug("SessionId: %d Sending WMA_ADD_BSS_REQ",
-		pe_session->peSessionId);
-	MTRACE(mac_trace_msg_tx(mac, pe_session->peSessionId, msgQ.type));
-
-	retCode = wma_post_ctrl_msg(mac, &msgQ);
-	if (QDF_STATUS_SUCCESS != retCode) {
+	retCode = wma_send_peer_assoc_req(pAddBssParams);
+	if (QDF_IS_STATUS_ERROR(retCode)) {
 		SET_LIM_PROCESS_DEFD_MESGS(mac, true);
 		qdf_mem_free(pAddBssParams);
-		pe_err("Posting ADD_BSS_REQ to HAL failed, reason=%X",
-			retCode);
-		goto returnFailure;
-
-	} else
-		return retCode;
+		pe_err("wma_send_peer_assoc_req failed=%X",
+		       retCode);
+	}
 
 returnFailure:
 	/* Clean-up will be done by the caller... */
 	return retCode;
 }
 
-QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updateEntry,
-					     struct pe_session *pe_session)
+QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac,
+					  struct pe_session *pe_session)
 {
-	struct scheduler_msg msgQ = {0};
 	struct bss_params *pAddBssParams = NULL;
 	uint32_t retCode;
 	tSchBeaconStruct *pBeaconStruct;
@@ -4130,8 +4089,8 @@ QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updat
 	/* Fill in struct bss_params self_mac_addr */
 	qdf_mem_copy(pAddBssParams->self_mac_addr,
 		     pe_session->self_mac_addr, sizeof(tSirMacAddr));
-	pe_debug("sessionid: %d updateEntry = %d limsystemrole = %d",
-		pe_session->smeSessionId, updateEntry,
+	pe_debug("sessionid: %d limsystemrole = %d",
+		 pe_session->smeSessionId,
 		GET_LIM_SYSTEM_ROLE(pe_session));
 
 	pe_debug("BSSID: " QDF_MAC_ADDR_STR,
@@ -4147,7 +4106,7 @@ QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updat
 	pAddBssParams->beaconInterval = bssDescription->beaconInterval;
 
 	pAddBssParams->dtimPeriod = pBeaconStruct->tim.dtimPeriod;
-	pAddBssParams->updateBss = updateEntry;
+	pAddBssParams->updateBss = false;
 
 	pAddBssParams->cfParamSet.cfpCount = pBeaconStruct->cfParamSet.cfpCount;
 	pAddBssParams->cfParamSet.cfpPeriod =
@@ -4271,7 +4230,7 @@ QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updat
 	pAddBssParams->staContext.maxSPLen = 0;
 	pAddBssParams->staContext.shortPreambleSupported =
 		(uint8_t) pBeaconStruct->capabilityInfo.shortPreamble;
-	pAddBssParams->staContext.updateSta = updateEntry;
+	pAddBssParams->staContext.updateSta = false;
 
 	pe_debug("StaCtx: " QDF_MAC_ADDR_STR " shortPreamble: %d",
 			QDF_MAC_ADDR_ARRAY(pAddBssParams->staContext.staMac),
@@ -4490,9 +4449,6 @@ QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updat
 		pAddBssParams->bSpectrumMgtEnabled, pAddBssParams->halPersona,
 		pe_session->limMlmState);
 
-	/* we need to defer the message until we get the response back from HAL. */
-	SET_LIM_PROCESS_DEFD_MESGS(mac, false);
-
 	if (cds_is_5_mhz_enabled()) {
 		pAddBssParams->ch_width = CH_WIDTH_5MHZ;
 		pAddBssParams->staContext.ch_width = CH_WIDTH_5MHZ;
@@ -4504,28 +4460,10 @@ QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updat
 	if (lim_is_fils_connection(pe_session))
 		pAddBssParams->no_ptk_4_way = true;
 
-	msgQ.type = WMA_ADD_BSS_REQ;
-	/** @ToDo : Update the Global counter to keeptrack of the PE <--> HAL messages*/
-	msgQ.reserved = 0;
-	msgQ.bodyptr = pAddBssParams;
-	msgQ.bodyval = 0;
-
-	pe_debug("SessionId:%d Sending WMA_ADD_BSS_REQ",
-		pe_session->peSessionId);
-	MTRACE(mac_trace_msg_tx(mac, pe_session->peSessionId, msgQ.type));
-
-	retCode = wma_post_ctrl_msg(mac, &msgQ);
-	if (QDF_STATUS_SUCCESS != retCode) {
-		SET_LIM_PROCESS_DEFD_MESGS(mac, true);
-		qdf_mem_free(pAddBssParams);
-		pe_err("Posting ADD_BSS_REQ to HAL failed, reason=%X",
-			retCode);
-		goto returnFailure;
-
-	} else {
-		qdf_mem_free(pBeaconStruct);
-		return retCode;
-	}
+	pAddBssParams->status = wma_pre_assoc_req(pAddBssParams);
+	lim_process_sta_add_bss_rsp_pre_assoc(mac, pAddBssParams, pe_session);
+	qdf_mem_free(pAddBssParams);
+	retCode = QDF_STATUS_SUCCESS;
 
 returnFailure:
 	/* Clean-up will be done by the caller... */

+ 29 - 6
core/mac/src/pe/lim/lim_assoc_utils.h

@@ -202,12 +202,35 @@ void lim_sta_add_bss_update_ht_parameter(uint32_t bss_chan_freq,
 					 bool chan_width_support,
 					 struct bss_params *add_bss);
 
-QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp,
-				   tpSchBeaconStruct pBeaconStruct,
-				   struct bss_description *bssDescription,
-				   uint8_t updateEntry, struct pe_session *pe_session);
-QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac, uint8_t updateEntry,
-					     struct pe_session *pe_session);
+/**
+ * lim_sta_send_add_bss() - add bss and send peer assoc after receive assoc
+ * rsp in sta mode
+ *.@mac: pointer to Global MAC structure
+ * @pAssocRsp: contains the structured assoc/reassoc Response got from AP
+ * @beaconstruct: the ProbeRsp/Beacon structured details
+ * @bssDescription: bss description passed to PE from the SME
+ * @updateEntry: bool flag of whether update bss and sta
+ * @pe_session: pointer to pe session
+ *
+ * Return: none
+ */
+QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac,
+				tpSirAssocRsp pAssocRsp,
+				tpSchBeaconStruct pBeaconStruct,
+				struct bss_description *bssDescription,
+				uint8_t updateEntry,
+				struct pe_session *pe_session);
+
+/**
+ * lim_sta_send_add_bss_pre_assoc() - add bss after channel switch and before
+ * associate req in sta mode
+ *.@mac: pointer to Global MAC structure
+ * @pe_session: pointer to pe session
+ *
+ * Return: none
+ */
+QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac,
+					  struct pe_session *pe_session);
 
 void lim_prepare_and_send_del_sta_cnf(struct mac_context *mac,
 				      tpDphHashNode sta,

+ 3 - 3
core/mac/src/pe/lim/lim_ft.c

@@ -113,7 +113,7 @@ void lim_ft_cleanup(struct mac_context *mac, struct pe_session *pe_session)
  *
  *------------------------------------------------------------------*/
 void lim_ft_prepare_add_bss_req(struct mac_context *mac,
-		uint8_t updateEntry, struct pe_session *ft_session,
+		struct pe_session *ft_session,
 		struct bss_description *bssDescription)
 {
 	struct bss_params *pAddBssParams = NULL;
@@ -160,7 +160,7 @@ void lim_ft_prepare_add_bss_req(struct mac_context *mac,
 	pAddBssParams->beaconInterval = bssDescription->beaconInterval;
 
 	pAddBssParams->dtimPeriod = pBeaconStruct->tim.dtimPeriod;
-	pAddBssParams->updateBss = updateEntry;
+	pAddBssParams->updateBss = false;
 
 	pAddBssParams->reassocReq = true;
 
@@ -296,7 +296,7 @@ void lim_ft_prepare_add_bss_req(struct mac_context *mac,
 		pAddBssParams->staContext.maxSPLen = 0;
 		pAddBssParams->staContext.shortPreambleSupported =
 			(uint8_t) pBeaconStruct->capabilityInfo.shortPreamble;
-		pAddBssParams->staContext.updateSta = updateEntry;
+		pAddBssParams->staContext.updateSta = false;
 		pAddBssParams->staContext.encryptType =
 			ft_session->encryptType;
 #ifdef WLAN_FEATURE_11W

+ 6 - 7
core/mac/src/pe/lim/lim_ft_preauth.c

@@ -318,6 +318,7 @@ QDF_STATUS lim_ft_setup_auth_session(struct mac_context *mac,
 {
 	struct pe_session *ft_session = NULL;
 	uint8_t sessionId = 0;
+	struct sSirFTPreAuthReq *req;
 
 	ft_session =
 		pe_find_session_by_bssid(mac, pe_session->limReAssocbssId,
@@ -334,15 +335,13 @@ QDF_STATUS lim_ft_setup_auth_session(struct mac_context *mac,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (pe_session->ftPEContext.pFTPreAuthReq &&
-	    pe_session->ftPEContext.pFTPreAuthReq->pbssDescription) {
+	req = pe_session->ftPEContext.pFTPreAuthReq;
+	if (req && req->pbssDescription) {
 		lim_fill_ft_session(mac,
-				    pe_session->ftPEContext.pFTPreAuthReq->
-				    pbssDescription, ft_session,
+				    req->pbssDescription, ft_session,
 				    pe_session);
-
-		lim_ft_prepare_add_bss_req(mac, false, ft_session,
-		     pe_session->ftPEContext.pFTPreAuthReq->pbssDescription);
+		lim_ft_prepare_add_bss_req(mac, ft_session,
+					   req->pbssDescription);
 	}
 
 	return QDF_STATUS_SUCCESS;

+ 0 - 19
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -1630,7 +1630,6 @@ static void lim_process_messages(struct mac_context *mac_ctx,
 	uint8_t i;
 	struct pe_session *session_entry = NULL;
 	uint8_t defer_msg = false;
-	tLinkStateParams *link_state_param;
 	uint16_t pkt_len = 0;
 	cds_pkt_t *body_ptr = NULL;
 	QDF_STATUS qdf_status;
@@ -1967,24 +1966,6 @@ static void lim_process_messages(struct mac_context *mac_ctx,
 	case WMA_AGGR_QOS_RSP:
 		lim_process_ft_aggr_qos_rsp(mac_ctx, msg);
 		break;
-	case WMA_SET_LINK_STATE_RSP:
-		link_state_param = (tLinkStateParams *) msg->bodyptr;
-		session_entry = link_state_param->session;
-		if (link_state_param->ft
-#if defined WLAN_FEATURE_ROAM_OFFLOAD
-			&& !session_entry->bRoamSynchInProgress
-#endif
-		)
-			lim_send_reassoc_req_with_ft_ies_mgmt_frame(mac_ctx,
-				session_entry->pLimMlmReassocReq,
-				session_entry);
-		if (link_state_param->callback)
-			link_state_param->callback(mac_ctx,
-				link_state_param->callbackArg,
-				link_state_param->status);
-		qdf_mem_free((void *)(msg->bodyptr));
-		msg->bodyptr = NULL;
-		break;
 	case WMA_RX_CHN_STATUS_EVENT:
 		lim_process_rx_channel_status_event(mac_ctx, msg->bodyptr);
 		break;

+ 12 - 17
core/mac/src/pe/lim/lim_process_mlm_host_roam.c

@@ -42,6 +42,8 @@
 #endif
 #include "wma_if.h"
 #include "rrm_api.h"
+#include "wma.h"
+
 static void lim_handle_sme_reaasoc_result(struct mac_context *, tSirResultCodes,
 		uint16_t, struct pe_session *);
 /**
@@ -582,8 +584,7 @@ void lim_process_mlm_ft_reassoc_req(struct mac_context *mac,
 	struct pe_session *session;
 	uint16_t caps;
 	uint32_t val;
-	struct scheduler_msg msgQ = {0};
-	QDF_STATUS retCode;
+	QDF_STATUS status;
 	uint32_t teleBcnEn = 0;
 
 	if (!reassoc_req) {
@@ -644,31 +645,25 @@ void lim_process_mlm_ft_reassoc_req(struct mac_context *mac,
 	else
 		val = mac->mlme_cfg->sap_cfg.listen_interval;
 
-	if (lim_set_link_state
-		    (mac, eSIR_LINK_PREASSOC_STATE, session->bssId,
-		    session->self_mac_addr, NULL, NULL) != QDF_STATUS_SUCCESS) {
+	status = wma_add_bss_peer_sta(session->self_mac_addr, session->bssId,
+				      false);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
 		qdf_mem_free(reassoc_req);
 		return;
 	}
 
 	reassoc_req->listenInterval = (uint16_t) val;
 	session->pLimMlmReassocReq = reassoc_req;
-
 	/* we need to defer the message until we get response back from HAL */
 	SET_LIM_PROCESS_DEFD_MESGS(mac, false);
 
-	msgQ.type = SIR_HAL_ADD_BSS_REQ;
-	msgQ.reserved = 0;
-	msgQ.bodyptr = session->ftPEContext.pAddBssReq;
-	msgQ.bodyval = 0;
-
-	pe_debug("Sending SIR_HAL_ADD_BSS_REQ");
-	MTRACE(mac_trace_msg_tx(mac, session->peSessionId, msgQ.type));
-	retCode = wma_post_ctrl_msg(mac, &msgQ);
-	if (QDF_STATUS_SUCCESS != retCode) {
+	status = wma_add_bss_lfr2_vdev_start(session->ftPEContext.pAddBssReq);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		SET_LIM_PROCESS_DEFD_MESGS(mac, true);
 		qdf_mem_free(session->ftPEContext.pAddBssReq);
-		pe_err("Posting ADD_BSS_REQ to HAL failed, reason: %X",
-			retCode);
+		pe_err("wma_add_bss_lfr2_vdev_start, reason: %X",
+		       status);
 	}
 
 	session->ftPEContext.pAddBssReq = NULL;

+ 14 - 38
core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c

@@ -288,8 +288,9 @@ void lim_process_mlm_join_cnf(struct mac_context *mac_ctx,
 		pe_debug("***SessionId:%d Joined ESS ***",
 			join_cnf->sessionId);
 		/* Setup hardware upfront */
-		if (lim_sta_send_add_bss_pre_assoc(mac_ctx, false,
-			session_entry) == QDF_STATUS_SUCCESS)
+		if (lim_sta_send_add_bss_pre_assoc(mac_ctx,
+						   session_entry) ==
+		    QDF_STATUS_SUCCESS)
 			return;
 		else
 			result_code = eSIR_SME_REFUSED;
@@ -2172,47 +2173,35 @@ static void lim_update_fils_auth_mode(struct pe_session *session_entry,
 { }
 #endif
 
-/**
- * csr_neighbor_roam_handoff_req_hdlr - Processes handoff request
- * @mac_ctx:  Pointer to mac context
- * @pAddBssParams: Bss params including rsp data
- * @session_entry: PE session handle
- *
- * This function is called to process a WMA_ADD_BSS_RSP from HAL.
- * Upon receipt of this message from HAL if the state is pre assoc.
- *
- * Return: Null
- */
-static void
-lim_process_sta_add_bss_rsp_pre_assoc(struct mac_context *mac_ctx,
-	struct bss_params *add_bss_params, struct pe_session *session_entry)
+void lim_process_sta_add_bss_rsp_pre_assoc(struct mac_context *mac_ctx,
+					   struct bss_params *add_bss_params,
+					   struct pe_session *session_entry)
 {
-	struct bss_params *pAddBssParams = add_bss_params;
 	tAniAuthType cfgAuthType, authMode;
 	tLimMlmAuthReq *pMlmAuthReq;
 	tpDphHashNode sta = NULL;
 
-	if (!pAddBssParams) {
+	if (!add_bss_params) {
 		pe_err("Invalid body pointer in message");
 		goto joinFailure;
 	}
-	if (QDF_STATUS_SUCCESS == pAddBssParams->status) {
+	if (QDF_STATUS_SUCCESS == add_bss_params->status) {
 		sta = dph_add_hash_entry(mac_ctx,
-				pAddBssParams->staContext.staMac,
+				add_bss_params->staContext.staMac,
 				DPH_STA_HASH_INDEX_PEER,
 				&session_entry->dph.dphHashTable);
 		if (!sta) {
 			/* Could not add hash table entry */
 			pe_err("could not add hash entry at DPH for");
 			lim_print_mac_addr(mac_ctx,
-				pAddBssParams->staContext.staMac, LOGE);
+				add_bss_params->staContext.staMac, LOGE);
 			goto joinFailure;
 		}
-		session_entry->bss_idx = (uint8_t)pAddBssParams->bss_idx;
+		session_entry->bss_idx = (uint8_t)add_bss_params->bss_idx;
 		/* Success, handle below */
-		sta->bssId = pAddBssParams->bss_idx;
+		sta->bssId = add_bss_params->bss_idx;
 		/* STA Index(genr by HAL) for the BSS entry is stored here */
-		sta->staIndex = pAddBssParams->staContext.staIdx;
+		sta->staIndex = add_bss_params->staContext.staIdx;
 		/* Trigger Authentication with AP */
 		cfgAuthType = mac_ctx->mlme_cfg->wep_params.auth_type;
 
@@ -2240,7 +2229,7 @@ lim_process_sta_add_bss_rsp_pre_assoc(struct mac_context *mac_ctx,
 		session_entry->limPrevSmeState = session_entry->limSmeState;
 		session_entry->limSmeState = eLIM_SME_WT_AUTH_STATE;
 		/* remember staId in case of assoc timeout/failure handling */
-		session_entry->staId = pAddBssParams->staContext.staIdx;
+		session_entry->staId = add_bss_params->staContext.staIdx;
 
 		MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
 			session_entry->peSessionId,
@@ -2295,16 +2284,6 @@ static void lim_process_sta_mlm_add_bss_rsp(struct mac_context *mac_ctx,
 	uint8_t update_sta = false;
 
 	mlm_assoc_cnf.resultCode = eSIR_SME_SUCCESS;
-
-	if (eLIM_MLM_WT_ADD_BSS_RSP_PREASSOC_STATE ==
-		session_entry->limMlmState) {
-		pe_debug("SessionId: %d lim_process_sta_add_bss_rsp_pre_assoc",
-			session_entry->peSessionId);
-		lim_process_sta_add_bss_rsp_pre_assoc(mac_ctx,
-						      add_bss_params,
-						      session_entry);
-		return;
-	}
 	if (eLIM_MLM_WT_ADD_BSS_RSP_REASSOC_STATE == session_entry->limMlmState
 		|| (eLIM_MLM_WT_ADD_BSS_RSP_FT_REASSOC_STATE ==
 		session_entry->limMlmState)) {
@@ -2326,9 +2305,6 @@ static void lim_process_sta_mlm_add_bss_rsp(struct mac_context *mac_ctx,
 		}
 	}
 
-	if (add_bss_params == 0)
-		return;
-
 	if (QDF_STATUS_SUCCESS == add_bss_params->status) {
 		if (eLIM_MLM_WT_ADD_BSS_RSP_FT_REASSOC_STATE ==
 			session_entry->limMlmState) {

+ 0 - 43
core/mac/src/pe/lim/lim_send_messages.c

@@ -354,49 +354,6 @@ void lim_set_active_edca_params(struct mac_context *mac_ctx,
 	return;
 }
 
-/** ---------------------------------------------------------
-   \fn      lim_set_link_state
-   \brief   LIM sends a message to WMA to set the link state
-   \param   struct mac_context * mac
-   \param   tSirLinkState      state
-   \return  None
-   -----------------------------------------------------------*/
-QDF_STATUS lim_set_link_state(struct mac_context *mac, tSirLinkState state,
-				 tSirMacAddr bssId, tSirMacAddr self_mac_addr,
-				 tpSetLinkStateCallback callback,
-				 void *callbackArg)
-{
-	struct scheduler_msg msgQ = {0};
-	QDF_STATUS retCode;
-	tpLinkStateParams pLinkStateParams = NULL;
-	/* Allocate memory. */
-	pLinkStateParams = qdf_mem_malloc(sizeof(tLinkStateParams));
-	if (!pLinkStateParams)
-		return QDF_STATUS_E_NOMEM;
-	pLinkStateParams->state = state;
-	pLinkStateParams->callback = callback;
-	pLinkStateParams->callbackArg = callbackArg;
-
-	/* Copy Mac address */
-	sir_copy_mac_addr(pLinkStateParams->bssid, bssId);
-	sir_copy_mac_addr(pLinkStateParams->self_mac_addr, self_mac_addr);
-
-	msgQ.type = WMA_SET_LINK_STATE;
-	msgQ.reserved = 0;
-	msgQ.bodyptr = pLinkStateParams;
-	msgQ.bodyval = 0;
-
-	MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msgQ.type));
-
-	retCode = (uint32_t) wma_post_ctrl_msg(mac, &msgQ);
-	if (retCode != QDF_STATUS_SUCCESS) {
-		qdf_mem_free(pLinkStateParams);
-		pe_err("Posting link state %d failed, reason = %x", state,
-			retCode);
-	}
-	return retCode;
-}
-
 QDF_STATUS lim_send_mode_update(struct mac_context *mac,
 				   tUpdateVHTOpMode *pTempParam,
 				   struct pe_session *pe_session)

+ 0 - 5
core/mac/src/pe/lim/lim_send_messages.h

@@ -66,11 +66,6 @@ QDF_STATUS lim_send_switch_chnl_params(struct mac_context *mac,
 QDF_STATUS lim_send_edca_params(struct mac_context *mac,
 				   tSirMacEdcaParamRecord *pUpdatedEdcaParams,
 				   uint16_t bss_idx, bool mu_edca);
-QDF_STATUS lim_set_link_state(struct mac_context *mac, tSirLinkState state,
-				 tSirMacAddr bssId, tSirMacAddr selfMac,
-				 tpSetLinkStateCallback callback,
-				 void *callbackArg);
-
 /**
  * lim_set_active_edca_params() - Choose best EDCA parameters
  * @mac_ctx:  pointer to Global Mac structure.

+ 15 - 0
core/mac/src/pe/lim/lim_types.h

@@ -1274,4 +1274,19 @@ bool lim_send_assoc_ind_to_sme(struct mac_context *mac_ctx,
 			       bool pmf_connection,
 			       bool *assoc_req_copied,
 			       bool dup_entry, bool force_1x1);
+
+/**
+ * lim_process_sta_add_bss_rsp_pre_assoc - Processes handoff request
+ * @mac_ctx:  Pointer to mac context
+ * @pAddBssParams: Bss params including rsp data
+ * @session_entry: PE session handle
+ *
+ * This function is called to process a WMA_ADD_BSS_RSP from HAL.
+ * Upon receipt of this message from HAL if the state is pre assoc.
+ *
+ * Return: Null
+ */
+void lim_process_sta_add_bss_rsp_pre_assoc(struct mac_context *mac_ctx,
+					   struct bss_params *add_bss_params,
+					   struct pe_session *session_entry);
 #endif /* __LIM_TYPES_H */

+ 0 - 2
core/mac/src/sys/legacy/src/utils/src/mac_trace.c

@@ -415,8 +415,6 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg)
 
 		CASE_RETURN_STRING(WMA_IBSS_STA_ADD);
 		CASE_RETURN_STRING(WMA_TIMER_ADJUST_ADAPTIVE_THRESHOLD_IND);
-		CASE_RETURN_STRING(WMA_SET_LINK_STATE);
-		CASE_RETURN_STRING(WMA_SET_LINK_STATE_RSP);
 		CASE_RETURN_STRING(WMA_SET_STA_BCASTKEY_REQ);
 		CASE_RETURN_STRING(WMA_SET_STA_BCASTKEY_RSP);
 		CASE_RETURN_STRING(WMA_ADD_TS_RSP);

+ 36 - 2
core/wma/inc/wma.h

@@ -754,7 +754,7 @@ struct wma_txrx_node {
 	enum phy_ch_width chan_width;
 	bool vdev_active;
 	uint64_t tsfadjust;
-	void *addBssStaContext;
+	tAddStaParams *addBssStaContext;
 	uint8_t aid;
 	uint8_t rmfEnabled;
 #ifdef WLAN_FEATURE_11W
@@ -770,7 +770,7 @@ struct wma_txrx_node {
 	int8_t tx_power;
 	int8_t max_tx_power;
 	uint32_t nwType;
-	void *staKeyParams;
+	tSetStaKeyParams *staKeyParams;
 	uint32_t peer_count;
 	bool roam_synch_in_progress;
 	void *plink_status_req;
@@ -2546,4 +2546,38 @@ QDF_STATUS wma_add_bss_peer_sta(uint8_t *self_mac, uint8_t *bssid,
  */
 QDF_STATUS wma_send_vdev_stop(uint8_t vdev_id);
 
+/**
+ * wma_pre_assoc_req() - wma pre assoc req when sta connect
+ * @add_bss: add bss param
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wma_pre_assoc_req(struct bss_params *add_bss);
+
+/**
+ * wma_add_bss_lfr3() - add bss during LFR3 offload roaming
+ * @wma: wma handler
+ * @add_bss: add bss param
+ *
+ * Return: None
+ */
+void wma_add_bss_lfr3(tp_wma_handle wma, struct bss_params *add_bss);
+
+#ifdef WLAN_FEATURE_HOST_ROAM
+/**
+ * wma_add_bss_lfr2_vdev_start() - add bss and start vdev during host roaming
+ * @add_bss: add bss param
+ *
+ * Return: None
+ */
+QDF_STATUS wma_add_bss_lfr2_vdev_start(struct bss_params *add_bss);
+#endif
+
+/**
+ * wma_send_peer_assoc_req() - wma send peer assoc req when sta connect
+ * @add_bss: add bss param
+ *
+ * Return: None
+ */
+QDF_STATUS wma_send_peer_assoc_req(struct bss_params *add_bss);
 #endif

+ 0 - 24
core/wma/inc/wma_if.h

@@ -770,30 +770,6 @@ typedef struct {
 	tSirMacSSid ssid;
 } tSwitchChannelParams, *tpSwitchChannelParams;
 
-typedef void (*tpSetLinkStateCallback)(struct mac_context *mac, void *msgParam,
-		bool status);
-
-/**
- * struct tLinkStateParams - link state parameters
- * @bssid: BSSID
- * @self_mac_addr: self mac address
- * @state: link state
- * @callback: callback function pointer
- * @callbackArg: callback argument
- * @session: session context
- */
-typedef struct sLinkStateParams {
-	/* SIR_HAL_SET_LINK_STATE */
-	tSirMacAddr bssid;
-	tSirMacAddr self_mac_addr;
-	tSirLinkState state;
-	tpSetLinkStateCallback callback;
-	void *callbackArg;
-	int ft;
-	void *session;
-	bool status;
-} tLinkStateParams, *tpLinkStateParams;
-
 /**
  * struct tEdcaParams - EDCA parameters
  * @bss_idx: BSSID index

+ 0 - 2
core/wma/inc/wma_internal.h

@@ -893,8 +893,6 @@ QDF_STATUS wma_set_mcc_channel_time_quota
 	uint32_t adapter_1_chan_number,
 	uint32_t adapter_1_quota, uint32_t adapter_2_chan_number);
 
-void wma_set_linkstate(tp_wma_handle wma, tpLinkStateParams params);
-
 QDF_STATUS wma_process_rate_update_indicate(tp_wma_handle wma,
 					    tSirRateUpdateInd *
 					    pRateUpdateParams);

+ 0 - 1
core/wma/inc/wma_types.h

@@ -154,7 +154,6 @@
 #define WMA_IBSS_STA_ADD               SIR_HAL_IBSS_STA_ADD
 #define WMA_TIMER_ADJUST_ADAPTIVE_THRESHOLD_IND SIR_HAL_TIMER_ADJUST_ADAPTIVE_THRESHOLD_IND
 #define WMA_SET_LINK_STATE             SIR_HAL_SET_LINK_STATE
-#define WMA_SET_LINK_STATE_RSP         SIR_HAL_SET_LINK_STATE_RSP
 #define WMA_SET_STA_BCASTKEY_REQ       SIR_HAL_SET_STA_BCASTKEY_REQ
 #define WMA_SET_STA_BCASTKEY_RSP       SIR_HAL_SET_STA_BCASTKEY_RSP
 #define WMA_ADD_TS_RSP                 SIR_HAL_ADD_TS_RSP

+ 0 - 60
core/wma/src/wma_data.c

@@ -1168,66 +1168,6 @@ QDF_STATUS wma_set_mcc_channel_time_quota(tp_wma_handle wma,
 						chan2_freq);
 }
 
-/**
- * wma_set_linkstate() - set wma linkstate
- * @wma: wma handle
- * @params: link state params
- *
- * Return: none
- */
-void wma_set_linkstate(tp_wma_handle wma, tpLinkStateParams params)
-{
-	struct cdp_pdev *pdev;
-	struct cdp_vdev *vdev;
-	uint8_t vdev_id;
-	bool roam_synch_in_progress = false;
-	QDF_STATUS status;
-
-	params->status = true;
-	WMA_LOGD("%s: state %d selfmac %pM", __func__,
-		 params->state, params->self_mac_addr);
-	if (params->state != eSIR_LINK_PREASSOC_STATE) {
-		WMA_LOGD("%s: unsupported link state %d",
-			 __func__, params->state);
-		params->status = false;
-		goto out;
-	}
-
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	if (!pdev) {
-		params->status = false;
-		goto out;
-	}
-
-	vdev = wma_find_vdev_by_addr(wma, params->self_mac_addr, &vdev_id);
-	if (!vdev) {
-		WMA_LOGP("%s: vdev not found for addr: %pM",
-			 __func__, params->self_mac_addr);
-		params->status = false;
-		goto out;
-	}
-
-	if (wma_is_vdev_in_ap_mode(wma, vdev_id)) {
-		WMA_LOGD("%s: Ignoring set link req in ap mode", __func__);
-		params->status = false;
-		goto out;
-	}
-
-	if (wma_is_roam_synch_in_progress(wma, vdev_id))
-		roam_synch_in_progress = true;
-	status = wma_create_peer(wma, pdev, vdev, params->bssid,
-				 WMI_PEER_TYPE_DEFAULT, vdev_id,
-				 roam_synch_in_progress);
-	if (status != QDF_STATUS_SUCCESS) {
-		WMA_LOGE("%s: Unable to create peer", __func__);
-		params->status = false;
-	}
-	if (roam_synch_in_progress)
-		return;
-out:
-	wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
-}
-
 /**
  * wma_process_rate_update_indate() - rate update indication
  * @wma: wma handle

+ 333 - 249
core/wma/src/wma_dev_if.c

@@ -3054,8 +3054,7 @@ int wma_peer_assoc_conf_handler(void *handle, uint8_t *cmd_param_info,
 			params->operMode,
 			params->updateBss, params->nwType, params->bssId,
 			params->staContext.staIdx, params->status);
-		wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
-					   (void *)params, 0);
+		lim_handle_mlm_add_bss_rsp(wma->mac_context, params);
 	} else {
 		WMA_LOGE(FL("Unhandled request message type: %d"),
 		req_msg->msg_type);
@@ -3219,8 +3218,7 @@ void wma_hold_req_timer(void *data)
 		if (wma_crash_on_fw_timeout(wma->fw_timeout_crash))
 			wma_trigger_recovery_assert_on_fw_timeout(
 				WMA_ADD_BSS_REQ);
-		wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
-					   (void *)params, 0);
+		lim_handle_mlm_add_bss_rsp(wma->mac_context, params);
 	} else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
 		(tgt_req->type == WMA_DELETE_STA_RSP_START)) {
 		tpDeleteStaParams params =
@@ -3783,304 +3781,391 @@ send_fail_resp:
 }
 #endif /* QCA_IBSS_SUPPORT */
 
-/**
- * wma_add_bss_sta_mode() -  process add bss request in sta mode
- * @wma: wma handle
- * @add_bss: add bss parameters
- *
- * Return: none
- */
-static void wma_add_bss_sta_mode(tp_wma_handle wma, struct bss_params *add_bss)
+static QDF_STATUS wma_update_iface_params(tp_wma_handle wma,
+					  struct bss_params *add_bss)
 {
-	struct cdp_pdev *pdev;
+	struct wma_txrx_node *iface;
+	uint8_t vdev_id;
+
+	vdev_id = add_bss->staContext.smesessionId;
+	iface = &wma->interfaces[vdev_id];
+	wma_set_bss_rate_flags(wma, vdev_id, add_bss);
+
+	if (iface->addBssStaContext)
+		qdf_mem_free(iface->addBssStaContext);
+	iface->addBssStaContext = qdf_mem_malloc(sizeof(tAddStaParams));
+	if (!iface->addBssStaContext)
+		return QDF_STATUS_E_RESOURCES;
+	*iface->addBssStaContext = add_bss->staContext;
+	if (iface->staKeyParams) {
+		qdf_mem_free(iface->staKeyParams);
+		iface->staKeyParams = NULL;
+	}
+	if (add_bss->extSetStaKeyParamValid) {
+		iface->staKeyParams =
+			qdf_mem_malloc(sizeof(tSetStaKeyParams));
+		if (!iface->staKeyParams) {
+			qdf_mem_free(iface->addBssStaContext);
+			iface->addBssStaContext = NULL;
+			return QDF_STATUS_E_RESOURCES;
+		}
+		*iface->staKeyParams = add_bss->extSetStaKeyParam;
+	}
+	/* Save parameters later needed by WMA_ADD_STA_REQ */
+	iface->rmfEnabled = add_bss->rmfEnabled;
+	if (add_bss->rmfEnabled)
+		wma_set_peer_pmf_status(wma, add_bss->bssId, true);
+	iface->beaconInterval = add_bss->beaconInterval;
+	iface->llbCoexist = add_bss->llbCoexist;
+	iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported;
+	iface->nwType = add_bss->nwType;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+void *wma_cdp_find_peer_by_addr(uint8_t *peer_addr, uint8_t *sta_idx)
+{
+	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
+	struct cdp_pdev *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+
+	if (! soc || !pdev) {
+		WMA_LOGE("%s Failed to get pdev/soc", __func__);
+		return NULL;
+	}
+
+	return cdp_peer_find_by_addr(soc, pdev, peer_addr, sta_idx);
+}
+
+static
+QDF_STATUS wma_save_bss_params(tp_wma_handle wma, struct bss_params *add_bss)
+{
+	QDF_STATUS status;
+
+	wma_vdev_set_he_config(wma, add_bss->staContext.smesessionId, add_bss);
+	if (!wma_cdp_find_peer_by_addr(add_bss->bssId,
+				       &add_bss->staContext.staIdx))
+		status = QDF_STATUS_E_FAILURE;
+	else
+		status = QDF_STATUS_SUCCESS;
+	add_bss->bss_idx = add_bss->staContext.smesessionId;
+	qdf_mem_copy(add_bss->staContext.staMac, add_bss->bssId,
+		     sizeof(add_bss->staContext.staMac));
+
+	WMA_LOGD("%s: opermode %d update_bss %d nw_type %d bssid %pM staIdx %d status %d",
+		 __func__, add_bss->operMode,
+		 add_bss->updateBss, add_bss->nwType, add_bss->bssId,
+		 add_bss->staContext.staIdx, add_bss->status);
+
+	return status;
+}
+
+QDF_STATUS wma_pre_assoc_req(struct bss_params *add_bss)
+{
+	QDF_STATUS status;
+	tp_wma_handle wma;
+
+	wma = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma) {
+		WMA_LOGE("Invalid pdev or wma");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	status = wma_update_iface_params(wma, add_bss);
+	if (QDF_IS_STATUS_ERROR(status))
+		return status;
+
+	status = wma_save_bss_params(wma, add_bss);
+
+	return status;
+}
+
+void wma_add_bss_lfr3(tp_wma_handle wma, struct bss_params *add_bss)
+{
+	QDF_STATUS status;
+	void *peer = NULL;
+	uint8_t peer_id;
+
+	status = wma_update_iface_params(wma, add_bss);
+	if (QDF_IS_STATUS_ERROR(status))
+		return;
+
+	peer = wma_cdp_find_peer_by_addr(add_bss->bssId, &peer_id);
+	if (!peer) {
+		WMA_LOGE("%s Failed to find peer %pM", __func__,
+			 add_bss->bssId);
+		return;
+	}
+	add_bss->staContext.staIdx = peer_id;
+	WMA_LOGD("LFR3:%s: bssid %pM staIdx %d", __func__, add_bss->bssId,
+		 add_bss->staContext.staIdx);
+}
+
+
+#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
+static
+QDF_STATUS wma_set_cdp_vdev_pause_reason(tp_wma_handle wma, uint8_t vdev_id)
+{
+	struct cdp_vdev *vdev;
+	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
+
+	vdev = wma_find_vdev_by_id(wma, vdev_id);
+	if (!vdev) {
+		WMA_LOGE("%s Invalid txrx vdev", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+	cdp_fc_vdev_pause(soc, vdev, OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
+
+	return QDF_STATUS_SUCCESS;
+}
+#else
+static inline
+QDF_STATUS wma_set_cdp_vdev_pause_reason(tp_wma_handle wma, uint8_t vdev_id)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
+
+#ifdef WLAN_FEATURE_HOST_ROAM
+QDF_STATUS wma_add_bss_lfr2_vdev_start(struct bss_params *add_bss)
+{
+	tp_wma_handle wma;
 	struct wma_vdev_start_req req;
-	struct wma_target_req *msg;
 	struct wlan_objmgr_vdev *vdev_obj;
-	uint8_t vdev_id = 0, peer_id;
+	uint8_t vdev_id, peer_id;
 	void *peer = NULL;
 	QDF_STATUS status;
 	struct wma_txrx_node *iface;
-	int pps_val = 0;
-	bool roam_synch_in_progress = false;
-	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
-	bool peer_assoc_sent = false;
-	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
-	if (!mac) {
-		WMA_LOGE("%s: Unable to get PE context", __func__);
-		goto send_fail_resp;
+	wma = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma) {
+		WMA_LOGE("Invalid pdev or wma");
+		return QDF_STATUS_E_INVAL;
 	}
 
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	status = wma_update_iface_params(wma, add_bss);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto send_fail_resp;
 
-	if (!pdev) {
-		WMA_LOGE("%s Failed to get pdev", __func__);
+	peer = wma_cdp_find_peer_by_addr(add_bss->bssId, &peer_id);
+	if (!peer) {
+		WMA_LOGE("%s Failed to find peer %pM", __func__,
+			 add_bss->bssId);
 		goto send_fail_resp;
 	}
 
 	vdev_id = add_bss->staContext.smesessionId;
 	iface = &wma->interfaces[vdev_id];
+	vdev_obj = iface->vdev;
+	if (!vdev_obj) {
+		wma_err("vdev not found for id: %d", vdev_id);
+		goto send_fail_resp;
+	}
+	mlme_set_bss_params(vdev_obj, add_bss);
+	add_bss->staContext.staIdx = peer_id;
 
-	wma_set_bss_rate_flags(wma, vdev_id, add_bss);
-	if (add_bss->operMode) {
-		/* Save parameters later needed by WMA_ADD_STA_REQ */
-		if (iface->addBssStaContext)
-			qdf_mem_free(iface->addBssStaContext);
-		iface->addBssStaContext = qdf_mem_malloc(sizeof(tAddStaParams));
-		if (!iface->addBssStaContext)
-			goto send_fail_resp;
+	qdf_mem_zero(&req, sizeof(req));
+	req.vdev_id = vdev_id;
+	req.op_chan_freq = add_bss->op_chan_freq;
+	req.chan_width = add_bss->ch_width;
 
-		qdf_mem_copy(iface->addBssStaContext, &add_bss->staContext,
-			     sizeof(tAddStaParams));
+	if (add_bss->ch_width == CH_WIDTH_10MHZ)
+		req.is_half_rate = 1;
+	else if (add_bss->ch_width == CH_WIDTH_5MHZ)
+		req.is_quarter_rate = 1;
 
-		if (iface->staKeyParams) {
-			qdf_mem_free(iface->staKeyParams);
-			iface->staKeyParams = NULL;
-		}
-		if (add_bss->extSetStaKeyParamValid) {
-			iface->staKeyParams =
-				qdf_mem_malloc(sizeof(tSetStaKeyParams));
-			if (!iface->staKeyParams)
-				goto send_fail_resp;
-
-			qdf_mem_copy(iface->staKeyParams,
-				     &add_bss->extSetStaKeyParam,
-				     sizeof(tSetStaKeyParams));
-		}
-		/* Save parameters later needed by WMA_ADD_STA_REQ */
-		iface->rmfEnabled = add_bss->rmfEnabled;
-		iface->beaconInterval = add_bss->beaconInterval;
-		iface->llbCoexist = add_bss->llbCoexist;
-		iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported;
-		iface->nwType = add_bss->nwType;
-		if (add_bss->rmfEnabled)
-			wma_set_peer_pmf_status(wma, add_bss->bssId, true);
-		if (add_bss->nonRoamReassoc) {
-			peer = cdp_peer_find_by_addr(soc,
-					pdev, add_bss->bssId,
-					&peer_id);
-			if (peer) {
-				add_bss->staContext.staIdx =
-					cdp_peer_get_local_peer_id(soc, peer);
-				goto send_bss_resp;
-			}
-		}
-		if (add_bss->reassocReq) {
-#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
-			struct cdp_vdev *vdev;
-#endif
-			/* Called in preassoc state. BSSID peer is already
-			 * added by set_linkstate
-			 */
-			peer = cdp_peer_find_by_addr(soc,
-					pdev,
-					add_bss->bssId,
-					&peer_id);
-			if (!peer) {
-				WMA_LOGE("%s Failed to find peer %pM", __func__,
-					 add_bss->bssId);
-				goto send_fail_resp;
-			}
-			if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
-				add_bss->staContext.staIdx =
-					cdp_peer_get_local_peer_id(soc, peer);
-				WMA_LOGD("LFR3:%s: bssid %pM staIdx %d",
-					__func__, add_bss->bssId,
-					add_bss->staContext.staIdx);
-				return;
-			}
+	req.chan_freq_seg0 = add_bss->chan_freq_seg0;
+	req.chan_freq_seg1 = add_bss->chan_freq_seg1;
+	req.max_txpow = add_bss->maxTxPower;
+	req.beacon_intval = add_bss->beaconInterval;
+	req.dtim_period = add_bss->dtimPeriod;
+	req.hidden_ssid = add_bss->bHiddenSSIDEn;
+	req.is_dfs = add_bss->bSpectrumMgtEnabled;
+	req.ssid.length = add_bss->ssId.length;
+	req.oper_mode = BSS_OPERATIONAL_MODE_STA;
+	if (req.ssid.length > 0)
+		qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
+			     add_bss->ssId.length);
 
-			vdev_obj = iface->vdev;
-			if (!vdev_obj) {
-				wma_err("vdev not found for id: %d", vdev_id);
-				goto send_fail_resp;
-			}
-			mlme_set_bss_params(vdev_obj, add_bss);
-
-			add_bss->staContext.staIdx =
-				cdp_peer_get_local_peer_id(soc, peer);
-
-			qdf_mem_zero(&req, sizeof(req));
-			req.vdev_id = vdev_id;
-			req.op_chan_freq = add_bss->op_chan_freq;
-			req.chan_width = add_bss->ch_width;
-
-			if (add_bss->ch_width == CH_WIDTH_10MHZ)
-				req.is_half_rate = 1;
-			else if (add_bss->ch_width == CH_WIDTH_5MHZ)
-				req.is_quarter_rate = 1;
-
-			req.chan_freq_seg0 = add_bss->chan_freq_seg0;
-			req.chan_freq_seg1 = add_bss->chan_freq_seg1;
-			req.max_txpow = add_bss->maxTxPower;
-			req.beacon_intval = add_bss->beaconInterval;
-			req.dtim_period = add_bss->dtimPeriod;
-			req.hidden_ssid = add_bss->bHiddenSSIDEn;
-			req.is_dfs = add_bss->bSpectrumMgtEnabled;
-			req.ssid.length = add_bss->ssId.length;
-			req.oper_mode = BSS_OPERATIONAL_MODE_STA;
-			if (req.ssid.length > 0)
-				qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
-					     add_bss->ssId.length);
-
-			if (add_bss->nss == 2) {
-				req.preferred_rx_streams = 2;
-				req.preferred_tx_streams = 2;
-			} else {
-				req.preferred_rx_streams = 1;
-				req.preferred_tx_streams = 1;
-			}
+	if (add_bss->nss == 2) {
+		req.preferred_rx_streams = 2;
+		req.preferred_tx_streams = 2;
+	} else {
+		req.preferred_rx_streams = 1;
+		req.preferred_tx_streams = 1;
+	}
 
-			status = wma_vdev_start(wma, &req, false);
-			if (status != QDF_STATUS_SUCCESS) {
-				wma_err("failed, status: %d", status);
-				mlme_clear_bss_params(vdev_obj);
-				goto peer_cleanup;
-			}
+	status = wma_vdev_start(wma, &req, false);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		wma_err("failed, status: %d", status);
+		mlme_clear_bss_params(vdev_obj);
+		goto peer_cleanup;
+	}
 
-#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
-			vdev = wma_find_vdev_by_id(wma, vdev_id);
-			if (!vdev) {
-				WMA_LOGE("%s Invalid txrx vdev", __func__);
-				goto peer_cleanup;
-			}
-			cdp_fc_vdev_pause(soc, vdev,
-				   OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
-#endif
-			/* ADD_BSS_RESP will be deferred to completion of
-			 * VDEV_START
-			 */
-			return;
-		}
-		if (!add_bss->updateBss)
-			goto send_bss_resp;
-		/* Update peer state */
-		if (add_bss->staContext.encryptType == eSIR_ED_NONE) {
-			WMA_LOGD("%s: Update peer(%pM) state into auth",
-				 __func__, add_bss->bssId);
-			cdp_peer_state_update(soc, pdev, add_bss->bssId,
-						  OL_TXRX_PEER_STATE_AUTH);
-		} else {
-#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
-			struct cdp_vdev *vdev;
-#endif
-			WMA_LOGD("%s: Update peer(%pM) state into conn",
-				 __func__, add_bss->bssId);
-			cdp_peer_state_update(soc, pdev, add_bss->bssId,
-						  OL_TXRX_PEER_STATE_CONN);
-#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
-			peer = cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
-					&peer_id);
-			if (!peer) {
-				WMA_LOGE("%s:%d Failed to find peer %pM",
-					 __func__, __LINE__, add_bss->bssId);
-				goto send_fail_resp;
-			}
+	status = wma_set_cdp_vdev_pause_reason(wma, vdev_id);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mlme_clear_bss_params(vdev_obj);
+		goto peer_cleanup;
+	}
 
-			vdev = wma_find_vdev_by_id(wma, vdev_id);
-			if (!vdev) {
-				WMA_LOGE("%s Invalid txrx vdev", __func__);
-				goto peer_cleanup;
-			}
-			cdp_fc_vdev_pause(soc, vdev,
-					OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
+	/* ADD_BSS_RESP will be deferred to completion of VDEV_START */
+	return QDF_STATUS_SUCCESS;
+
+peer_cleanup:
+	if (peer)
+		wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
+
+send_fail_resp:
+	add_bss->status = QDF_STATUS_E_FAILURE;
+	lim_handle_mlm_add_bss_rsp(wma->mac_context, add_bss);
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
-		}
 
-		wmi_unified_send_txbf(wma, &add_bss->staContext);
+QDF_STATUS wma_send_peer_assoc_req(struct bss_params *add_bss)
+{
+	struct cdp_pdev *pdev;
+	struct wma_target_req *msg;
+	tp_wma_handle wma;
+	uint8_t vdev_id, peer_id;
+	void *peer = NULL;
+	QDF_STATUS status;
+	struct wma_txrx_node *iface;
+	int pps_val = 0;
+	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
+	bool peer_assoc_sent = false;
+	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
-		pps_val = ((mac->mlme_cfg->sta.enable_5g_ebt << 31) &
-			   0xffff0000) | (PKT_PWR_SAVE_5G_EBT & 0xffff);
-		status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
-						WMI_VDEV_PARAM_PACKET_POWERSAVE,
-						pps_val);
-		if (QDF_IS_STATUS_ERROR(status))
-			WMA_LOGE("Failed to send wmi packet power save cmd");
-		else
-			WMA_LOGD("Sent PKT_PWR_SAVE_5G_EBT cmd to target, val = %x, status = %d",
-				pps_val, status);
+	wma = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma) {
+		WMA_LOGE("Invalid pdev or wma");
+		return QDF_STATUS_E_INVAL;
+	}
 
-		add_bss->staContext.no_ptk_4_way = add_bss->no_ptk_4_way;
+	vdev_id = add_bss->staContext.smesessionId;
+	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	if (!pdev) {
+		WMA_LOGE("%s Failed to get pdev", __func__);
+		add_bss->status = QDF_STATUS_E_FAILURE;
+		goto send_resp;
+	}
 
-		status = wma_send_peer_assoc(wma, add_bss->nwType,
-					     &add_bss->staContext);
+	iface = &wma->interfaces[vdev_id];
+	status = wma_update_iface_params(wma, add_bss);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		add_bss->status = QDF_STATUS_E_FAILURE;
+		goto send_resp;
+	}
+	peer = wma_cdp_find_peer_by_addr(add_bss->bssId, &peer_id);
+	if (add_bss->nonRoamReassoc && peer) {
+		add_bss->staContext.staIdx = peer_id;
+		goto send_bss_resp;
+	}
+	if (!add_bss->updateBss)
+		goto send_bss_resp;
+
+	if (!peer) {
+		WMA_LOGE("%s: %d Failed to find peer %pM",
+			 __func__, __LINE__, add_bss->bssId);
+		add_bss->status = QDF_STATUS_E_FAILURE;
+		goto send_resp;
+	}
+
+
+	if (add_bss->staContext.encryptType == eSIR_ED_NONE) {
+		WMA_LOGD("%s: Update peer(%pM) state into auth",
+			 __func__, add_bss->bssId);
+		cdp_peer_state_update(soc, pdev, add_bss->bssId,
+				      OL_TXRX_PEER_STATE_AUTH);
+	} else {
+		WMA_LOGD("%s: Update peer(%pM) state into conn",
+			 __func__, add_bss->bssId);
+		cdp_peer_state_update(soc, pdev, add_bss->bssId,
+				      OL_TXRX_PEER_STATE_CONN);
+		status = wma_set_cdp_vdev_pause_reason(wma, vdev_id);
 		if (QDF_IS_STATUS_ERROR(status)) {
-			WMA_LOGE("Failed to send peer assoc status:%d", status);
+			add_bss->status = QDF_STATUS_E_FAILURE;
 			goto peer_cleanup;
 		}
-		peer_assoc_sent = true;
+	}
 
-		/* we just had peer assoc, so install key will be done later */
-		if (add_bss->staContext.encryptType != eSIR_ED_NONE)
-			iface->is_waiting_for_key = true;
+	wmi_unified_send_txbf(wma, &add_bss->staContext);
 
-		if (add_bss->rmfEnabled)
-			wma_set_mgmt_frame_protection(wma);
+	pps_val = ((mac->mlme_cfg->sta.enable_5g_ebt << 31) &
+		 0xffff0000) | (PKT_PWR_SAVE_5G_EBT & 0xffff);
+	status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
+				    WMI_VDEV_PARAM_PACKET_POWERSAVE,
+				    pps_val);
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("Failed to send wmi packet power save cmd");
+	else
+		WMA_LOGD("Sent PKT_PWR_SAVE_5G_EBT cmd to target, val = %x, status = %d",
+			 pps_val, status);
 
-		wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId,
-					add_bss->beaconInterval,
-					add_bss->dtimPeriod,
-					add_bss->shortSlotTimeSupported,
-					add_bss->llbCoexist,
-					add_bss->maxTxPower);
-
-		/*
-		 * Store the bssid in interface table, bssid will
-		 * be used during group key setting sta mode.
-		 */
-		qdf_mem_copy(iface->bssid, add_bss->bssId, QDF_MAC_ADDR_SIZE);
+	add_bss->staContext.no_ptk_4_way = add_bss->no_ptk_4_way;
 
+	status = wma_send_peer_assoc(wma, add_bss->nwType,
+				     &add_bss->staContext);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		WMA_LOGE("Failed to send peer assoc status:%d", status);
+		add_bss->status = QDF_STATUS_E_FAILURE;
+		goto peer_cleanup;
 	}
-send_bss_resp:
+	peer_assoc_sent = true;
 
-	wma_vdev_set_he_config(wma, vdev_id, add_bss);
-	if (!cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
-					&add_bss->staContext.staIdx))
-		add_bss->status = QDF_STATUS_E_FAILURE;
-	else
-		add_bss->status = QDF_STATUS_SUCCESS;
-	add_bss->bss_idx = add_bss->staContext.smesessionId;
-	qdf_mem_copy(add_bss->staContext.staMac, add_bss->bssId,
-		     sizeof(add_bss->staContext.staMac));
+	/* we just had peer assoc, so install key will be done later */
+	if (add_bss->staContext.encryptType != eSIR_ED_NONE)
+		iface->is_waiting_for_key = true;
+
+	if (add_bss->rmfEnabled)
+		wma_set_mgmt_frame_protection(wma);
+
+	wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId,
+				add_bss->beaconInterval,
+				add_bss->dtimPeriod,
+				add_bss->shortSlotTimeSupported,
+				add_bss->llbCoexist,
+				add_bss->maxTxPower);
+
+	/*
+	 * Store the bssid in interface table, bssid will
+	 * be used during group key setting sta mode.
+	 */
+	qdf_mem_copy(iface->bssid, add_bss->bssId, QDF_MAC_ADDR_SIZE);
+
+send_bss_resp:
+	add_bss->status = wma_save_bss_params(wma, add_bss);
 
 	if (!wmi_service_enabled(wma->wmi_handle,
-				    wmi_service_peer_assoc_conf)) {
+				 wmi_service_peer_assoc_conf)) {
 		WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
-		goto send_final_rsp;
+		goto send_resp;
 	}
 
 	/* In case of reassoc, peer assoc cmd will not be sent */
 	if (!peer_assoc_sent)
-		goto send_final_rsp;
+		goto send_resp;
 
 	msg = wma_fill_hold_req(wma, vdev_id, WMA_ADD_BSS_REQ,
-			   WMA_PEER_ASSOC_CNF_START, add_bss,
-			   WMA_PEER_ASSOC_TIMEOUT);
+				WMA_PEER_ASSOC_CNF_START, add_bss,
+				WMA_PEER_ASSOC_TIMEOUT);
 	if (!msg) {
 		WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
 			 vdev_id);
 		wma_remove_req(wma, vdev_id, WMA_PEER_ASSOC_CNF_START);
 		goto peer_cleanup;
 	}
-	return;
-
-send_final_rsp:
-	WMA_LOGD("%s: opermode %d update_bss %d nw_type %d bssid %pM staIdx %d status %d",
-		 __func__, add_bss->operMode,
-		 add_bss->updateBss, add_bss->nwType, add_bss->bssId,
-		 add_bss->staContext.staIdx, add_bss->status);
-	wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
-	return;
+	return QDF_STATUS_SUCCESS;
 
 peer_cleanup:
 	if (peer)
-		wma_remove_peer(wma, add_bss->bssId, vdev_id, peer,
-				roam_synch_in_progress);
-send_fail_resp:
-	add_bss->status = QDF_STATUS_E_FAILURE;
-	if (!wma_is_roam_synch_in_progress(wma, vdev_id))
-		wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
-					   (void *)add_bss, 0);
+		wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
+send_resp:
+	lim_handle_mlm_add_bss_rsp(wma->mac_context, add_bss);
+
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -4113,7 +4198,6 @@ void wma_add_bss(tp_wma_handle wma, struct bss_params *params)
 		break;
 
 	default:
-		wma_add_bss_sta_mode(wma, params);
 		break;
 	}
 }

+ 0 - 6
core/wma/src/wma_main.c

@@ -1665,9 +1665,6 @@ static void wma_discard_fw_event(struct scheduler_msg *msg)
 		qdf_nbuf_free(((wma_process_fw_event_params *)msg->bodyptr)
 				->evt_buf);
 		break;
-	case WMA_SET_LINK_STATE:
-		qdf_mem_free(((tpLinkStateParams) msg->bodyptr)->callbackArg);
-		break;
 	}
 
 	qdf_mem_free(msg->bodyptr);
@@ -8446,9 +8443,6 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
 					(tSirUpdateChanList *) msg->bodyptr);
 		qdf_mem_free(msg->bodyptr);
 		break;
-	case WMA_SET_LINK_STATE:
-		wma_set_linkstate(wma_handle, (tpLinkStateParams) msg->bodyptr);
-		break;
 	case WMA_CHNL_SWITCH_REQ:
 		wma_set_channel(wma_handle,
 				(tpSwitchChannelParams) msg->bodyptr);

+ 1 - 1
core/wma/src/wma_scan_roam.c

@@ -2687,7 +2687,7 @@ wma_roam_update_vdev(tp_wma_handle wma,
 	/* Update new peer's uc cipher */
 	wma_update_roamed_peer_unicast_cipher(wma, uc_cipher, cipher_cap,
 					      roam_synch_ind_ptr->bssid.bytes);
-	wma_add_bss(wma, (struct bss_params *)roam_synch_ind_ptr->add_bss_params);
+	wma_add_bss_lfr3(wma, roam_synch_ind_ptr->add_bss_params);
 	wma_add_sta(wma, add_sta_params);
 	qdf_mem_copy(wma->interfaces[vdev_id].bssid,
 			roam_synch_ind_ptr->bssid.bytes, QDF_MAC_ADDR_SIZE);