diff --git a/Kbuild b/Kbuild index 6997edbff076..b7726815614d 100644 --- a/Kbuild +++ b/Kbuild @@ -891,6 +891,35 @@ UMAC_GREEN_AP_OBJS := $(UMAC_GREEN_AP_CORE_DIR)/wlan_green_ap_main.o \ $(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 @@ INCS := $(HDD_INC) \ $(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 @@ OBJS := $(HDD_OBJS) \ $(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 5f304ebb6ca9..53df0973064b 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -81,6 +81,7 @@ #endif #include #include +#include #ifdef FEATURE_WLAN_EXTSCAN #include "wlan_hdd_ext_scan.h" @@ -20427,38 +20428,17 @@ static int __wlan_hdd_cfg80211_testmode(struct wiphy *wiphy, #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 af76c4bd645b..46fba907d8fe 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 #endif #define HDD_FTM_WMA_PRE_START_TIMEOUT (30000) /* 30 seconds */ @@ -180,50 +181,17 @@ static int wlan_hdd_qcmbr_command(struct hdd_adapter *adapter, 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 7dcd862ca622..f5a012204918 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2623,11 +2623,6 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx, 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 09f22df3f768..bbf1a8e81456 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -485,9 +485,6 @@ static inline void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal) #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 b57559dc1c6f..1758dfdac87a 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -4157,29 +4157,6 @@ QDF_STATUS sme_oem_get_capability(tHalHandle hal, } #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. diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 27f609408c26..f866e3fb5bb6 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -2580,11 +2580,6 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, 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 @@ err_event_init: 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 @@ QDF_STATUS wma_close(void) 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;