qcacmn: Define VDEV MLME component object

This change defines VDEV MLME object, and registers with object manager to
be notified on creation/destroy, and also initializes MLME SM

Change-Id: I75bb7de7326e4bbed21ef9653427c4e0694c3ffc
CRs-Fixed: 2307722
diff --git a/init_deinit/dispatcher/src/dispatcher_init_deinit.c b/init_deinit/dispatcher/src/dispatcher_init_deinit.c
index 2e6a175..5c44533 100644
--- a/init_deinit/dispatcher/src/dispatcher_init_deinit.c
+++ b/init_deinit/dispatcher/src/dispatcher_init_deinit.c
@@ -27,6 +27,7 @@
 #include <wlan_ftm_init_deinit_api.h>
 #include <wlan_mgmt_txrx_utils_api.h>
 #include <wlan_serialization_api.h>
+#include <wlan_vdev_mlme_main.h>
 #ifdef WLAN_POLICY_MGR_ENABLE
 #include "wlan_policy_mgr_api.h"
 #endif
@@ -973,6 +974,9 @@
 	if (QDF_IS_STATUS_ERROR(cfg_dispatcher_init()))
 		goto cfg_init_fail;
 
+	if (QDF_STATUS_SUCCESS != wlan_vdev_mlme_init())
+		goto vdev_mlme_init_fail;
+
 	/*
 	 * scheduler INIT has to be the last as each component's
 	 * initialization has to happen first and then at the end
@@ -984,6 +988,8 @@
 	return QDF_STATUS_SUCCESS;
 
 scheduler_init_fail:
+	wlan_vdev_mlme_deinit();
+vdev_mlme_init_fail:
 	cfg_dispatcher_deinit();
 cfg_init_fail:
 	dispatcher_ftm_deinit();
@@ -1041,6 +1047,8 @@
 
 	QDF_BUG(QDF_STATUS_SUCCESS == scheduler_deinit());
 
+	QDF_BUG(QDF_STATUS_SUCCESS == wlan_vdev_mlme_deinit());
+
 	status = cfg_dispatcher_deinit();
 	QDF_BUG(QDF_IS_STATUS_SUCCESS(status));
 
diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h
index 3fe5381..e3e5a60 100644
--- a/qdf/inc/qdf_types.h
+++ b/qdf/inc/qdf_types.h
@@ -361,6 +361,7 @@
  * @QDF_MODULE_ID_MBSSIE: MBSS IE ID
  * @QDF_MODULE_ID_FWOL: FW Offload module ID
  * @QDF_MODULE_ID_SM_ENGINE: SM engine module ID
+ * @QDF_MODULE_ID_CMN_MLME: CMN MLME module ID
  * @QDF_MODULE_ID_ANY: anything
  * @QDF_MODULE_ID_MAX: Max place holder module ID
  */
@@ -469,6 +470,7 @@
 	QDF_MODULE_ID_MBSSIE,
 	QDF_MODULE_ID_FWOL,
 	QDF_MODULE_ID_SM_ENGINE,
+	QDF_MODULE_ID_CMN_MLME,
 	QDF_MODULE_ID_ANY,
 	QDF_MODULE_ID_MAX,
 } QDF_MODULE_ID;
diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c
index fbd5c6a..a379d92 100644
--- a/qdf/linux/src/qdf_trace.c
+++ b/qdf/linux/src/qdf_trace.c
@@ -2835,6 +2835,7 @@
 	[QDF_MODULE_ID_MBSSIE] = {"MBSSIE"},
 	[QDF_MODULE_ID_FWOL] = {"fwol"},
 	[QDF_MODULE_ID_SM_ENGINE] = {"SM_ENGINE"},
+	[QDF_MODULE_ID_CMN_MLME] = {"CMN_MLME"},
 	[QDF_MODULE_ID_ANY] = {"ANY"},
 };
 qdf_export_symbol(g_qdf_category_name);
@@ -3285,6 +3286,7 @@
 		[QDF_MODULE_ID_MBSSIE] = QDF_TRACE_LEVEL_INFO,
 		[QDF_MODULE_ID_FWOL] = QDF_TRACE_LEVEL_NONE,
 		[QDF_MODULE_ID_SM_ENGINE] = QDF_TRACE_LEVEL_DEBUG,
+		[QDF_MODULE_ID_CMN_MLME] = QDF_TRACE_LEVEL_INFO,
 		[QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_INFO,
 	};
 
diff --git a/spectral/Kbuild b/spectral/Kbuild
index a37d209..a30b951 100644
--- a/spectral/Kbuild
+++ b/spectral/Kbuild
@@ -104,6 +104,8 @@
         -I$(obj)/$(DEPTH)/cmn_dev/umac/cmn_services/serialization/core/inc \
         -I$(obj)/$(DEPTH)/cmn_dev/umac/regulatory/dispatcher/inc \
         -I$(obj)/$(DEPTH)/cmn_dev/target_if/regulatory/inc \
+        -I$(obj)/$(DEPTH)/cmn_dev/umac/mlme/mlme_objmgr/dispatcher/inc/ \
+        -I$(obj)/$(DEPTH)/cmn_dev/umac/mlme/vdev_mgr/dispatcher/inc \
 
 PERF_PWR_OFFLOAD_INC += -I$(PERF_PWR_OFFLOAD_DIR_PATH)/wlan/include \
  -I$(PERF_PWR_OFFLOAD_DIR_PATH)/wlan/ath_pktlog/include \
diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h
index bc654a3..9deffaf 100644
--- a/umac/cmn_services/inc/wlan_cmn.h
+++ b/umac/cmn_services/inc/wlan_cmn.h
@@ -442,12 +442,14 @@
  * @WLAN_BAND_2_4_GHZ: 2.4 GHz band
  * @WLAN_BAND_5_GHZ: 5 GHz band
  * @WLAN_BAND_4_9_GHZ: 4.9 GHz band
+ * @WLAN_BAND_NUM_MAX: Max num band
  */
 enum wlan_band {
 	WLAN_BAND_ALL,
 	WLAN_BAND_2_4_GHZ,
 	WLAN_BAND_5_GHZ,
 	WLAN_BAND_4_9_GHZ,
+	WLAN_BAND_NUM_MAX,
 };
 
 /**
diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h
index 3dcdf17..e83980a 100644
--- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h
+++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h
@@ -137,9 +137,11 @@
  * struct wlan_objmgr_pdev_mlme - pdev object mlme structure
  * @pdev_op_flags:    PDEV operation flags, can be used to know the
  *                    operation status (deletion progress, etc)
+ * @mlme_register_ops: Call back to register MLME legacy APIs
  */
 struct wlan_objmgr_pdev_mlme {
 	uint32_t pdev_op_flags;
+	QDF_STATUS (*mlme_register_ops)(void *vdev_mlme);
 };
 
 /**
diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
index d8dad81..7c0e467 100644
--- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
+++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
@@ -284,7 +284,8 @@
 /**
  * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure
  * @vdev_opmode:        Opmode of VDEV
- * @mlme_state:         VDEV state
+ * @mlme_state:         VDEV MLME SM state
+ * @mlme_state:         VDEV MLME SM substate
  * @bss_chan:           BSS channel
  * @des_chan:           Desired channel, for STA Desired may not be used
  * @nss:                Num. Spatial streams
@@ -296,6 +297,7 @@
  * @vdev_feat_ext_caps: VDEV Extended feature caps
  * @max_rate:           MAX rate
  * @tx_mgmt_rate:       TX Mgmt. Rate
+ * @per_band_mgmt_rate: Per-band TX Mgmt. Rate
  * @vdev_op_flags:      Operation flags
  * @mataddr[]:          MAT address
  * @macaddr[]:          VDEV self MAC address
@@ -305,8 +307,9 @@
 struct wlan_objmgr_vdev_mlme {
 	enum QDF_OPMODE vdev_opmode;
 	enum wlan_vdev_state mlme_state;
-	struct wlan_channel  *bss_chan;   /* Define wlan_channel */
-	struct wlan_channel  *des_chan;  /*TODO ??? */
+	enum wlan_vdev_state mlme_substate;
+	struct wlan_channel *bss_chan;
+	struct wlan_channel *des_chan;
 	uint8_t nss;
 	uint8_t tx_chainmask;
 	uint8_t rx_chainmask;
@@ -316,6 +319,7 @@
 	uint32_t vdev_feat_ext_caps;
 	uint32_t max_rate;
 	uint32_t tx_mgmt_rate;
+	uint32_t per_band_mgmt_rate[WLAN_BAND_NUM_MAX];
 	uint32_t vdev_op_flags;
 	uint8_t  mataddr[QDF_MAC_ADDR_SIZE];
 	uint8_t  macaddr[QDF_MAC_ADDR_SIZE];
diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h
new file mode 100644
index 0000000..f82a547
--- /dev/null
+++ b/umac/mlme/include/wlan_vdev_mlme.h
@@ -0,0 +1,496 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Define VDEV MLME structure and APIs
+ */
+#ifndef _WLAN_VDEV_MLME_H_
+#define _WLAN_VDEV_MLME_H_
+
+struct vdev_mlme_obj;
+
+/**
+ * struct vdev_mlme_proto - VDEV protocol strucutre
+ */
+struct vdev_mlme_proto {
+};
+
+/**
+ * enum beacon_update_op - Beacon update op type
+ * @BEACON_INIT:      Initialize beacon
+ * @BEACON_REINIT:    Re-initialize beacon
+ * @BEACON_UPDATE:    Update dynamic fields of beacon
+ * @BEACON_CSA:       Enable CSA IE
+ * @BEACON_FREE:      Beacon buffer free
+ */
+enum beacon_update_op {
+	BEACON_INIT,
+	BEACON_REINIT,
+	BEACON_UPDATE,
+	BEACON_CSA,
+	BEACON_FREE,
+};
+
+/**
+ * struct vdev_mlme_ops - VDEV MLME operation callbacks strucutre
+ * @mlme_vdev_validate_basic_params:   callback to validate basic params of VDEV
+ * @mlme_vdev_reset_proto_params:      callback to Reset protocol params
+ * @mlme_vdev_start_send:              callback to initiate actions of VDEV MLME
+ *                                     start operation
+ * @mlme_vdev_restart_send:            callback to initiate actions of VDEV MLME
+ *                                     restart operation
+ * @mlme_vdev_start_continue:          callback to initiate operations on
+ *                                     LMAC/FW start response
+ * @mlme_vdev_up_send:                 callback to initiate actions of VDEV MLME
+ *                                     up operation
+ * @mlme_vdev_notify_up_complete:      callback to notify VDEV MLME on moving to
+ *                                     UP state
+ * @mlme_vdev_update_beacon:           callback to initiate beacon update
+ * @mlme_vdev_disconnect_peers:        callback to initiate disconnection of
+ *                                     peers
+ * @mlme_vdev_dfs_cac_timer_stop:      callback to stop the DFS CAC timer
+ * @mlme_vdev_stop_send:               callback to initiate actions of VDEV MLME
+ *                                     stop operation
+ * @mlme_vdev_stop_continue:           callback to initiate operations on
+ *                                     LMAC/FW stop response
+ * @mlme_vdev_bss_peer_delete_continue:callback to initiate operations on BSS
+ *                                     peer delete completion
+ * @mlme_vdev_down_send:               callback to initiate actions of VDEV MLME
+ *                                     down operation
+ * @mlme_vdev_legacy_hdl_create:       callback to invoke creation of legacy
+ *                                     vdev object
+ * @mlme_vdev_legacy_hdl_post_create:  callback to invoke post creation actions
+ *                                     of legacy vdev object
+ * @mlme_vdev_legacy_hdl_destroy:      callback to invoke destroy of legacy
+ *                                     vdev object
+ */
+struct vdev_mlme_ops {
+	QDF_STATUS (*mlme_vdev_validate_basic_params)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_reset_proto_params)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_start_send)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_restart_send)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_start_continue)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_up_send)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_notify_up_complete)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_update_beacon)(struct vdev_mlme_obj *vdev_mlme,
+					      enum beacon_update_op op);
+	QDF_STATUS (*mlme_vdev_disconnect_peers)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_dfs_cac_timer_stop)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_stop_send)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_stop_continue)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_bss_peer_delete_continue)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_down_send)(struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_notify_down_complete)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_legacy_hdl_create)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_legacy_hdl_post_create)(
+					struct vdev_mlme_obj *vdev_mlme);
+	QDF_STATUS (*mlme_vdev_legacy_hdl_destroy)(
+					struct vdev_mlme_obj *vdev_mlme);
+
+};
+
+/**
+ * struct vdev_mlme_obj - VDEV MLME component object
+ * @vdev_proto:           VDEV MLME proto substructure
+ * @sm_lock:              VDEV SM lock
+ * @sm_hdl:               VDEV SM handle
+ * @ops:                  VDEV MLME callback table
+ * @legacy_vdev_ptr:      VDEV MLME legacy pointer
+ */
+struct vdev_mlme_obj {
+	struct vdev_mlme_proto vdev_proto;
+#ifdef VDEV_SM_LOCK_SUPPORT
+	qdf_spinlock_t sm_lock;
+#endif
+	struct wlan_sm *sm_hdl;
+	struct wlan_objmgr_vdev *vdev;
+	struct vdev_mlme_ops *ops;
+	void *legacy_vdev_ptr;
+};
+
+/**
+ * mlme_vdev_validate_basic_params - Validate basic params
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API validate MLME VDEV basic parameters
+ *
+ * Return: SUCCESS on successful validation
+ *         FAILURE, if any parameter is not initialized
+ */
+static inline QDF_STATUS mlme_vdev_validate_basic_params(
+				struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_validate_basic_params)
+		ret = vdev_mlme->ops->mlme_vdev_validate_basic_params(
+								vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_reset_proto_params - Reset VDEV protocol params
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API resets the protocol params fo vdev
+ *
+ * Return: SUCCESS on successful reset
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_reset_proto_params(
+				struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_reset_proto_params)
+		ret = vdev_mlme->ops->mlme_vdev_reset_proto_params(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_start_send - Invokes VDEV start operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV start operation
+ *
+ * Return: SUCCESS on successful completion of start operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_send)
+		ret = vdev_mlme->ops->mlme_vdev_start_send(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_restart_send - Invokes VDEV restart operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV restart operation
+ *
+ * Return: SUCCESS on successful completion of restart operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_restart_send)
+		ret = vdev_mlme->ops->mlme_vdev_restart_send(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_start_continue - VDEV start response handling
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV start response actions
+ *
+ * Return: SUCCESS on successful completion of start response operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_start_continue(
+				struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_continue)
+		ret = vdev_mlme->ops->mlme_vdev_start_continue(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_up_send - VDEV up operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV up operations
+ *
+ * Return: SUCCESS on successful completion of up operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_up_send)
+		ret = vdev_mlme->ops->mlme_vdev_up_send(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_notify_up_complete - VDEV up state transition notification
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API notifies MLME on moving to UP state
+ *
+ * Return: SUCCESS on successful completion of up notification
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_notify_up_complete(
+			      struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_up_complete)
+		ret = vdev_mlme->ops->mlme_vdev_notify_up_complete(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_update_beacon - Updates beacon
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @op: beacon update type
+ *
+ * API updates/allocates/frees the beacon
+ *
+ * Return: SUCCESS on successful update of beacon
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_update_beacon(
+						struct vdev_mlme_obj *vdev_mlme,
+						enum beacon_update_op op)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_update_beacon)
+		ret = vdev_mlme->ops->mlme_vdev_update_beacon(vdev_mlme, op);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_disconnect_peers - Disconnect peers
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API trigger stations disconnection with AP VDEV or AP disconnection with STA
+ * VDEV
+ *
+ * Return: SUCCESS on successful invocation of station disconnection
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_disconnect_peers(
+			      struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_disconnect_peers)
+		ret = vdev_mlme->ops->mlme_vdev_disconnect_peers(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_dfs_cac_timer_stop - Stop CAC timer
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API stops the CAC timer through DFS API
+ *
+ * Return: SUCCESS on successful CAC timer stop
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop(
+			      struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop)
+		ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_stop_send - Invokes VDEV stop operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV stop operation
+ *
+ * Return: SUCCESS on successful completion of stop operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_send)
+		ret = vdev_mlme->ops->mlme_vdev_stop_send(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_stop_continue - VDEV stop response handling
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV stop response actions
+ *
+ * Return: SUCCESS on successful completion of stop response operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_stop_continue(
+						struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_continue)
+		ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_bss_peer_delete_continue - VDEV BSS peer delete complete
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV BSS peer delete complete operation
+ *
+ * Return: SUCCESS on successful completion of BSS peer delete handling
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_bss_peer_delete_continue(
+			      struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) &&
+	    vdev_mlme->ops->mlme_vdev_bss_peer_delete_continue)
+		ret = vdev_mlme->ops->mlme_vdev_bss_peer_delete_continue(
+								vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_down_send - VDEV down operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes VDEV down operation
+ *
+ * Return: SUCCESS on successful completion of VDEV down operation
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_down_send)
+		ret = vdev_mlme->ops->mlme_vdev_down_send(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_notify_down_complete - VDEV init state transition notification
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API notifies MLME on moving to INIT state
+ *
+ * Return: SUCCESS on successful completion of down notification
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_notify_down_complete(
+					struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_down_complete)
+		ret = vdev_mlme->ops->mlme_vdev_notify_down_complete(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_legacy_hdl_create - VDEV legacy pointer allocation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes legacy pointer allocation and initialization
+ *
+ * Return: SUCCESS on successful creation of legacy handle
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_legacy_hdl_create(
+			      struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_legacy_hdl_create)
+		ret = vdev_mlme->ops->mlme_vdev_legacy_hdl_create(vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_legacy_hdl_post_create - VDEV post legacy pointer allocation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes post legacy pointer allocation operation
+ *
+ * Return: SUCCESS on successful creation of legacy handle
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_legacy_hdl_post_create(
+				struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_legacy_hdl_post_create)
+		ret = vdev_mlme->ops->mlme_vdev_legacy_hdl_post_create(
+								vdev_mlme);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_legacy_hdl_destroy - VDEV legacy pointer free
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API invokes legacy pointer free
+ *
+ * Return: SUCCESS on successful free of legacy handle
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_legacy_hdl_destroy(
+			      struct vdev_mlme_obj *vdev_mlme)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_legacy_hdl_destroy)
+		ret = vdev_mlme->ops->mlme_vdev_legacy_hdl_destroy(vdev_mlme);
+
+	return ret;
+}
+
+#endif
diff --git a/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h
new file mode 100644
index 0000000..9ddf168
--- /dev/null
+++ b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+ /**
+  * DOC: Define the debug utils for MLME
+  */
+#ifndef _WLAN_MLME_DBG_H_
+#define _WLAN_MLME_DBG_H_
+
+#include <qdf_types.h>
+#include <qdf_trace.h>
+
+#define mlme_alert(format, args...) \
+		QDF_TRACE_FATAL(QDF_MODULE_ID_CMN_MLME, format, ## args)
+
+#define mlme_err(format, args...) \
+		QDF_TRACE_ERROR(QDF_MODULE_ID_CMN_MLME, format, ## args)
+
+#define mlme_warn(format, args...) \
+		QDF_TRACE_WARN(QDF_MODULE_ID_CMN_MLME, format, ## args)
+
+#define mlme_info(format, args...) \
+		QDF_TRACE_INFO(QDF_MODULE_ID_CMN_MLME, format, ## args)
+
+#define mlme_debug(format, args...) \
+		QDF_TRACE_DEBUG(QDF_MODULE_ID_CMN_MLME, format, ## args)
+
+#endif    /* _WLAN_MLME_DBG_H_ */
+
diff --git a/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h
new file mode 100644
index 0000000..eb73220
--- /dev/null
+++ b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Define VDEV MLME init/deinit APIs
+ */
+
+#ifndef _WLAN_VDEV_MLME_MAIN_H_
+#define _WLAN_VDEV_MLME_MAIN_H_
+
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+/**
+ * wlan_vdev_mlme_init - Initializes MLME component
+ *
+ * Registers callbacks with object manager for create/destroy
+ *
+ * Return: SUCCESS on successful registration
+ *         FAILURE, if registration fails
+ */
+QDF_STATUS wlan_vdev_mlme_init(void);
+
+/**
+ * wlan_vdev_mlme_deinit - Uninitializes MLME component
+ *
+ * Unregisters callbacks with object manager for create/destroy
+ *
+ * Return: SUCCESS on successful registration
+ *         FAILURE, if registration fails
+ */
+QDF_STATUS wlan_vdev_mlme_deinit(void);
+
+#else
+
+/**
+ * wlan_vdev_mlme_init - Initializes MLME component
+ *
+ * Registers callbacks with object manager for create/destroy
+ *
+ * Return: SUCCESS on successful registration
+ *         FAILURE, if registration fails
+ */
+static inline QDF_STATUS wlan_vdev_mlme_init(void)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wlan_vdev_mlme_deinit - Uninitializes MLME component
+ *
+ * Unregisters callbacks with object manager for create/destroy
+ *
+ * Return: SUCCESS on successful registration
+ *         FAILURE, if registration fails
+ */
+static inline QDF_STATUS wlan_vdev_mlme_deinit(void)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+#endif
+
diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c
new file mode 100644
index 0000000..f6166ca
--- /dev/null
+++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Implements MLME component object creation/initialization/destroy
+ */
+
+#include <wlan_objmgr_cmn.h>
+#include <wlan_objmgr_global_obj.h>
+#include <wlan_objmgr_vdev_obj.h>
+#include <wlan_mlme_dbg.h>
+#include "include/wlan_vdev_mlme.h"
+#include "vdev_mgr/core/src/vdev_mlme_sm.h"
+
+static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev,
+					       void *arg)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+	struct wlan_objmgr_pdev *pdev;
+
+	if (!vdev) {
+		mlme_err(" VDEV is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		mlme_err(" PDEV is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	vdev_mlme = qdf_mem_malloc(sizeof(*vdev_mlme));
+	if (!vdev_mlme) {
+		mlme_err(" MLME component object alloc failed");
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	vdev_mlme->vdev = vdev;
+
+	if (pdev->pdev_mlme.mlme_register_ops(vdev_mlme)
+							!= QDF_STATUS_SUCCESS) {
+		mlme_err("Callbacks registration is failed");
+		goto init_failed;
+	}
+
+	if (mlme_vdev_sm_create(vdev_mlme) != QDF_STATUS_SUCCESS) {
+		mlme_err("SME creation failed");
+		goto init_failed;
+	}
+
+	if (mlme_vdev_legacy_hdl_create(vdev_mlme) != QDF_STATUS_SUCCESS) {
+		mlme_err("Legacy vdev object creation failed");
+		goto legacy_hdl_create_failed;
+	}
+
+	wlan_objmgr_vdev_component_obj_attach((struct wlan_objmgr_vdev *)vdev,
+					      WLAN_UMAC_COMP_MLME,
+					      (void *)vdev_mlme,
+					      QDF_STATUS_SUCCESS);
+
+	if (mlme_vdev_legacy_hdl_post_create(vdev_mlme) != QDF_STATUS_SUCCESS) {
+		mlme_err("Legacy vdev object post creation failed");
+		goto legacy_hdl_post_create_failed;
+	}
+
+	return QDF_STATUS_SUCCESS;
+
+legacy_hdl_post_create_failed:
+	mlme_vdev_legacy_hdl_destroy(vdev_mlme);
+	wlan_objmgr_vdev_component_obj_detach(vdev, WLAN_UMAC_COMP_MLME,
+					      vdev_mlme);
+legacy_hdl_create_failed:
+	mlme_vdev_sm_destroy(vdev_mlme);
+init_failed:
+	qdf_mem_free(vdev_mlme);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev,
+						void *arg)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+
+	if (!vdev) {
+		mlme_err(" VDEV is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
+							  WLAN_UMAC_COMP_MLME);
+	if (!vdev_mlme) {
+		mlme_err(" VDEV MLME component object is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	mlme_vdev_sm_destroy(vdev_mlme);
+
+	mlme_vdev_legacy_hdl_destroy(vdev_mlme);
+
+	wlan_objmgr_vdev_component_obj_detach(vdev, WLAN_UMAC_COMP_MLME,
+					      vdev_mlme);
+	qdf_mem_free(vdev_mlme);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wlan_vdev_mlme_init(void)
+{
+	if (wlan_objmgr_register_vdev_create_handler(WLAN_UMAC_COMP_MLME,
+				mlme_vdev_obj_create_handler, NULL)
+						!= QDF_STATUS_SUCCESS)
+		return QDF_STATUS_E_FAILURE;
+
+	if (wlan_objmgr_register_vdev_destroy_handler(WLAN_UMAC_COMP_MLME,
+				mlme_vdev_obj_destroy_handler, NULL)
+						!= QDF_STATUS_SUCCESS) {
+		if (wlan_objmgr_unregister_vdev_create_handler(
+					WLAN_UMAC_COMP_MLME,
+					mlme_vdev_obj_create_handler, NULL)
+						!= QDF_STATUS_SUCCESS)
+			return QDF_STATUS_E_FAILURE;
+
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wlan_vdev_mlme_deinit(void)
+{
+	if (wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_MLME,
+				mlme_vdev_obj_create_handler, NULL)
+					!= QDF_STATUS_SUCCESS)
+		return QDF_STATUS_E_FAILURE;
+
+	if (wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_MLME,
+				mlme_vdev_obj_destroy_handler, NULL)
+						!= QDF_STATUS_SUCCESS)
+		return QDF_STATUS_E_FAILURE;
+
+	return QDF_STATUS_SUCCESS;
+}
diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c
new file mode 100644
index 0000000..79228f2
--- /dev/null
+++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Implements VDEV MLME SM
+ */
+
+#include <wlan_mlme_dbg.h>
+#include <wlan_sm_engine.h>
+#include "include/wlan_vdev_mlme.h"
+#include "vdev_mlme_sm.h"
+
+QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme)
+{
+	struct wlan_sm *sm;
+
+	sm = wlan_sm_create("VDEV MLME", vdev_mlme, 0, NULL, 0, NULL, 0);
+	if (!sm) {
+		mlme_err("VDEV MLME SM allocation failed");
+		return QDF_STATUS_E_FAILURE;
+	}
+	vdev_mlme->sm_hdl = sm;
+
+	mlme_vdev_sm_spinlock_create(vdev_mlme);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme)
+{
+	mlme_vdev_sm_spinlock_destroy(vdev_mlme);
+
+	wlan_sm_delete(vdev_mlme->sm_hdl);
+
+	return QDF_STATUS_SUCCESS;
+}
diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h
new file mode 100644
index 0000000..4c0be66
--- /dev/null
+++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Declares VDEV MLME SM APIs and structures
+ */
+
+#ifndef _VDEV_MLME_SM_H_
+#define _VDEV_MLME_SM_H_
+
+/**
+ * mlme_vdev_sm_create - Invoke SME creation for VDEV
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API allocates VDEV MLME SM and initializes SM lock
+ *
+ * Return: SUCCESS on successful allocation
+ *         FAILURE, if registration fails
+ */
+QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme);
+
+/**
+ * mlme_vdev_sm_destroy - Invoke SME destroy for VDEV
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * API frees VDEV MLME SM and destroys the SM lock
+ *
+ * Return: SUCCESS on successful destroy
+ *         FAILURE, if registration fails
+ */
+QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme);
+
+#ifdef VDEV_SM_LOCK_SUPPORT
+/**
+ * mlme_vdev_sm_spinlock_create - Create VDEV MLME spinlock
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * Creates VDEV MLME spinlock
+ *
+ * Return: void
+ */
+static inline void mlme_vdev_sm_spinlock_create(
+						struct vdev_mlme_obj *vdev_mlme)
+{
+	qdf_spinlock_create(&vdev_mlme->sm_lock);
+}
+
+/**
+ * mlme_vdev_sm_spinlock_destroy - Destroy VDEV MLME spinlock
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ *
+ * Destroy VDEV MLME spinlock
+ *
+ * Return: void
+ */
+static inline void mlme_vdev_sm_spinlock_destroy(
+						struct vdev_mlme_obj *vdev_mlme)
+{
+	qdf_spinlock_destroy(&vdev_mlme->sm_lock);
+}
+
+/**
+ * mlme_vdev_sm_spin_lock - acquire spinlock
+ * @vdev_mlme_obj:  vdev mlme comp object
+ *
+ * acquire vdev mlme spinlock
+ *
+ * return: void
+ */
+static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme)
+{
+	qdf_spin_lock_bh(&vdev_mlme->sm_lock);
+}
+
+/**
+ * mlme_vdev_sm_spin_unlock - release spinlock
+ * @vdev_mlme_obj:  vdev mlme comp object
+ *
+ * release vdev mlme spinlock
+ *
+ * return: void
+ */
+static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme)
+{
+	qdf_spin_unlock_bh(&vdev_mlme->sm_lock);
+}
+
+#else
+static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme)
+{
+	mlme_info("VDEV SM lock is disabled!!!");
+}
+
+static inline void mlme_vdev_sm_spinlock_destroy(
+						struct vdev_mlme_obj *vdev_mlme)
+{
+	mlme_info("VDEV SM lock is disabled!!!");
+}
+
+static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme)
+{
+}
+
+static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme)
+{
+}
+#endif
+
+#endif
+
diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h
new file mode 100644
index 0000000..338fc5f
--- /dev/null
+++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Define VDEV MLME public APIs
+ */
+
+#ifndef _WLAN_VDEV_MLME_API_H_
+#define _WLAN_VDEV_MLME_API_H_
+
+/**
+ * wlan_vdev_mlme_get_legacy_hdl - Returns legacy handle
+ *
+ * Retrieves legacy handle from vdev mlme component object
+ *
+ * Return: legacy handle on SUCCESS
+ *         NULL, if it fails to retrieve
+ */
+void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev);
+
+#endif
diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c
new file mode 100644
index 0000000..27a4c9d
--- /dev/null
+++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Implements VDEV MLME public APIs
+ */
+
+#include <wlan_objmgr_vdev_obj.h>
+#include <wlan_mlme_dbg.h>
+#include "include/wlan_vdev_mlme.h"
+
+void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+
+	if (!vdev) {
+		mlme_err("vdev is NULL");
+		return NULL;
+	}
+
+	vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev,
+							  WLAN_UMAC_COMP_MLME);
+	if (!vdev_mlme) {
+		mlme_err(" MLME component object is NULL");
+		return NULL;
+	}
+
+	return vdev_mlme->legacy_vdev_ptr;
+}
+
+qdf_export_symbol(wlan_vdev_mlme_get_legacy_hdl);