qcacld-3.0: Refactor vdev create code

Refactor vdev create code to target_if common code. Remove legacy
code for vdev create.

Change-Id: I57caf0c5fa2da7b6ba640a9d2edb72363959c585
CRs-Fixed: 2460786
diff --git a/components/target_if/p2p/src/target_if_p2p.c b/components/target_if/p2p/src/target_if_p2p.c
index dbce599..df39148 100644
--- a/components/target_if/p2p/src/target_if_p2p.c
+++ b/components/target_if/p2p/src/target_if_p2p.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019 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
@@ -361,7 +361,7 @@
 
 	target_if_debug("psoc:%pK, vdev_id:%d disable_noa:%d",
 				psoc, vdev_id, disable_noa);
-	param.if_id = vdev_id;
+	param.vdev_id = vdev_id;
 	param.param_id = WMI_VDEV_PARAM_DISABLE_NOA_P2P_GO;
 	param.param_value = (uint32_t)disable_noa;
 
diff --git a/components/target_if/pmo/src/target_if_pmo_suspend_resume.c b/components/target_if/pmo/src/target_if_pmo_suspend_resume.c
index fd61755..7ac48a9 100644
--- a/components/target_if/pmo/src/target_if_pmo_suspend_resume.c
+++ b/components/target_if/pmo/src/target_if_pmo_suspend_resume.c
@@ -74,7 +74,7 @@
 		return QDF_STATUS_E_INVAL;
 	}
 
-	param.if_id = vdev_id;
+	param.vdev_id = vdev_id;
 	param.param_id = param_id;
 	param.param_value = param_value;
 	target_if_debug("set vdev param vdev_id: %d value: %d for param_id: %d",
@@ -127,7 +127,7 @@
 	}
 
 	sta_ps_param.vdev_id = vdev_id;
-	sta_ps_param.param = param_id;
+	sta_ps_param.param_id = param_id;
 	sta_ps_param.value = param_value;
 	target_if_debug("set vdev param vdev_id: %d value: %d for param_id: %d",
 			vdev_id, param_value, param_id);
diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h
index a5022eb..cc51afa 100644
--- a/core/cds/inc/cds_api.h
+++ b/core/cds/inc/cds_api.h
@@ -329,8 +329,26 @@
 
 QDF_STATUS cds_set_context(QDF_MODULE_ID module_id, void *context);
 
-QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint32_t *type,
-			      uint32_t *subType);
+/**
+ * cds_get_vdev_types() - get vdev type and subtype from it's operation mode
+ * @mode: operation mode of vdev
+ * @type: type of vdev
+ * @sub_type: sub_type of vdev
+ *
+ * This API is called to get vdev type and subtype from it's operation mode.
+ * Vdev operation modes are defined in enum QDF_OPMODE.
+ *
+ * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA,
+ * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR,
+ * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI
+ *
+ * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE,
+ * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO,
+ * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type,
+			      uint8_t *sub_type);
 
 void cds_flush_work(void *work);
 void cds_flush_delayed_work(void *dwork);
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index d7360d7..cfe1219 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -1607,16 +1607,8 @@
 	return QDF_STATUS_SUCCESS;
 } /* cds_free_context() */
 
-/**
- * cds_get_vdev_types() - get vdev type
- * @mode: mode
- * @type: type
- * @sub_type: sub_type
- *
- * Return: WMI vdev type
- */
-QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint32_t *type,
-			      uint32_t *sub_type)
+QDF_STATUS cds_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type,
+			      uint8_t *sub_type)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	*type = 0;
@@ -1624,34 +1616,34 @@
 
 	switch (mode) {
 	case QDF_STA_MODE:
-		*type = WMI_VDEV_TYPE_STA;
+		*type = WLAN_VDEV_MLME_TYPE_STA;
 		break;
 	case QDF_SAP_MODE:
-		*type = WMI_VDEV_TYPE_AP;
+		*type = WLAN_VDEV_MLME_TYPE_AP;
 		break;
 	case QDF_P2P_DEVICE_MODE:
-		*type = WMI_VDEV_TYPE_AP;
-		*sub_type = WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE;
+		*type = WLAN_VDEV_MLME_TYPE_AP;
+		*sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE;
 		break;
 	case QDF_P2P_CLIENT_MODE:
-		*type = WMI_VDEV_TYPE_STA;
-		*sub_type = WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT;
+		*type = WLAN_VDEV_MLME_TYPE_STA;
+		*sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT;
 		break;
 	case QDF_P2P_GO_MODE:
-		*type = WMI_VDEV_TYPE_AP;
-		*sub_type = WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO;
+		*type = WLAN_VDEV_MLME_TYPE_AP;
+		*sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO;
 		break;
 	case QDF_OCB_MODE:
-		*type = WMI_VDEV_TYPE_OCB;
+		*type = WLAN_VDEV_MLME_TYPE_OCB;
 		break;
 	case QDF_IBSS_MODE:
-		*type = WMI_VDEV_TYPE_IBSS;
+		*type = WLAN_VDEV_MLME_TYPE_IBSS;
 		break;
 	case QDF_MONITOR_MODE:
-		*type = WMI_VDEV_TYPE_MONITOR;
+		*type = WMI_HOST_VDEV_TYPE_MONITOR;
 		break;
 	case QDF_NDI_MODE:
-		*type = WMI_VDEV_TYPE_NDI;
+		*type = WLAN_VDEV_MLME_TYPE_NDI;
 		break;
 	default:
 		cds_err("Invalid device mode %d", mode);
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index a49fd63..49db2ee 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -5885,7 +5885,6 @@
 	struct nlattr *rx_attr =
 		tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION];
 	uint8_t tx_size, rx_size;
-	struct sir_set_tx_rx_aggregation_size request;
 	QDF_STATUS status;
 
 	/* nothing to do if neither attribute is present */
@@ -5909,15 +5908,10 @@
 		return -EINVAL;
 	}
 
-	qdf_mem_zero(&request, sizeof(request));
-	request.tx_aggregation_size = tx_size;
-	request.rx_aggregation_size = rx_size;
-	request.vdev_id = adapter->vdev_id;
-	request.aggr_type = WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
-
-	status = wma_set_tx_rx_aggregation_size(&request);
-	if (QDF_IS_STATUS_ERROR(status))
-		hdd_err("failed to set aggr sizes err %d", status);
+	status = wma_set_tx_rx_aggr_size(adapter->vdev_id,
+					 tx_size,
+					 rx_size,
+					 WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU);
 
 	return qdf_status_to_os_return(status);
 }
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index c94f867..a9eb703 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -4381,24 +4381,13 @@
 			csr_roam_complete_cb callback,
 			void *callback_ctx)
 {
-	uint32_t type;
-	uint32_t sub_type;
-	QDF_STATUS status;
-
-	/* determine vdev (sub)type */
-	status = cds_get_vdev_types(adapter->device_mode, &type, &sub_type);
-	if (QDF_STATUS_SUCCESS != status) {
-		hdd_err("failed to get vdev type: %d", status);
-		return qdf_status_to_os_return(status);
-	}
-	session_param->sme_session_id = adapter->vdev_id;
+	session_param->vdev_id = adapter->vdev_id;
 	session_param->self_mac_addr = (uint8_t *)&adapter->mac_addr;
-	session_param->type_of_persona = type;
-	session_param->subtype_of_persona = sub_type;
 	session_param->session_open_cb = hdd_sme_open_session_callback;
 	session_param->session_close_cb = hdd_sme_close_session_callback;
 	session_param->callback = callback;
 	session_param->callback_ctx = callback_ctx;
+	session_param->vdev = adapter->vdev;
 
 	return 0;
 }
@@ -4470,14 +4459,15 @@
 		hdd_err("failed to populating SME params");
 		goto objmgr_vdev_destroy_procedure;
 	}
-	status = sme_open_session(hdd_ctx->mac_handle, &sme_session_params);
+	status = sme_create_vdev(hdd_ctx->mac_handle,
+				 &sme_session_params);
 	if (QDF_IS_STATUS_ERROR(status)) {
-		hdd_err("failed to open sme session: %d", status);
+		hdd_err("failed to create vdev: %d", status);
 		errno = qdf_status_to_os_return(status);
 		goto objmgr_vdev_destroy_procedure;
 	}
 
-	/* block on a completion variable until sme session is opened */
+	/* block on a completion variable until vdev is created in firmware */
 	status = qdf_wait_for_event_completion(&adapter->qdf_session_open_event,
 			SME_CMD_VDEV_CREATE_DELETE_TIMEOUT);
 	if (QDF_STATUS_SUCCESS != status) {
diff --git a/core/hdd/src/wlan_hdd_object_manager.h b/core/hdd/src/wlan_hdd_object_manager.h
index 070ff28..580268c 100644
--- a/core/hdd/src/wlan_hdd_object_manager.h
+++ b/core/hdd/src/wlan_hdd_object_manager.h
@@ -120,7 +120,7 @@
  * Return: 0 for success, negative error code for failure
  */
 int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
-			      struct hdd_adapter *adapter);
+				     struct hdd_adapter *adapter);
 
 /**
  * hdd_objmgr_release_and_destroy_vdev() - Delete vdev and remove from adapter
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index e9ff205..b4f5ccb 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -5042,56 +5042,6 @@
 #endif /* WLAN_FEATURE_NAN */
 
 /**
- * struct sir_set_tx_rx_aggregation_size - sets tx rx aggregation size
- * @vdev_id: vdev id of the session
- * @aggr_type: TX Aggregation Type (0=A-MPDU, 1=A-MSDU)
- * @tx_aggregation_size: Tx aggregation size
- * @tx_aggregation_size_be: Tx aggregation size for be queue
- * @tx_aggregation_size_bk: Tx aggregation size for bk queue
- * @tx_aggregation_size_vi: Tx aggregation size for vi queue
- * @tx_aggregation_size_vo: Tx aggregation size for vo queue
- * @rx_aggregation_size: Rx aggregation size
- */
-struct sir_set_tx_rx_aggregation_size {
-	uint8_t vdev_id;
-	wmi_vdev_custom_aggr_type_t aggr_type;
-	uint32_t tx_aggregation_size;
-	uint32_t tx_aggregation_size_be;
-	uint32_t tx_aggregation_size_bk;
-	uint32_t tx_aggregation_size_vi;
-	uint32_t tx_aggregation_size_vo;
-	uint32_t rx_aggregation_size;
-};
-
-/**
- * struct sir_set_tx_sw_retry_threshold - set sw retry threshold
- * @vdev_id: vdev id of the session
- * @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for BE
- * @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for BK
- * @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for VI
- * @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for VO
- * @tx_aggr_sw_retry_threshold: aggr sw retry threshold
- * @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for BE
- * @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for BK
- * @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for VI
- * @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for VO
- * @tx_non_aggr_sw_retry_threshold: non aggr sw retry threshold
- */
-struct sir_set_tx_sw_retry_threshold {
-	uint8_t vdev_id;
-	uint32_t tx_aggr_sw_retry_threshold_be;
-	uint32_t tx_aggr_sw_retry_threshold_bk;
-	uint32_t tx_aggr_sw_retry_threshold_vi;
-	uint32_t tx_aggr_sw_retry_threshold_vo;
-	uint32_t tx_aggr_sw_retry_threshold;
-	uint32_t tx_non_aggr_sw_retry_threshold_be;
-	uint32_t tx_non_aggr_sw_retry_threshold_bk;
-	uint32_t tx_non_aggr_sw_retry_threshold_vi;
-	uint32_t tx_non_aggr_sw_retry_threshold_vo;
-	uint32_t tx_non_aggr_sw_retry_threshold;
-};
-
-/**
  * struct sir_p2p_lo_start - p2p listen offload start
  * @vdev_id: vdev identifier
  * @ctl_flags: control flag
diff --git a/core/mac/inc/wni_api.h b/core/mac/inc/wni_api.h
index 674504a..c93a724 100644
--- a/core/mac/inc/wni_api.h
+++ b/core/mac/inc/wni_api.h
@@ -87,7 +87,7 @@
 	eWNI_SME_BEACON_REPORT_REQ_IND = SIR_SME_MSG_TYPES_BEGIN + 45,
 	eWNI_SME_BEACON_REPORT_RESP_XMIT_IND = SIR_SME_MSG_TYPES_BEGIN + 46,
 
-	eWNI_SME_ADD_STA_SELF_RSP = SIR_SME_MSG_TYPES_BEGIN + 47,
+	/* unused SIR_SME_MSG_TYPES_BEGIN + 47, */
 	eWNI_SME_DEL_STA_SELF_RSP = SIR_SME_MSG_TYPES_BEGIN + 48,
 
 	eWNI_SME_FT_PRE_AUTH_REQ = SIR_SME_MSG_TYPES_BEGIN + 49,
@@ -240,7 +240,9 @@
 	WNI_SME_REGISTER_BCN_REPORT_SEND_CB = SIR_SME_MSG_TYPES_BEGIN + 154,
 	eWNI_SME_ANTENNA_ISOLATION_RSP = SIR_SME_MSG_TYPES_BEGIN + 155,
 	eWNI_SME_MON_DEINIT_SESSION = SIR_SME_MSG_TYPES_BEGIN + 156,
-	eWNI_SME_MSG_TYPES_END = SIR_SME_MSG_TYPES_BEGIN + 157
+	eWNI_SME_VDEV_CREATE_REQ = SIR_SME_MSG_TYPES_BEGIN + 157,
+	eWNI_SME_VDEV_CREATE_RSP = SIR_SME_MSG_TYPES_BEGIN + 158,
+	eWNI_SME_MSG_TYPES_END = SIR_SME_MSG_TYPES_BEGIN + 159
 };
 
 typedef struct sAniCfgTxRateCtrs {
diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h
index f836e1b..a6a8505 100644
--- a/core/mac/src/include/sir_params.h
+++ b/core/mac/src/include/sir_params.h
@@ -298,8 +298,8 @@
 /* / PE <-> HAL Host Offload message */
 #define SIR_HAL_SET_HOST_OFFLOAD           (SIR_HAL_ITC_MSG_TYPES_BEGIN + 100)
 
-#define SIR_HAL_ADD_STA_SELF_REQ           (SIR_HAL_ITC_MSG_TYPES_BEGIN + 101)
-#define SIR_HAL_ADD_STA_SELF_RSP           (SIR_HAL_ITC_MSG_TYPES_BEGIN + 102)
+/* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 101) is unused */
+/* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 102) is unused */
 #define SIR_HAL_DEL_STA_SELF_REQ           (SIR_HAL_ITC_MSG_TYPES_BEGIN + 103)
 /*
  * (SIR_HAL_ITC_MSG_TYPES_BEGIN + 104) thru
diff --git a/core/mac/src/pe/lim/lim_process_message_queue.c b/core/mac/src/pe/lim/lim_process_message_queue.c
index b0ca963..154888c 100644
--- a/core/mac/src/pe/lim/lim_process_message_queue.c
+++ b/core/mac/src/pe/lim/lim_process_message_queue.c
@@ -59,6 +59,7 @@
 #include "cds_ieee80211_common.h"
 #include <wlan_scan_ucfg_api.h>
 #include "wlan_mlme_public_struct.h"
+#include "../../core/src/vdev_mgr_ops.h"
 
 void lim_log_session_states(struct mac_context *mac);
 static void lim_process_normal_hdd_msg(struct mac_context *mac_ctx,
@@ -1541,6 +1542,60 @@
 	return;
 }
 
+static void
+lim_process_vdev_create(struct mac_context *mac_ctx,
+			struct vdev_create_req_param *vdev_create_param)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct vdev_mlme_obj *vdev_mlme = NULL;
+	struct scheduler_msg message = {0};
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
+						    vdev_create_param->vdev_id,
+						    WLAN_LEGACY_MAC_ID);
+	if (!vdev) {
+		pe_err("Failed to get vdev obj for vdev id %d",
+		       vdev_create_param->vdev_id);
+		status = QDF_STATUS_E_INVAL;
+		goto end;
+	}
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		pe_err("Failed to get vdev mlme obj for vdev id %d",
+		       vdev_create_param->vdev_id);
+		status = QDF_STATUS_E_INVAL;
+		goto end;
+	}
+
+	status = vdev_mgr_create_send(vdev_mlme);
+	if (QDF_IS_STATUS_ERROR(vdev_create_param->status)) {
+		pe_err("Failed to create vdev for vdev id %d",
+		       vdev_create_param->vdev_id);
+		goto end;
+	}
+
+	status = wma_post_vdev_create_setup(vdev);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		vdev_mgr_delete_send(vdev_mlme);
+
+end:
+	if (vdev)
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
+
+	vdev_create_param->status = status;
+	message.type = eWNI_SME_VDEV_CREATE_RSP;
+	message.bodyptr = vdev_create_param;
+	status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
+					QDF_MODULE_ID_SME, &message);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		qdf_mem_free(vdev_create_param);
+		pe_err("scheduler_post_msg failed!(err=%d)", status);
+	}
+}
+
 /**
  * lim_process_messages() - Process messages from upper layers.
  *
@@ -2097,6 +2152,11 @@
 		qdf_mem_free((void *)msg->bodyptr);
 		msg->bodyptr = NULL;
 		break;
+	case eWNI_SME_VDEV_CREATE_REQ:
+		lim_process_vdev_create(mac_ctx, msg->bodyptr);
+		/* Do not free msg->bodyptr, same memory used to send resp */
+		msg->bodyptr = NULL;
+		break;
 	default:
 		qdf_mem_free((void *)msg->bodyptr);
 		msg->bodyptr = NULL;
diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c
index 40917f6..c902f87 100644
--- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c
+++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c
@@ -256,7 +256,6 @@
 		CASE_RETURN_STRING(eWNI_SME_NEIGHBOR_REPORT_IND);
 		CASE_RETURN_STRING(eWNI_SME_BEACON_REPORT_REQ_IND);
 		CASE_RETURN_STRING(eWNI_SME_BEACON_REPORT_RESP_XMIT_IND);
-		CASE_RETURN_STRING(eWNI_SME_ADD_STA_SELF_RSP);
 		CASE_RETURN_STRING(eWNI_SME_DEL_STA_SELF_RSP);
 		CASE_RETURN_STRING(eWNI_SME_FT_PRE_AUTH_REQ);
 		CASE_RETURN_STRING(eWNI_SME_FT_PRE_AUTH_RSP);
@@ -388,7 +387,6 @@
 	switch (wma_msg) {
 		CASE_RETURN_STRING(WMA_ADD_STA_REQ);
 		CASE_RETURN_STRING(WMA_ADD_STA_RSP);
-		CASE_RETURN_STRING(WMA_ADD_STA_SELF_RSP);
 		CASE_RETURN_STRING(WMA_DELETE_STA_REQ);
 		CASE_RETURN_STRING(WMA_DELETE_STA_RSP);
 		CASE_RETURN_STRING(WMA_ADD_BSS_REQ);
@@ -453,7 +451,6 @@
 #ifdef WLAN_NS_OFFLOAD
 		CASE_RETURN_STRING(WMA_SET_NS_OFFLOAD);
 #endif /* WLAN_NS_OFFLOAD */
-		CASE_RETURN_STRING(WMA_ADD_STA_SELF_REQ);
 		CASE_RETURN_STRING(WMA_DEL_STA_SELF_REQ);
 		CASE_RETURN_STRING(WMA_WLAN_SUSPEND_IND);
 		CASE_RETURN_STRING(WMA_WLAN_RESUME_REQ);
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 10e3719..84f49c1 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -212,21 +212,19 @@
  * @session_open_cb: callback to be registered with SME for opening the session
  * @session_close_cb: callback to be registered with SME for closing the session
  * @callback: callback to be invoked for roaming events
+ * @vdev: pointer to vdev object
  * @callback_ctx: user-supplied context to be passed back on roaming events
  * @self_mac_addr: Self mac address
- * @sme_session_id: SME session id
- * @type_of_persona: person type
- * @subtype_of_persona: sub type of persona
+ * @vdev_id: vdev id
  */
 struct sme_session_params {
 	csr_session_open_cb  session_open_cb;
 	csr_session_close_cb session_close_cb;
 	csr_roam_complete_cb callback;
+	struct wlan_objmgr_vdev *vdev;
 	void *callback_ctx;
 	uint8_t *self_mac_addr;
-	uint8_t sme_session_id;
-	uint32_t type_of_persona;
-	uint32_t subtype_of_persona;
+	uint8_t vdev_id;
 };
 
 #define MAX_CANDIDATE_INFO 10
@@ -370,21 +368,19 @@
 		      uint8_t vdev_id);
 
 /**
- * sme_open_session() - Open a session for given persona
+ * sme_create_vdev() - Create vdev for given persona
+ * @mac_handle: The handle returned by mac_open
+ * @params: to initialize the session open params
  *
  * This is a synchronous API. For any protocol stack related activity
- * requires session to be opened. This API needs to be called to open
- * the session in SME module.
+ * requires vdev to be created. This API needs to be called to create
+ * vdev in SME module.
  *
- * mac_handle: The handle returned by mac_open.
- * params: to initialize the session open params
- *
- * Return:
- * QDF_STATUS_SUCCESS - session is opened.
- * Other status means SME is failed to open the session.
+ * Return: QDF_STATUS_SUCCESS - vdev is created
+ * Other status means SME is failed to create vdev
  */
-QDF_STATUS sme_open_session(mac_handle_t mac_handle,
-			    struct sme_session_params *params);
+QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
+			   struct sme_session_params *params);
 
 /**
  * sme_close_session() - Close a session for given persona
diff --git a/core/sme/inc/sme_inside.h b/core/sme/inc/sme_inside.h
index 989302a..abcd5e4 100644
--- a/core/sme/inc/sme_inside.h
+++ b/core/sme/inc/sme_inside.h
@@ -163,7 +163,6 @@
 QDF_STATUS sme_acquire_global_lock(struct sme_context *sme);
 QDF_STATUS sme_release_global_lock(struct sme_context *sme);
 
-QDF_STATUS csr_process_add_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg);
 QDF_STATUS csr_process_del_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg);
 
 QDF_STATUS csr_flush_cfg_bg_scan_roam_channel_list(struct mac_context *mac,
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index 516b47a..b86ae3c 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -1997,10 +1997,9 @@
 			sme_err("Empty message for: %d", pMsg->type);
 		}
 		break;
-	case eWNI_SME_ADD_STA_SELF_RSP:
+	case eWNI_SME_VDEV_CREATE_RSP:
 		if (pMsg->bodyptr) {
-			status = csr_process_add_sta_session_rsp(mac,
-								pMsg->bodyptr);
+			status = csr_vdev_create_resp(mac, pMsg->bodyptr);
 			qdf_mem_free(pMsg->bodyptr);
 		} else {
 			sme_err("Empty message for: %d", pMsg->type);
@@ -4486,8 +4485,8 @@
 	return status;
 }
 
-QDF_STATUS sme_open_session(mac_handle_t mac_handle,
-			    struct sme_session_params *params)
+QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
+			   struct sme_session_params *params)
 {
 	QDF_STATUS status = QDF_STATUS_E_INVAL;
 	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
@@ -4496,17 +4495,13 @@
 	uint8_t peer_id;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
-	QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
-		  "%s: type=%d, session_id %d subType=%d addr:%pM",
-		  __func__, params->type_of_persona,
-		  params->sme_session_id, params->subtype_of_persona,
+	sme_debug("vdev_id %d addr:%pM", params->vdev_id,
 		  params->self_mac_addr);
 
 	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 
 	if (!pdev) {
-		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Failed to get pdev handler", __func__);
+		sme_err("Failed to get pdev handler");
 		return status;
 	}
 
@@ -4517,17 +4512,15 @@
 	peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
 				     &peer_id);
 	if (peer) {
-		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Peer=%d exist with same MAC",
-			  __func__, peer_id);
+		sme_err("Peer=%d exist with same MAC", peer_id);
 		status = QDF_STATUS_E_INVAL;
 	} else {
-		status = csr_roam_open_session(mac_ctx, params);
+		status = csr_create_vdev(mac_ctx, params->vdev, params);
 	}
 	sme_release_global_lock(&mac_ctx->sme);
 
 	MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
-			 params->sme_session_id, 0));
+			 params->vdev_id, 0));
 
 	return status;
 }
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 229c106..7a1b836 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -16785,47 +16785,86 @@
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
 }
 
-QDF_STATUS csr_process_add_sta_session_rsp(struct mac_context *mac, uint8_t *pMsg)
+static void csr_send_set_ie(uint8_t type, uint8_t sub_type,
+			    uint8_t vdev_id)
 {
-	struct add_sta_self_params *rsp;
 	struct send_extcap_ie *msg;
 	QDF_STATUS status;
 
-	if (!pMsg) {
-		sme_err("in %s msg ptr is NULL", __func__);
+	sme_debug("send SET IE msg to PE");
+
+	if (!(type == WLAN_VDEV_MLME_TYPE_STA ||
+	      (type == WLAN_VDEV_MLME_TYPE_AP &&
+	      sub_type == WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE))) {
+		sme_err("Failed to send set IE req for vdev_%d", vdev_id);
+		return;
+	}
+
+	msg = qdf_mem_malloc(sizeof(*msg));
+	if (!msg)
+		return;
+
+	msg->msg_type = eWNI_SME_SET_IE_REQ;
+	msg->session_id = vdev_id;
+	msg->length = sizeof(*msg);
+	status = umac_send_mb_message_to_mac(msg);
+	if (!QDF_IS_STATUS_SUCCESS(status))
+		sme_err("Failed to send set IE req for vdev_%d", vdev_id);
+}
+
+QDF_STATUS csr_vdev_create_resp(struct mac_context *mac, uint8_t *pmsg)
+{
+	struct vdev_create_req_param *rsp;
+	struct vdev_mlme_obj *vdev_mlme;
+	struct wlan_objmgr_vdev *vdev;
+
+	if (!pmsg) {
+		sme_err("msg ptr is NULL");
 		return QDF_STATUS_E_FAILURE;
 	}
-	rsp = (struct add_sta_self_params *) pMsg;
-	sme_debug("Add Sta self rsp status = %d", rsp->status);
+	rsp = (struct vdev_create_req_param *)pmsg;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
+						    rsp->vdev_id,
+						    WLAN_LEGACY_MAC_ID);
+	if (!vdev) {
+		sme_err("Failed to get vdev obj for vdev id %d",
+			rsp->vdev_id);
+		csr_cleanup_session(mac, rsp->vdev_id);
+		csr_roam_session_opened(mac, QDF_STATUS_E_FAILURE,
+					rsp->vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	sme_debug("create vdev status = %d", rsp->status);
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		sme_err("Fail to get vdev priv object");
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
+		csr_cleanup_session(mac, rsp->vdev_id);
+		csr_roam_session_opened(mac, QDF_STATUS_E_FAILURE,
+					rsp->vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
 
 	if (QDF_IS_STATUS_SUCCESS(rsp->status)) {
-		if ((WMI_VDEV_TYPE_STA == rsp->type ||
-		    (WMI_VDEV_TYPE_AP == rsp->type &&
-		     WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE == rsp->sub_type))) {
-			sme_debug("send SET IE msg to PE");
-			msg = qdf_mem_malloc(sizeof(*msg));
-			if (!msg)
-				return QDF_STATUS_E_NOMEM;
+		csr_send_set_ie(vdev_mlme->mgmt.generic.type,
+				vdev_mlme->mgmt.generic.subtype,
+				rsp->vdev_id);
 
-			msg->msg_type = eWNI_SME_SET_IE_REQ;
-			msg->session_id = rsp->session_id;
-			msg->length = sizeof(*msg);
-			status = umac_send_mb_message_to_mac(msg);
-			if (!QDF_IS_STATUS_SUCCESS(status))
-				sme_err("Failed to send down the set IE req ");
+		if (vdev_mlme->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_STA) {
+			csr_store_oce_cfg_flags_in_vdev(mac, mac->pdev,
+							rsp->vdev_id);
+			wlan_mlme_update_oce_flags(mac->pdev);
 		}
 	}
 
-	csr_roam_session_opened(mac, rsp->status, rsp->session_id);
+	csr_roam_session_opened(mac, rsp->status, rsp->vdev_id);
 
-	if (QDF_IS_STATUS_SUCCESS(rsp->status) &&
-	    rsp->type == WMI_VDEV_TYPE_STA) {
-		csr_store_oce_cfg_flags_in_vdev(mac, mac->pdev,
-						rsp->session_id);
-		wlan_mlme_update_oce_flags(mac->pdev);
-	}
 	if (QDF_IS_STATUS_ERROR(rsp->status))
-		csr_cleanup_session(mac, rsp->session_id);
+		csr_cleanup_session(mac, rsp->vdev_id);
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -16889,118 +16928,73 @@
 		break;
 	}
 	sme_debug("mode - %d: nss_2g - %d, 5g - %d",
-			dev_mode, *nss_2g, *nss_5g);
+		  dev_mode, *nss_2g, *nss_5g);
 }
 
 static
-QDF_STATUS csr_issue_add_sta_for_session_req(struct mac_context *mac,
-					     uint32_t sessionId,
-					     tSirMacAddr sessionMacAddr,
-					     uint32_t type, uint32_t subType)
+QDF_STATUS csr_issue_vdev_create_req(struct mac_context *mac,
+				     uint32_t vdev_id)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	struct add_sta_self_params *add_sta_self_req;
-	struct wlan_mlme_qos *qos_aggr = &mac->mlme_cfg->qos_mlme_params;
-	uint8_t nss_2g;
-	uint8_t nss_5g;
-	struct scheduler_msg msg = {0};
+	struct vdev_create_req_param *vdev_create_req;
+	struct scheduler_msg message = {0};
 
-	add_sta_self_req = qdf_mem_malloc(sizeof(struct add_sta_self_params));
-	if (!add_sta_self_req)
+	vdev_create_req = qdf_mem_malloc(sizeof(*vdev_create_req));
+	if (!vdev_create_req)
 		return QDF_STATUS_E_NOMEM;
 
-	if (!(mac->mlme_cfg)) {
-		pe_err("Mlme cfg NULL");
-		return QDF_STATUS_E_FAILURE;
+	vdev_create_req->vdev_id = vdev_id;
+	/* Serialize the req through MC thread */
+	message.type    = eWNI_SME_VDEV_CREATE_REQ;
+	message.bodyptr = vdev_create_req;
+	status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
+					QDF_MODULE_ID_PE, &message);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		sme_err("scheduler_post_msg failed!(err=%d)", status);
+		qdf_mem_free(vdev_create_req);
+		status = QDF_STATUS_E_FAILURE;
 	}
 
-	csr_get_vdev_type_nss(mac, mac->sme.curr_device_mode,
-			      &nss_2g, &nss_5g);
-	qdf_mem_copy(add_sta_self_req->self_mac_addr, sessionMacAddr,
-		     sizeof(tSirMacAddr));
-	add_sta_self_req->curr_device_mode = mac->sme.curr_device_mode;
-	add_sta_self_req->session_id = sessionId;
-	add_sta_self_req->type = type;
-	add_sta_self_req->sub_type = subType;
-	add_sta_self_req->nss_2g = nss_2g;
-	add_sta_self_req->nss_5g = nss_5g;
-
-	add_sta_self_req->tx_aggregation_size = qos_aggr->tx_aggregation_size;
-	add_sta_self_req->tx_aggregation_size_be =
-			qos_aggr->tx_aggregation_size_be;
-	add_sta_self_req->tx_aggregation_size_bk =
-			qos_aggr->tx_aggregation_size_bk;
-	add_sta_self_req->tx_aggregation_size_vi =
-			qos_aggr->tx_aggregation_size_vi;
-	add_sta_self_req->tx_aggregation_size_vo =
-			qos_aggr->tx_aggregation_size_vo;
-
-	add_sta_self_req->rx_aggregation_size = qos_aggr->rx_aggregation_size;
-	add_sta_self_req->tx_aggr_sw_retry_threshold_be =
-			qos_aggr->tx_aggr_sw_retry_threshold_be;
-	add_sta_self_req->tx_aggr_sw_retry_threshold_bk =
-			qos_aggr->tx_aggr_sw_retry_threshold_bk;
-	add_sta_self_req->tx_aggr_sw_retry_threshold_vi =
-			qos_aggr->tx_aggr_sw_retry_threshold_vi;
-	add_sta_self_req->tx_aggr_sw_retry_threshold_vo =
-			qos_aggr->tx_aggr_sw_retry_threshold_vo;
-	add_sta_self_req->tx_aggr_sw_retry_threshold =
-			qos_aggr->tx_aggr_sw_retry_threshold;
-	add_sta_self_req->tx_non_aggr_sw_retry_threshold_be =
-			qos_aggr->tx_non_aggr_sw_retry_threshold_be;
-	add_sta_self_req->tx_non_aggr_sw_retry_threshold_bk =
-			qos_aggr->tx_non_aggr_sw_retry_threshold_bk;
-	add_sta_self_req->tx_non_aggr_sw_retry_threshold_vi =
-			qos_aggr->tx_non_aggr_sw_retry_threshold_vi;
-	add_sta_self_req->tx_non_aggr_sw_retry_threshold_vo =
-			qos_aggr->tx_non_aggr_sw_retry_threshold_vo;
-	add_sta_self_req->tx_non_aggr_sw_retry_threshold =
-			qos_aggr->tx_non_aggr_sw_retry_threshold;
-
-	add_sta_self_req->enable_bcast_probe_rsp =
-			mac->mlme_cfg->oce.enable_bcast_probe_rsp;
-	add_sta_self_req->fils_max_chan_guard_time =
-			mac->mlme_cfg->sta.fils_max_chan_guard_time;
-	add_sta_self_req->pkt_err_disconn_th =
-			mac->mlme_cfg->gen.dropped_pkt_disconnect_thresh;
-	add_sta_self_req->oce_feature_bitmap =
-			mac->mlme_cfg->oce.feature_bitmap;
-
-	msg.type = WMA_ADD_STA_SELF_REQ;
-	msg.reserved = 0;
-	msg.bodyptr = add_sta_self_req;
-	msg.bodyval = 0;
-
-	sme_debug(
-		"Send WMA_ADD_STA_SELF_REQ for selfMac=" QDF_MAC_ADDR_STR,
-		 QDF_MAC_ADDR_ARRAY(add_sta_self_req->self_mac_addr));
-	status = scheduler_post_message(QDF_MODULE_ID_SME,
-					QDF_MODULE_ID_WMA,
-					QDF_MODULE_ID_WMA, &msg);
-
-	if (status != QDF_STATUS_SUCCESS) {
-		sme_err("wma_post_ctrl_msg failed");
-		qdf_mem_free(add_sta_self_req);
-		add_sta_self_req = NULL;
-	}
 	return status;
 }
 
-QDF_STATUS csr_roam_open_session(struct mac_context *mac_ctx,
-				 struct sme_session_params *session_param)
+QDF_STATUS csr_create_vdev(struct mac_context *mac_ctx,
+			   struct wlan_objmgr_vdev *vdev,
+			   struct sme_session_params *session_param)
 {
 	QDF_STATUS status;
 	uint32_t existing_session_id;
 	struct mlme_ht_capabilities_info *ht_cap_info;
 	struct csr_roam_session *session;
 	struct mlme_vht_capabilities_info *vht_cap_info;
+	struct vdev_mlme_obj *vdev_mlme;
+	enum QDF_OPMODE op_mode;
 
 	if (!(mac_ctx->mlme_cfg)) {
-		pe_err("invalid mlme cfg");
+		sme_err("invalid mlme cfg");
 		return QDF_STATUS_E_FAILURE;
 	}
 	vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
 
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		sme_err("Failed to get cmpt obj");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	op_mode = wlan_vdev_mlme_get_opmode(vdev);
+	csr_get_vdev_type_nss(mac_ctx, op_mode,
+			      &vdev_mlme->proto.generic.nss_2g,
+			      &vdev_mlme->proto.generic.nss_5g);
+
+	status = cds_get_vdev_types(op_mode,
+				    &vdev_mlme->mgmt.generic.type,
+				    &vdev_mlme->mgmt.generic.subtype);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		sme_err("Get vdev type failed; status:%d", status);
+		return status;
+	}
+
 	/* check to see if the mac address already belongs to a session */
 	status = csr_roam_get_session_id_from_bssid(mac_ctx,
 			(struct qdf_mac_addr *)session_param->self_mac_addr,
@@ -17013,22 +17007,22 @@
 	}
 
 	/* attempt to retrieve session for Id */
-	session = CSR_GET_SESSION(mac_ctx, session_param->sme_session_id);
+	session = CSR_GET_SESSION(mac_ctx, session_param->vdev_id);
 	if (!session) {
 		sme_err("Session does not exist for interface %d",
-			session_param->sme_session_id);
+			session_param->vdev_id);
 		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* check to see if the session is already active */
 	if (session->sessionActive) {
 		sme_err("Cannot re-open active session with Id %d",
-			session_param->sme_session_id);
+			session_param->vdev_id);
 		return QDF_STATUS_E_FAILURE;
 	}
 
 	session->sessionActive = true;
-	session->sessionId = session_param->sme_session_id;
+	session->sessionId = session_param->vdev_id;
 
 	/* Initialize FT related data structures only in STA mode */
 	sme_ft_open(MAC_HANDLE(mac_ctx), session->sessionId);
@@ -17095,13 +17089,9 @@
 	 * Do not advertise requester role for SAP & responder role
 	 * for STA
 	 */
-	csr_init_session_twt_cap(session, session_param->type_of_persona);
+	csr_init_session_twt_cap(session, vdev_mlme->mgmt.generic.type);
 
-	return csr_issue_add_sta_for_session_req(mac_ctx,
-				session_param->sme_session_id,
-				session_param->self_mac_addr,
-				session_param->type_of_persona,
-				session_param->subtype_of_persona);
+	return csr_issue_vdev_create_req(mac_ctx, session->sessionId);
 }
 
 QDF_STATUS csr_process_del_sta_session_rsp(struct mac_context *mac_ctx,
diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h
index 643aa70..1b86e78 100644
--- a/core/sme/src/csr/csr_inside_api.h
+++ b/core/sme/src/csr/csr_inside_api.h
@@ -248,6 +248,17 @@
 void csr_roam_check_for_link_status_change(struct mac_context *mac,
 					tSirSmeRsp *pSirMsg);
 
+/**
+ * csr_vdev_create_resp() - Vdev create response handler
+ * @mac_ctx: global mac context
+ * @pMsg: pointer to response data
+ *
+ * This API handles vdev create response.
+ *
+ * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE
+ */
+QDF_STATUS csr_vdev_create_resp(struct mac_context *mac, uint8_t *pmsg);
+
 QDF_STATUS csr_roam_issue_start_bss(struct mac_context *mac, uint32_t sessionId,
 				    struct csr_roamstart_bssparams *pParam,
 				    struct csr_roam_profile *pProfile,
@@ -355,8 +366,6 @@
 					*channelTable);
 QDF_STATUS csr_roam_set_key(struct mac_context *mac, uint32_t sessionId,
 			    tCsrRoamSetKey *pSetKey, uint32_t roamId);
-QDF_STATUS csr_roam_open_session(struct mac_context *mac,
-				 struct sme_session_params *session_param);
 QDF_STATUS csr_roam_close_session(struct mac_context *mac_ctx,
 				  uint32_t session_id, bool sync);
 void csr_cleanup_session(struct mac_context *mac, uint32_t sessionId);
@@ -1017,6 +1026,17 @@
 csr_scan_get_channel_for_hw_mode_change(
 	struct mac_context *mac_ctx, uint32_t session_id,
 	struct csr_roam_profile *profile);
+/**
+ * csr_create_vdev() - API to create vdev
+ * @mac_ctx: pointer to mac context
+ * @vdev: vdev object
+ * @session_param: Session params
+ *
+ * Returns: QDF_STATUS
+ */
+QDF_STATUS csr_create_vdev(struct mac_context *mac,
+			   struct wlan_objmgr_vdev *vdev,
+			   struct sme_session_params *session_param);
 
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
 /**
diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h
index d1dcce3..dc96e82 100644
--- a/core/wma/inc/wma_api.h
+++ b/core/wma/inc/wma_api.h
@@ -266,23 +266,44 @@
  */
 QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle,
 		uint32_t cts2self_for_p2p_go);
-QDF_STATUS wma_set_tx_rx_aggregation_size
-	(struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size);
 
 /**
- * wma_set_tx_rx_aggregation_size_per_ac() - set aggregation size per ac
- * @tx_rx_aggregation_size: the parameter for aggregation size
+ * wma_set_tx_rx_aggr_size() - set tx rx aggregation size
+ * @vdev_id: vdev id
+ * @tx_size: tx aggr size
+ * @rx_size: rx aggr size
+ * @aggr_type: aggregation type
  *
- *  This function try to set the aggregation size per AC.
+ *  This function try to set the aggregation size.
  *
  *  Return: QDF_STATUS enumeration
  */
-QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac
-	(struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size);
+QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id,
+				   uint32_t tx_size,
+				   uint32_t rx_size,
+				   wmi_vdev_custom_aggr_type_t aggr_type);
+/**
+ * wma_set_tx_rx_aggr_size_per_ac() - set aggregation size per ac
+ * @wma_handle: pointer to wma handle.
+ * @vdev_id: vdev_id
+ * @qos_aggr: QoS data
+ * @aggr_type: aggregation type
+ *
+ * This function try to set the aggregation size per AC.
+ *
+ * Return: QDF_STATUS enumeration
+ */
+QDF_STATUS
+wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE wma_handle,
+			       uint8_t vdev_id,
+			       struct wlan_mlme_qos *qos_aggr,
+			       wmi_vdev_custom_aggr_type_t aggr_type);
+
 /**
  * wma_set_sw_retry_threshold_per_ac() - set sw retry threshold per AC for tx
  * @handle: wma handle
- * @tx_sw_retry_threshold: value needs to set to firmware
+ * @vdev_id: vdev id
+ * @qos_aggr: pointer to QOS TX/RX aggregation values
  *
  * This function sends WMI command to set the sw retry threshold per AC
  * for Tx.
@@ -291,19 +312,20 @@
  */
 QDF_STATUS wma_set_sw_retry_threshold_per_ac
 	(WMA_HANDLE handle,
-	 struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold);
+	 uint8_t vdev_id, struct wlan_mlme_qos *qos_aggr);
 /**
  * wma_set_sw_retry_threshold() - set sw retry threshold for tx
  * @vdev_id: vdev
  * @retry: retry number
- * @param: for aggregation or non-aggregation
+ * @param_id: aggregrate sw retry threshold param id
  *
  * This function sends WMI command to set the sw retry threshold for Tx.
  *
  * Return: QDF_STATUS.
  */
 QDF_STATUS wma_set_sw_retry_threshold(uint8_t vdev_id, uint32_t retry,
-				      uint32_t param);
+				      uint32_t param_id);
+
 /**
  * wma_get_sar_limit() - get SAR limits from the target
  * @handle: wma handle
@@ -576,6 +598,17 @@
  */
 QDF_STATUS wma_sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
 				       uint16_t data_len, void *data);
+/**
+ * wma_post_vdev_create_setup() - Post vdev create setup
+ * @vdev: vdev obj
+ *
+ * This API is invoked after vded is created to perform post
+ * vdev create operations i.e. creating peer and setting vdev params.
+ *
+ * Return: SUCCESS on successful post vdev operations, FAILURE, if it
+ *         fails due to any
+ */
+QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev);
 
 /**
  * wma_mon_mlme_vdev_start_continue() - VDEV start response handling
diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h
index 33f1fa2..2784cdf 100644
--- a/core/wma/inc/wma_if.h
+++ b/core/wma/inc/wma_if.h
@@ -875,60 +875,13 @@
 } tMaxTxPowerPerBandParams, *tpMaxTxPowerPerBandParams;
 
 /**
- * struct add_sta_self_params - Add Sta Self params
- * @self_mac_addr: self MAC Address
- * @curr_device_mode: operating device mode
- * @type: Vdev Type
- * @sub_type: Vdev Sub Type
- * @session_id: SME Session ID
- * @nss_2g: vdev nss in 2.4G
- * @nss_5g: vdev nss in 5G
+ * struct vdev_create_req_param - vdev create request params
+ * @vdev_id: vdev_id
  * @status: response status code
- * @tx_aggregation_size: Tx aggregation size
- * @rx_aggregation_size: Rx aggregation size
- * @enable_bcast_probe_rsp: enable broadcast probe response
- * @fils_max_chan_guard_time: FILS max channel guard time
- * @pkt_err_disconn_th: packet drop threshold
- * @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for be
- * @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for bk
- * @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for vi
- * @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for vo
- * @tx_aggr_sw_retry_threshold: aggr sw retry threshold
- * @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for be
- * @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for bk
- * @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for vi
- * @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for vo
- * @tx_non_aggr_sw_retry_threshold: non aggr sw retry threshold
  */
-struct add_sta_self_params {
-	tSirMacAddr self_mac_addr;
-	enum QDF_OPMODE curr_device_mode;
-	uint32_t type;
-	uint32_t sub_type;
-	uint8_t session_id;
-	uint8_t nss_2g;
-	uint8_t nss_5g;
-	uint32_t status;
-	uint32_t tx_aggregation_size;
-	uint32_t tx_aggregation_size_be;
-	uint32_t tx_aggregation_size_bk;
-	uint32_t tx_aggregation_size_vi;
-	uint32_t tx_aggregation_size_vo;
-	uint32_t rx_aggregation_size;
-	bool enable_bcast_probe_rsp;
-	uint8_t fils_max_chan_guard_time;
-	uint16_t pkt_err_disconn_th;
-	uint8_t oce_feature_bitmap;
-	uint32_t tx_aggr_sw_retry_threshold_be;
-	uint32_t tx_aggr_sw_retry_threshold_bk;
-	uint32_t tx_aggr_sw_retry_threshold_vi;
-	uint32_t tx_aggr_sw_retry_threshold_vo;
-	uint32_t tx_aggr_sw_retry_threshold;
-	uint32_t tx_non_aggr_sw_retry_threshold_be;
-	uint32_t tx_non_aggr_sw_retry_threshold_bk;
-	uint32_t tx_non_aggr_sw_retry_threshold_vi;
-	uint32_t tx_non_aggr_sw_retry_threshold_vo;
-	uint32_t tx_non_aggr_sw_retry_threshold;
+struct vdev_create_req_param {
+	uint32_t vdev_id;
+	QDF_STATUS status;
 };
 
 /**
diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h
index 0de76e4..41a83dc 100644
--- a/core/wma/inc/wma_internal.h
+++ b/core/wma/inc/wma_internal.h
@@ -641,10 +641,6 @@
 int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
 				      uint32_t len);
 
-struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
-				struct add_sta_self_params *self_sta_req,
-				uint8_t generateRsp);
-
 QDF_STATUS wma_vdev_start(tp_wma_handle wma, struct wma_vdev_start_req *req,
 			  bool isRestart);
 
diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h
index 6a8e964..3fd1173 100644
--- a/core/wma/inc/wma_types.h
+++ b/core/wma/inc/wma_types.h
@@ -116,7 +116,6 @@
 
 #define WMA_ADD_STA_REQ                SIR_HAL_ADD_STA_REQ
 #define WMA_ADD_STA_RSP                SIR_HAL_ADD_STA_RSP
-#define WMA_ADD_STA_SELF_RSP           SIR_HAL_ADD_STA_SELF_RSP
 #define WMA_DELETE_STA_REQ             SIR_HAL_DELETE_STA_REQ
 #define WMA_DELETE_STA_RSP             SIR_HAL_DELETE_STA_RSP
 #define WMA_ADD_BSS_REQ                SIR_HAL_ADD_BSS_REQ
@@ -208,7 +207,6 @@
 #ifdef WLAN_NS_OFFLOAD
 #define WMA_SET_NS_OFFLOAD             SIR_HAL_SET_NS_OFFLOAD
 #endif /* WLAN_NS_OFFLOAD */
-#define WMA_ADD_STA_SELF_REQ           SIR_HAL_ADD_STA_SELF_REQ
 #define WMA_DEL_STA_SELF_REQ           SIR_HAL_DEL_STA_SELF_REQ
 
 #ifdef FEATURE_WLAN_TDLS
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index ba1ba25..e95ece4 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -189,45 +189,6 @@
 }
 
 /**
- * wma_get_txrx_vdev_type() - return operating mode of vdev
- * @type: vdev_type
- *
- * Return: return operating mode as enum wlan_op_mode type
- */
-static enum wlan_op_mode wma_get_txrx_vdev_type(uint32_t type)
-{
-	enum wlan_op_mode vdev_type = wlan_op_mode_unknown;
-
-	switch (type) {
-	case WMI_VDEV_TYPE_AP:
-		vdev_type = wlan_op_mode_ap;
-		break;
-	case WMI_VDEV_TYPE_STA:
-		vdev_type = wlan_op_mode_sta;
-		break;
-#ifdef QCA_IBSS_SUPPORT
-	case WMI_VDEV_TYPE_IBSS:
-		vdev_type = wlan_op_mode_ibss;
-		break;
-#endif /* QCA_IBSS_SUPPORT */
-	case WMI_VDEV_TYPE_OCB:
-		vdev_type = wlan_op_mode_ocb;
-		break;
-	case WMI_VDEV_TYPE_MONITOR:
-		vdev_type = wlan_op_mode_monitor;
-		break;
-	case WMI_VDEV_TYPE_NDI:
-		vdev_type = wlan_op_mode_ndi;
-		break;
-	default:
-		WMA_LOGE("Invalid vdev type %u", type);
-		vdev_type = wlan_op_mode_unknown;
-	}
-
-	return vdev_type;
-}
-
-/**
  * wma_find_req_on_timer_expiry() - find request by address
  * @wma: wma handle
  * @req: pointer to the target request
@@ -692,13 +653,12 @@
 
 static void
 wma_cdp_vdev_detach(ol_txrx_soc_handle soc,
-			tp_wma_handle wma_handle,
-			uint8_t vdev_id)
+		    tp_wma_handle wma_handle,
+		    uint8_t vdev_id)
 {
 	struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
 
-	cdp_vdev_detach(soc,
-		iface->handle, NULL, NULL);
+	cdp_vdev_detach(soc, iface->handle, NULL, NULL);
 	iface->handle = NULL;
 }
 
@@ -769,7 +729,7 @@
 		goto out;
 	}
 
-	WMA_LOGD("vdev_id:%hu vdev_hdl:%pK", vdev_id, iface->handle);
+	WMA_LOGD("vdev_id:%hu", vdev_id);
 	if (!generate_rsp) {
 		WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
 		goto out;
@@ -793,6 +753,7 @@
 				     WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
 	}
 	WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
+	wlan_vdev_set_dp_handle(iface->vdev, NULL);
 	wma_release_vdev_ref(iface);
 	wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
 
@@ -807,6 +768,7 @@
 out:
 	WMA_LOGE("Call txrx detach callback for vdev %d, generate_rsp %u",
 		vdev_id, generate_rsp);
+	wlan_vdev_set_dp_handle(iface->vdev, NULL);
 	wma_release_vdev_ref(iface);
 	wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
 
@@ -981,6 +943,7 @@
 	 * CDP Vdev.
 	 */
 	if (!cds_is_target_ready()) {
+		wlan_vdev_set_dp_handle(iface->vdev, NULL);
 		wma_release_vdev_and_peer_ref(wma_handle, iface);
 		wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
 		goto send_rsp;
@@ -1527,7 +1490,7 @@
 		return QDF_STATUS_E_INVAL;
 	}
 
-	param.if_id = if_id;
+	param.vdev_id = if_id;
 	param.param_id = param_id;
 	param.param_value = param_value;
 
@@ -1564,16 +1527,19 @@
 {
 	tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
 	struct peer_set_params param = {0};
-	int err;
+	QDF_STATUS status;
 
 	param.vdev_id = vdev_id;
 	param.param_value = param_value;
 	param.param_id = param_id;
 
-	err = wmi_set_peer_param_send(wma_handle->wmi_handle, peer_addr,
-					   &param);
-
-	return err;
+	status = wmi_set_peer_param_send(wma_handle->wmi_handle,
+					 peer_addr,
+					 &param);
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("vdev_id: %d peer set failed, id %d, val %d",
+			 vdev_id, param_id, param_value);
+	return status;
 }
 
 /**
@@ -2675,280 +2641,174 @@
 	return 0;
 }
 
-/**
- * wma_vdev_attach() - create vdev in fw
- * @wma_handle: wma handle
- * @self_sta_req: self sta request
- * @generateRsp: generate response
- *
- * This function creates vdev in target and
- * attach this vdev to txrx module. It also set
- * vdev related params to fw.
- *
- * Return: txrx vdev handle
- */
-struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
-				struct add_sta_self_params *self_sta_req,
-				uint8_t generateRsp)
+QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
 {
 	struct cdp_vdev *txrx_vdev_handle = NULL;
 	struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	enum wlan_op_mode txrx_vdev_type;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
 	uint32_t cfg_val;
 	uint8_t mcc_adapt_sch;
 	QDF_STATUS ret;
 	struct mlme_ht_capabilities_info *ht_cap_info;
-	struct scheduler_msg sme_msg = { 0 };
-	struct vdev_create_params params = { 0 };
 	u_int8_t vdev_id;
-	struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
-	struct sir_set_tx_sw_retry_threshold tx_sw_retry_threshold;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct wlan_objmgr_peer *obj_peer;
-	struct wlan_objmgr_vdev *vdev;
-	uint32_t retry;
+	struct wlan_mlme_qos *qos_aggr;
+	struct vdev_mlme_obj *vdev_mlme;
+	tp_wma_handle wma_handle;
 
-	qdf_mem_zero(&tx_rx_aggregation_size, sizeof(tx_rx_aggregation_size));
-	WMA_LOGD("mac %pM, vdev_id %hu, type %d, sub_type %d, nss 2g %d, 5g %d",
-		self_sta_req->self_mac_addr, self_sta_req->session_id,
-		self_sta_req->type, self_sta_req->sub_type,
-		self_sta_req->nss_2g, self_sta_req->nss_5g);
 	if (!mac) {
 		WMA_LOGE("%s: Failed to get mac", __func__);
-		status = QDF_STATUS_E_FAILURE;
-		goto end;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	vdev_id = self_sta_req->session_id;
-	if (wma_is_vdev_valid(vdev_id)) {
-		WMA_LOGE("%s: vdev %d already active", __func__, vdev_id);
-		status = QDF_STATUS_E_FAILURE;
-		goto end;
+	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma_handle) {
+		WMA_LOGE("%s: WMA context is invalid", __func__);
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	params.if_id = self_sta_req->session_id;
-	params.type = self_sta_req->type;
-	params.subtype = self_sta_req->sub_type;
-	params.nss_2g = self_sta_req->nss_2g;
-	params.nss_5g = self_sta_req->nss_5g;
-
-	/* Create a vdev in target */
-	ret = wmi_unified_vdev_create_send(wma_handle->wmi_handle,
-					   self_sta_req->self_mac_addr,
-					   &params);
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMA_LOGE("%s: Unable to add an interface for ath_dev",
-			 __func__);
-		status = QDF_STATUS_E_FAILURE;
-		goto end;
+	if (!soc) {
+		WMA_LOGE("%s: SOC context is invalid", __func__);
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type);
+	if (wlan_objmgr_vdev_try_get_ref(vdev, WLAN_LEGACY_WMA_ID) !=
+		QDF_STATUS_SUCCESS)
+		return QDF_STATUS_E_FAILURE;
 
-	if (wlan_op_mode_unknown == txrx_vdev_type) {
-		WMA_LOGE("Failed to get txrx vdev type");
-		wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
-					     self_sta_req->session_id);
-		status = QDF_STATUS_E_FAILURE;
-		goto end;
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		WMA_LOGE("%s: Failed to get vdev mlme obj!", __func__);
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	txrx_vdev_handle = cdp_vdev_attach(soc, txrx_pdev,
-					   self_sta_req->self_mac_addr,
-					   vdev_id, txrx_vdev_type);
-
-	WMA_LOGD("vdev_id %hu, txrx_vdev_handle = %pK", vdev_id,
-		 txrx_vdev_handle);
-
-	if (!txrx_vdev_handle) {
-		WMA_LOGE("%s: cdp_vdev_attach failed", __func__);
-		status = QDF_STATUS_E_FAILURE;
-		wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
-					     self_sta_req->session_id);
-		goto end;
-	}
+	vdev_id = wlan_vdev_get_id(vdev);
+	txrx_vdev_handle = wlan_vdev_get_dp_handle(vdev);
 
 	wma_handle->interfaces[vdev_id].vdev_active = true;
 	wma_handle->interfaces[vdev_id].handle = txrx_vdev_handle;
 	wma_vdev_update_pause_bitmap(vdev_id, 0);
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma_handle->psoc, vdev_id,
-						    WLAN_LEGACY_WMA_ID);
-	if (!vdev) {
-		WMA_LOGE(FL("vdev obj is NULL for vdev_id: %u"), vdev_id);
-		status = QDF_STATUS_E_FAILURE;
-		wma_handle->interfaces[vdev_id].vdev_active = false;
-		wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
-		goto end;
-	}
-
 	wma_handle->interfaces[vdev_id].vdev = vdev;
+	wma_handle->interfaces[vdev_id].type =
+		vdev_mlme->mgmt.generic.type;
+	wma_handle->interfaces[vdev_id].sub_type =
+		vdev_mlme->mgmt.generic.subtype;
 
 	qdf_mem_copy(wma_handle->interfaces[vdev_id].addr,
-		     self_sta_req->self_mac_addr,
+		     vdev->vdev_mlme.macaddr,
 		     sizeof(wma_handle->interfaces[vdev_id].addr));
 
-	tx_rx_aggregation_size.tx_aggregation_size =
-				self_sta_req->tx_aggregation_size;
-	tx_rx_aggregation_size.rx_aggregation_size =
-				self_sta_req->rx_aggregation_size;
-	tx_rx_aggregation_size.vdev_id = self_sta_req->session_id;
-	tx_rx_aggregation_size.aggr_type = WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
+	qos_aggr = &mac->mlme_cfg->qos_mlme_params;
+	status = wma_set_tx_rx_aggr_size(vdev_id, qos_aggr->tx_aggregation_size,
+					 qos_aggr->rx_aggregation_size,
+					 WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU);
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("failed to set aggregation sizes(status = %d)",
+			 status);
 
-	ret = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size);
-	if (QDF_IS_STATUS_ERROR(ret))
-		WMA_LOGE("failed to set aggregation sizes(err=%d)", ret);
+	if (wma_vdev_uses_self_peer(vdev_mlme->mgmt.generic.type,
+				    vdev_mlme->mgmt.generic.subtype)) {
+		ret = wma_create_peer(wma_handle, txrx_pdev, txrx_vdev_handle,
+				      vdev->vdev_mlme.macaddr,
+				      WMI_PEER_TYPE_DEFAULT,
+				      vdev_id, false);
+		if (QDF_IS_STATUS_ERROR(ret)) {
+			WMA_LOGE("%s: Failed to create peer", __func__);
+			goto end;
+		}
+	} else if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA) {
+		status = wma_set_tx_rx_aggr_size_per_ac(
+					wma_handle, vdev_id,
+					qos_aggr,
+					WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU);
 
-	tx_rx_aggregation_size.tx_aggregation_size_be =
-				self_sta_req->tx_aggregation_size_be;
-	tx_rx_aggregation_size.tx_aggregation_size_bk =
-				self_sta_req->tx_aggregation_size_bk;
-	tx_rx_aggregation_size.tx_aggregation_size_vi =
-				self_sta_req->tx_aggregation_size_vi;
-	tx_rx_aggregation_size.tx_aggregation_size_vo =
-				self_sta_req->tx_aggregation_size_vo;
+		if (QDF_IS_STATUS_ERROR(status))
+			WMA_LOGE("failed to set aggr size per ac(status = %d)",
+				 status);
 
-	tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_be =
-				self_sta_req->tx_aggr_sw_retry_threshold_be;
-	tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_bk =
-				self_sta_req->tx_aggr_sw_retry_threshold_bk;
-	tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_vi =
-				self_sta_req->tx_aggr_sw_retry_threshold_vi;
-	tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_vo =
-				self_sta_req->tx_aggr_sw_retry_threshold_vo;
-	tx_sw_retry_threshold.tx_aggr_sw_retry_threshold =
-				self_sta_req->tx_aggr_sw_retry_threshold;
-
-	tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_be =
-				self_sta_req->tx_non_aggr_sw_retry_threshold_be;
-	tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_bk =
-				self_sta_req->tx_non_aggr_sw_retry_threshold_bk;
-	tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_vi =
-				self_sta_req->tx_non_aggr_sw_retry_threshold_vi;
-	tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_vo =
-				self_sta_req->tx_non_aggr_sw_retry_threshold_vo;
-	tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold =
-				self_sta_req->tx_non_aggr_sw_retry_threshold;
-
-	tx_sw_retry_threshold.vdev_id = self_sta_req->session_id;
-
-
-	switch (self_sta_req->type) {
-	case WMI_VDEV_TYPE_STA:
-		ret = wma_set_tx_rx_aggregation_size_per_ac(
-						&tx_rx_aggregation_size);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("set aggr sizes per ac(err=%d) failed", ret);
-
-		cfg_val = mac->mlme_cfg->sta.sta_keep_alive_period;
-		wma_set_sta_keep_alive(wma_handle,
-				       self_sta_req->session_id,
-				       SIR_KEEP_ALIVE_NULL_PKT,
-				       cfg_val, NULL, NULL, NULL);
+		wma_set_sta_keep_alive(
+				wma_handle, vdev_id,
+				SIR_KEEP_ALIVE_NULL_PKT,
+				mac->mlme_cfg->sta.sta_keep_alive_period,
+				NULL, NULL, NULL);
 
 		/* offload STA SA query related params to fwr */
 		if (wmi_service_enabled(wma_handle->wmi_handle,
-			wmi_service_sta_pmf_offload)) {
+					wmi_service_sta_pmf_offload)) {
 			wma_set_sta_sa_query_param(wma_handle, vdev_id);
 		}
 
-		vdev_id = tx_sw_retry_threshold.vdev_id;
-		retry = tx_sw_retry_threshold.tx_aggr_sw_retry_threshold;
-		if (retry) {
-			ret = wma_set_sw_retry_threshold(vdev_id, retry,
+		status = wma_set_sw_retry_threshold(
+					vdev_id,
+					qos_aggr->tx_aggr_sw_retry_threshold,
 					WMI_PDEV_PARAM_AGG_SW_RETRY_TH);
-			if (QDF_IS_STATUS_ERROR(ret))
-				WMA_LOGE("failed set agg retry threshold");
-		}
+		if (QDF_IS_STATUS_ERROR(status))
+			WMA_LOGE("failed to set sw retry threshold (status = %d)",
+				 status);
 
-		retry = tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold;
-		if (retry) {
-			ret = wma_set_sw_retry_threshold(vdev_id, retry,
-					WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH);
-			if (QDF_IS_STATUS_ERROR(ret))
-				WMA_LOGE("failed set non-agg retry threshold");
-		}
+		status = wma_set_sw_retry_threshold(
+				vdev_id,
+				qos_aggr->tx_non_aggr_sw_retry_threshold,
+				WMI_PDEV_PARAM_AGG_SW_RETRY_TH);
+		if (QDF_IS_STATUS_ERROR(status))
+			WMA_LOGE("failed to set sw retry threshold tx non aggr(status = %d)",
+				 status);
 
-		ret = wma_set_sw_retry_threshold_per_ac(wma_handle,
-						&tx_sw_retry_threshold);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("failed to set retry threshold(err=%d)", ret);
-		break;
-	}
+		status = wma_set_sw_retry_threshold_per_ac(wma_handle, vdev_id,
+							   qos_aggr);
+		if (QDF_IS_STATUS_ERROR(status))
+			WMA_LOGE("failed to set sw retry threshold per ac(status = %d)",
+				 status);
 
-	wma_handle->interfaces[vdev_id].type = self_sta_req->type;
-	wma_handle->interfaces[vdev_id].sub_type = self_sta_req->sub_type;
-	qdf_atomic_init(&wma_handle->interfaces[vdev_id].bss_status);
-
-	if (wma_vdev_uses_self_peer(self_sta_req->type,
-				    self_sta_req->sub_type)) {
-		ret = wma_create_peer(wma_handle, txrx_pdev, txrx_vdev_handle,
-				      self_sta_req->self_mac_addr,
-				      WMI_PEER_TYPE_DEFAULT,
-				      self_sta_req->session_id, false);
-		if (QDF_IS_STATUS_ERROR(ret)) {
-			WMA_LOGE("%s: Failed to create peer", __func__);
-			status = QDF_STATUS_E_FAILURE;
-			wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
-			wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
-						     self_sta_req->session_id);
-			wma_handle->interfaces[vdev_id].vdev_active = false;
-			wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
-			wma_handle->interfaces[vdev_id].vdev = NULL;
-			txrx_vdev_handle = NULL;
-			goto end;
-		}
-	} else if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
 		obj_peer = wma_create_objmgr_peer(wma_handle, vdev_id,
-						  self_sta_req->self_mac_addr,
+						  vdev->vdev_mlme.macaddr,
 						  WMI_PEER_TYPE_DEFAULT);
 		if (!obj_peer) {
 			WMA_LOGE("%s: Failed to create obj mgr peer for self sta",
 				 __func__);
-			status = QDF_STATUS_E_FAILURE;
-			wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
-						     self_sta_req->session_id);
-			wma_handle->interfaces[vdev_id].vdev_active = false;
-			wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
-			wma_handle->interfaces[vdev_id].vdev = NULL;
-			wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
-			txrx_vdev_handle = NULL;
 			goto end;
 		}
 	}
 
 	WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d",
-		 self_sta_req->pkt_err_disconn_th);
-	ret = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
-				 WMI_VDEV_PARAM_DISCONNECT_TH,
-				 self_sta_req->pkt_err_disconn_th);
-	if (ret)
-		WMA_LOGE("Failed to set WMI_VDEV_PARAM_DISCONNECT_TH");
+		 mac->mlme_cfg->gen.dropped_pkt_disconnect_thresh);
+	status  = wma_vdev_set_param(
+			wma_handle->wmi_handle, vdev_id,
+			WMI_VDEV_PARAM_DISCONNECT_TH,
+			mac->mlme_cfg->gen.dropped_pkt_disconnect_thresh);
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("failed to set DISCONNECT_TH(status = %d)", status);
 
-	ret = wma_vdev_set_param(wma_handle->wmi_handle,
-				self_sta_req->session_id,
-				WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
-				mac->roam.configParam.mcc_rts_cts_prot_enable);
-	if (QDF_IS_STATUS_ERROR(ret))
-		WMA_LOGE("Failed to set WMI VDEV MCC_RTSCTS_PROTECTION_ENABLE");
+	status = wma_vdev_set_param(
+			wma_handle->wmi_handle,
+			vdev_id,
+			WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
+			mac->roam.configParam.mcc_rts_cts_prot_enable);
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("failed to set MCC_RTSCTS_PROTECTION_ENABLE(status = %d)",
+			 status);
 
-	ret = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id,
+	status = wma_vdev_set_param(
+			wma_handle->wmi_handle, vdev_id,
 			WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE,
 			mac->roam.configParam.mcc_bcast_prob_resp_enable);
-	if (QDF_IS_STATUS_ERROR(ret))
-		WMA_LOGE("Failed to set WMI VDEV MCC_BROADCAST_PROBE_ENABLE");
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("failed to set MCC_BROADCAST_PROBE_ENABLE(status = %d)",
+			 status);
 
 	if (wlan_mlme_get_rts_threshold(mac->psoc,
 					&cfg_val) ==
 					QDF_STATUS_SUCCESS) {
-		ret = wma_vdev_set_param(wma_handle->wmi_handle,
-					self_sta_req->session_id,
-					WMI_VDEV_PARAM_RTS_THRESHOLD,
-					cfg_val);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("Failed to set WMI_VDEV_PARAM_RTS_THRESHOLD");
+		status = wma_vdev_set_param(wma_handle->wmi_handle,
+					    vdev_id,
+					    WMI_VDEV_PARAM_RTS_THRESHOLD,
+					    cfg_val);
+		if (QDF_IS_STATUS_ERROR(status))
+			WMA_LOGE("failed to set RTS_THRESHOLD(status = %d)",
+				 status);
 	} else {
 		WMA_LOGE("Fail to get val for rts threshold, leave unchanged");
 	}
@@ -2956,27 +2816,23 @@
 	if (wlan_mlme_get_frag_threshold(mac->psoc,
 					 &cfg_val) ==
 					 QDF_STATUS_SUCCESS) {
-		ret = wma_vdev_set_param(wma_handle->wmi_handle,
-					self_sta_req->session_id,
-					WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
-					cfg_val);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("Failed to set WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD");
+		wma_vdev_set_param(wma_handle->wmi_handle,
+				   vdev_id,
+				   WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
+				   cfg_val);
 	} else {
 		WMA_LOGE("Fail to get val for frag threshold, leave unchanged");
 	}
 
 	ht_cap_info = &mac->mlme_cfg->ht_caps.ht_cap_info;
+	status = wma_vdev_set_param(wma_handle->wmi_handle,
+				    vdev_id,
+				    WMI_VDEV_PARAM_TX_STBC,
+				    ht_cap_info->tx_stbc);
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("failed to set TX_STBC(status = %d)", status);
 
-	ret = wma_vdev_set_param(wma_handle->wmi_handle,
-				 self_sta_req->session_id,
-				 WMI_VDEV_PARAM_TX_STBC,
-				 ht_cap_info->tx_stbc);
-	if (QDF_IS_STATUS_ERROR(ret))
-		WMA_LOGE("Failed to set WMI_VDEV_PARAM_TX_STBC");
-
-	wma_set_vdev_mgmt_rate(wma_handle, self_sta_req->session_id);
-
+	wma_set_vdev_mgmt_rate(wma_handle, vdev_id);
 	if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) {
 		/*
 		 * Enable / disable trigger access for a AP vdev's peers.
@@ -2994,39 +2850,40 @@
 		 *                 Rx OFDMA trigger receive & UL response
 		 *  6  | UL MUMIMO
 		 */
-		ret = wma_vdev_set_param(wma_handle->wmi_handle,
-					 self_sta_req->session_id,
-					 WMI_VDEV_PARAM_SET_HEMU_MODE,
-					 0x37);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("Failed to set WMI_VDEV_PARAM_SET_HEMU_MODE");
+		status = wma_vdev_set_param(wma_handle->wmi_handle,
+					    vdev_id,
+					    WMI_VDEV_PARAM_SET_HEMU_MODE,
+					    0x37);
+		if (QDF_IS_STATUS_ERROR(status))
+			WMA_LOGE("failed to set HEMU_MODE(status = %d)",
+				 status);
 	}
 
 	/* Initialize roaming offload state */
-	if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
-	    (self_sta_req->sub_type == 0)) {
+	if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
+	    vdev_mlme->mgmt.generic.subtype == 0) {
 		/* Pass down enable/disable bcast probe rsp to FW */
 		ret = wma_vdev_set_param(
 				wma_handle->wmi_handle,
-				self_sta_req->session_id,
+				vdev_id,
 				WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
-				self_sta_req->enable_bcast_probe_rsp);
+				mac->mlme_cfg->oce.enable_bcast_probe_rsp);
 		if (QDF_IS_STATUS_ERROR(ret))
 			WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE");
 
 		/* Pass down the FILS max channel guard time to FW */
 		ret = wma_vdev_set_param(
 				wma_handle->wmi_handle,
-				self_sta_req->session_id,
+				vdev_id,
 				WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
-				self_sta_req->fils_max_chan_guard_time);
+				mac->mlme_cfg->sta.fils_max_chan_guard_time);
 		if (QDF_IS_STATUS_ERROR(ret))
 			WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME");
 
 		/* Pass down the Probe Request tx delay(in ms) to FW */
 		ret = wma_vdev_set_param(
 				wma_handle->wmi_handle,
-				self_sta_req->session_id,
+				vdev_id,
 				WMI_VDEV_PARAM_PROBE_DELAY,
 				PROBE_REQ_TX_DELAY);
 		if (QDF_IS_STATUS_ERROR(ret))
@@ -3035,37 +2892,35 @@
 		/* Pass down the probe request tx time gap(in ms) to FW */
 		ret = wma_vdev_set_param(
 				wma_handle->wmi_handle,
-				self_sta_req->session_id,
+				vdev_id,
 				WMI_VDEV_PARAM_REPEAT_PROBE_TIME,
 				PROBE_REQ_TX_TIME_GAP);
 		if (QDF_IS_STATUS_ERROR(ret))
 			WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME");
 	}
 
-	if ((self_sta_req->type == WMI_VDEV_TYPE_STA ||
-	     self_sta_req->type == WMI_VDEV_TYPE_AP) &&
-	    self_sta_req->sub_type == 0) {
-		ret = wma_vdev_set_param(wma_handle->wmi_handle,
-				     self_sta_req->session_id,
-				     WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
-				     self_sta_req->oce_feature_bitmap);
-		if (QDF_IS_STATUS_ERROR(ret))
-			WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES");
+	if ((vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA ||
+	     vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_AP) &&
+	     vdev_mlme->mgmt.generic.subtype == 0) {
+		wma_vdev_set_param(wma_handle->wmi_handle,
+				   vdev_id,
+				   WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
+				   mac->mlme_cfg->oce.feature_bitmap);
 	}
 
 	/* Initialize BMISS parameters */
-	if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
-	    (self_sta_req->sub_type == 0))
+	if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
+	    vdev_mlme->mgmt.generic.subtype == 0)
 		wma_roam_scan_bmiss_cnt(wma_handle,
 		mac->mlme_cfg->lfr.roam_bmiss_first_bcnt,
 		mac->mlme_cfg->lfr.roam_bmiss_final_bcnt,
-		self_sta_req->session_id);
+		vdev_id);
 
 	if (policy_mgr_get_mcc_adaptive_sch(mac->psoc,
 					    &mcc_adapt_sch) ==
 	    QDF_STATUS_SUCCESS) {
 		WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d",
-			__func__, mcc_adapt_sch);
+			 __func__, mcc_adapt_sch);
 		ret =
 		wma_set_enable_disable_mcc_adaptive_scheduler(mcc_adapt_sch);
 		if (QDF_IS_STATUS_ERROR(ret)) {
@@ -3075,66 +2930,59 @@
 		WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged");
 	}
 
-	if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
-	    (ucfg_pmo_is_apf_enabled(wma_handle->psoc))) {
+	if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&
+	    ucfg_pmo_is_apf_enabled(wma_handle->psoc)) {
 		ret = wma_config_active_apf_mode(wma_handle,
-						 self_sta_req->session_id);
+						 vdev_id);
 		if (QDF_IS_STATUS_ERROR(ret))
 			WMA_LOGE("Failed to configure active APF mode");
 	}
 
+	cdp_data_tx_cb_set(soc, txrx_vdev_handle,
+			   wma_data_tx_ack_comp_hdlr,
+			   wma_handle);
+
+	return QDF_STATUS_SUCCESS;
+
 end:
-	self_sta_req->status = status;
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
+	wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
+	wma_handle->interfaces[vdev_id].vdev_active = false;
+	txrx_vdev_handle = NULL;
 
-#ifdef QCA_IBSS_SUPPORT
-	if (generateRsp)
-#endif
-	{
-		sme_msg.type = eWNI_SME_ADD_STA_SELF_RSP;
-		sme_msg.bodyptr = self_sta_req;
-		sme_msg.bodyval = 0;
-
-		status = scheduler_post_message(QDF_MODULE_ID_WMA,
-						QDF_MODULE_ID_SME,
-						QDF_MODULE_ID_SME, &sme_msg);
-		if (!QDF_IS_STATUS_SUCCESS(status)) {
-			WMA_LOGE("Failed to post eWNI_SME_ADD_STA_SELF_RSP");
-			qdf_mem_free(self_sta_req);
-		}
-	}
-	return txrx_vdev_handle;
+	return QDF_STATUS_E_FAILURE;
 }
 
-uint32_t wma_get_bcn_rate_code(uint16_t rate)
+enum mlme_bcn_tx_rate_code wma_get_bcn_rate_code(uint16_t rate)
 {
 	/* rate in multiples of 100 Kbps */
 	switch (rate) {
 	case WMA_BEACON_TX_RATE_1_M:
-		return WMI_BCN_TX_RATE_CODE_1_M;
+		return MLME_BCN_TX_RATE_CODE_1_M;
 	case WMA_BEACON_TX_RATE_2_M:
-		return WMI_BCN_TX_RATE_CODE_2_M;
+		return MLME_BCN_TX_RATE_CODE_2_M;
 	case WMA_BEACON_TX_RATE_5_5_M:
-		return WMI_BCN_TX_RATE_CODE_5_5_M;
+		return MLME_BCN_TX_RATE_CODE_5_5_M;
 	case WMA_BEACON_TX_RATE_11_M:
-		return WMI_BCN_TX_RATE_CODE_11M;
+		return MLME_BCN_TX_RATE_CODE_11M;
 	case WMA_BEACON_TX_RATE_6_M:
-		return WMI_BCN_TX_RATE_CODE_6_M;
+		return MLME_BCN_TX_RATE_CODE_6_M;
 	case WMA_BEACON_TX_RATE_9_M:
-		return WMI_BCN_TX_RATE_CODE_9_M;
+		return MLME_BCN_TX_RATE_CODE_9_M;
 	case WMA_BEACON_TX_RATE_12_M:
-		return WMI_BCN_TX_RATE_CODE_12_M;
+		return MLME_BCN_TX_RATE_CODE_12_M;
 	case WMA_BEACON_TX_RATE_18_M:
-		return WMI_BCN_TX_RATE_CODE_18_M;
+		return MLME_BCN_TX_RATE_CODE_18_M;
 	case WMA_BEACON_TX_RATE_24_M:
-		return WMI_BCN_TX_RATE_CODE_24_M;
+		return MLME_BCN_TX_RATE_CODE_24_M;
 	case WMA_BEACON_TX_RATE_36_M:
-		return WMI_BCN_TX_RATE_CODE_36_M;
+		return MLME_BCN_TX_RATE_CODE_36_M;
 	case WMA_BEACON_TX_RATE_48_M:
-		return WMI_BCN_TX_RATE_CODE_48_M;
+		return MLME_BCN_TX_RATE_CODE_48_M;
 	case WMA_BEACON_TX_RATE_54_M:
-		return WMI_BCN_TX_RATE_CODE_54_M;
+		return MLME_BCN_TX_RATE_CODE_54_M;
 	default:
-		return WMI_BCN_TX_RATE_CODE_1_M;
+		return MLME_BCN_TX_RATE_CODE_1_M;
 	}
 }
 
@@ -3252,7 +3100,7 @@
 		 req->vdev_id);
 	params.vdev_id = req->vdev_id;
 
-	intr[params.vdev_id].chanmode = params.channel.phy_mode;
+	intr[params.vdev_id].chanmode = chan_mode;
 	intr[params.vdev_id].ht_capable = req->ht_capable;
 	intr[params.vdev_id].vht_capable = req->vht_capable;
 	intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
@@ -3314,7 +3162,7 @@
 			params.channel.dfs_set = true;
 	}
 
-	params.beacon_intval = req->beacon_intval;
+	params.beacon_interval = req->beacon_intval;
 	params.dtim_period = req->dtim_period;
 
 	if (req->beacon_tx_rate) {
@@ -3339,7 +3187,7 @@
 
 	/* TODO: Handle regulatory class, max antenna */
 	if (!isRestart) {
-		params.beacon_intval = req->beacon_intval;
+		params.beacon_interval = req->beacon_intval;
 		params.dtim_period = req->dtim_period;
 
 		/* Copy the SSID */
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index 6f678cb..933cef0 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -4247,16 +4247,10 @@
 }
 #endif /* FEATURE_WLAN_APF */
 
-/**
- * wma_set_tx_rx_aggregation_size() - sets tx rx aggregation sizes
- * @tx_rx_aggregation_size: aggregation size parameters
- *
- * This function sets tx rx aggregation sizes
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS wma_set_tx_rx_aggregation_size(
-	struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
+QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id,
+				   uint32_t tx_size,
+				   uint32_t rx_size,
+				   wmi_vdev_custom_aggr_type_t aggr_type)
 {
 	tp_wma_handle wma_handle;
 	wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
@@ -4267,10 +4261,6 @@
 
 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
 
-	if (!tx_rx_aggregation_size) {
-		WMA_LOGE("%s: invalid pointer", __func__);
-		return QDF_STATUS_E_INVAL;
-	}
 
 	if (!wma_handle) {
 		WMA_LOGE("%s: WMA context is invald!", __func__);
@@ -4291,12 +4281,11 @@
 		WMITLV_GET_STRUCT_TLVLEN(
 			wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
 
-	cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
-	cmd->tx_aggr_size = tx_rx_aggregation_size->tx_aggregation_size;
-	cmd->rx_aggr_size = tx_rx_aggregation_size->rx_aggregation_size;
+	cmd->vdev_id = vdev_id;
+	cmd->tx_aggr_size = tx_size;
+	cmd->rx_aggr_size = rx_size;
 	/* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
-	if (tx_rx_aggregation_size->aggr_type ==
-	    WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
+	if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
 		cmd->enable_bitmap |= 0x04;
 
 	WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d",
@@ -4313,10 +4302,11 @@
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac(
-	struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
+QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle,
+					  uint8_t vdev_id,
+					  struct wlan_mlme_qos *qos_aggr,
+					  wmi_vdev_custom_aggr_type_t aggr_type)
 {
-	tp_wma_handle wma_handle;
 	wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
 	int32_t len;
 	wmi_buf_t buf;
@@ -4324,23 +4314,17 @@
 	int ret;
 	int queue_num;
 	uint32_t tx_aggr_size[4];
-
-	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
-
-	if (!tx_rx_aggregation_size) {
-		WMA_LOGE("%s: invalid pointer", __func__);
-		return QDF_STATUS_E_INVAL;
-	}
+	tp_wma_handle wma_handle = (tp_wma_handle)handle;
 
 	if (!wma_handle) {
 		WMA_LOGE("%s: WMA context is invald!", __func__);
 		return QDF_STATUS_E_INVAL;
 	}
 
-	tx_aggr_size[0] = tx_rx_aggregation_size->tx_aggregation_size_be;
-	tx_aggr_size[1] = tx_rx_aggregation_size->tx_aggregation_size_bk;
-	tx_aggr_size[2] = tx_rx_aggregation_size->tx_aggregation_size_vi;
-	tx_aggr_size[3] = tx_rx_aggregation_size->tx_aggregation_size_vo;
+	tx_aggr_size[0] = qos_aggr->tx_aggregation_size_be;
+	tx_aggr_size[1] = qos_aggr->tx_aggregation_size_bk;
+	tx_aggr_size[2] = qos_aggr->tx_aggregation_size_vi;
+	tx_aggr_size[3] = qos_aggr->tx_aggregation_size_vo;
 
 	for (queue_num = 0; queue_num < 4; queue_num++) {
 		if (tx_aggr_size[queue_num] == 0)
@@ -4360,16 +4344,13 @@
 			       WMITLV_GET_STRUCT_TLVLEN(
 					wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
 
-		cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
-		cmd->rx_aggr_size =
-				  tx_rx_aggregation_size->rx_aggregation_size;
-
+		cmd->vdev_id = vdev_id;
+		cmd->rx_aggr_size = qos_aggr->rx_aggregation_size;
 		cmd->tx_aggr_size = tx_aggr_size[queue_num];
 		/* bit 5: tx_ac_enable, if set, ac bitmap is valid. */
 		cmd->enable_bitmap = 0x20 | queue_num;
 		/* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
-		if (tx_rx_aggregation_size->aggr_type ==
-		    WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
+		if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
 			cmd->enable_bitmap |= 0x04;
 
 		WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d",
@@ -4435,23 +4416,15 @@
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS wma_set_sw_retry_threshold_per_ac(
-	WMA_HANDLE handle,
-	struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold)
+QDF_STATUS wma_set_sw_retry_threshold_per_ac(WMA_HANDLE handle,
+					     uint8_t vdev_id,
+					     struct wlan_mlme_qos *qos_aggr)
 {
 	QDF_STATUS ret;
-	tp_wma_handle wma_handle;
-	uint8_t vdev_id;
 	int retry_type, queue_num;
 	uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX];
 	uint32_t sw_retry;
-
-	wma_handle = (tp_wma_handle)handle;
-
-	if (!tx_sw_retry_threshold) {
-		wma_err("%s: invalid pointer", __func__);
-		return QDF_STATUS_E_INVAL;
-	}
+	tp_wma_handle wma_handle = (tp_wma_handle)handle;
 
 	if (!wma_handle) {
 		wma_err("%s: WMA context is invalid!", __func__);
@@ -4459,22 +4432,22 @@
 	}
 
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] =
-		tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be;
+		qos_aggr->tx_aggr_sw_retry_threshold_be;
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] =
-		tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk;
+		qos_aggr->tx_aggr_sw_retry_threshold_bk;
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] =
-		tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi;
+		qos_aggr->tx_aggr_sw_retry_threshold_vi;
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] =
-		tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vo;
+		qos_aggr->tx_aggr_sw_retry_threshold_vo;
 
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] =
-		tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_be;
+		qos_aggr->tx_non_aggr_sw_retry_threshold_be;
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] =
-		tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_bk;
+		qos_aggr->tx_non_aggr_sw_retry_threshold_bk;
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] =
-		tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vi;
+		qos_aggr->tx_non_aggr_sw_retry_threshold_vi;
 	tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] =
-		tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vo;
+		qos_aggr->tx_non_aggr_sw_retry_threshold_vo;
 
 	retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR;
 	while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) {
@@ -4482,7 +4455,6 @@
 			if (tx_sw_retry[retry_type][queue_num] == 0)
 				continue;
 
-			vdev_id = tx_sw_retry_threshold->vdev_id;
 			sw_retry = tx_sw_retry[retry_type][queue_num];
 			ret = wma_set_sw_retry_by_qos(wma_handle,
 						      vdev_id,
@@ -4522,6 +4494,7 @@
 
 	return QDF_STATUS_SUCCESS;
 }
+
 /**
  * wma_process_fw_test_cmd() - send unit test command to fw.
  * @handle: wma handle
@@ -4972,6 +4945,8 @@
 	struct mac_context *mac = NULL;
 	struct lim_channel_status *channel_status;
 	bool snr_monitor_enabled;
+	struct wlan_objmgr_vdev *vdev;
+	enum QDF_OPMODE mode;
 
 	WMA_LOGD("%s: Enter", __func__);
 
@@ -4983,21 +4958,20 @@
 		return -EINVAL;
 	}
 
+	param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
+	if (!param_buf)  {
+		WMA_LOGE("Invalid chan info event buffer");
+		return -EINVAL;
+	}
+	event = param_buf->fixed_param;
+	if (!event) {
+		WMA_LOGA("%s: Invalid fixed param", __func__);
+		return -EINVAL;
+	}
+
 	snr_monitor_enabled = wlan_scan_is_snr_monitor_enabled(mac->psoc);
 	WMA_LOGD("%s: monitor:%d", __func__, snr_monitor_enabled);
 	if (snr_monitor_enabled && mac->chan_info_cb) {
-		param_buf =
-			(WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
-		if (!param_buf) {
-			WMA_LOGA("%s: Invalid chan info event", __func__);
-			return -EINVAL;
-		}
-
-		event = param_buf->fixed_param;
-		if (!event) {
-			WMA_LOGA("%s: Invalid fixed param", __func__);
-			return -EINVAL;
-		}
 		buf.tx_frame_count = event->tx_frame_cnt;
 		buf.clock_freq = event->mac_clk_mhz;
 		buf.cmd_flag = event->cmd_flags;
@@ -5008,14 +4982,19 @@
 		mac->chan_info_cb(&buf);
 	}
 
-	if (mac->sap.acs_with_more_param &&
-	    mac->sme.curr_device_mode == QDF_SAP_MODE) {
-		param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *) event_buf;
-		if (!param_buf)  {
-			WMA_LOGE("Invalid chan info event buffer");
-			return -EINVAL;
-		}
-		event = param_buf->fixed_param;
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, event->vdev_id,
+						    WLAN_LEGACY_WMA_ID);
+
+	if (!vdev) {
+		WMA_LOGE("%s: vdev is NULL for vdev %d",
+			 __func__, event->vdev_id);
+		return -EINVAL;
+	}
+	mode = wlan_vdev_mlme_get_opmode(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
+	WMA_LOGD("Vdevid %d mode %d", event->vdev_id, mode);
+
+	if (mac->sap.acs_with_more_param && mode == QDF_SAP_MODE) {
 		channel_status = qdf_mem_malloc(sizeof(*channel_status));
 		if (!channel_status)
 			return -ENOMEM;
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index bae4e26..42ebf6a 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -954,10 +954,8 @@
 	struct pdev_params pdev_param;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct target_psoc_info *tgt_hdl;
-	struct sir_set_tx_rx_aggregation_size aggr;
 
 	WMA_LOGD("wmihandle %pK", wma->wmi_handle);
-	qdf_mem_zero(&aggr, sizeof(aggr));
 
 	if (!mac) {
 		WMA_LOGE("%s: Failed to get mac", __func__);
@@ -1027,6 +1025,8 @@
 	{
 		struct cdp_vdev *vdev = NULL;
 		struct wma_txrx_node *intr = wma->interfaces;
+		wmi_vdev_custom_aggr_type_t aggr_type =
+			WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
 
 		vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
 		if (!vdev) {
@@ -1055,18 +1055,14 @@
 					intr[privcmd->param_vdev_id].config.
 						ampdu = privcmd->param_value;
 
-				aggr.aggr_type =
+				aggr_type =
 					WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
-			} else {
-				aggr.aggr_type =
-					WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
 			}
 
-			aggr.vdev_id = vid;
-			aggr.tx_aggregation_size = privcmd->param_value;
-			aggr.rx_aggregation_size = privcmd->param_value;
-
-			ret = wma_set_tx_rx_aggregation_size(&aggr);
+			ret = wma_set_tx_rx_aggr_size(vid,
+						      privcmd->param_value,
+						      privcmd->param_value,
+						      aggr_type);
 			if (QDF_IS_STATUS_ERROR(ret)) {
 				WMA_LOGE("set_aggr_size failed ret %d", ret);
 				return;
@@ -8413,9 +8409,6 @@
 {
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	tp_wma_handle wma_handle;
-	struct cdp_vdev *txrx_vdev_handle = NULL;
-
-	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
 	if (!msg) {
 		WMA_LOGE("msg is NULL");
@@ -8454,26 +8447,6 @@
 		wma_process_tsm_stats_req(wma_handle, (void *)msg->bodyptr);
 		break;
 #endif /* FEATURE_WLAN_ESE */
-	case WMA_ADD_STA_SELF_REQ:
-		txrx_vdev_handle =
-			wma_vdev_attach(wma_handle,
-				(struct add_sta_self_params *) msg->
-				bodyptr, 1);
-		if (!txrx_vdev_handle) {
-			WMA_LOGE("Failed to attach vdev");
-		} else {
-			/* Register with TxRx Module for Data Ack Complete Cb */
-			if (soc) {
-				cdp_data_tx_cb_set(soc, txrx_vdev_handle,
-						wma_data_tx_ack_comp_hdlr,
-						wma_handle);
-			} else {
-				WMA_LOGE("%s: SOC context is NULL", __func__);
-				qdf_status = QDF_STATUS_E_FAILURE;
-				goto end;
-			}
-		}
-		break;
 	case WMA_DEL_STA_SELF_REQ:
 		wma_vdev_detach(wma_handle,
 				(struct del_sta_self_params *) msg->bodyptr, 1);
diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c
index 4d4a5c4..3939f73 100644
--- a/core/wma/src/wma_power.c
+++ b/core/wma/src/wma_power.c
@@ -116,7 +116,7 @@
 	iface = &wma->interfaces[vdev_id];
 
 	sta_ps_param.vdev_id = vdev_id;
-	sta_ps_param.param = param;
+	sta_ps_param.param_id = param;
 	sta_ps_param.value = value;
 	status = wmi_unified_sta_ps_cmd_send(wmi_handle, &sta_ps_param);
 	if (QDF_IS_STATUS_ERROR(status))