Browse Source

qcacld-3.0: Add VDEV state machine for STA disconnection

Add support for VDEV state machine support
for STA disconnection

Change-Id: Iee7274fbc8ae985d034a29f920faa38aab68ccc7
CRs-Fixed: 2322539
Sandeep Puligilla 6 years ago
parent
commit
30bb8407cd

+ 9 - 0
components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h

@@ -115,5 +115,14 @@ mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val);
  */
 bool mlme_get_vdev_start_failed(struct wlan_objmgr_vdev *vdev);
 
+/**
+ * mlme_is_vdev_in_beaconning_mode() - check if vdev is beaconing mode
+ * @vdev_opmode: vdev opmode
+ *
+ * To check if vdev is operating in beaconing mode or not.
+ *
+ * Return: true or false
+ */
+bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode);
 #endif
 #endif

+ 44 - 84
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c

@@ -22,19 +22,12 @@
 #include "wlan_mlme_vdev_mgr_interface.h"
 #include "lim_utils.h"
 #include "wma_api.h"
+#include "lim_types.h"
 
 static struct vdev_mlme_ops sta_mlme_ops;
 static struct vdev_mlme_ops ap_mlme_ops;
 
-/**
- * mlme_is_vdev_in_beaconning_mode() - check if vdev is beaconing mode
- * @vdev_opmode: vdev opmode
- *
- * This function is called to register vdev manager operations
- *
- * Return: QDF_STATUS
- */
-static inline bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode)
+bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode)
 {
 	switch (vdev_opmode) {
 	case QDF_SAP_MODE:
@@ -101,6 +94,22 @@ static QDF_STATUS sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
 					    event_data);
 }
 
+/**
+ * sta_mlme_start_continue() - vdev start rsp calback
+ * @vdev_mlme: vdev mlme object
+ * @data_len: event data length
+ * @data: event data
+ *
+ * This function is called to handle the VDEV START/RESTART calback
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS sta_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
+					  uint16_t data_len, void *data)
+{
+	return wma_sta_mlme_vdev_start_continue(vdev_mlme, data_len, data);
+}
+
 /**
  * sta_mlme_vdev_restart_send() - MLME vdev restart send
  * @vdev_mlme: vdev mlme object
@@ -184,7 +193,8 @@ static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
 					       uint16_t event_data_len,
 					       void *event_data)
 {
-	return QDF_STATUS_SUCCESS;
+	return lim_sta_mlme_vdev_disconnect_bss(vdev_mlme, event_data_len,
+						event_data);
 }
 
 /**
@@ -198,14 +208,14 @@ static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
  * Return: QDF_STATUS
  */
 static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
-					  uint16_t event_data_len,
-					  void *event_data)
+					  uint16_t data_len,
+					  void *data)
 {
-	return QDF_STATUS_SUCCESS;
+	return lim_sta_mlme_vdev_stop_send(vdev_mlme, data_len, data);
 }
 
 /**
- * sta_mlme_vdev_stop_continue() - MLME vdev stop send callback
+ * vdevmgr_mlme_stop_continue() - MLME vdev stop send callback
  * @vdev_mlme: vdev mlme object
  * @event_data_len: event data length
  * @event_data: event data
@@ -215,48 +225,14 @@ static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS sta_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
-					      uint16_t event_data_len,
-					      void *event_data)
+static QDF_STATUS vdevmgr_mlme_stop_continue(struct vdev_mlme_obj *vdev_mlme,
+					     uint16_t data_len,
+					     void *data)
 {
-	return QDF_STATUS_SUCCESS;
+	return wma_mlme_vdev_stop_continue(vdev_mlme, data_len, data);
 }
 
 /**
- * sta_mlme_vdev_down_send() - MLME vdev down send callback
- * @vdev_mlme: vdev mlme object
- * @event_data_len: event data length
- * @event_data: event data
- *
- * This function is to send the vdev down to firmware
- *
- * Return: QDF_STATUS
- */
-static QDF_STATUS sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
-					  uint16_t event_data_len,
-					  void *event_data)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * sta_vdev_notify_down_complete() - MLME vdev down complete callback
- * @vdev_mlme: vdev mlme object
- * @event_data_len: event data length
- * @event_data: event data
- *
- * This function is called on moving vdev state to down.
- *
- * Return: QDF_STATUS
- */
-static QDF_STATUS sta_vdev_notify_down_complete(struct vdev_mlme_obj *vdev_mlme,
-						 uint16_t event_data_len,
-						 void *event_data)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
- /**
  * ap_mlme_vdev_start_send () - send vdev start req
  * @vdev_mlme: vdev mlme object
  * @data_len: event data length
@@ -273,7 +249,7 @@ static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
 }
 
 /**
- * mlme_start_continue () - vdev start rsp calback
+ * ap_start_continue () - vdev start rsp calback
  * @vdev_mlme: vdev mlme object
  * @data_len: event data length
  * @data: event data
@@ -282,10 +258,10 @@ static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS vdevmgr_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
-				      uint16_t data_len, void *data)
+static QDF_STATUS ap_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
+					 uint16_t data_len, void *data)
 {
-	return wma_mlme_vdev_start_continue(vdev_mlme, data_len, data);
+	return wma_ap_mlme_vdev_start_continue(vdev_mlme, data_len, data);
 }
 
 /**
@@ -378,22 +354,6 @@ static QDF_STATUS ap_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
 	return lim_ap_mlme_vdev_stop_send(vdev_mlme, data_len, data);
 }
 
-/**
- * ap_mlme_vdev_stop_continue() - callback to handle stop vdev resp
- * @vdev_mlme: vdev mlme object
- * @data_len: event data length
- * @data: event data
- *
- * This function is called to handle stop vdev resp
- *
- * Return: QDF_STATUS
- */
-static QDF_STATUS ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
-					     uint16_t data_len, void *data)
-{
-	return wma_ap_mlme_vdev_stop_continue(vdev_mlme, data_len, data);
-}
-
 /**
  * ap_mlme_vdev_down_send() - callback to send vdev down req
  * @vdev_mlme: vdev mlme object
@@ -404,13 +364,13 @@ static QDF_STATUS ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS ap_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
-					 uint16_t data_len, void *data)
+static QDF_STATUS vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
+					      uint16_t data_len, void *data)
 {
 	return wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data);
 }
 /**
- * ap_vdev_notify_down_complete() - callback to indicate vdev down is completed
+ * vdevmgr_notify_down_complete() - callback to indicate vdev down is completed
  * @vdev_mlme: vdev mlme object
  * @data_len: event data length
  * @data: event data
@@ -419,7 +379,7 @@ static QDF_STATUS ap_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS ap_vdev_notify_down_complete(struct vdev_mlme_obj *vdev_mlme,
+static QDF_STATUS vdevmgr_notify_down_complete(struct vdev_mlme_obj *vdev_mlme,
 					       uint16_t data_len, void *data)
 {
 	return wma_ap_mlme_vdev_notify_down_complete(vdev_mlme, data_len, data);
@@ -672,15 +632,15 @@ static QDF_STATUS ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj *vdev_mlme,
 static struct vdev_mlme_ops sta_mlme_ops = {
 	.mlme_vdev_start_send = sta_mlme_vdev_start_send,
 	.mlme_vdev_restart_send = sta_mlme_vdev_restart_send,
-	.mlme_vdev_start_continue = vdevmgr_mlme_start_continue,
+	.mlme_vdev_start_continue = sta_mlme_start_continue,
 	.mlme_vdev_sta_conn_start = sta_mlme_vdev_start_connection,
 	.mlme_vdev_up_send = sta_mlme_vdev_up_send,
 	.mlme_vdev_notify_up_complete = sta_mlme_vdev_notify_up_complete,
 	.mlme_vdev_disconnect_peers = sta_mlme_vdev_disconnect_bss,
 	.mlme_vdev_stop_send = sta_mlme_vdev_stop_send,
-	.mlme_vdev_stop_continue = sta_mlme_vdev_stop_continue,
-	.mlme_vdev_down_send = sta_mlme_vdev_down_send,
-	.mlme_vdev_notify_down_complete = sta_vdev_notify_down_complete,
+	.mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue,
+	.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
+	.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
 	.mlme_vdev_legacy_hdl_create = mlme_legacy_hdl_create,
 	.mlme_vdev_legacy_hdl_destroy = mlme_legacy_hdl_destroy,
 };
@@ -721,7 +681,7 @@ static struct vdev_mlme_ops ap_mlme_ops = {
 	.mlme_vdev_start_send = ap_mlme_vdev_start_send,
 	.mlme_vdev_restart_send = ap_mlme_vdev_restart_send,
 	.mlme_vdev_stop_start_send = ap_mlme_vdev_stop_start_send,
-	.mlme_vdev_start_continue = vdevmgr_mlme_start_continue,
+	.mlme_vdev_start_continue = ap_mlme_start_continue,
 	.mlme_vdev_start_req_failed = ap_mlme_vdev_start_req_failed,
 	.mlme_vdev_up_send = ap_mlme_vdev_up_send,
 	.mlme_vdev_notify_up_complete = ap_mlme_vdev_notify_up_complete,
@@ -729,9 +689,9 @@ static struct vdev_mlme_ops ap_mlme_ops = {
 	.mlme_vdev_disconnect_peers = ap_mlme_vdev_disconnect_peers,
 	.mlme_vdev_dfs_cac_timer_stop = ap_vdev_dfs_cac_timer_stop,
 	.mlme_vdev_stop_send = ap_mlme_vdev_stop_send,
-	.mlme_vdev_stop_continue = ap_mlme_vdev_stop_continue,
-	.mlme_vdev_down_send = ap_mlme_vdev_down_send,
-	.mlme_vdev_notify_down_complete = ap_vdev_notify_down_complete,
+	.mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue,
+	.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
+	.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
 	.mlme_vdev_legacy_hdl_create = mlme_legacy_hdl_create,
 	.mlme_vdev_legacy_hdl_destroy = mlme_legacy_hdl_destroy,
 };

+ 1 - 6
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -44,7 +44,6 @@
 static void lim_process_mlm_auth_req(tpAniSirGlobal, uint32_t *);
 static void lim_process_mlm_assoc_req(tpAniSirGlobal, uint32_t *);
 static void lim_process_mlm_disassoc_req(tpAniSirGlobal, uint32_t *);
-static void lim_process_mlm_deauth_req(tpAniSirGlobal, uint32_t *);
 static void lim_process_mlm_set_keys_req(tpAniSirGlobal, uint32_t *);
 
 /* MLM Timeout event handler templates */
@@ -128,9 +127,6 @@ void lim_process_mlm_req_messages(tpAniSirGlobal mac_ctx,
 	case LIM_MLM_DISASSOC_REQ:
 		lim_process_mlm_disassoc_req(mac_ctx, msg->bodyptr);
 		break;
-	case LIM_MLM_DEAUTH_REQ:
-		lim_process_mlm_deauth_req(mac_ctx, msg->bodyptr);
-		break;
 	case LIM_MLM_SETKEYS_REQ:
 		lim_process_mlm_set_keys_req(mac_ctx, msg->bodyptr);
 		break;
@@ -1991,8 +1987,7 @@ void lim_process_deauth_ack_timeout(tpAniSirGlobal mac_ctx)
  *
  * @Return: None
  */
-static void
-lim_process_mlm_deauth_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
+void lim_process_mlm_deauth_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
 {
 	tLimMlmDeauthReq *mlm_deauth_req;
 	tpPESession session;

+ 16 - 0
core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c

@@ -1895,6 +1895,9 @@ void lim_process_sta_mlm_del_sta_rsp(tpAniSirGlobal pMac,
 	tSirResultCodes statusCode = eSIR_SME_SUCCESS;
 	tpDeleteStaParams pDelStaParams = (tpDeleteStaParams) limMsgQ->bodyptr;
 	tpDphHashNode pStaDs = NULL;
+#ifdef CONFIG_VDEV_SM
+	QDF_STATUS status;
+#endif
 
 	if (NULL == pDelStaParams) {
 		pe_err("Encountered NULL Pointer");
@@ -1938,9 +1941,22 @@ void lim_process_sta_mlm_del_sta_rsp(tpAniSirGlobal pMac,
 		qdf_mem_free(pDelStaParams);
 		limMsgQ->bodyptr = NULL;
 	}
+#ifdef CONFIG_VDEV_SM
+	status =
+	    wlan_vdev_mlme_sm_deliver_evt(psessionEntry->vdev,
+					  WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE,
+					  sizeof(*psessionEntry),
+					  psessionEntry);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		pe_err("failed to post WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE for vdevid %d",
+		       psessionEntry->smeSessionId);
+	}
+#else
 	/* Proceed to do DelBSS even if DelSta resulted in failure */
 	statusCode = (tSirResultCodes)lim_del_bss(pMac, pStaDs, 0,
 			psessionEntry);
+#endif
+
 	return;
 end:
 	if (0 != limMsgQ->bodyptr) {

+ 149 - 10
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -49,10 +49,7 @@
 #include "sir_mac_prot_def.h"
 #include "rrm_api.h"
 #include "nan_datapath.h"
-
 #include "sap_api.h"
-
-
 #include <lim_ft.h>
 #include "cds_regdomain.h"
 #include "lim_process_fils.h"
@@ -2294,7 +2291,7 @@ sendDisassoc:
    \return none
    \sa
    ----------------------------------------------------------------- */
-static void __lim_process_sme_disassoc_cnf(tpAniSirGlobal pMac, uint32_t *pMsgBuf)
+void __lim_process_sme_disassoc_cnf(tpAniSirGlobal pMac, uint32_t *pMsgBuf)
 {
 	tSirSmeDisassocCnf smeDisassocCnf;
 	uint16_t aid;
@@ -2627,9 +2624,8 @@ static void __lim_process_sme_deauth_req(tpAniSirGlobal mac_ctx,
 
 	/* Update PE session Id */
 	mlm_deauth_req->sessionId = session_id;
+	lim_process_mlm_deauth_req(mac_ctx, (uint32_t *)mlm_deauth_req);
 
-	lim_post_mlm_message(mac_ctx, LIM_MLM_DEAUTH_REQ,
-			(uint32_t *)mlm_deauth_req);
 	return;
 
 send_deauth:
@@ -2971,6 +2967,27 @@ void lim_delete_all_peers(tpPESession session)
 
 }
 
+QDF_STATUS lim_sta_send_del_bss(tpPESession session)
+{
+	tpAniSirGlobal mac_ctx = session->mac_ctx;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+	tpDphHashNode sta_ds = NULL;
+
+	sta_ds = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
+				    &session->dph.dphHashTable);
+	if (!sta_ds) {
+		pe_err("DPH Entry for STA is missing, failed to send delbss");
+		goto end;
+	}
+
+	status = lim_del_bss(mac_ctx, sta_ds, 0, session);
+	if (QDF_IS_STATUS_ERROR(status))
+		pe_err("delBss failed for bss %d", session->bssIdx);
+
+end:
+	return status;
+}
+
 QDF_STATUS lim_send_vdev_stop(tpPESession session)
 {
 	tpAniSirGlobal mac_ctx = session->mac_ctx;
@@ -3024,7 +3041,6 @@ static void lim_delete_peers_and_send_vdev_stop(tpPESession session)
 }
 #endif
 
-
 static void
 __lim_handle_sme_stop_bss_request(tpAniSirGlobal pMac, uint32_t *pMsgBuf)
 {
@@ -4683,6 +4699,129 @@ static void lim_process_sme_update_access_policy_vendor_ie(
 	pe_session_entry->access_policy = update_vendor_ie->access_policy;
 }
 
+#ifdef CONFIG_VDEV_SM
+QDF_STATUS lim_sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
+					    uint16_t data_len, void *data)
+{
+	tpAniSirGlobal mac_ctx;
+	struct scheduler_msg *msg = (struct scheduler_msg *)data;
+
+	mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
+	if (!mac_ctx) {
+		pe_err("mac_ctx is NULL");
+		if (data)
+			qdf_mem_free(data);
+		return QDF_STATUS_E_INVAL;
+	}
+	pe_debug("VDEV Manager disconnect bss callback type:(%d)", msg->type);
+
+	switch (msg->type) {
+	case eWNI_SME_DEAUTH_REQ:
+		__lim_process_sme_deauth_req(mac_ctx,
+					     (uint32_t *)msg->bodyptr);
+		break;
+	case eWNI_SME_DISASSOC_CNF:
+	case eWNI_SME_DEAUTH_CNF:
+		__lim_process_sme_disassoc_cnf(mac_ctx,
+					       (uint32_t *)msg->bodyptr);
+		break;
+	case eWNI_SME_DISASSOC_REQ:
+		__lim_process_sme_disassoc_req(mac_ctx,
+					       (uint32_t *)msg->bodyptr);
+		break;
+	default:
+		pe_debug("Wrong message type received %d", msg->type);
+	}
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
+static void lim_process_sme_disassoc_cnf(tpAniSirGlobal mac_ctx,
+					 struct scheduler_msg *msg)
+{
+#ifdef CONFIG_VDEV_SM
+	tSirSmeDisassocCnf sme_disassoc_cnf;
+	tpPESession session;
+	uint8_t session_id;
+	QDF_STATUS status;
+
+	qdf_mem_copy(&sme_disassoc_cnf, msg->bodyptr,
+		     sizeof(struct sSirSmeDisassocCnf));
+
+	session = pe_find_session_by_bssid(mac_ctx,
+					   sme_disassoc_cnf.bssid.bytes,
+					   &session_id);
+
+	if (LIM_IS_STA_ROLE(session)) {
+		status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
+						       WLAN_VDEV_SM_EV_DOWN,
+						       sizeof(*msg),
+						       msg);
+	} else {
+		__lim_process_sme_disassoc_cnf(mac_ctx,
+					       (uint32_t *)msg->bodyptr);
+	}
+#else
+	__lim_process_sme_disassoc_cnf(mac_ctx, (uint32_t *)msg->bodyptr);
+#endif
+}
+
+static void lim_process_sme_disassoc_req(tpAniSirGlobal mac_ctx,
+					 struct scheduler_msg *msg)
+{
+#ifdef CONFIG_VDEV_SM
+	tSirSmeDisassocReq disassoc_req;
+	tpPESession session;
+	uint8_t session_id;
+	QDF_STATUS status;
+
+	qdf_mem_copy(&disassoc_req, msg->bodyptr, sizeof(tSirSmeDisassocReq));
+
+	session = pe_find_session_by_bssid(mac_ctx,
+					   disassoc_req.bssid.bytes,
+					   &session_id);
+	if (LIM_IS_STA_ROLE(session)) {
+		status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
+						       WLAN_VDEV_SM_EV_DOWN,
+						       sizeof(*msg),
+						       msg);
+	} else {
+		__lim_process_sme_disassoc_req(mac_ctx,
+					       (uint32_t *)msg->bodyptr);
+	}
+#else
+	__lim_process_sme_disassoc_req(mac_ctx, (uint32_t *)msg->bodyptr);
+#endif
+}
+
+static void lim_process_sme_deauth_req(tpAniSirGlobal mac_ctx,
+				       struct scheduler_msg *msg)
+{
+#ifdef CONFIG_VDEV_SM
+	tSirSmeDeauthReq sme_deauth_req;
+	tpPESession session;
+	uint8_t session_id;
+	QDF_STATUS status;
+
+	qdf_mem_copy(&sme_deauth_req, msg->bodyptr, sizeof(tSirSmeDeauthReq));
+
+	session = pe_find_session_by_bssid(mac_ctx,
+					   sme_deauth_req.bssid.bytes,
+					   &session_id);
+	if (LIM_IS_STA_ROLE(session)) {
+		status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
+						       WLAN_VDEV_SM_EV_DOWN,
+						       sizeof(*msg),
+						       msg);
+	} else {
+		__lim_process_sme_deauth_req(mac_ctx,
+					     (uint32_t *)msg->bodyptr);
+	}
+#else
+	__lim_process_sme_deauth_req(mac_ctx, (uint32_t *)msg->bodyptr);
+#endif
+}
+
 /**
  * lim_process_sme_req_messages()
  *
@@ -4738,16 +4877,16 @@ bool lim_process_sme_req_messages(tpAniSirGlobal pMac,
 		break;
 
 	case eWNI_SME_DISASSOC_REQ:
-		__lim_process_sme_disassoc_req(pMac, pMsgBuf);
+		lim_process_sme_disassoc_req(pMac, pMsg);
 		break;
 
 	case eWNI_SME_DISASSOC_CNF:
 	case eWNI_SME_DEAUTH_CNF:
-		__lim_process_sme_disassoc_cnf(pMac, pMsgBuf);
+		lim_process_sme_disassoc_cnf(pMac, pMsg);
 		break;
 
 	case eWNI_SME_DEAUTH_REQ:
-		__lim_process_sme_deauth_req(pMac, pMsgBuf);
+		lim_process_sme_deauth_req(pMac, pMsg);
 		break;
 
 	case eWNI_SME_SEND_DISASSOC_FRAME:

+ 1 - 3
core/mac/src/pe/lim/lim_send_messages.c

@@ -258,9 +258,7 @@ QDF_STATUS lim_send_switch_chnl_params(tpAniSirGlobal pMac,
 		return QDF_STATUS_E_FAILURE;
 	}
 	pSessionEntry->ch_switch_in_progress = true;
-#ifdef CONFIG_VDEV_SM
-	mlme_set_chan_switch_in_progress(pSessionEntry->vdev, true);
-#endif
+
 	return QDF_STATUS_SUCCESS;
 }
 

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

@@ -1145,4 +1145,33 @@ void lim_process_mlm_start_req(tpAniSirGlobal mac_ctx,
  */
 void lim_process_mlm_join_req(tpAniSirGlobal mac_ctx,
 			      tLimMlmJoinReq *mlm_join_req);
+
+/*
+ * lim_process_mlm_deauth_req() - This function is called to process
+ * MLM_DEAUTH_REQ message from SME
+ *
+ * @mac_ctx:      Pointer to Global MAC structure
+ * @msg_buf:      A pointer to the MLM message buffer
+ *
+ * This function is called to process MLM_DEAUTH_REQ message from SME
+ *
+ * @Return: None
+ */
+void lim_process_mlm_deauth_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf);
+
+#ifdef CONFIG_VDEV_SM
+/**
+ * lim_sta_mlme_vdev_disconnect_bss() - Disconnect from BSS
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @data_len: data size
+ * @data: event data
+ *
+ * API invokes BSS disconnection
+ *
+ * Return: SUCCESS on successful completion of disconnection
+ *         FAILURE, if it fails due to any
+ */
+QDF_STATUS lim_sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
+					    uint16_t data_len, void *data);
+#endif
 #endif /* __LIM_TYPES_H */

+ 6 - 0
core/mac/src/pe/lim/lim_utils.c

@@ -8432,6 +8432,12 @@ QDF_STATUS lim_sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS lim_sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
+				       uint16_t data_len, void *data)
+{
+	return lim_sta_send_del_bss((tpPESession)data);
+}
+
 void lim_send_beacon(tpAniSirGlobal mac_ctx, tpPESession session)
 {
 	if (wlan_vdev_mlme_get_state(session->vdev) ==

+ 22 - 0
core/mac/src/pe/lim/lim_utils.h

@@ -1381,6 +1381,14 @@ void lim_delete_all_peers(tpPESession session);
  */
 QDF_STATUS lim_send_vdev_stop(tpPESession session);
 
+/**
+ * lim_send_vdev_stop() -send delete bss/stop vdev req for STA
+ * @session: session pointer
+ *
+ * Return QDF_STATUS
+ */
+QDF_STATUS lim_sta_send_del_bss(tpPESession session);
+
 /**
  * lim_send_start_bss_confirm() -send start bss confirm req
  * @mac_ctx: pointer to global mac structure
@@ -1497,6 +1505,20 @@ void lim_rx_invalid_peer_process(tpAniSirGlobal mac_ctx,
 void lim_send_beacon(tpAniSirGlobal mac_ctx, tpPESession session);
 
 #ifdef CONFIG_VDEV_SM
+/**
+ * lim_sta_mlme_vdev_stop_send() - send VDEV stop
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @data_len: data size
+ * @data: event data
+ *
+ * API invokes vdev stop
+ *
+ * Return: SUCCESS on successful completion of vdev stop
+ *         FAILURE, if it fails due to any
+ */
+QDF_STATUS lim_sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
+				       uint16_t data_len, void *data);
+
 /**
  * lim_ap_mlme_vdev_start_send() - Invokes VDEV start operation
  * @vdev_mlme_obj:  VDEV MLME comp object

+ 33 - 6
core/wma/inc/wma_api.h

@@ -433,6 +433,20 @@ bool wma_get_hidden_ssid_restart_in_progress(struct wma_txrx_node *iface);
 
 #ifdef CONFIG_VDEV_SM
 
+/**
+ * wma_sta_mlme_vdev_start_continue - VDEV start response handling
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @data_len: data size
+ * @data: event data
+ *
+ * API invokes VDEV start response actions
+ *
+ * Return: SUCCESS on successful completion of start response operation
+ *         FAILURE, if it fails due to any
+ */
+QDF_STATUS wma_sta_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
+					    uint16_t data_len, void *data);
+
 /**
  * wma_ap_mlme_vdev_start_continue - VDEV start response handling
  * @vdev_mlme_obj:  VDEV MLME comp object
@@ -444,7 +458,7 @@ bool wma_get_hidden_ssid_restart_in_progress(struct wma_txrx_node *iface);
  * Return: SUCCESS on successful completion of start response operation
  *         FAILURE, if it fails due to any
  */
-QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
+QDF_STATUS wma_ap_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
 					   uint16_t data_len, void *data);
 
 /**
@@ -459,10 +473,10 @@ QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
  *         FAILURE, if it fails due to any
  */
 QDF_STATUS wma_sta_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
-				 uint16_t data_len, void *data);
+				uint16_t data_len, void *data);
 
 /**
- * wma_ap_mlme_vdev_stop_continue - VDEV stop response handling
+ * wma_mlme_vdev_stop_continue - VDEV stop response handling
  * @vdev_mlme_obj:  VDEV MLME comp object
  * @data_len: data size
  * @data: event data
@@ -472,8 +486,8 @@ QDF_STATUS wma_sta_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
  * Return: SUCCESS on successful completion of stop response operation
  *         FAILURE, if it fails due to any
  */
-QDF_STATUS wma_ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
-					  uint16_t data_len, void *data);
+QDF_STATUS wma_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
+				       uint16_t data_len, void *data);
 
 /**
  * wma_ap_mlme_vdev_down_send - VDEV down operation
@@ -520,6 +534,19 @@ QDF_STATUS wma_ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme,
 					    enum vdev_cmd_type type,
 					    uint16_t data_len, void *data);
 
-#endif
+/**
+ * wma_sta_mlme_vdev_down_send - VDEV down operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @data_len: data size
+ * @data: event data
+ *
+ * API invokes VDEV down operation
+ *
+ * Return: SUCCESS on successful completion of VDEV down operation
+ *         FAILURE, if it fails due to any
+ */
+QDF_STATUS wma_sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
+				       uint16_t data_len, void *data);
 
 #endif
+#endif

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

@@ -1489,4 +1489,14 @@ int wma_roam_scan_stats_event_handler(void *handle, uint8_t *event,
  */
 void wma_send_vdev_down_bss(tp_wma_handle wma, struct wma_target_req *req);
 
+/**
+ * wma_sta_send_vdev_down_bss() - send vdev down to firmware
+ * @wma: wma handle.
+ * @req: vdev request
+ *
+ * This function sends vdev down to firmware
+ *
+ * Return: none
+ */
+void wma_sta_send_vdev_down_bss(tp_wma_handle wma, struct wma_target_req *req);
 #endif

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

@@ -5173,7 +5173,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
 	param.vdev_id = params->smesessionId;
 	param.assoc_id = params->assocId;
 #ifdef CONFIG_VDEV_SM
-	status = wlan_vdev_mlme_sm_deliver_evt(wma->interfaces[param.vdev_id].vdev,
+	status = wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
 					       WLAN_VDEV_SM_EV_START_SUCCESS,
 					       sizeof(param), (void *)&param);
 #else

+ 15 - 5
core/wma/src/wma_utils.c

@@ -4830,8 +4830,19 @@ static QDF_STATUS wma_vdev_send_start_resp(tp_wma_handle wma,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
-					uint16_t data_len, void *data)
+QDF_STATUS wma_sta_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
+					    uint16_t data_len, void *data)
+{
+	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
+
+	wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
+				   data, 0);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wma_ap_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
+					   uint16_t data_len, void *data)
 {
 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -4851,8 +4862,8 @@ QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme,
 	return status;
 }
 
-QDF_STATUS wma_ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
-					  uint16_t data_len, void *data)
+QDF_STATUS wma_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
+				       uint16_t data_len, void *data)
 {
 	return __wma_vdev_stop_resp_handler(
 			(wmi_vdev_stopped_event_fixed_param *)data);
@@ -4895,7 +4906,6 @@ QDF_STATUS wma_ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme,
 
 	return wma_vdev_send_start_resp(wma, bss_params);
 }
-
 #else
 bool wma_get_hidden_ssid_restart_in_progress(struct wma_txrx_node *iface)
 {