qcacmn: Add extscan feature flag

Add config flag to enable / disable extscan feature

Change-Id: I6303836226aa2cdcaf3a680d9ce36f2490fde615
CRs-Fixed: 2243749
diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h
index 38683ac..a1f75e3 100644
--- a/wmi/inc/wmi_unified_api.h
+++ b/wmi/inc/wmi_unified_api.h
@@ -58,6 +58,10 @@
 #include "wmi_unified_twt_api.h"
 #endif
 
+#ifdef FEATURE_WLAN_EXTSCAN
+#include "wmi_unified_extscan_api.h"
+#endif
+
 #ifdef IPA_OFFLOAD
 #include "wlan_ipa_public_struct.h"
 #endif
@@ -804,12 +808,6 @@
 QDF_STATUS wmi_unified_scan_probe_setoui_cmd(void *wmi_hdl,
 			  struct scan_mac_oui *psetoui);
 
-QDF_STATUS wmi_unified_reset_passpoint_network_list_cmd(void *wmi_hdl,
-					struct wifi_passpoint_req_param *req);
-
-QDF_STATUS wmi_unified_set_passpoint_network_list_cmd(void *wmi_hdl,
-					struct wifi_passpoint_req_param *req);
-
 #ifdef CONFIG_MCL
 QDF_STATUS wmi_unified_roam_scan_offload_mode_cmd(void *wmi_hdl,
 				wmi_start_scan_cmd_fixed_param *scan_cmd_fp,
@@ -835,38 +833,11 @@
 QDF_STATUS wmi_unified_roam_scan_filter_cmd(void *wmi_hdl,
 				struct roam_scan_filter_params *roam_req);
 
-QDF_STATUS wmi_unified_set_epno_network_list_cmd(void *wmi_hdl,
-		struct wifi_enhanched_pno_params *req);
-
 #ifdef IPA_OFFLOAD
 QDF_STATUS  wmi_unified_ipa_offload_control_cmd(void *wmi_hdl,
 		struct ipa_uc_offload_control_params *ipa_offload);
 #endif
 
-QDF_STATUS wmi_unified_extscan_get_capabilities_cmd(void *wmi_hdl,
-			  struct extscan_capabilities_params *pgetcapab);
-
-QDF_STATUS wmi_unified_extscan_get_cached_results_cmd(void *wmi_hdl,
-			  struct extscan_cached_result_params *pcached_results);
-
-
-QDF_STATUS wmi_unified_extscan_stop_change_monitor_cmd(void *wmi_hdl,
-			  struct extscan_capabilities_reset_params *reset_req);
-
-
-QDF_STATUS wmi_unified_extscan_start_change_monitor_cmd(void *wmi_hdl,
-				   struct extscan_set_sig_changereq_params *
-					   psigchange);
-
-QDF_STATUS wmi_unified_extscan_stop_hotlist_monitor_cmd(void *wmi_hdl,
-		  struct extscan_bssid_hotlist_reset_params *photlist_reset);
-
-QDF_STATUS wmi_unified_stop_extscan_cmd(void *wmi_hdl,
-			  struct extscan_stop_req_params *pstopcmd);
-
-QDF_STATUS wmi_unified_start_extscan_cmd(void *wmi_hdl,
-			  struct wifi_scan_cmd_req_params *pstart);
-
 QDF_STATUS wmi_unified_plm_stop_cmd(void *wmi_hdl,
 			  const struct plm_req_params *plm);
 
@@ -1125,10 +1096,6 @@
 QDF_STATUS wmi_unified_set_per_roam_config(void *wmi_hdl,
 		struct wmi_per_roam_config_req *req_buf);
 
-QDF_STATUS wmi_unified_get_buf_extscan_hotlist_cmd(void *wmi_hdl,
-				   struct ext_scan_setbssi_hotlist_params *
-				   photlist, int *buf_len);
-
 /**
  * wmi_unified_set_active_bpf_mode_cmd() - config active BPF mode in FW
  * @wmi_hdl: the WMI handle
diff --git a/wmi/inc/wmi_unified_extscan_api.h b/wmi/inc/wmi_unified_extscan_api.h
new file mode 100644
index 0000000..0d91164
--- /dev/null
+++ b/wmi/inc/wmi_unified_extscan_api.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2013-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.
+ */
+
+#ifndef _WMI_UNIFIED_EXTSCAN_API_H_
+#define _WMI_UNIFIED_EXTSCAN_API_H_
+
+QDF_STATUS wmi_unified_reset_passpoint_network_list_cmd(void *wmi_hdl,
+					struct wifi_passpoint_req_param *req);
+
+QDF_STATUS wmi_unified_set_passpoint_network_list_cmd(void *wmi_hdl,
+					struct wifi_passpoint_req_param *req);
+
+QDF_STATUS wmi_unified_set_epno_network_list_cmd(void *wmi_hdl,
+		struct wifi_enhanched_pno_params *req);
+
+QDF_STATUS wmi_unified_extscan_get_capabilities_cmd(void *wmi_hdl,
+			  struct extscan_capabilities_params *pgetcapab);
+
+QDF_STATUS wmi_unified_extscan_get_cached_results_cmd(void *wmi_hdl,
+			  struct extscan_cached_result_params *pcached_results);
+
+QDF_STATUS wmi_unified_extscan_stop_change_monitor_cmd(void *wmi_hdl,
+			  struct extscan_capabilities_reset_params *reset_req);
+
+QDF_STATUS wmi_unified_extscan_start_change_monitor_cmd(void *wmi_hdl,
+				   struct extscan_set_sig_changereq_params *
+					   psigchange);
+
+QDF_STATUS wmi_unified_extscan_stop_hotlist_monitor_cmd(void *wmi_hdl,
+		  struct extscan_bssid_hotlist_reset_params *photlist_reset);
+
+QDF_STATUS wmi_unified_stop_extscan_cmd(void *wmi_hdl,
+			  struct extscan_stop_req_params *pstopcmd);
+
+QDF_STATUS wmi_unified_start_extscan_cmd(void *wmi_hdl,
+			  struct wifi_scan_cmd_req_params *pstart);
+
+QDF_STATUS wmi_unified_get_buf_extscan_hotlist_cmd(void *wmi_hdl,
+				   struct ext_scan_setbssi_hotlist_params *
+				   photlist, int *buf_len);
+
+#endif /* _WMI_UNIFIED_EXTSCAN_API_H_ */
diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h
index 80c7f16..beb04f6 100644
--- a/wmi/inc/wmi_unified_priv.h
+++ b/wmi/inc/wmi_unified_priv.h
@@ -1753,6 +1753,14 @@
 #endif
 void wmi_non_tlv_attach(wmi_unified_t wmi_handle);
 
+#ifdef FEATURE_WLAN_EXTSCAN
+void wmi_extscan_attach_tlv(struct wmi_unified *wmi_handle);
+#else
+static inline void wmi_extscan_attach_tlv(struct wmi_unified *wmi_handle)
+{
+}
+#endif
+
 /**
  * wmi_align() - provides word aligned parameter
  * @param: parameter to be aligned
diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c
index e2f09a1..fc98960 100644
--- a/wmi/src/wmi_unified_api.c
+++ b/wmi/src/wmi_unified_api.c
@@ -1630,72 +1630,6 @@
 	return QDF_STATUS_E_FAILURE;
 }
 
-/**
- * wmi_unified_reset_passpoint_network_list_cmd() - reset passpoint network list
- * @wmi_hdl: wmi handle
- * @req: passpoint network request structure
- *
- * This function sends down WMI command with network id set to wildcard id.
- * firmware shall clear all the config entries
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_reset_passpoint_network_list_cmd(void *wmi_hdl,
-					struct wifi_passpoint_req_param *req)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_reset_passpoint_network_list_cmd)
-		return wmi_handle->ops->send_reset_passpoint_network_list_cmd(wmi_handle,
-			    req);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * wmi_unified_set_passpoint_network_list_cmd() - set passpoint network list
- * @wmi_hdl: wmi handle
- * @req: passpoint network request structure
- *
- * This function reads the incoming @req and fill in the destination
- * WMI structure and send down the passpoint configs down to the firmware
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_set_passpoint_network_list_cmd(void *wmi_hdl,
-					struct wifi_passpoint_req_param *req)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_set_passpoint_network_list_cmd)
-		return wmi_handle->ops->send_set_passpoint_network_list_cmd(wmi_handle,
-			    req);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/** wmi_unified_set_epno_network_list_cmd() - set epno network list
- * @wmi_hdl: wmi handle
- * @req: epno config params request structure
- *
- * This function reads the incoming epno config request structure
- * and constructs the WMI message to the firmware.
- *
- * Returns: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failures,
- *          error number otherwise
- */
-QDF_STATUS wmi_unified_set_epno_network_list_cmd(void *wmi_hdl,
-		struct wifi_enhanched_pno_params *req)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_set_epno_network_list_cmd)
-		return wmi_handle->ops->send_set_epno_network_list_cmd(wmi_handle,
-			    req);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
 #ifdef CONFIG_MCL
 /**
  * wmi_unified_roam_scan_offload_mode_cmd() - set roam scan parameters
@@ -1801,155 +1735,6 @@
 }
 #endif
 
-/**
- * wmi_unified_extscan_get_capabilities_cmd() - extscan get capabilities
- * @wmi_hdl: wmi handle
- * @pgetcapab: get capabilities params
- *
- * This function send request to fw to get extscan capabilities.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_extscan_get_capabilities_cmd(void *wmi_hdl,
-			  struct extscan_capabilities_params *pgetcapab)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_extscan_get_capabilities_cmd)
-		return wmi_handle->ops->send_extscan_get_capabilities_cmd(wmi_handle,
-			    pgetcapab);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * wmi_unified_extscan_get_cached_results_cmd() - extscan get cached results
- * @wmi_hdl: wmi handle
- * @pcached_results: cached results parameters
- *
- * This function send request to fw to get cached results.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_extscan_get_cached_results_cmd(void *wmi_hdl,
-			  struct extscan_cached_result_params *pcached_results)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_extscan_get_cached_results_cmd)
-		return wmi_handle->ops->send_extscan_get_cached_results_cmd(wmi_handle,
-			    pcached_results);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * wmi_unified_extscan_stop_change_monitor_cmd() - send stop change monitor cmd
- * @wmi_hdl: wmi handle
- * @reset_req: Reset change request params
- *
- * This function sends stop change monitor request to fw.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_extscan_stop_change_monitor_cmd(void *wmi_hdl,
-			  struct extscan_capabilities_reset_params *reset_req)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_extscan_stop_change_monitor_cmd)
-		return wmi_handle->ops->send_extscan_stop_change_monitor_cmd(wmi_handle,
-			    reset_req);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-
-
-/**
- * wmi_unified_extscan_start_change_monitor_cmd() - start change monitor cmd
- * @wmi_hdl: wmi handle
- * @psigchange: change monitor request params
- *
- * This function sends start change monitor request to fw.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_extscan_start_change_monitor_cmd(void *wmi_hdl,
-				   struct extscan_set_sig_changereq_params *
-				   psigchange)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_extscan_start_change_monitor_cmd)
-		return wmi_handle->ops->send_extscan_start_change_monitor_cmd(wmi_handle,
-			    psigchange);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * wmi_unified_extscan_stop_hotlist_monitor_cmd() - stop hotlist monitor
- * @wmi_hdl: wmi handle
- * @photlist_reset: hotlist reset params
- *
- * This function configures hotlist monitor to stop in fw.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_extscan_stop_hotlist_monitor_cmd(void *wmi_hdl,
-		  struct extscan_bssid_hotlist_reset_params *photlist_reset)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_extscan_stop_hotlist_monitor_cmd)
-		return wmi_handle->ops->send_extscan_stop_hotlist_monitor_cmd(wmi_handle,
-			    photlist_reset);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * wmi_unified_stop_extscan_cmd() - stop extscan command to fw.
- * @wmi_hdl: wmi handle
- * @pstopcmd: stop scan command request params
- *
- * This function sends stop extscan request to fw.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure.
- */
-QDF_STATUS wmi_unified_stop_extscan_cmd(void *wmi_hdl,
-			  struct extscan_stop_req_params *pstopcmd)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_stop_extscan_cmd)
-		return wmi_handle->ops->send_stop_extscan_cmd(wmi_handle,
-			    pstopcmd);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * wmi_unified_start_extscan_cmd() - start extscan command to fw.
- * @wmi_hdl: wmi handle
- * @pstart: scan command request params
- *
- * This function sends start extscan request to fw.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure.
- */
-QDF_STATUS wmi_unified_start_extscan_cmd(void *wmi_hdl,
-			  struct wifi_scan_cmd_req_params *pstart)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_start_extscan_cmd)
-		return wmi_handle->ops->send_start_extscan_cmd(wmi_handle,
-			    pstart);
-
-	return QDF_STATUS_E_FAILURE;
-}
 
 /**
  * wmi_unified_plm_stop_cmd() - plm stop request
@@ -3372,30 +3157,6 @@
 }
 #endif
 
-/**
- * wmi_unified_get_buf_extscan_hotlist_cmd() - prepare hotlist command
- * @wmi_hdl: wmi handle
- * @photlist: hotlist command params
- * @buf_len: buffer length
- *
- * This function fills individual elements for  hotlist request and
- * TLV for bssid entries
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure.
- */
-QDF_STATUS wmi_unified_get_buf_extscan_hotlist_cmd(void *wmi_hdl,
-				   struct ext_scan_setbssi_hotlist_params *
-				   photlist, int *buf_len)
-{
-	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
-
-	if (wmi_handle->ops->send_get_buf_extscan_hotlist_cmd)
-		return wmi_handle->ops->send_get_buf_extscan_hotlist_cmd(wmi_handle,
-				  photlist, buf_len);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
 QDF_STATUS wmi_unified_set_active_bpf_mode_cmd(void *wmi_hdl,
 				uint8_t vdev_id,
 				enum wmi_host_active_bpf_mode ucast_mode,
diff --git a/wmi/src/wmi_unified_extscan_api.c b/wmi/src/wmi_unified_extscan_api.c
new file mode 100644
index 0000000..bcd696c
--- /dev/null
+++ b/wmi/src/wmi_unified_extscan_api.c
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2016-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.
+ */
+
+#include "wmi_unified_priv.h"
+
+/**
+ * wmi_unified_reset_passpoint_network_list_cmd() - reset passpoint network list
+ * @wmi_hdl: wmi handle
+ * @req: passpoint network request structure
+ *
+ * This function sends down WMI command with network id set to wildcard id.
+ * firmware shall clear all the config entries
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_reset_passpoint_network_list_cmd(void *wmi_hdl,
+					struct wifi_passpoint_req_param *req)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_reset_passpoint_network_list_cmd)
+		return wmi_handle->ops->send_reset_passpoint_network_list_cmd(wmi_handle,
+			    req);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_set_passpoint_network_list_cmd() - set passpoint network list
+ * @wmi_hdl: wmi handle
+ * @req: passpoint network request structure
+ *
+ * This function reads the incoming @req and fill in the destination
+ * WMI structure and send down the passpoint configs down to the firmware
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_set_passpoint_network_list_cmd(void *wmi_hdl,
+					struct wifi_passpoint_req_param *req)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_set_passpoint_network_list_cmd)
+		return wmi_handle->ops->send_set_passpoint_network_list_cmd(wmi_handle,
+			    req);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/** wmi_unified_set_epno_network_list_cmd() - set epno network list
+ * @wmi_hdl: wmi handle
+ * @req: epno config params request structure
+ *
+ * This function reads the incoming epno config request structure
+ * and constructs the WMI message to the firmware.
+ *
+ * Returns: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failures,
+ *          error number otherwise
+ */
+QDF_STATUS wmi_unified_set_epno_network_list_cmd(void *wmi_hdl,
+		struct wifi_enhanched_pno_params *req)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_set_epno_network_list_cmd)
+		return wmi_handle->ops->send_set_epno_network_list_cmd(wmi_handle,
+			    req);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_extscan_get_capabilities_cmd() - extscan get capabilities
+ * @wmi_hdl: wmi handle
+ * @pgetcapab: get capabilities params
+ *
+ * This function send request to fw to get extscan capabilities.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_extscan_get_capabilities_cmd(void *wmi_hdl,
+			  struct extscan_capabilities_params *pgetcapab)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_extscan_get_capabilities_cmd)
+		return wmi_handle->ops->send_extscan_get_capabilities_cmd(wmi_handle,
+			    pgetcapab);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_extscan_get_cached_results_cmd() - extscan get cached results
+ * @wmi_hdl: wmi handle
+ * @pcached_results: cached results parameters
+ *
+ * This function send request to fw to get cached results.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_extscan_get_cached_results_cmd(void *wmi_hdl,
+			  struct extscan_cached_result_params *pcached_results)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_extscan_get_cached_results_cmd)
+		return wmi_handle->ops->send_extscan_get_cached_results_cmd(wmi_handle,
+			    pcached_results);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_extscan_stop_change_monitor_cmd() - send stop change monitor cmd
+ * @wmi_hdl: wmi handle
+ * @reset_req: Reset change request params
+ *
+ * This function sends stop change monitor request to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_extscan_stop_change_monitor_cmd(void *wmi_hdl,
+			  struct extscan_capabilities_reset_params *reset_req)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_extscan_stop_change_monitor_cmd)
+		return wmi_handle->ops->send_extscan_stop_change_monitor_cmd(wmi_handle,
+			    reset_req);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+
+
+/**
+ * wmi_unified_extscan_start_change_monitor_cmd() - start change monitor cmd
+ * @wmi_hdl: wmi handle
+ * @psigchange: change monitor request params
+ *
+ * This function sends start change monitor request to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_extscan_start_change_monitor_cmd(void *wmi_hdl,
+				   struct extscan_set_sig_changereq_params *
+				   psigchange)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_extscan_start_change_monitor_cmd)
+		return wmi_handle->ops->send_extscan_start_change_monitor_cmd(wmi_handle,
+			    psigchange);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_extscan_stop_hotlist_monitor_cmd() - stop hotlist monitor
+ * @wmi_hdl: wmi handle
+ * @photlist_reset: hotlist reset params
+ *
+ * This function configures hotlist monitor to stop in fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_extscan_stop_hotlist_monitor_cmd(void *wmi_hdl,
+		  struct extscan_bssid_hotlist_reset_params *photlist_reset)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_extscan_stop_hotlist_monitor_cmd)
+		return wmi_handle->ops->send_extscan_stop_hotlist_monitor_cmd(wmi_handle,
+			    photlist_reset);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_stop_extscan_cmd() - stop extscan command to fw.
+ * @wmi_hdl: wmi handle
+ * @pstopcmd: stop scan command request params
+ *
+ * This function sends stop extscan request to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure.
+ */
+QDF_STATUS wmi_unified_stop_extscan_cmd(void *wmi_hdl,
+			  struct extscan_stop_req_params *pstopcmd)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_stop_extscan_cmd)
+		return wmi_handle->ops->send_stop_extscan_cmd(wmi_handle,
+			    pstopcmd);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_start_extscan_cmd() - start extscan command to fw.
+ * @wmi_hdl: wmi handle
+ * @pstart: scan command request params
+ *
+ * This function sends start extscan request to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure.
+ */
+QDF_STATUS wmi_unified_start_extscan_cmd(void *wmi_hdl,
+			  struct wifi_scan_cmd_req_params *pstart)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_start_extscan_cmd)
+		return wmi_handle->ops->send_start_extscan_cmd(wmi_handle,
+			    pstart);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+/**
+ * wmi_unified_get_buf_extscan_hotlist_cmd() - prepare hotlist command
+ * @wmi_hdl: wmi handle
+ * @photlist: hotlist command params
+ * @buf_len: buffer length
+ *
+ * This function fills individual elements for  hotlist request and
+ * TLV for bssid entries
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure.
+ */
+QDF_STATUS wmi_unified_get_buf_extscan_hotlist_cmd(void *wmi_hdl,
+				   struct ext_scan_setbssi_hotlist_params *
+				   photlist, int *buf_len)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_get_buf_extscan_hotlist_cmd)
+		return wmi_handle->ops->send_get_buf_extscan_hotlist_cmd(wmi_handle,
+				  photlist, buf_len);
+
+	return QDF_STATUS_E_FAILURE;
+}
diff --git a/wmi/src/wmi_unified_extscan_tlv.c b/wmi/src/wmi_unified_extscan_tlv.c
new file mode 100644
index 0000000..6a43e66
--- /dev/null
+++ b/wmi/src/wmi_unified_extscan_tlv.c
@@ -0,0 +1,1112 @@
+/*
+ * Copyright (c) 2016-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.
+ */
+
+#include <osdep.h>
+#include "wmi.h"
+#include "wmi_unified_priv.h"
+
+/**
+ * send_reset_passpoint_network_list_cmd_tlv() - reset passpoint network list
+ * @wmi_handle: wmi handle
+ * @req: passpoint network request structure
+ *
+ * This function sends down WMI command with network id set to wildcard id.
+ * firmware shall clear all the config entries
+ *
+ * Return: QDF_STATUS enumeration
+ */
+static QDF_STATUS send_reset_passpoint_network_list_cmd_tlv
+					(wmi_unified_t wmi_handle,
+					struct wifi_passpoint_req_param *req)
+{
+	wmi_passpoint_config_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	uint32_t len;
+	int ret;
+
+	len = sizeof(*cmd);
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf) {
+		WMI_LOGE("%s: Failed allocate wmi buffer", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_passpoint_config_cmd_fixed_param *) wmi_buf_data(buf);
+
+	WMITLV_SET_HDR(&cmd->tlv_header,
+			WMITLV_TAG_STRUC_wmi_passpoint_config_cmd_fixed_param,
+			WMITLV_GET_STRUCT_TLVLEN(
+			wmi_passpoint_config_cmd_fixed_param));
+	cmd->id = WMI_PASSPOINT_NETWORK_ID_WILDCARD;
+
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_PASSPOINT_LIST_CONFIG_CMDID);
+	if (ret) {
+		WMI_LOGE("%s: Failed to send reset passpoint network list wmi cmd",
+			 __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_set_passpoint_network_list_cmd_tlv() - set passpoint network list
+ * @wmi_handle: wmi handle
+ * @req: passpoint network request structure
+ *
+ * This function reads the incoming @req and fill in the destination
+ * WMI structure and send down the passpoint configs down to the firmware
+ *
+ * Return: QDF_STATUS enumeration
+ */
+static QDF_STATUS send_set_passpoint_network_list_cmd_tlv
+					(wmi_unified_t wmi_handle,
+					struct wifi_passpoint_req_param *req)
+{
+	wmi_passpoint_config_cmd_fixed_param *cmd;
+	u_int8_t i, j, *bytes;
+	wmi_buf_t buf;
+	uint32_t len;
+	int ret;
+
+	len = sizeof(*cmd);
+	for (i = 0; i < req->num_networks; i++) {
+		buf = wmi_buf_alloc(wmi_handle, len);
+		if (!buf) {
+			WMI_LOGE("%s: Failed allocate wmi buffer", __func__);
+			return QDF_STATUS_E_NOMEM;
+		}
+
+		cmd = (wmi_passpoint_config_cmd_fixed_param *)
+				wmi_buf_data(buf);
+
+		WMITLV_SET_HDR(&cmd->tlv_header,
+			WMITLV_TAG_STRUC_wmi_passpoint_config_cmd_fixed_param,
+			WMITLV_GET_STRUCT_TLVLEN(
+			wmi_passpoint_config_cmd_fixed_param));
+		cmd->id = req->networks[i].id;
+		WMI_LOGD("%s: network id: %u", __func__, cmd->id);
+		qdf_mem_copy(cmd->realm, req->networks[i].realm,
+			strlen(req->networks[i].realm) + 1);
+		WMI_LOGD("%s: realm: %s", __func__, cmd->realm);
+		for (j = 0; j < PASSPOINT_ROAMING_CONSORTIUM_ID_NUM; j++) {
+			bytes = (uint8_t *) &req->networks[i].roaming_consortium_ids[j];
+			WMI_LOGD("index: %d rcids: %02x %02x %02x %02x %02x %02x %02x %02x",
+				j, bytes[0], bytes[1], bytes[2], bytes[3],
+				bytes[4], bytes[5], bytes[6], bytes[7]);
+
+			qdf_mem_copy(&cmd->roaming_consortium_ids[j],
+				&req->networks[i].roaming_consortium_ids[j],
+				PASSPOINT_ROAMING_CONSORTIUM_ID_LEN);
+		}
+		qdf_mem_copy(cmd->plmn, req->networks[i].plmn,
+				PASSPOINT_PLMN_ID_LEN);
+		WMI_LOGD("%s: plmn: %02x:%02x:%02x", __func__,
+			cmd->plmn[0], cmd->plmn[1], cmd->plmn[2]);
+
+		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+					   WMI_PASSPOINT_LIST_CONFIG_CMDID);
+		if (ret) {
+			WMI_LOGE("%s: Failed to send set passpoint network list wmi cmd",
+				 __func__);
+			wmi_buf_free(buf);
+			return QDF_STATUS_E_FAILURE;
+		}
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/** send_set_epno_network_list_cmd_tlv() - set epno network list
+ * @wmi_handle: wmi handle
+ * @req: epno config params request structure
+ *
+ * This function reads the incoming epno config request structure
+ * and constructs the WMI message to the firmware.
+ *
+ * Returns: 0 on success, error number otherwise
+ */
+static QDF_STATUS send_set_epno_network_list_cmd_tlv(wmi_unified_t wmi_handle,
+		struct wifi_enhanched_pno_params *req)
+{
+	wmi_nlo_config_cmd_fixed_param *cmd;
+	nlo_configured_parameters *nlo_list;
+	enlo_candidate_score_params *cand_score_params;
+	u_int8_t i, *buf_ptr;
+	wmi_buf_t buf;
+	uint32_t len;
+	QDF_STATUS ret;
+
+	/* Fixed Params */
+	len = sizeof(*cmd);
+	if (req->num_networks) {
+		/* TLV place holder for array of structures
+		 * then each nlo_configured_parameters(nlo_list) TLV.
+		 */
+		len += WMI_TLV_HDR_SIZE;
+		len += (sizeof(nlo_configured_parameters)
+			    * QDF_MIN(req->num_networks, WMI_NLO_MAX_SSIDS));
+		/* TLV for array of uint32 channel_list */
+		len += WMI_TLV_HDR_SIZE;
+		/* TLV for nlo_channel_prediction_cfg */
+		len += WMI_TLV_HDR_SIZE;
+		/* TLV for candidate score params */
+		len += sizeof(enlo_candidate_score_params);
+	}
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf) {
+		WMI_LOGE("%s: Failed allocate wmi buffer", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_nlo_config_cmd_fixed_param *) wmi_buf_data(buf);
+
+	buf_ptr = (u_int8_t *) cmd;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_nlo_config_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN(
+			       wmi_nlo_config_cmd_fixed_param));
+	cmd->vdev_id = req->session_id;
+
+	/* set flag to reset if num of networks are 0 */
+	cmd->flags = (req->num_networks == 0 ?
+		WMI_NLO_CONFIG_ENLO_RESET : WMI_NLO_CONFIG_ENLO);
+
+	buf_ptr += sizeof(wmi_nlo_config_cmd_fixed_param);
+
+	cmd->no_of_ssids = QDF_MIN(req->num_networks, WMI_NLO_MAX_SSIDS);
+	WMI_LOGD("SSID count: %d flags: %d",
+		cmd->no_of_ssids, cmd->flags);
+
+	/* Fill nlo_config only when num_networks are non zero */
+	if (cmd->no_of_ssids) {
+		/* Fill networks */
+		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+			cmd->no_of_ssids * sizeof(nlo_configured_parameters));
+		buf_ptr += WMI_TLV_HDR_SIZE;
+
+		nlo_list = (nlo_configured_parameters *) buf_ptr;
+		for (i = 0; i < cmd->no_of_ssids; i++) {
+			WMITLV_SET_HDR(&nlo_list[i].tlv_header,
+				WMITLV_TAG_ARRAY_BYTE,
+				WMITLV_GET_STRUCT_TLVLEN(
+				nlo_configured_parameters));
+			/* Copy ssid and it's length */
+			nlo_list[i].ssid.valid = true;
+			nlo_list[i].ssid.ssid.ssid_len =
+				req->networks[i].ssid.length;
+			qdf_mem_copy(nlo_list[i].ssid.ssid.ssid,
+				     req->networks[i].ssid.mac_ssid,
+				     nlo_list[i].ssid.ssid.ssid_len);
+			WMI_LOGD("index: %d ssid: %.*s len: %d", i,
+				 nlo_list[i].ssid.ssid.ssid_len,
+				 (char *) nlo_list[i].ssid.ssid.ssid,
+				 nlo_list[i].ssid.ssid.ssid_len);
+
+			/* Copy pno flags */
+			nlo_list[i].bcast_nw_type.valid = true;
+			nlo_list[i].bcast_nw_type.bcast_nw_type =
+					req->networks[i].flags;
+			WMI_LOGD("PNO flags (%u)",
+				nlo_list[i].bcast_nw_type.bcast_nw_type);
+
+			/* Copy auth bit field */
+			nlo_list[i].auth_type.valid = true;
+			nlo_list[i].auth_type.auth_type =
+					req->networks[i].auth_bit_field;
+			WMI_LOGD("Auth bit field (%u)",
+					nlo_list[i].auth_type.auth_type);
+		}
+
+		buf_ptr += cmd->no_of_ssids * sizeof(nlo_configured_parameters);
+		/* Fill the channel list */
+		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32, 0);
+		buf_ptr += WMI_TLV_HDR_SIZE;
+
+		/* Fill prediction_param */
+		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0);
+		buf_ptr += WMI_TLV_HDR_SIZE;
+
+		/* Fill epno candidate score params */
+		cand_score_params = (enlo_candidate_score_params *) buf_ptr;
+		WMITLV_SET_HDR(buf_ptr,
+			WMITLV_TAG_STRUC_enlo_candidate_score_param,
+			WMITLV_GET_STRUCT_TLVLEN(enlo_candidate_score_params));
+		cand_score_params->min5GHz_rssi =
+			req->min_5ghz_rssi;
+		cand_score_params->min24GHz_rssi =
+			req->min_24ghz_rssi;
+		cand_score_params->initial_score_max =
+			req->initial_score_max;
+		cand_score_params->current_connection_bonus =
+			req->current_connection_bonus;
+		cand_score_params->same_network_bonus =
+			req->same_network_bonus;
+		cand_score_params->secure_bonus =
+			req->secure_bonus;
+		cand_score_params->band5GHz_bonus =
+			req->band_5ghz_bonus;
+		buf_ptr += sizeof(enlo_candidate_score_params);
+	}
+
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+			WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		WMI_LOGE("%s: Failed to send nlo wmi cmd", __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	WMI_LOGD("set ePNO list request sent successfully for vdev %d",
+		 req->session_id);
+
+	return ret;
+}
+
+/**
+ * send_extscan_get_capabilities_cmd_tlv() - extscan get capabilities
+ * @wmi_handle: wmi handle
+ * @pgetcapab: get capabilities params
+ *
+ * This function send request to fw to get extscan capabilities.
+ *
+ * Return: CDF status
+ */
+static QDF_STATUS send_extscan_get_capabilities_cmd_tlv(wmi_unified_t wmi_handle,
+		    struct extscan_capabilities_params *pgetcapab)
+{
+	wmi_extscan_get_capabilities_cmd_fixed_param *cmd;
+	wmi_buf_t wmi_buf;
+	uint32_t len;
+	uint8_t *buf_ptr;
+
+	len = sizeof(*cmd);
+	wmi_buf = wmi_buf_alloc(wmi_handle, len);
+	if (!wmi_buf) {
+		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
+
+	cmd = (wmi_extscan_get_capabilities_cmd_fixed_param *) buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+	       WMITLV_TAG_STRUC_wmi_extscan_get_capabilities_cmd_fixed_param,
+	       WMITLV_GET_STRUCT_TLVLEN
+	       (wmi_extscan_get_capabilities_cmd_fixed_param));
+
+	cmd->request_id = pgetcapab->request_id;
+
+	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
+				 WMI_EXTSCAN_GET_CAPABILITIES_CMDID)) {
+		WMI_LOGE("%s: failed to  command", __func__);
+		wmi_buf_free(wmi_buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_extscan_get_cached_results_cmd_tlv() - extscan get cached results
+ * @wmi_handle: wmi handle
+ * @pcached_results: cached results parameters
+ *
+ * This function send request to fw to get cached results.
+ *
+ * Return: CDF status
+ */
+static QDF_STATUS send_extscan_get_cached_results_cmd_tlv(wmi_unified_t wmi_handle,
+		  struct extscan_cached_result_params *pcached_results)
+{
+	wmi_extscan_get_cached_results_cmd_fixed_param *cmd;
+	wmi_buf_t wmi_buf;
+	uint32_t len;
+	uint8_t *buf_ptr;
+
+	len = sizeof(*cmd);
+	wmi_buf = wmi_buf_alloc(wmi_handle, len);
+	if (!wmi_buf) {
+		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
+
+	cmd = (wmi_extscan_get_cached_results_cmd_fixed_param *) buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_extscan_get_cached_results_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN
+		(wmi_extscan_get_cached_results_cmd_fixed_param));
+
+	cmd->request_id = pcached_results->request_id;
+	cmd->vdev_id = pcached_results->session_id;
+	cmd->control_flags = pcached_results->flush;
+
+	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
+				 WMI_EXTSCAN_GET_CACHED_RESULTS_CMDID)) {
+		WMI_LOGE("%s: failed to  command", __func__);
+		wmi_buf_free(wmi_buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_extscan_stop_change_monitor_cmd_tlv() - send stop change monitor cmd
+ * @wmi_handle: wmi handle
+ * @reset_req: Reset change request params
+ *
+ * This function sends stop change monitor request to fw.
+ *
+ * Return: CDF status
+ */
+static QDF_STATUS send_extscan_stop_change_monitor_cmd_tlv
+			(wmi_unified_t wmi_handle,
+			struct extscan_capabilities_reset_params *reset_req)
+{
+	wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *cmd;
+	wmi_buf_t wmi_buf;
+	uint32_t len;
+	uint8_t *buf_ptr;
+	int change_list = 0;
+
+	len = sizeof(*cmd);
+
+	/* reset significant change tlv is set to 0 */
+	len += WMI_TLV_HDR_SIZE;
+	len += change_list * sizeof(wmi_extscan_wlan_change_bssid_param);
+	wmi_buf = wmi_buf_alloc(wmi_handle, len);
+	if (!wmi_buf) {
+		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
+
+	cmd = (wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *)
+		buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+	WMITLV_TAG_STRUC_wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN
+		(wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param));
+
+	cmd->request_id = reset_req->request_id;
+	cmd->vdev_id = reset_req->session_id;
+	cmd->mode = 0;
+
+	buf_ptr += sizeof(*cmd);
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_STRUC,
+		       change_list *
+		       sizeof(wmi_extscan_wlan_change_bssid_param));
+	buf_ptr += WMI_TLV_HDR_SIZE + (change_list *
+				       sizeof
+				       (wmi_extscan_wlan_change_bssid_param));
+
+	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
+			 WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID)) {
+		WMI_LOGE("%s: failed to  command", __func__);
+		wmi_buf_free(wmi_buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wmi_get_buf_extscan_change_monitor_cmd() - fill change monitor request
+ * @wmi_handle: wmi handle
+ * @psigchange: change monitor request params
+ * @buf: wmi buffer
+ * @buf_len: buffer length
+ *
+ * This function fills elements of change monitor request buffer.
+ *
+ * Return: CDF status
+ */
+static QDF_STATUS wmi_get_buf_extscan_change_monitor_cmd
+			(wmi_unified_t wmi_handle,
+			struct extscan_set_sig_changereq_params
+			*psigchange, wmi_buf_t *buf, int *buf_len)
+{
+	wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *cmd;
+	wmi_extscan_wlan_change_bssid_param *dest_chglist;
+	uint8_t *buf_ptr;
+	int j;
+	int len = sizeof(*cmd);
+	uint32_t numap = psigchange->num_ap;
+	struct ap_threshold_params *src_ap = psigchange->ap;
+
+	if (!numap || (numap > WMI_WLAN_EXTSCAN_MAX_SIGNIFICANT_CHANGE_APS)) {
+		WMI_LOGE("%s: Invalid number of bssid's", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+	len += WMI_TLV_HDR_SIZE;
+	len += numap * sizeof(wmi_extscan_wlan_change_bssid_param);
+
+	*buf = wmi_buf_alloc(wmi_handle, len);
+	if (!*buf) {
+		WMI_LOGP("%s: failed to allocate memory for change monitor cmd",
+			 __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+	buf_ptr = (uint8_t *) wmi_buf_data(*buf);
+	cmd =
+		(wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *)
+		buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+	WMITLV_TAG_STRUC_wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param,
+	       WMITLV_GET_STRUCT_TLVLEN
+	       (wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param));
+
+	cmd->request_id = psigchange->request_id;
+	cmd->vdev_id = psigchange->session_id;
+	cmd->total_entries = numap;
+	cmd->mode = 1;
+	cmd->num_entries_in_page = numap;
+	cmd->lost_ap_scan_count = psigchange->lostap_sample_size;
+	cmd->max_rssi_samples = psigchange->rssi_sample_size;
+	cmd->rssi_averaging_samples = psigchange->rssi_sample_size;
+	cmd->max_out_of_range_count = psigchange->min_breaching;
+
+	buf_ptr += sizeof(*cmd);
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_STRUC,
+		       numap * sizeof(wmi_extscan_wlan_change_bssid_param));
+	dest_chglist = (wmi_extscan_wlan_change_bssid_param *)
+		       (buf_ptr + WMI_TLV_HDR_SIZE);
+
+	for (j = 0; j < numap; j++) {
+		WMITLV_SET_HDR(dest_chglist,
+		       WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_extscan_wlan_change_bssid_param));
+
+		dest_chglist->lower_rssi_limit = src_ap->low;
+		dest_chglist->upper_rssi_limit = src_ap->high;
+		WMI_CHAR_ARRAY_TO_MAC_ADDR(src_ap->bssid.bytes,
+					   &dest_chglist->bssid);
+
+		WMI_LOGD("%s: min_rssi %d", __func__,
+			 dest_chglist->lower_rssi_limit);
+		dest_chglist++;
+		src_ap++;
+	}
+	buf_ptr += WMI_TLV_HDR_SIZE +
+		   (numap * sizeof(wmi_extscan_wlan_change_bssid_param));
+	*buf_len = len;
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_extscan_start_change_monitor_cmd_tlv() - send start change monitor cmd
+ * @wmi_handle: wmi handle
+ * @psigchange: change monitor request params
+ *
+ * This function sends start change monitor request to fw.
+ *
+ * Return: CDF status
+ */
+static QDF_STATUS send_extscan_start_change_monitor_cmd_tlv
+			(wmi_unified_t wmi_handle,
+			struct extscan_set_sig_changereq_params *
+			psigchange)
+{
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
+	wmi_buf_t buf;
+	int len;
+
+
+	qdf_status = wmi_get_buf_extscan_change_monitor_cmd(wmi_handle,
+			     psigchange, &buf,
+			     &len);
+	if (qdf_status != QDF_STATUS_SUCCESS) {
+		WMI_LOGE("%s: Failed to get buffer for change monitor cmd",
+			 __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+	if (!buf) {
+		WMI_LOGE("%s: Failed to get buffer", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+	if (wmi_unified_cmd_send(wmi_handle, buf, len,
+		 WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID)) {
+		WMI_LOGE("%s: failed to send command", __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_extscan_stop_hotlist_monitor_cmd_tlv() - stop hotlist monitor
+ * @wmi_handle: wmi handle
+ * @photlist_reset: hotlist reset params
+ *
+ * This function configures hotlist monitor to stop in fw.
+ *
+ * Return: CDF status
+ */
+static QDF_STATUS send_extscan_stop_hotlist_monitor_cmd_tlv
+		(wmi_unified_t wmi_handle,
+		struct extscan_bssid_hotlist_reset_params *photlist_reset)
+{
+	wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *cmd;
+	wmi_buf_t wmi_buf;
+	uint32_t len;
+	uint8_t *buf_ptr;
+	int hotlist_entries = 0;
+
+	len = sizeof(*cmd);
+
+	/* reset bssid hotlist with tlv set to 0 */
+	len += WMI_TLV_HDR_SIZE;
+	len += hotlist_entries * sizeof(wmi_extscan_hotlist_entry);
+
+	wmi_buf = wmi_buf_alloc(wmi_handle, len);
+	if (!wmi_buf) {
+		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
+	cmd = (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *)
+	      buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+	WMITLV_TAG_STRUC_wmi_extscan_configure_hotlist_monitor_cmd_fixed_param,
+	WMITLV_GET_STRUCT_TLVLEN
+	(wmi_extscan_configure_hotlist_monitor_cmd_fixed_param));
+
+	cmd->request_id = photlist_reset->request_id;
+	cmd->vdev_id = photlist_reset->session_id;
+	cmd->mode = 0;
+
+	buf_ptr += sizeof(*cmd);
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_STRUC,
+		       hotlist_entries * sizeof(wmi_extscan_hotlist_entry));
+	buf_ptr += WMI_TLV_HDR_SIZE +
+		   (hotlist_entries * sizeof(wmi_extscan_hotlist_entry));
+
+	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
+				WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID)) {
+		WMI_LOGE("%s: failed to  command", __func__);
+		wmi_buf_free(wmi_buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_stop_extscan_cmd_tlv() - stop extscan command to fw.
+ * @wmi_handle: wmi handle
+ * @pstopcmd: stop scan command request params
+ *
+ * This function sends stop extscan request to fw.
+ *
+ * Return: CDF Status.
+ */
+static QDF_STATUS send_stop_extscan_cmd_tlv(wmi_unified_t wmi_handle,
+			  struct extscan_stop_req_params *pstopcmd)
+{
+	wmi_extscan_stop_cmd_fixed_param *cmd;
+	wmi_buf_t wmi_buf;
+	uint32_t len;
+	uint8_t *buf_ptr;
+
+	len = sizeof(*cmd);
+	wmi_buf = wmi_buf_alloc(wmi_handle, len);
+	if (!wmi_buf) {
+		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
+	cmd = (wmi_extscan_stop_cmd_fixed_param *) buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_extscan_stop_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+			       (wmi_extscan_stop_cmd_fixed_param));
+
+	cmd->request_id = pstopcmd->request_id;
+	cmd->vdev_id = pstopcmd->session_id;
+
+	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
+				 WMI_EXTSCAN_STOP_CMDID)) {
+		WMI_LOGE("%s: failed to  command", __func__);
+		wmi_buf_free(wmi_buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wmi_get_buf_extscan_start_cmd() - Fill extscan start request
+ * @wmi_handle: wmi handle
+ * @pstart: scan command request params
+ * @buf: event buffer
+ * @buf_len: length of buffer
+ *
+ * This function fills individual elements of extscan request and
+ * TLV for buckets, channel list.
+ *
+ * Return: CDF Status.
+ */
+static
+QDF_STATUS wmi_get_buf_extscan_start_cmd(wmi_unified_t wmi_handle,
+			 struct wifi_scan_cmd_req_params *pstart,
+			 wmi_buf_t *buf, int *buf_len)
+{
+	wmi_extscan_start_cmd_fixed_param *cmd;
+	wmi_extscan_bucket *dest_blist;
+	wmi_extscan_bucket_channel *dest_clist;
+	struct wifi_scan_bucket_params *src_bucket = pstart->buckets;
+	struct wifi_scan_channelspec_params *src_channel = src_bucket->channels;
+	struct wifi_scan_channelspec_params save_channel[WMI_WLAN_EXTSCAN_MAX_CHANNELS];
+
+	uint8_t *buf_ptr;
+	int i, k, count = 0;
+	int len = sizeof(*cmd);
+	int nbuckets = pstart->numBuckets;
+	int nchannels = 0;
+
+	/* These TLV's are are NULL by default */
+	uint32_t ie_len_with_pad = 0;
+	int num_ssid = 0;
+	int num_bssid = 0;
+	int ie_len = 0;
+
+	uint32_t base_period = pstart->basePeriod;
+
+	/* TLV placeholder for ssid_list (NULL) */
+	len += WMI_TLV_HDR_SIZE;
+	len += num_ssid * sizeof(wmi_ssid);
+
+	/* TLV placeholder for bssid_list (NULL) */
+	len += WMI_TLV_HDR_SIZE;
+	len += num_bssid * sizeof(wmi_mac_addr);
+
+	/* TLV placeholder for ie_data (NULL) */
+	len += WMI_TLV_HDR_SIZE;
+	len += ie_len * sizeof(uint32_t);
+
+	/* TLV placeholder for bucket */
+	len += WMI_TLV_HDR_SIZE;
+	len += nbuckets * sizeof(wmi_extscan_bucket);
+
+	/* TLV channel placeholder */
+	len += WMI_TLV_HDR_SIZE;
+	for (i = 0; i < nbuckets; i++) {
+		nchannels += src_bucket->numChannels;
+		src_bucket++;
+	}
+
+	WMI_LOGD("%s: Total buckets: %d total #of channels is %d",
+		__func__, nbuckets, nchannels);
+	len += nchannels * sizeof(wmi_extscan_bucket_channel);
+	/* Allocate the memory */
+	*buf = wmi_buf_alloc(wmi_handle, len);
+	if (!*buf) {
+		WMI_LOGP("%s: failed to allocate memory for start extscan cmd",
+			__func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	buf_ptr = (uint8_t *) wmi_buf_data(*buf);
+	cmd = (wmi_extscan_start_cmd_fixed_param *) buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_extscan_start_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+			       (wmi_extscan_start_cmd_fixed_param));
+
+	cmd->request_id = pstart->requestId;
+	cmd->vdev_id = pstart->sessionId;
+	cmd->base_period = pstart->basePeriod;
+	cmd->num_buckets = nbuckets;
+	cmd->configuration_flags = 0;
+	if (pstart->configuration_flags & WMI_EXTSCAN_LP_EXTENDED_BATCHING)
+		cmd->configuration_flags |= WMI_EXTSCAN_EXTENDED_BATCHING_EN;
+	WMI_LOGI("%s: configuration_flags: 0x%x", __func__,
+			cmd->configuration_flags);
+#ifdef FEATURE_WLAN_EXTSCAN
+	cmd->min_rest_time = WMI_EXTSCAN_REST_TIME;
+	cmd->max_rest_time = WMI_EXTSCAN_REST_TIME;
+	cmd->max_scan_time = WMI_EXTSCAN_MAX_SCAN_TIME;
+	cmd->burst_duration = WMI_EXTSCAN_BURST_DURATION;
+#endif
+	cmd->max_bssids_per_scan_cycle = pstart->maxAPperScan;
+
+	/* The max dwell time is retrieved from the first channel
+	 * of the first bucket and kept common for all channels.
+	 */
+	cmd->min_dwell_time_active = pstart->min_dwell_time_active;
+	cmd->max_dwell_time_active = pstart->max_dwell_time_active;
+	cmd->min_dwell_time_passive = pstart->min_dwell_time_passive;
+	cmd->max_dwell_time_passive = pstart->max_dwell_time_passive;
+	cmd->max_bssids_per_scan_cycle = pstart->maxAPperScan;
+	cmd->max_table_usage = pstart->report_threshold_percent;
+	cmd->report_threshold_num_scans = pstart->report_threshold_num_scans;
+
+	cmd->repeat_probe_time = cmd->max_dwell_time_active /
+					WMI_SCAN_NPROBES_DEFAULT;
+	cmd->probe_delay = 0;
+	cmd->probe_spacing_time = 0;
+	cmd->idle_time = 0;
+	cmd->scan_ctrl_flags = WMI_SCAN_ADD_BCAST_PROBE_REQ |
+			       WMI_SCAN_ADD_CCK_RATES |
+			       WMI_SCAN_ADD_OFDM_RATES |
+			       WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ |
+			       WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
+	WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags,
+			pstart->extscan_adaptive_dwell_mode);
+	cmd->scan_priority = WMI_SCAN_PRIORITY_VERY_LOW;
+	cmd->num_ssids = 0;
+	cmd->num_bssid = 0;
+	cmd->ie_len = 0;
+	cmd->n_probes = (cmd->repeat_probe_time > 0) ?
+			cmd->max_dwell_time_active / cmd->repeat_probe_time : 0;
+
+	buf_ptr += sizeof(*cmd);
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_FIXED_STRUC,
+		       num_ssid * sizeof(wmi_ssid));
+	buf_ptr += WMI_TLV_HDR_SIZE + (num_ssid * sizeof(wmi_ssid));
+
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_FIXED_STRUC,
+		       num_bssid * sizeof(wmi_mac_addr));
+	buf_ptr += WMI_TLV_HDR_SIZE + (num_bssid * sizeof(wmi_mac_addr));
+
+	ie_len_with_pad = 0;
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
+			  ie_len_with_pad);
+	buf_ptr += WMI_TLV_HDR_SIZE + ie_len_with_pad;
+
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_STRUC,
+		       nbuckets * sizeof(wmi_extscan_bucket));
+	dest_blist = (wmi_extscan_bucket *)
+		     (buf_ptr + WMI_TLV_HDR_SIZE);
+	src_bucket = pstart->buckets;
+
+	/* Retrieve scanning information from each bucket and
+	 * channels and send it to the target
+	 */
+	for (i = 0; i < nbuckets; i++) {
+		WMITLV_SET_HDR(dest_blist,
+		      WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
+		      WMITLV_GET_STRUCT_TLVLEN(wmi_extscan_bucket));
+
+		dest_blist->bucket_id = src_bucket->bucket;
+		dest_blist->base_period_multiplier =
+			src_bucket->period / base_period;
+		dest_blist->min_period = src_bucket->period;
+		dest_blist->max_period = src_bucket->max_period;
+		dest_blist->exp_backoff = src_bucket->exponent;
+		dest_blist->exp_max_step_count = src_bucket->step_count;
+		dest_blist->channel_band = src_bucket->band;
+		dest_blist->num_channels = src_bucket->numChannels;
+		dest_blist->notify_extscan_events = 0;
+
+		if (src_bucket->reportEvents & WMI_EXTSCAN_REPORT_EVENTS_EACH_SCAN)
+			dest_blist->notify_extscan_events =
+					WMI_EXTSCAN_CYCLE_COMPLETED_EVENT |
+					WMI_EXTSCAN_CYCLE_STARTED_EVENT;
+
+		if (src_bucket->reportEvents &
+				WMI_EXTSCAN_REPORT_EVENTS_FULL_RESULTS) {
+			dest_blist->forwarding_flags =
+				WMI_EXTSCAN_FORWARD_FRAME_TO_HOST;
+			dest_blist->notify_extscan_events |=
+				WMI_EXTSCAN_BUCKET_COMPLETED_EVENT |
+				WMI_EXTSCAN_CYCLE_STARTED_EVENT |
+				WMI_EXTSCAN_CYCLE_COMPLETED_EVENT;
+		} else {
+			dest_blist->forwarding_flags =
+				WMI_EXTSCAN_NO_FORWARDING;
+		}
+
+		if (src_bucket->reportEvents & WMI_EXTSCAN_REPORT_EVENTS_NO_BATCH)
+			dest_blist->configuration_flags = 0;
+		else
+			dest_blist->configuration_flags =
+				WMI_EXTSCAN_BUCKET_CACHE_RESULTS;
+
+		WMI_LOGI("%s: ntfy_extscan_events:%u cfg_flags:%u fwd_flags:%u",
+			__func__, dest_blist->notify_extscan_events,
+			dest_blist->configuration_flags,
+			dest_blist->forwarding_flags);
+
+		dest_blist->min_dwell_time_active =
+				   src_bucket->min_dwell_time_active;
+		dest_blist->max_dwell_time_active =
+				   src_bucket->max_dwell_time_active;
+		dest_blist->min_dwell_time_passive =
+				   src_bucket->min_dwell_time_passive;
+		dest_blist->max_dwell_time_passive =
+				   src_bucket->max_dwell_time_passive;
+		src_channel = src_bucket->channels;
+
+		/* save the channel info to later populate
+		 * the  channel TLV
+		 */
+		for (k = 0; k < src_bucket->numChannels; k++) {
+			save_channel[count++].channel = src_channel->channel;
+			src_channel++;
+		}
+		dest_blist++;
+		src_bucket++;
+	}
+	buf_ptr += WMI_TLV_HDR_SIZE + (nbuckets * sizeof(wmi_extscan_bucket));
+	WMITLV_SET_HDR(buf_ptr,
+		       WMITLV_TAG_ARRAY_STRUC,
+		       nchannels * sizeof(wmi_extscan_bucket_channel));
+	dest_clist = (wmi_extscan_bucket_channel *)
+		     (buf_ptr + WMI_TLV_HDR_SIZE);
+
+	/* Active or passive scan is based on the bucket dwell time
+	 * and channel specific active,passive scans are not
+	 * supported yet
+	 */
+	for (i = 0; i < nchannels; i++) {
+		WMITLV_SET_HDR(dest_clist,
+		WMITLV_TAG_STRUC_wmi_extscan_bucket_channel_event_fixed_param,
+			   WMITLV_GET_STRUCT_TLVLEN
+			   (wmi_extscan_bucket_channel));
+		dest_clist->channel = save_channel[i].channel;
+		dest_clist++;
+	}
+	buf_ptr += WMI_TLV_HDR_SIZE +
+		   (nchannels * sizeof(wmi_extscan_bucket_channel));
+	*buf_len = len;
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_start_extscan_cmd_tlv() - start extscan command to fw.
+ * @wmi_handle: wmi handle
+ * @pstart: scan command request params
+ *
+ * This function sends start extscan request to fw.
+ *
+ * Return: CDF Status.
+ */
+static QDF_STATUS send_start_extscan_cmd_tlv(wmi_unified_t wmi_handle,
+			  struct wifi_scan_cmd_req_params *pstart)
+{
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
+	wmi_buf_t buf;
+	int len;
+
+	/* Fill individual elements of extscan request and
+	 * TLV for buckets, channel list.
+	 */
+	qdf_status = wmi_get_buf_extscan_start_cmd(wmi_handle,
+			     pstart, &buf, &len);
+	if (qdf_status != QDF_STATUS_SUCCESS) {
+		WMI_LOGE("%s: Failed to get buffer for ext scan cmd", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+	if (!buf) {
+		WMI_LOGE("%s:Failed to get buffer for current extscan info",
+			__func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+	if (wmi_unified_cmd_send(wmi_handle, buf,
+				 len, WMI_EXTSCAN_START_CMDID)) {
+		WMI_LOGE("%s: failed to send command", __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/** wmi_get_hotlist_entries_per_page() - hotlist entries per page
+ * @wmi_handle: wmi handle.
+ * @cmd: size of command structure.
+ * @per_entry_size: per entry size.
+ *
+ * This utility function calculates how many hotlist entries can
+ * fit in one page.
+ *
+ * Return: number of entries
+ */
+static inline int wmi_get_hotlist_entries_per_page
+				(wmi_unified_t wmi_handle,
+				size_t cmd_size,
+				size_t per_entry_size)
+{
+	uint32_t avail_space = 0;
+	int num_entries = 0;
+	uint16_t max_msg_len = wmi_get_max_msg_len(wmi_handle);
+
+	/* Calculate number of hotlist entries that can
+	 * be passed in wma message request.
+	 */
+	avail_space = max_msg_len - cmd_size;
+	num_entries = avail_space / per_entry_size;
+	return num_entries;
+}
+
+/**
+ * send_get_buf_extscan_hotlist_cmd_tlv() - prepare hotlist command
+ * @wmi_handle: wmi handle
+ * @photlist: hotlist command params
+ * @buf_len: buffer length
+ *
+ * This function fills individual elements for  hotlist request and
+ * TLV for bssid entries
+ *
+ * Return: CDF Status.
+ */
+static QDF_STATUS send_get_buf_extscan_hotlist_cmd_tlv
+			(wmi_unified_t wmi_handle,
+			struct ext_scan_setbssi_hotlist_params *photlist,
+			int *buf_len)
+{
+	wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *cmd = NULL;
+	wmi_extscan_hotlist_entry *dest_hotlist;
+	struct ap_threshold_params *src_ap = photlist->ap;
+	wmi_buf_t buf;
+	uint8_t *buf_ptr;
+
+	int j, index = 0;
+	int cmd_len = 0;
+	int num_entries;
+	int min_entries = 0;
+	uint32_t numap = photlist->numAp;
+	int len = sizeof(*cmd);
+
+	len += WMI_TLV_HDR_SIZE;
+	cmd_len = len;
+
+	num_entries = wmi_get_hotlist_entries_per_page(wmi_handle,
+							cmd_len,
+							sizeof(*dest_hotlist));
+	/* setbssid hotlist expects the bssid list
+	 * to be non zero value
+	 */
+	if (!numap || (numap > WMI_WLAN_EXTSCAN_MAX_HOTLIST_APS)) {
+		WMI_LOGE("Invalid number of APs: %d", numap);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	/* Split the hot list entry pages and send multiple command
+	 * requests if the buffer reaches the maximum request size
+	 */
+	while (index < numap) {
+		min_entries = QDF_MIN(num_entries, numap);
+		len += min_entries * sizeof(wmi_extscan_hotlist_entry);
+		buf = wmi_buf_alloc(wmi_handle, len);
+		if (!buf) {
+			WMI_LOGP("%s: wmi_buf_alloc failed", __func__);
+			return QDF_STATUS_E_FAILURE;
+		}
+		buf_ptr = (uint8_t *) wmi_buf_data(buf);
+		cmd = (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *)
+		      buf_ptr;
+		WMITLV_SET_HDR(&cmd->tlv_header,
+			       WMITLV_TAG_STRUC_wmi_extscan_configure_hotlist_monitor_cmd_fixed_param,
+			       WMITLV_GET_STRUCT_TLVLEN
+				       (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param));
+
+		/* Multiple requests are sent until the num_entries_in_page
+		 * matches the total_entries
+		 */
+		cmd->request_id = photlist->requestId;
+		cmd->vdev_id = photlist->sessionId;
+		cmd->total_entries = numap;
+		cmd->mode = 1;
+		cmd->num_entries_in_page = min_entries;
+		cmd->lost_ap_scan_count = photlist->lost_ap_sample_size;
+		cmd->first_entry_index = index;
+
+		WMI_LOGD("%s: vdev id:%d total_entries: %d num_entries: %d lost_ap_sample_size: %d",
+			__func__, cmd->vdev_id, cmd->total_entries,
+			cmd->num_entries_in_page,
+			cmd->lost_ap_scan_count);
+
+		buf_ptr += sizeof(*cmd);
+		WMITLV_SET_HDR(buf_ptr,
+			       WMITLV_TAG_ARRAY_STRUC,
+			       min_entries * sizeof(wmi_extscan_hotlist_entry));
+		dest_hotlist = (wmi_extscan_hotlist_entry *)
+			       (buf_ptr + WMI_TLV_HDR_SIZE);
+
+		/* Populate bssid, channel info and rssi
+		 * for the bssid's that are sent as hotlists.
+		 */
+		for (j = 0; j < min_entries; j++) {
+			WMITLV_SET_HDR(dest_hotlist,
+				       WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
+				       WMITLV_GET_STRUCT_TLVLEN
+					       (wmi_extscan_hotlist_entry));
+
+			dest_hotlist->min_rssi = src_ap->low;
+			WMI_CHAR_ARRAY_TO_MAC_ADDR(src_ap->bssid.bytes,
+						   &dest_hotlist->bssid);
+
+			WMI_LOGD("%s:channel:%d min_rssi %d",
+				 __func__, dest_hotlist->channel,
+				 dest_hotlist->min_rssi);
+			WMI_LOGD
+				("%s: bssid mac_addr31to0: 0x%x, mac_addr47to32: 0x%x",
+				__func__, dest_hotlist->bssid.mac_addr31to0,
+				dest_hotlist->bssid.mac_addr47to32);
+			dest_hotlist++;
+			src_ap++;
+		}
+		buf_ptr += WMI_TLV_HDR_SIZE +
+			   (min_entries * sizeof(wmi_extscan_hotlist_entry));
+
+		if (wmi_unified_cmd_send(wmi_handle, buf, len,
+				WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID)) {
+			WMI_LOGE("%s: failed to send command", __func__);
+			wmi_buf_free(buf);
+			return QDF_STATUS_E_FAILURE;
+		}
+		index = index + min_entries;
+		num_entries = numap - min_entries;
+		len = cmd_len;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+void wmi_extscan_attach_tlv(wmi_unified_t wmi_handle)
+{
+	struct wmi_ops *ops = wmi_handle->ops;
+	ops->send_reset_passpoint_network_list_cmd =
+				send_reset_passpoint_network_list_cmd_tlv;
+	ops->send_set_passpoint_network_list_cmd =
+				send_set_passpoint_network_list_cmd_tlv;
+	ops->send_set_epno_network_list_cmd =
+				send_set_epno_network_list_cmd_tlv;
+	ops->send_extscan_get_capabilities_cmd =
+				 send_extscan_get_capabilities_cmd_tlv;
+	ops->send_extscan_get_cached_results_cmd =
+				send_extscan_get_cached_results_cmd_tlv;
+	ops->send_extscan_stop_change_monitor_cmd =
+				send_extscan_stop_change_monitor_cmd_tlv;
+	ops->send_extscan_start_change_monitor_cmd =
+				send_extscan_start_change_monitor_cmd_tlv;
+	ops->send_extscan_stop_hotlist_monitor_cmd =
+				send_extscan_stop_hotlist_monitor_cmd_tlv;
+	ops->send_stop_extscan_cmd = send_stop_extscan_cmd_tlv;
+	ops->send_start_extscan_cmd = send_start_extscan_cmd_tlv;
+	ops->send_get_buf_extscan_hotlist_cmd =
+				send_get_buf_extscan_hotlist_cmd_tlv;
+}
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index 6fc7ded..828ce59 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -5965,118 +5965,6 @@
 	return QDF_STATUS_SUCCESS;
 }
 
-/**
- * send_reset_passpoint_network_list_cmd_tlv() - reset passpoint network list
- * @wmi_handle: wmi handle
- * @req: passpoint network request structure
- *
- * This function sends down WMI command with network id set to wildcard id.
- * firmware shall clear all the config entries
- *
- * Return: QDF_STATUS enumeration
- */
-static QDF_STATUS send_reset_passpoint_network_list_cmd_tlv(wmi_unified_t wmi_handle,
-					struct wifi_passpoint_req_param *req)
-{
-	wmi_passpoint_config_cmd_fixed_param *cmd;
-	wmi_buf_t buf;
-	uint32_t len;
-	int ret;
-
-	len = sizeof(*cmd);
-	buf = wmi_buf_alloc(wmi_handle, len);
-	if (!buf) {
-		WMI_LOGE("%s: Failed allocate wmi buffer", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	cmd = (wmi_passpoint_config_cmd_fixed_param *) wmi_buf_data(buf);
-
-	WMITLV_SET_HDR(&cmd->tlv_header,
-			WMITLV_TAG_STRUC_wmi_passpoint_config_cmd_fixed_param,
-			WMITLV_GET_STRUCT_TLVLEN(
-			wmi_passpoint_config_cmd_fixed_param));
-	cmd->id = WMI_PASSPOINT_NETWORK_ID_WILDCARD;
-
-	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
-				   WMI_PASSPOINT_LIST_CONFIG_CMDID);
-	if (ret) {
-		WMI_LOGE("%s: Failed to send reset passpoint network list wmi cmd",
-			 __func__);
-		wmi_buf_free(buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_set_passpoint_network_list_cmd_tlv() - set passpoint network list
- * @wmi_handle: wmi handle
- * @req: passpoint network request structure
- *
- * This function reads the incoming @req and fill in the destination
- * WMI structure and send down the passpoint configs down to the firmware
- *
- * Return: QDF_STATUS enumeration
- */
-static QDF_STATUS send_set_passpoint_network_list_cmd_tlv(wmi_unified_t wmi_handle,
-					struct wifi_passpoint_req_param *req)
-{
-	wmi_passpoint_config_cmd_fixed_param *cmd;
-	u_int8_t i, j, *bytes;
-	wmi_buf_t buf;
-	uint32_t len;
-	int ret;
-
-	len = sizeof(*cmd);
-	for (i = 0; i < req->num_networks; i++) {
-		buf = wmi_buf_alloc(wmi_handle, len);
-		if (!buf) {
-			WMI_LOGE("%s: Failed allocate wmi buffer", __func__);
-			return QDF_STATUS_E_NOMEM;
-		}
-
-		cmd = (wmi_passpoint_config_cmd_fixed_param *)
-				wmi_buf_data(buf);
-
-		WMITLV_SET_HDR(&cmd->tlv_header,
-			WMITLV_TAG_STRUC_wmi_passpoint_config_cmd_fixed_param,
-			WMITLV_GET_STRUCT_TLVLEN(
-			wmi_passpoint_config_cmd_fixed_param));
-		cmd->id = req->networks[i].id;
-		WMI_LOGD("%s: network id: %u", __func__, cmd->id);
-		qdf_mem_copy(cmd->realm, req->networks[i].realm,
-			strlen(req->networks[i].realm) + 1);
-		WMI_LOGD("%s: realm: %s", __func__, cmd->realm);
-		for (j = 0; j < PASSPOINT_ROAMING_CONSORTIUM_ID_NUM; j++) {
-			bytes = (uint8_t *) &req->networks[i].roaming_consortium_ids[j];
-			WMI_LOGD("index: %d rcids: %02x %02x %02x %02x %02x %02x %02x %02x",
-				j, bytes[0], bytes[1], bytes[2], bytes[3],
-				bytes[4], bytes[5], bytes[6], bytes[7]);
-
-			qdf_mem_copy(&cmd->roaming_consortium_ids[j],
-				&req->networks[i].roaming_consortium_ids[j],
-				PASSPOINT_ROAMING_CONSORTIUM_ID_LEN);
-		}
-		qdf_mem_copy(cmd->plmn, req->networks[i].plmn,
-				PASSPOINT_PLMN_ID_LEN);
-		WMI_LOGD("%s: plmn: %02x:%02x:%02x", __func__,
-			cmd->plmn[0], cmd->plmn[1], cmd->plmn[2]);
-
-		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
-					   WMI_PASSPOINT_LIST_CONFIG_CMDID);
-		if (ret) {
-			WMI_LOGE("%s: Failed to send set passpoint network list wmi cmd",
-				 __func__);
-			wmi_buf_free(buf);
-			return QDF_STATUS_E_FAILURE;
-		}
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
 #if defined(WLAN_FEATURE_FILS_SK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
 /**
  * wmi_add_fils_tlv() - Add FILS TLV to roam scan offload command
@@ -7075,153 +6963,6 @@
 }
 #endif
 
-/** send_set_epno_network_list_cmd_tlv() - set epno network list
- * @wmi_handle: wmi handle
- * @req: epno config params request structure
- *
- * This function reads the incoming epno config request structure
- * and constructs the WMI message to the firmware.
- *
- * Returns: 0 on success, error number otherwise
- */
-static QDF_STATUS send_set_epno_network_list_cmd_tlv(wmi_unified_t wmi_handle,
-		struct wifi_enhanched_pno_params *req)
-{
-	wmi_nlo_config_cmd_fixed_param *cmd;
-	nlo_configured_parameters *nlo_list;
-	enlo_candidate_score_params *cand_score_params;
-	u_int8_t i, *buf_ptr;
-	wmi_buf_t buf;
-	uint32_t len;
-	QDF_STATUS ret;
-
-	/* Fixed Params */
-	len = sizeof(*cmd);
-	if (req->num_networks) {
-		/* TLV place holder for array of structures
-		 * then each nlo_configured_parameters(nlo_list) TLV.
-		 */
-		len += WMI_TLV_HDR_SIZE;
-		len += (sizeof(nlo_configured_parameters)
-			    * QDF_MIN(req->num_networks, WMI_NLO_MAX_SSIDS));
-		/* TLV for array of uint32 channel_list */
-		len += WMI_TLV_HDR_SIZE;
-		/* TLV for nlo_channel_prediction_cfg */
-		len += WMI_TLV_HDR_SIZE;
-		/* TLV for candidate score params */
-		len += sizeof(enlo_candidate_score_params);
-	}
-
-	buf = wmi_buf_alloc(wmi_handle, len);
-	if (!buf) {
-		WMI_LOGE("%s: Failed allocate wmi buffer", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	cmd = (wmi_nlo_config_cmd_fixed_param *) wmi_buf_data(buf);
-
-	buf_ptr = (u_int8_t *) cmd;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-		       WMITLV_TAG_STRUC_wmi_nlo_config_cmd_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN(
-			       wmi_nlo_config_cmd_fixed_param));
-	cmd->vdev_id = req->session_id;
-
-	/* set flag to reset if num of networks are 0 */
-	cmd->flags = (req->num_networks == 0 ?
-		WMI_NLO_CONFIG_ENLO_RESET : WMI_NLO_CONFIG_ENLO);
-
-	buf_ptr += sizeof(wmi_nlo_config_cmd_fixed_param);
-
-	cmd->no_of_ssids = QDF_MIN(req->num_networks, WMI_NLO_MAX_SSIDS);
-	WMI_LOGD("SSID count: %d flags: %d",
-		cmd->no_of_ssids, cmd->flags);
-
-	/* Fill nlo_config only when num_networks are non zero */
-	if (cmd->no_of_ssids) {
-		/* Fill networks */
-		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
-			cmd->no_of_ssids * sizeof(nlo_configured_parameters));
-		buf_ptr += WMI_TLV_HDR_SIZE;
-
-		nlo_list = (nlo_configured_parameters *) buf_ptr;
-		for (i = 0; i < cmd->no_of_ssids; i++) {
-			WMITLV_SET_HDR(&nlo_list[i].tlv_header,
-				WMITLV_TAG_ARRAY_BYTE,
-				WMITLV_GET_STRUCT_TLVLEN(
-				nlo_configured_parameters));
-			/* Copy ssid and it's length */
-			nlo_list[i].ssid.valid = true;
-			nlo_list[i].ssid.ssid.ssid_len =
-				req->networks[i].ssid.length;
-			qdf_mem_copy(nlo_list[i].ssid.ssid.ssid,
-				     req->networks[i].ssid.mac_ssid,
-				     nlo_list[i].ssid.ssid.ssid_len);
-			WMI_LOGD("index: %d ssid: %.*s len: %d", i,
-				 nlo_list[i].ssid.ssid.ssid_len,
-				 (char *) nlo_list[i].ssid.ssid.ssid,
-				 nlo_list[i].ssid.ssid.ssid_len);
-
-			/* Copy pno flags */
-			nlo_list[i].bcast_nw_type.valid = true;
-			nlo_list[i].bcast_nw_type.bcast_nw_type =
-					req->networks[i].flags;
-			WMI_LOGD("PNO flags (%u)",
-				nlo_list[i].bcast_nw_type.bcast_nw_type);
-
-			/* Copy auth bit field */
-			nlo_list[i].auth_type.valid = true;
-			nlo_list[i].auth_type.auth_type =
-					req->networks[i].auth_bit_field;
-			WMI_LOGD("Auth bit field (%u)",
-					nlo_list[i].auth_type.auth_type);
-		}
-
-		buf_ptr += cmd->no_of_ssids * sizeof(nlo_configured_parameters);
-		/* Fill the channel list */
-		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32, 0);
-		buf_ptr += WMI_TLV_HDR_SIZE;
-
-		/* Fill prediction_param */
-		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0);
-		buf_ptr += WMI_TLV_HDR_SIZE;
-
-		/* Fill epno candidate score params */
-		cand_score_params = (enlo_candidate_score_params *) buf_ptr;
-		WMITLV_SET_HDR(buf_ptr,
-			WMITLV_TAG_STRUC_enlo_candidate_score_param,
-			WMITLV_GET_STRUCT_TLVLEN(enlo_candidate_score_params));
-		cand_score_params->min5GHz_rssi =
-			req->min_5ghz_rssi;
-		cand_score_params->min24GHz_rssi =
-			req->min_24ghz_rssi;
-		cand_score_params->initial_score_max =
-			req->initial_score_max;
-		cand_score_params->current_connection_bonus =
-			req->current_connection_bonus;
-		cand_score_params->same_network_bonus =
-			req->same_network_bonus;
-		cand_score_params->secure_bonus =
-			req->secure_bonus;
-		cand_score_params->band5GHz_bonus =
-			req->band_5ghz_bonus;
-		buf_ptr += sizeof(enlo_candidate_score_params);
-	}
-
-	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
-			WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID);
-	if (QDF_IS_STATUS_ERROR(ret)) {
-		WMI_LOGE("%s: Failed to send nlo wmi cmd", __func__);
-		wmi_buf_free(buf);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	WMI_LOGD("set ePNO list request sent successfully for vdev %d",
-		 req->session_id);
-
-	return ret;
-}
-
 #ifdef IPA_OFFLOAD
 /** send_ipa_offload_control_cmd_tlv() - ipa offload control parameter
  * @wmi_handle: wmi handle
@@ -7271,656 +7012,6 @@
 #endif
 
 /**
- * send_extscan_get_capabilities_cmd_tlv() - extscan get capabilities
- * @wmi_handle: wmi handle
- * @pgetcapab: get capabilities params
- *
- * This function send request to fw to get extscan capabilities.
- *
- * Return: CDF status
- */
-static QDF_STATUS send_extscan_get_capabilities_cmd_tlv(wmi_unified_t wmi_handle,
-		    struct extscan_capabilities_params *pgetcapab)
-{
-	wmi_extscan_get_capabilities_cmd_fixed_param *cmd;
-	wmi_buf_t wmi_buf;
-	uint32_t len;
-	uint8_t *buf_ptr;
-
-	len = sizeof(*cmd);
-	wmi_buf = wmi_buf_alloc(wmi_handle, len);
-	if (!wmi_buf) {
-		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
-
-	cmd = (wmi_extscan_get_capabilities_cmd_fixed_param *) buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-	       WMITLV_TAG_STRUC_wmi_extscan_get_capabilities_cmd_fixed_param,
-	       WMITLV_GET_STRUCT_TLVLEN
-	       (wmi_extscan_get_capabilities_cmd_fixed_param));
-
-	cmd->request_id = pgetcapab->request_id;
-
-	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
-				 WMI_EXTSCAN_GET_CAPABILITIES_CMDID)) {
-		WMI_LOGE("%s: failed to  command", __func__);
-		wmi_buf_free(wmi_buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_extscan_get_cached_results_cmd_tlv() - extscan get cached results
- * @wmi_handle: wmi handle
- * @pcached_results: cached results parameters
- *
- * This function send request to fw to get cached results.
- *
- * Return: CDF status
- */
-static QDF_STATUS send_extscan_get_cached_results_cmd_tlv(wmi_unified_t wmi_handle,
-		  struct extscan_cached_result_params *pcached_results)
-{
-	wmi_extscan_get_cached_results_cmd_fixed_param *cmd;
-	wmi_buf_t wmi_buf;
-	uint32_t len;
-	uint8_t *buf_ptr;
-
-	len = sizeof(*cmd);
-	wmi_buf = wmi_buf_alloc(wmi_handle, len);
-	if (!wmi_buf) {
-		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
-
-	cmd = (wmi_extscan_get_cached_results_cmd_fixed_param *) buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-		WMITLV_TAG_STRUC_wmi_extscan_get_cached_results_cmd_fixed_param,
-		WMITLV_GET_STRUCT_TLVLEN
-		(wmi_extscan_get_cached_results_cmd_fixed_param));
-
-	cmd->request_id = pcached_results->request_id;
-	cmd->vdev_id = pcached_results->session_id;
-	cmd->control_flags = pcached_results->flush;
-
-	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
-				 WMI_EXTSCAN_GET_CACHED_RESULTS_CMDID)) {
-		WMI_LOGE("%s: failed to  command", __func__);
-		wmi_buf_free(wmi_buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_extscan_stop_change_monitor_cmd_tlv() - send stop change monitor cmd
- * @wmi_handle: wmi handle
- * @reset_req: Reset change request params
- *
- * This function sends stop change monitor request to fw.
- *
- * Return: CDF status
- */
-static QDF_STATUS send_extscan_stop_change_monitor_cmd_tlv(wmi_unified_t wmi_handle,
-			struct extscan_capabilities_reset_params *reset_req)
-{
-	wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *cmd;
-	wmi_buf_t wmi_buf;
-	uint32_t len;
-	uint8_t *buf_ptr;
-	int change_list = 0;
-
-	len = sizeof(*cmd);
-
-	/* reset significant change tlv is set to 0 */
-	len += WMI_TLV_HDR_SIZE;
-	len += change_list * sizeof(wmi_extscan_wlan_change_bssid_param);
-	wmi_buf = wmi_buf_alloc(wmi_handle, len);
-	if (!wmi_buf) {
-		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
-
-	cmd = (wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *)
-		buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-	WMITLV_TAG_STRUC_wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param,
-		WMITLV_GET_STRUCT_TLVLEN
-		(wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param));
-
-	cmd->request_id = reset_req->request_id;
-	cmd->vdev_id = reset_req->session_id;
-	cmd->mode = 0;
-
-	buf_ptr += sizeof(*cmd);
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_STRUC,
-		       change_list *
-		       sizeof(wmi_extscan_wlan_change_bssid_param));
-	buf_ptr += WMI_TLV_HDR_SIZE + (change_list *
-				       sizeof
-				       (wmi_extscan_wlan_change_bssid_param));
-
-	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
-			 WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID)) {
-		WMI_LOGE("%s: failed to  command", __func__);
-		wmi_buf_free(wmi_buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * wmi_get_buf_extscan_change_monitor_cmd() - fill change monitor request
- * @wmi_handle: wmi handle
- * @psigchange: change monitor request params
- * @buf: wmi buffer
- * @buf_len: buffer length
- *
- * This function fills elements of change monitor request buffer.
- *
- * Return: CDF status
- */
-static QDF_STATUS wmi_get_buf_extscan_change_monitor_cmd(wmi_unified_t wmi_handle,
-			struct extscan_set_sig_changereq_params
-			*psigchange, wmi_buf_t *buf, int *buf_len)
-{
-	wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *cmd;
-	wmi_extscan_wlan_change_bssid_param *dest_chglist;
-	uint8_t *buf_ptr;
-	int j;
-	int len = sizeof(*cmd);
-	uint32_t numap = psigchange->num_ap;
-	struct ap_threshold_params *src_ap = psigchange->ap;
-
-	if (!numap || (numap > WMI_WLAN_EXTSCAN_MAX_SIGNIFICANT_CHANGE_APS)) {
-		WMI_LOGE("%s: Invalid number of bssid's", __func__);
-		return QDF_STATUS_E_INVAL;
-	}
-	len += WMI_TLV_HDR_SIZE;
-	len += numap * sizeof(wmi_extscan_wlan_change_bssid_param);
-
-	*buf = wmi_buf_alloc(wmi_handle, len);
-	if (!*buf) {
-		WMI_LOGP("%s: failed to allocate memory for change monitor cmd",
-			 __func__);
-		return QDF_STATUS_E_FAILURE;
-	}
-	buf_ptr = (uint8_t *) wmi_buf_data(*buf);
-	cmd =
-		(wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *)
-		buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-	WMITLV_TAG_STRUC_wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param,
-	       WMITLV_GET_STRUCT_TLVLEN
-	       (wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param));
-
-	cmd->request_id = psigchange->request_id;
-	cmd->vdev_id = psigchange->session_id;
-	cmd->total_entries = numap;
-	cmd->mode = 1;
-	cmd->num_entries_in_page = numap;
-	cmd->lost_ap_scan_count = psigchange->lostap_sample_size;
-	cmd->max_rssi_samples = psigchange->rssi_sample_size;
-	cmd->rssi_averaging_samples = psigchange->rssi_sample_size;
-	cmd->max_out_of_range_count = psigchange->min_breaching;
-
-	buf_ptr += sizeof(*cmd);
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_STRUC,
-		       numap * sizeof(wmi_extscan_wlan_change_bssid_param));
-	dest_chglist = (wmi_extscan_wlan_change_bssid_param *)
-		       (buf_ptr + WMI_TLV_HDR_SIZE);
-
-	for (j = 0; j < numap; j++) {
-		WMITLV_SET_HDR(dest_chglist,
-		       WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN
-		       (wmi_extscan_wlan_change_bssid_param));
-
-		dest_chglist->lower_rssi_limit = src_ap->low;
-		dest_chglist->upper_rssi_limit = src_ap->high;
-		WMI_CHAR_ARRAY_TO_MAC_ADDR(src_ap->bssid.bytes,
-					   &dest_chglist->bssid);
-
-		WMI_LOGD("%s: min_rssi %d", __func__,
-			 dest_chglist->lower_rssi_limit);
-		dest_chglist++;
-		src_ap++;
-	}
-	buf_ptr += WMI_TLV_HDR_SIZE +
-		   (numap * sizeof(wmi_extscan_wlan_change_bssid_param));
-	*buf_len = len;
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_extscan_start_change_monitor_cmd_tlv() - send start change monitor cmd
- * @wmi_handle: wmi handle
- * @psigchange: change monitor request params
- *
- * This function sends start change monitor request to fw.
- *
- * Return: CDF status
- */
-static QDF_STATUS send_extscan_start_change_monitor_cmd_tlv(wmi_unified_t wmi_handle,
-			   struct extscan_set_sig_changereq_params *
-			   psigchange)
-{
-	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
-	wmi_buf_t buf;
-	int len;
-
-
-	qdf_status = wmi_get_buf_extscan_change_monitor_cmd(wmi_handle,
-			     psigchange, &buf,
-			     &len);
-	if (qdf_status != QDF_STATUS_SUCCESS) {
-		WMI_LOGE("%s: Failed to get buffer for change monitor cmd",
-			 __func__);
-		return QDF_STATUS_E_FAILURE;
-	}
-	if (!buf) {
-		WMI_LOGE("%s: Failed to get buffer", __func__);
-		return QDF_STATUS_E_FAILURE;
-	}
-	if (wmi_unified_cmd_send(wmi_handle, buf, len,
-		 WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID)) {
-		WMI_LOGE("%s: failed to send command", __func__);
-		wmi_buf_free(buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_extscan_stop_hotlist_monitor_cmd_tlv() - stop hotlist monitor
- * @wmi_handle: wmi handle
- * @photlist_reset: hotlist reset params
- *
- * This function configures hotlist monitor to stop in fw.
- *
- * Return: CDF status
- */
-static QDF_STATUS send_extscan_stop_hotlist_monitor_cmd_tlv(wmi_unified_t wmi_handle,
-		  struct extscan_bssid_hotlist_reset_params *photlist_reset)
-{
-	wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *cmd;
-	wmi_buf_t wmi_buf;
-	uint32_t len;
-	uint8_t *buf_ptr;
-	int hotlist_entries = 0;
-
-	len = sizeof(*cmd);
-
-	/* reset bssid hotlist with tlv set to 0 */
-	len += WMI_TLV_HDR_SIZE;
-	len += hotlist_entries * sizeof(wmi_extscan_hotlist_entry);
-
-	wmi_buf = wmi_buf_alloc(wmi_handle, len);
-	if (!wmi_buf) {
-		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
-	cmd = (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *)
-	      buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-	WMITLV_TAG_STRUC_wmi_extscan_configure_hotlist_monitor_cmd_fixed_param,
-	WMITLV_GET_STRUCT_TLVLEN
-	(wmi_extscan_configure_hotlist_monitor_cmd_fixed_param));
-
-	cmd->request_id = photlist_reset->request_id;
-	cmd->vdev_id = photlist_reset->session_id;
-	cmd->mode = 0;
-
-	buf_ptr += sizeof(*cmd);
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_STRUC,
-		       hotlist_entries * sizeof(wmi_extscan_hotlist_entry));
-	buf_ptr += WMI_TLV_HDR_SIZE +
-		   (hotlist_entries * sizeof(wmi_extscan_hotlist_entry));
-
-	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
-				 WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID)) {
-		WMI_LOGE("%s: failed to  command", __func__);
-		wmi_buf_free(wmi_buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_stop_extscan_cmd_tlv() - stop extscan command to fw.
- * @wmi_handle: wmi handle
- * @pstopcmd: stop scan command request params
- *
- * This function sends stop extscan request to fw.
- *
- * Return: CDF Status.
- */
-static QDF_STATUS send_stop_extscan_cmd_tlv(wmi_unified_t wmi_handle,
-			  struct extscan_stop_req_params *pstopcmd)
-{
-	wmi_extscan_stop_cmd_fixed_param *cmd;
-	wmi_buf_t wmi_buf;
-	uint32_t len;
-	uint8_t *buf_ptr;
-
-	len = sizeof(*cmd);
-	wmi_buf = wmi_buf_alloc(wmi_handle, len);
-	if (!wmi_buf) {
-		WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
-	cmd = (wmi_extscan_stop_cmd_fixed_param *) buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-		       WMITLV_TAG_STRUC_wmi_extscan_stop_cmd_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN
-			       (wmi_extscan_stop_cmd_fixed_param));
-
-	cmd->request_id = pstopcmd->request_id;
-	cmd->vdev_id = pstopcmd->session_id;
-
-	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
-				 WMI_EXTSCAN_STOP_CMDID)) {
-		WMI_LOGE("%s: failed to  command", __func__);
-		wmi_buf_free(wmi_buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * wmi_get_buf_extscan_start_cmd() - Fill extscan start request
- * @wmi_handle: wmi handle
- * @pstart: scan command request params
- * @buf: event buffer
- * @buf_len: length of buffer
- *
- * This function fills individual elements of extscan request and
- * TLV for buckets, channel list.
- *
- * Return: CDF Status.
- */
-static
-QDF_STATUS wmi_get_buf_extscan_start_cmd(wmi_unified_t wmi_handle,
-			 struct wifi_scan_cmd_req_params *pstart,
-			 wmi_buf_t *buf, int *buf_len)
-{
-	wmi_extscan_start_cmd_fixed_param *cmd;
-	wmi_extscan_bucket *dest_blist;
-	wmi_extscan_bucket_channel *dest_clist;
-	struct wifi_scan_bucket_params *src_bucket = pstart->buckets;
-	struct wifi_scan_channelspec_params *src_channel = src_bucket->channels;
-	struct wifi_scan_channelspec_params save_channel[WMI_WLAN_EXTSCAN_MAX_CHANNELS];
-
-	uint8_t *buf_ptr;
-	int i, k, count = 0;
-	int len = sizeof(*cmd);
-	int nbuckets = pstart->numBuckets;
-	int nchannels = 0;
-
-	/* These TLV's are are NULL by default */
-	uint32_t ie_len_with_pad = 0;
-	int num_ssid = 0;
-	int num_bssid = 0;
-	int ie_len = 0;
-
-	uint32_t base_period = pstart->basePeriod;
-
-	/* TLV placeholder for ssid_list (NULL) */
-	len += WMI_TLV_HDR_SIZE;
-	len += num_ssid * sizeof(wmi_ssid);
-
-	/* TLV placeholder for bssid_list (NULL) */
-	len += WMI_TLV_HDR_SIZE;
-	len += num_bssid * sizeof(wmi_mac_addr);
-
-	/* TLV placeholder for ie_data (NULL) */
-	len += WMI_TLV_HDR_SIZE;
-	len += ie_len * sizeof(uint32_t);
-
-	/* TLV placeholder for bucket */
-	len += WMI_TLV_HDR_SIZE;
-	len += nbuckets * sizeof(wmi_extscan_bucket);
-
-	/* TLV channel placeholder */
-	len += WMI_TLV_HDR_SIZE;
-	for (i = 0; i < nbuckets; i++) {
-		nchannels += src_bucket->numChannels;
-		src_bucket++;
-	}
-
-	WMI_LOGD("%s: Total buckets: %d total #of channels is %d",
-		__func__, nbuckets, nchannels);
-	len += nchannels * sizeof(wmi_extscan_bucket_channel);
-	/* Allocate the memory */
-	*buf = wmi_buf_alloc(wmi_handle, len);
-	if (!*buf) {
-		WMI_LOGP("%s: failed to allocate memory"
-			 " for start extscan cmd", __func__);
-		return QDF_STATUS_E_NOMEM;
-	}
-	buf_ptr = (uint8_t *) wmi_buf_data(*buf);
-	cmd = (wmi_extscan_start_cmd_fixed_param *) buf_ptr;
-	WMITLV_SET_HDR(&cmd->tlv_header,
-		       WMITLV_TAG_STRUC_wmi_extscan_start_cmd_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN
-			       (wmi_extscan_start_cmd_fixed_param));
-
-	cmd->request_id = pstart->requestId;
-	cmd->vdev_id = pstart->sessionId;
-	cmd->base_period = pstart->basePeriod;
-	cmd->num_buckets = nbuckets;
-	cmd->configuration_flags = 0;
-	if (pstart->configuration_flags & WMI_EXTSCAN_LP_EXTENDED_BATCHING)
-		cmd->configuration_flags |= WMI_EXTSCAN_EXTENDED_BATCHING_EN;
-	WMI_LOGI("%s: configuration_flags: 0x%x", __func__,
-			cmd->configuration_flags);
-#ifdef FEATURE_WLAN_EXTSCAN
-	cmd->min_rest_time = WMI_EXTSCAN_REST_TIME;
-	cmd->max_rest_time = WMI_EXTSCAN_REST_TIME;
-	cmd->max_scan_time = WMI_EXTSCAN_MAX_SCAN_TIME;
-	cmd->burst_duration = WMI_EXTSCAN_BURST_DURATION;
-#endif
-	cmd->max_bssids_per_scan_cycle = pstart->maxAPperScan;
-
-	/* The max dwell time is retrieved from the first channel
-	 * of the first bucket and kept common for all channels.
-	 */
-	cmd->min_dwell_time_active = pstart->min_dwell_time_active;
-	cmd->max_dwell_time_active = pstart->max_dwell_time_active;
-	cmd->min_dwell_time_passive = pstart->min_dwell_time_passive;
-	cmd->max_dwell_time_passive = pstart->max_dwell_time_passive;
-	cmd->max_bssids_per_scan_cycle = pstart->maxAPperScan;
-	cmd->max_table_usage = pstart->report_threshold_percent;
-	cmd->report_threshold_num_scans = pstart->report_threshold_num_scans;
-
-	cmd->repeat_probe_time = cmd->max_dwell_time_active /
-					WMI_SCAN_NPROBES_DEFAULT;
-	cmd->probe_delay = 0;
-	cmd->probe_spacing_time = 0;
-	cmd->idle_time = 0;
-	cmd->scan_ctrl_flags = WMI_SCAN_ADD_BCAST_PROBE_REQ |
-			       WMI_SCAN_ADD_CCK_RATES |
-			       WMI_SCAN_ADD_OFDM_RATES |
-			       WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ |
-			       WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
-	WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags,
-			pstart->extscan_adaptive_dwell_mode);
-	cmd->scan_priority = WMI_SCAN_PRIORITY_VERY_LOW;
-	cmd->num_ssids = 0;
-	cmd->num_bssid = 0;
-	cmd->ie_len = 0;
-	cmd->n_probes = (cmd->repeat_probe_time > 0) ?
-			cmd->max_dwell_time_active / cmd->repeat_probe_time : 0;
-
-	buf_ptr += sizeof(*cmd);
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_FIXED_STRUC,
-		       num_ssid * sizeof(wmi_ssid));
-	buf_ptr += WMI_TLV_HDR_SIZE + (num_ssid * sizeof(wmi_ssid));
-
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_FIXED_STRUC,
-		       num_bssid * sizeof(wmi_mac_addr));
-	buf_ptr += WMI_TLV_HDR_SIZE + (num_bssid * sizeof(wmi_mac_addr));
-
-	ie_len_with_pad = 0;
-	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
-			  ie_len_with_pad);
-	buf_ptr += WMI_TLV_HDR_SIZE + ie_len_with_pad;
-
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_STRUC,
-		       nbuckets * sizeof(wmi_extscan_bucket));
-	dest_blist = (wmi_extscan_bucket *)
-		     (buf_ptr + WMI_TLV_HDR_SIZE);
-	src_bucket = pstart->buckets;
-
-	/* Retrieve scanning information from each bucket and
-	 * channels and send it to the target
-	 */
-	for (i = 0; i < nbuckets; i++) {
-		WMITLV_SET_HDR(dest_blist,
-		      WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
-		      WMITLV_GET_STRUCT_TLVLEN(wmi_extscan_bucket));
-
-		dest_blist->bucket_id = src_bucket->bucket;
-		dest_blist->base_period_multiplier =
-			src_bucket->period / base_period;
-		dest_blist->min_period = src_bucket->period;
-		dest_blist->max_period = src_bucket->max_period;
-		dest_blist->exp_backoff = src_bucket->exponent;
-		dest_blist->exp_max_step_count = src_bucket->step_count;
-		dest_blist->channel_band = src_bucket->band;
-		dest_blist->num_channels = src_bucket->numChannels;
-		dest_blist->notify_extscan_events = 0;
-
-		if (src_bucket->reportEvents & WMI_EXTSCAN_REPORT_EVENTS_EACH_SCAN)
-			dest_blist->notify_extscan_events =
-					WMI_EXTSCAN_CYCLE_COMPLETED_EVENT |
-					WMI_EXTSCAN_CYCLE_STARTED_EVENT;
-
-		if (src_bucket->reportEvents &
-				WMI_EXTSCAN_REPORT_EVENTS_FULL_RESULTS) {
-			dest_blist->forwarding_flags =
-				WMI_EXTSCAN_FORWARD_FRAME_TO_HOST;
-			dest_blist->notify_extscan_events |=
-				WMI_EXTSCAN_BUCKET_COMPLETED_EVENT |
-				WMI_EXTSCAN_CYCLE_STARTED_EVENT |
-				WMI_EXTSCAN_CYCLE_COMPLETED_EVENT;
-		} else {
-			dest_blist->forwarding_flags =
-				WMI_EXTSCAN_NO_FORWARDING;
-		}
-
-		if (src_bucket->reportEvents & WMI_EXTSCAN_REPORT_EVENTS_NO_BATCH)
-			dest_blist->configuration_flags = 0;
-		else
-			dest_blist->configuration_flags =
-				WMI_EXTSCAN_BUCKET_CACHE_RESULTS;
-
-		WMI_LOGI("%s: ntfy_extscan_events:%u cfg_flags:%u fwd_flags:%u",
-			__func__, dest_blist->notify_extscan_events,
-			dest_blist->configuration_flags,
-			dest_blist->forwarding_flags);
-
-		dest_blist->min_dwell_time_active =
-				   src_bucket->min_dwell_time_active;
-		dest_blist->max_dwell_time_active =
-				   src_bucket->max_dwell_time_active;
-		dest_blist->min_dwell_time_passive =
-				   src_bucket->min_dwell_time_passive;
-		dest_blist->max_dwell_time_passive =
-				   src_bucket->max_dwell_time_passive;
-		src_channel = src_bucket->channels;
-
-		/* save the channel info to later populate
-		 * the  channel TLV
-		 */
-		for (k = 0; k < src_bucket->numChannels; k++) {
-			save_channel[count++].channel = src_channel->channel;
-			src_channel++;
-		}
-		dest_blist++;
-		src_bucket++;
-	}
-	buf_ptr += WMI_TLV_HDR_SIZE + (nbuckets * sizeof(wmi_extscan_bucket));
-	WMITLV_SET_HDR(buf_ptr,
-		       WMITLV_TAG_ARRAY_STRUC,
-		       nchannels * sizeof(wmi_extscan_bucket_channel));
-	dest_clist = (wmi_extscan_bucket_channel *)
-		     (buf_ptr + WMI_TLV_HDR_SIZE);
-
-	/* Active or passive scan is based on the bucket dwell time
-	 * and channel specific active,passive scans are not
-	 * supported yet
-	 */
-	for (i = 0; i < nchannels; i++) {
-		WMITLV_SET_HDR(dest_clist,
-		WMITLV_TAG_STRUC_wmi_extscan_bucket_channel_event_fixed_param,
-			   WMITLV_GET_STRUCT_TLVLEN
-			   (wmi_extscan_bucket_channel));
-		dest_clist->channel = save_channel[i].channel;
-		dest_clist++;
-	}
-	buf_ptr += WMI_TLV_HDR_SIZE +
-		   (nchannels * sizeof(wmi_extscan_bucket_channel));
-	*buf_len = len;
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * send_start_extscan_cmd_tlv() - start extscan command to fw.
- * @wmi_handle: wmi handle
- * @pstart: scan command request params
- *
- * This function sends start extscan request to fw.
- *
- * Return: CDF Status.
- */
-static QDF_STATUS send_start_extscan_cmd_tlv(wmi_unified_t wmi_handle,
-			  struct wifi_scan_cmd_req_params *pstart)
-{
-	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
-	wmi_buf_t buf;
-	int len;
-
-	/* Fill individual elements of extscan request and
-	 * TLV for buckets, channel list.
-	 */
-	qdf_status = wmi_get_buf_extscan_start_cmd(wmi_handle,
-			     pstart, &buf, &len);
-	if (qdf_status != QDF_STATUS_SUCCESS) {
-		WMI_LOGE("%s: Failed to get buffer for ext scan cmd", __func__);
-		return QDF_STATUS_E_FAILURE;
-	}
-	if (!buf) {
-		WMI_LOGE("%s:Failed to get buffer"
-			 "for current extscan info", __func__);
-		return QDF_STATUS_E_FAILURE;
-	}
-	if (wmi_unified_cmd_send(wmi_handle, buf,
-				 len, WMI_EXTSCAN_START_CMDID)) {
-		WMI_LOGE("%s: failed to send command", __func__);
-		wmi_buf_free(buf);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
  * send_plm_stop_cmd_tlv() - plm stop request
  * @wmi_handle: wmi handle
  * @plm: plm request parameters
@@ -16444,155 +15535,6 @@
 	return status;
 }
 
-/** wmi_get_hotlist_entries_per_page() - hotlist entries per page
- * @wmi_handle: wmi handle.
- * @cmd: size of command structure.
- * @per_entry_size: per entry size.
- *
- * This utility function calculates how many hotlist entries can
- * fit in one page.
- *
- * Return: number of entries
- */
-static inline int wmi_get_hotlist_entries_per_page(wmi_unified_t wmi_handle,
-						   size_t cmd_size,
-						   size_t per_entry_size)
-{
-	uint32_t avail_space = 0;
-	int num_entries = 0;
-	uint16_t max_msg_len = wmi_get_max_msg_len(wmi_handle);
-
-	/* Calculate number of hotlist entries that can
-	 * be passed in wma message request.
-	 */
-	avail_space = max_msg_len - cmd_size;
-	num_entries = avail_space / per_entry_size;
-	return num_entries;
-}
-
-/**
- * send_get_buf_extscan_hotlist_cmd_tlv() - prepare hotlist command
- * @wmi_handle: wmi handle
- * @photlist: hotlist command params
- * @buf_len: buffer length
- *
- * This function fills individual elements for  hotlist request and
- * TLV for bssid entries
- *
- * Return: CDF Status.
- */
-static QDF_STATUS send_get_buf_extscan_hotlist_cmd_tlv(wmi_unified_t wmi_handle,
-					   struct ext_scan_setbssi_hotlist_params *
-					   photlist, int *buf_len)
-{
-	wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *cmd = NULL;
-	wmi_extscan_hotlist_entry *dest_hotlist;
-	struct ap_threshold_params *src_ap = photlist->ap;
-	wmi_buf_t buf;
-	uint8_t *buf_ptr;
-
-	int j, index = 0;
-	int cmd_len = 0;
-	int num_entries;
-	int min_entries = 0;
-	uint32_t numap = photlist->numAp;
-	int len = sizeof(*cmd);
-
-	len += WMI_TLV_HDR_SIZE;
-	cmd_len = len;
-
-	num_entries = wmi_get_hotlist_entries_per_page(wmi_handle,
-							cmd_len,
-							sizeof(*dest_hotlist));
-	/* setbssid hotlist expects the bssid list
-	 * to be non zero value
-	 */
-	if (!numap || (numap > WMI_WLAN_EXTSCAN_MAX_HOTLIST_APS)) {
-		WMI_LOGE("Invalid number of APs: %d", numap);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	/* Split the hot list entry pages and send multiple command
-	 * requests if the buffer reaches the maximum request size
-	 */
-	while (index < numap) {
-		min_entries = QDF_MIN(num_entries, numap);
-		len += min_entries * sizeof(wmi_extscan_hotlist_entry);
-		buf = wmi_buf_alloc(wmi_handle, len);
-		if (!buf) {
-			WMI_LOGP("%s: wmi_buf_alloc failed", __func__);
-			return QDF_STATUS_E_FAILURE;
-		}
-		buf_ptr = (uint8_t *) wmi_buf_data(buf);
-		cmd = (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *)
-		      buf_ptr;
-		WMITLV_SET_HDR(&cmd->tlv_header,
-			       WMITLV_TAG_STRUC_wmi_extscan_configure_hotlist_monitor_cmd_fixed_param,
-			       WMITLV_GET_STRUCT_TLVLEN
-				       (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param));
-
-		/* Multiple requests are sent until the num_entries_in_page
-		 * matches the total_entries
-		 */
-		cmd->request_id = photlist->requestId;
-		cmd->vdev_id = photlist->sessionId;
-		cmd->total_entries = numap;
-		cmd->mode = 1;
-		cmd->num_entries_in_page = min_entries;
-		cmd->lost_ap_scan_count = photlist->lost_ap_sample_size;
-		cmd->first_entry_index = index;
-
-		WMI_LOGD("%s: vdev id:%d total_entries: %d num_entries: %d lost_ap_sample_size: %d",
-			__func__, cmd->vdev_id, cmd->total_entries,
-			cmd->num_entries_in_page,
-			cmd->lost_ap_scan_count);
-
-		buf_ptr += sizeof(*cmd);
-		WMITLV_SET_HDR(buf_ptr,
-			       WMITLV_TAG_ARRAY_STRUC,
-			       min_entries * sizeof(wmi_extscan_hotlist_entry));
-		dest_hotlist = (wmi_extscan_hotlist_entry *)
-			       (buf_ptr + WMI_TLV_HDR_SIZE);
-
-		/* Populate bssid, channel info and rssi
-		 * for the bssid's that are sent as hotlists.
-		 */
-		for (j = 0; j < min_entries; j++) {
-			WMITLV_SET_HDR(dest_hotlist,
-				       WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
-				       WMITLV_GET_STRUCT_TLVLEN
-					       (wmi_extscan_hotlist_entry));
-
-			dest_hotlist->min_rssi = src_ap->low;
-			WMI_CHAR_ARRAY_TO_MAC_ADDR(src_ap->bssid.bytes,
-						   &dest_hotlist->bssid);
-
-			WMI_LOGD("%s:channel:%d min_rssi %d",
-				 __func__, dest_hotlist->channel,
-				 dest_hotlist->min_rssi);
-			WMI_LOGD
-				("%s: bssid mac_addr31to0: 0x%x, mac_addr47to32: 0x%x",
-				__func__, dest_hotlist->bssid.mac_addr31to0,
-				dest_hotlist->bssid.mac_addr47to32);
-			dest_hotlist++;
-			src_ap++;
-		}
-		buf_ptr += WMI_TLV_HDR_SIZE +
-			   (min_entries * sizeof(wmi_extscan_hotlist_entry));
-
-		if (wmi_unified_cmd_send(wmi_handle, buf, len,
-					 WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID)) {
-			WMI_LOGE("%s: failed to send command", __func__);
-			wmi_buf_free(buf);
-			return QDF_STATUS_E_FAILURE;
-		}
-		index = index + min_entries;
-		num_entries = numap - min_entries;
-		len = cmd_len;
-	}
-	return QDF_STATUS_SUCCESS;
-}
-
 /**
  * send_set_active_bpf_mode_cmd_tlv() - configure active BPF mode in FW
  * @wmi_handle: the WMI handle
@@ -22674,33 +21616,15 @@
 			 send_set_rssi_monitoring_cmd_tlv,
 	.send_scan_probe_setoui_cmd =
 				send_scan_probe_setoui_cmd_tlv,
-	.send_reset_passpoint_network_list_cmd =
-				send_reset_passpoint_network_list_cmd_tlv,
-	.send_set_passpoint_network_list_cmd =
-			 send_set_passpoint_network_list_cmd_tlv,
 	.send_roam_scan_offload_rssi_thresh_cmd =
 			send_roam_scan_offload_rssi_thresh_cmd_tlv,
 	.send_roam_mawc_params_cmd = send_roam_mawc_params_cmd_tlv,
 	.send_roam_scan_filter_cmd =
 			send_roam_scan_filter_cmd_tlv,
-	.send_set_epno_network_list_cmd =
-			 send_set_epno_network_list_cmd_tlv,
 #ifdef IPA_OFFLOAD
 	.send_ipa_offload_control_cmd =
 			 send_ipa_offload_control_cmd_tlv,
 #endif
-	.send_extscan_get_capabilities_cmd =
-			 send_extscan_get_capabilities_cmd_tlv,
-	.send_extscan_get_cached_results_cmd =
-		 send_extscan_get_cached_results_cmd_tlv,
-	.send_extscan_stop_change_monitor_cmd =
-		  send_extscan_stop_change_monitor_cmd_tlv,
-	.send_extscan_start_change_monitor_cmd =
-		  send_extscan_start_change_monitor_cmd_tlv,
-	.send_extscan_stop_hotlist_monitor_cmd =
-		  send_extscan_stop_hotlist_monitor_cmd_tlv,
-	.send_stop_extscan_cmd = send_stop_extscan_cmd_tlv,
-	.send_start_extscan_cmd = send_start_extscan_cmd_tlv,
 	.send_plm_stop_cmd = send_plm_stop_cmd_tlv,
 	.send_plm_start_cmd = send_plm_start_cmd_tlv,
 	.send_pno_stop_cmd = send_pno_stop_cmd_tlv,
@@ -22827,8 +21751,6 @@
 		 send_roam_scan_offload_chan_list_cmd_tlv,
 	.send_roam_scan_offload_rssi_change_cmd =
 		 send_roam_scan_offload_rssi_change_cmd_tlv,
-	.send_get_buf_extscan_hotlist_cmd =
-		 send_get_buf_extscan_hotlist_cmd_tlv,
 	.send_set_active_bpf_mode_cmd = send_set_active_bpf_mode_cmd_tlv,
 	.send_adapt_dwelltime_params_cmd =
 		send_adapt_dwelltime_params_cmd_tlv,
@@ -24039,6 +22961,7 @@
 	populate_tlv_service(wmi_handle->services);
 	populate_target_defines_tlv(wmi_handle);
 	wmi_twt_attach_tlv(wmi_handle);
+	wmi_extscan_attach_tlv(wmi_handle);
 }
 qdf_export_symbol(wmi_tlv_attach);