qcacld-3.0: Move FTM cmd/event handle to common code

- replace the ftm command/event handle with common interfaces
- remove the event register from wma
- reconfigure the target_if_handle for FTM mode
- separate change will be raised to cleanup legacy code

Change-Id: If8e2dfc4c6bb400406be5d0d3fa53422db5c6fb5
CRs-fixed: 2162168
diff --git a/Kbuild b/Kbuild
index 6997edb..b772681 100644
--- a/Kbuild
+++ b/Kbuild
@@ -891,6 +891,35 @@
 		$(UMAC_GREEN_AP_DISP_DIR)/wlan_green_ap_api.o \
                 $(UMAC_GREEN_AP_DISP_DIR)/wlan_green_ap_ucfg_api.o \
                 $(WLAN_COMMON_ROOT)/target_if/green_ap/src/target_if_green_ap.o
+############# FTM CORE ############
+FTM_CORE_DIR := ftm
+TARGET_IF_FTM_DIR := target_if/ftm
+OS_IF_LINUX_FTM_DIR := os_if/linux/ftm
+
+FTM_CORE_SRC := $(WLAN_COMMON_ROOT)/$(FTM_CORE_DIR)/core/src
+FTM_DISP_SRC := $(WLAN_COMMON_ROOT)/$(FTM_CORE_DIR)/dispatcher/src
+TARGET_IF_FTM_SRC := $(WLAN_COMMON_ROOT)/$(TARGET_IF_FTM_DIR)/src
+OS_IF_FTM_SRC := $(WLAN_COMMON_ROOT)/$(OS_IF_LINUX_FTM_DIR)/src
+
+FTM_CORE_INC := $(WLAN_COMMON_INC)/$(FTM_CORE_DIR)/core/src
+FTM_DISP_INC := $(WLAN_COMMON_INC)/$(FTM_CORE_DIR)/dispatcher/inc
+TARGET_IF_FTM_INC := $(WLAN_COMMON_INC)/$(TARGET_IF_FTM_DIR)/inc
+OS_IF_FTM_INC := $(WLAN_COMMON_INC)/$(OS_IF_LINUX_FTM_DIR)/inc
+
+FTM_INC := -I$(FTM_DISP_INC)	\
+	   -I$(FTM_CORE_INC)	\
+	   -I$(OS_IF_FTM_INC)	\
+	   -I$(TARGET_IF_FTM_INC)
+
+FTM_OBJS := $(FTM_DISP_SRC)/wlan_ftm_init_deinit.o \
+	    $(FTM_DISP_SRC)/wlan_ftm_ucfg_api.o \
+	    $(FTM_CORE_SRC)/wlan_ftm_svc.o \
+	    $(OS_IF_FTM_SRC)/wlan_cfg80211_ftm.o \
+	    $(TARGET_IF_FTM_SRC)/target_if_ftm.o
+
+ifeq ($(CONFIG_LINUX_QCMBR),y)
+FTM_OBJS += $(OS_IF_FTM_SRC)/wlan_ioctl_ftm.o
+endif
 
 ############# UMAC_CMN_SERVICES ############
 UMAC_COMMON_INC := -I$(WLAN_COMMON_INC)/umac/cmn_services/cmn_defs/inc \
@@ -1517,7 +1546,8 @@
 		$(TARGET_IF_INC) \
 		$(CLD_TARGET_IF_INC) \
 		$(OS_IF_INC) \
-		$(GLOBAL_LMAC_IF_INC)
+		$(GLOBAL_LMAC_IF_INC) \
+		$(FTM_INC)
 
 INCS +=		$(WMA_INC) \
 		$(UAPI_INC) \
@@ -1599,7 +1629,8 @@
 		$(SYS_OBJS) \
 		$(QDF_OBJS) \
 		$(CDS_OBJS) \
-		$(DFS_OBJS)
+		$(DFS_OBJS) \
+		$(FTM_OBJS)
 
 OBJS +=		$(WMA_OBJS) \
 		$(TXRX_OBJS) \
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 5f304eb..53df097 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -81,6 +81,7 @@
 #endif
 #include <cdp_txrx_handle.h>
 #include <wlan_cfg80211_scan.h>
+#include <wlan_cfg80211_ftm.h>
 
 #ifdef FEATURE_WLAN_EXTSCAN
 #include "wlan_hdd_ext_scan.h"
@@ -20427,38 +20428,17 @@
 #if  defined(QCA_WIFI_FTM)
 	case WLAN_HDD_TM_CMD_WLAN_FTM:
 	{
-		int buf_len;
-		void *buf;
-		QDF_STATUS status;
-
-		if (hdd_get_conparam() != QDF_GLOBAL_FTM_MODE) {
-			hdd_err("Device is not in FTM mode");
-			return -EINVAL;
-		}
-
-		if (!tb[WLAN_HDD_TM_ATTR_DATA]) {
-			hdd_err("WLAN_HDD_TM_ATTR_DATA attribute is invalid");
-			return -EINVAL;
-		}
-
-		buf = nla_data(tb[WLAN_HDD_TM_ATTR_DATA]);
-		buf_len = nla_len(tb[WLAN_HDD_TM_ATTR_DATA]);
-
-		hdd_debug("****FTM Tx cmd len = %d*****", buf_len);
-
-		status = wlan_hdd_ftm_testmode_cmd(buf, buf_len);
-
-		if (status != QDF_STATUS_SUCCESS)
-			err = -EBUSY;
+		err = wlan_cfg80211_ftm_testmode_cmd(hdd_ctx->hdd_pdev,
+						     data, len);
 		break;
 	}
 #endif
-
 	default:
 		hdd_err("command: %d not supported",
-		       nla_get_u32(tb[WLAN_HDD_TM_ATTR_CMD]));
+			nla_get_u32(tb[WLAN_HDD_TM_ATTR_CMD]));
 		return -EOPNOTSUPP;
 	}
+
 	EXIT();
 	return err;
 }
diff --git a/core/hdd/src/wlan_hdd_ftm.c b/core/hdd/src/wlan_hdd_ftm.c
index af76c4b..46fba90 100644
--- a/core/hdd/src/wlan_hdd_ftm.c
+++ b/core/hdd/src/wlan_hdd_ftm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -54,6 +54,7 @@
 #include "ol_fw.h"
 #include "wlan_hdd_cfg80211.h"
 #include "hif.h"
+#include <wlan_ioctl_ftm.h>
 #endif
 
 #define HDD_FTM_WMA_PRE_START_TIMEOUT (30000) /* 30 seconds */
@@ -180,50 +181,17 @@
 				  struct qcmbr_data *pqcmbr_data)
 {
 	int ret = 0;
-	struct qcmbr_queue *qcmbr_buf = NULL;
+	struct hdd_context *hdd_ctx;
 
-	switch (pqcmbr_data->cmd) {
-	case ATH_XIOCTL_UNIFIED_UTF_CMD: {
-		pqcmbr_data->copy_to_user = 0;
-		if (pqcmbr_data->length &&
-			pqcmbr_data->length <= sizeof(pqcmbr_data->buf)) {
-			if (wlan_hdd_ftm_testmode_cmd(pqcmbr_data->buf,
-						      pqcmbr_data->
-						      length)
-			    != QDF_STATUS_SUCCESS) {
-				ret = -EBUSY;
-			} else {
-				ret = 0;
-			}
-		}
-	}
-	break;
+	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+	ret = wlan_hdd_validate_context(hdd_ctx);
+	if (ret)
+		return ret;
 
-	case ATH_XIOCTL_UNIFIED_UTF_RSP: {
-		pqcmbr_data->copy_to_user = 1;
-
-		spin_lock_bh(&qcmbr_queue_lock);
-		if (!list_empty(&qcmbr_queue_head)) {
-			qcmbr_buf = list_first_entry(&qcmbr_queue_head,
-						     struct qcmbr_queue,
-						     list);
-			list_del(&qcmbr_buf->list);
-			ret = 0;
-		} else {
-			ret = -1;
-		}
-		spin_unlock_bh(&qcmbr_queue_lock);
-
-		if (!ret) {
-			memcpy(pqcmbr_data->buf, qcmbr_buf->utf_buf,
-			       (MAX_UTF_LENGTH + 4));
-			qdf_mem_free(qcmbr_buf);
-		} else {
-			ret = -EAGAIN;
-		}
-	}
-	break;
-	}
+	ret = wlan_ioctl_ftm_testmode_cmd(hdd_ctx->hdd_pdev,
+					  pqcmbr_data->cmd,
+					  pqcmbr_data->buf,
+					  pqcmbr_data->length);
 
 	return ret;
 }
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 7dcd862..f5a0122 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -2623,11 +2623,6 @@
 		hdd_ctx->driver_status = DRIVER_MODULES_OPENED;
 		hdd_info("Wlan transitioned (now OPENED)");
 
-		if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
-			sme_register_ftm_msg_processor(hdd_ctx->hHal,
-						       hdd_ftm_mc_process_msg);
-			break;
-		}
 		if (unint) {
 			hdd_debug("In phase-1 initialization  don't enable modules");
 			break;
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 09f22df..bbf1a8e 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -485,9 +485,6 @@
 
 #endif
 
-void sme_register_ftm_msg_processor(tHalHandle hal,
-				    hdd_ftm_msg_processor callback);
-
 extern QDF_STATUS sme_enter_wowl(tHalHandle hHal,
 			 void (*enter_wowl_callback_routine)(void
 						  *callbackContext,
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index b57559d..1758dfd 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -4158,29 +4158,6 @@
 #endif
 
 /**
- * sme_register_ftm_msg_processor() - registers hdd ftm message processor
- * function to MAC/SYS
- *
- * @hal:        hal handle
- * @callback:   hdd function that has to be registered
- *
- * Return: void
- */
-void sme_register_ftm_msg_processor(tHalHandle hal,
-				    hdd_ftm_msg_processor callback)
-{
-	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
-
-	if (mac_ctx == NULL) {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			FL("mac ctx is NULL"));
-		return;
-	}
-
-	mac_ctx->ftm_msg_processor_callback = callback;
-}
-
-/**
  * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
  * @hal_ctx - The handle returned by mac_open.
  * @enter_wowl_callback_routine -  Callback routine provided by HDD.
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index 27f6094..f866e3f 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -2580,11 +2580,6 @@
 
 	wma_handle->tx_chain_mask_cck = cds_cfg->tx_chain_mask_cck;
 	wma_handle->self_gen_frm_pwr = cds_cfg->self_gen_frm_pwr;
-
-#if defined(QCA_WIFI_FTM)
-	if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
-		wma_utf_attach(wma_handle);
-#endif /* QCA_WIFI_FTM */
 	wma_init_max_no_of_peers(wma_handle, cds_cfg->max_station);
 	cds_cfg->max_station = wma_get_number_of_peers_supported(wma_handle);
 
@@ -2973,9 +2968,6 @@
 	qdf_mem_free(wma_handle->interfaces);
 
 err_scn_context:
-#if defined(QCA_WIFI_FTM)
-	wma_utf_detach(wma_handle);
-#endif /* QCA_WIFI_FTM */
 	qdf_mem_free(((p_cds_contextType) cds_context)->cfg_ctx);
 	OS_FREE(wmi_handle);
 
@@ -4058,12 +4050,6 @@
 					    memctx));
 	}
 
-#if defined(QCA_WIFI_FTM)
-	/* Detach UTF and unregister the handler */
-	if (cds_get_conparam() == QDF_GLOBAL_FTM_MODE)
-		wma_utf_detach(wma_handle);
-#endif /* QCA_WIFI_FTM */
-
 	if (NULL != wma_handle->pGetRssiReq) {
 		qdf_mem_free(wma_handle->pGetRssiReq);
 		wma_handle->pGetRssiReq = NULL;