diff --git a/Kbuild b/Kbuild index 2ddbcd38f8..d6ca366afa 100644 --- a/Kbuild +++ b/Kbuild @@ -277,6 +277,10 @@ ifeq ($(CONFIG_QCACLD_FEATURE_BTC_CHAIN_MODE), y) HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_btc_chain_mode.o endif +ifeq ($(CONFIG_FEATURE_WLAN_TIME_SYNC_FTM), y) +HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_ftm_time_sync.o +endif + ###### OSIF_SYNC ######## SYNC_DIR := os_if/sync SYNC_INC_DIR := $(SYNC_DIR)/inc diff --git a/components/ftm_time_sync/core/inc/ftm_time_sync_main.h b/components/ftm_time_sync/core/inc/ftm_time_sync_main.h index cb86333936..bd1277a366 100644 --- a/components/ftm_time_sync/core/inc/ftm_time_sync_main.h +++ b/components/ftm_time_sync/core/inc/ftm_time_sync_main.h @@ -160,4 +160,12 @@ QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev); */ QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev); +/** + * ftm_time_sync_show() - Handler to print the offset derived + * @vdev: vdev for which offset is to be shown + * @buf: buffer in which the values to be printed + * + * Return: the number of bytes written in buf + */ +ssize_t ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf); #endif /* end of _FTM_TIME_SYNC_MAIN_H_ */ diff --git a/components/ftm_time_sync/core/src/ftm_time_sync_main.c b/components/ftm_time_sync/core/src/ftm_time_sync_main.c index a54a27bd6d..a209f3662e 100644 --- a/components/ftm_time_sync/core/src/ftm_time_sync_main.c +++ b/components/ftm_time_sync/core/src/ftm_time_sync_main.c @@ -372,3 +372,30 @@ QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev) return QDF_STATUS_SUCCESS; } + +ssize_t ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf) +{ + struct ftm_time_sync_vdev_priv *vdev_priv; + uint64_t q_master, q_slave; + ssize_t size = 0; + int iter; + + vdev_priv = ftm_time_sync_vdev_get_priv(vdev); + if (!vdev_priv) { + ftm_time_sync_debug("Failed to get ftm time sync vdev_priv"); + return 0; + } + + for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) { + q_master = vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master; + q_slave = vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave; + + size += qdf_scnprintf(buf + size, PAGE_SIZE, + "%s %llu %s %llu %s %lld\n", + "Qtime_master", q_master, "Qtime_slave", + q_slave, "Offset", q_slave > q_master ? + q_slave - q_master : q_master - q_slave); + } + return size; +} + diff --git a/components/ftm_time_sync/dispatcher/inc/ftm_time_sync_ucfg_api.h b/components/ftm_time_sync/dispatcher/inc/ftm_time_sync_ucfg_api.h index b3e4a5f5a0..9bf212ae27 100644 --- a/components/ftm_time_sync/dispatcher/inc/ftm_time_sync_ucfg_api.h +++ b/components/ftm_time_sync/dispatcher/inc/ftm_time_sync_ucfg_api.h @@ -96,6 +96,18 @@ ucfg_ftm_time_sync_update_sta_connect_state(struct wlan_objmgr_vdev *vdev, */ void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, enum ftm_time_sync_bss_state ap_state); + +/** + * ucfg_ftm_time_sync_show() - Show the ftm time sync offset values derived + * @vdev: vdev context + * @buf: buffer in which the values to be written + * + * This function prints the offset values derived after ftm time sync + * between the qtime of STA(slave) and connected SAP(master). + * + * Return: number of bytes written in buffer + */ +ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf); #else static inline @@ -131,5 +143,11 @@ ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, enum ftm_time_sync_bss_state ap_state) { } + +static inline +ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf) +{ + return 0; +} #endif /* FEATURE_WLAN_TIME_SYNC_FTM */ #endif /* _FTM_TIME_SYNC_UCFG_API_H_ */ diff --git a/components/ftm_time_sync/dispatcher/src/ftm_time_sync_ucfg_api.c b/components/ftm_time_sync/dispatcher/src/ftm_time_sync_ucfg_api.c index e845c7aa49..2eebacc5c3 100644 --- a/components/ftm_time_sync/dispatcher/src/ftm_time_sync_ucfg_api.c +++ b/components/ftm_time_sync/dispatcher/src/ftm_time_sync_ucfg_api.c @@ -166,3 +166,8 @@ void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, ftm_time_sync_stop(vdev); } } + +ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf) +{ + return ftm_time_sync_show(vdev, buf); +} diff --git a/core/hdd/inc/wlan_hdd_ftm_time_sync.h b/core/hdd/inc/wlan_hdd_ftm_time_sync.h new file mode 100644 index 0000000000..24468fe855 --- /dev/null +++ b/core/hdd/inc/wlan_hdd_ftm_time_sync.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020, 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 "ftm_time_sync_ucfg_api.h" +#include "wlan_hdd_main.h" + +#ifdef FEATURE_WLAN_TIME_SYNC_FTM +/** + * hdd_ftm_time_sync_sta_state_notify() - notify FTM TIME SYNC sta state change + * @adapter: pointer to adapter + * @state: enum ftm_time_sync_sta_state + * + * This function is called by hdd connect and disconnect handler and notifies + * the FTM TIME SYNC component about the sta state. + * + * Return: None + */ +void +hdd_ftm_time_sync_sta_state_notify(struct hdd_adapter *adapter, + enum ftm_time_sync_sta_state state); + +#else + +static inline void +hdd_ftm_time_sync_sta_state_notify(struct hdd_adapter *adapter, + enum ftm_time_sync_sta_state state) +{ +} + +#endif diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index ff8d705dea..725042be5d 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -71,7 +71,7 @@ #include #include "wlan_blm_ucfg_api.h" #include "wlan_hdd_sta_info.h" -#include "ftm_time_sync_ucfg_api.h" +#include "wlan_hdd_ftm_time_sync.h" #include @@ -1669,32 +1669,6 @@ static void hdd_print_bss_info(struct hdd_station_ctx *hdd_sta_ctx) conn_info->hs20vendor_ie.release_num : 0); } -/** - * hdd_ftm_time_sync_sta_state_notify() - notify FTM TIME SYNC sta state change - * @adapter: pointer to adapter - * @state: enum ftm_time_sync_sta_state - * - * This function is called by hdd connect and disconnect handler and notifies - * the FTM TIME SYNC component about the sta state. - * - * Return: None - */ -static void -hdd_ftm_time_sync_sta_state_notify(struct hdd_adapter *adapter, - enum ftm_time_sync_sta_state state) -{ - struct wlan_objmgr_psoc *psoc; - - psoc = wlan_vdev_get_psoc(adapter->vdev); - if (!psoc) - return; - - if (!ucfg_is_ftm_time_sync_enable(psoc)) - return; - - ucfg_ftm_time_sync_update_sta_connect_state(adapter->vdev, state); -} - /** * hdd_dis_connect_handler() - disconnect event handler * @adapter: pointer to adapter diff --git a/core/hdd/src/wlan_hdd_ftm_time_sync.c b/core/hdd/src/wlan_hdd_ftm_time_sync.c new file mode 100644 index 0000000000..9a2bba0812 --- /dev/null +++ b/core/hdd/src/wlan_hdd_ftm_time_sync.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020, 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 "wlan_hdd_ftm_time_sync.h" +#include "ftm_time_sync_ucfg_api.h" + +static ssize_t hdd_ftm_time_sync_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hdd_station_ctx *hdd_sta_ctx; + struct hdd_adapter *adapter; + ssize_t size = 0; + + struct net_device *net_dev = qdf_container_of(dev, struct net_device, + dev); + + adapter = (struct hdd_adapter *)(netdev_priv(net_dev)); + if (adapter->magic != WLAN_HDD_ADAPTER_MAGIC) + return scnprintf(buf, PAGE_SIZE, "Invalid device\n"); + + hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); + if (adapter->device_mode == QDF_STA_MODE) + return ucfg_ftm_time_sync_show(adapter->vdev, buf); + + return size; +} + +static DEVICE_ATTR(ftm_time_sync, 0400, hdd_ftm_time_sync_show, NULL); + +void +hdd_ftm_time_sync_sta_state_notify(struct hdd_adapter *adapter, + enum ftm_time_sync_sta_state state) +{ + struct wlan_objmgr_psoc *psoc; + struct net_device *net_dev; + + psoc = wlan_vdev_get_psoc(adapter->vdev); + if (!psoc) + return; + + if (!ucfg_is_ftm_time_sync_enable(psoc)) + return; + + net_dev = adapter->dev; + + if (net_dev) { + if (state == FTM_TIME_SYNC_STA_CONNECTED) + device_create_file(&net_dev->dev, + &dev_attr_ftm_time_sync); + else + device_remove_file(&net_dev->dev, + &dev_attr_ftm_time_sync); + } + + ucfg_ftm_time_sync_update_sta_connect_state(adapter->vdev, state); +}