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 6e0d92c9c1..cb86333936 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 @@ -139,4 +139,25 @@ enum ftm_time_sync_mode ftm_time_sync_get_mode(struct wlan_objmgr_psoc *psoc); * Return: enum ftm_time_sync_role */ enum ftm_time_sync_role ftm_time_sync_get_role(struct wlan_objmgr_psoc *psoc); + +/** + * ftm_time_sync_send_trigger() - Handler for sending trigger cmd to FW + * @vdev: vdev for which FTM time_sync trigger cmd to be send + * + * This function sends the ftm trigger cmd to target. + * + * Return: QDF_STATUS + */ +QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev); + +/** + * ftm_time_sync_stop() - Handler for stopping the FTM time sync + * @vdev: vdev for which FTM time_sync feature to be stopped + * + * This function stops the ftm time sync functionality. + * + * Return: QDF_STATUS + */ +QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev); + #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 beb617ad9d..a54a27bd6d 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 @@ -325,3 +325,50 @@ ftm_time_sync_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc, qdf_mem_free(psoc_priv); return status; } + +QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev) +{ + struct ftm_time_sync_vdev_priv *vdev_priv; + struct wlan_objmgr_psoc *psoc; + enum ftm_time_sync_mode mode; + uint8_t vdev_id; + QDF_STATUS status; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + ftm_time_sync_err("Failed to get psoc"); + return QDF_STATUS_E_INVAL; + } + + vdev_priv = ftm_time_sync_vdev_get_priv(vdev); + if (!vdev_priv) { + ftm_time_sync_err("Failed to get ftm time sync vdev_priv"); + return QDF_STATUS_E_INVAL; + } + + vdev_id = wlan_vdev_get_id(vdev_priv->vdev); + mode = ftm_time_sync_get_mode(psoc); + + status = vdev_priv->tx_ops.ftm_time_sync_send_trigger(psoc, + vdev_id, mode); + if (QDF_IS_STATUS_ERROR(status)) + ftm_time_sync_err("send_ftm_time_sync_trigger failed %d", + status); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev) +{ + struct ftm_time_sync_vdev_priv *vdev_priv; + + vdev_priv = ftm_time_sync_vdev_get_priv(vdev); + if (!vdev_priv) { + ftm_time_sync_err("Failed to get ftm time sync vdev_priv"); + return QDF_STATUS_E_INVAL; + } + + qdf_delayed_work_stop_sync(&vdev_priv->ftm_time_sync_work); + + return QDF_STATUS_SUCCESS; +} 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 c2d2d1e322..b3e4a5f5a0 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 @@ -25,6 +25,7 @@ #include #include #include "ftm_time_sync_objmgr.h" +#include "wlan_ftm_time_sync_public_struct.h" #ifdef FEATURE_WLAN_TIME_SYNC_FTM @@ -68,6 +69,33 @@ bool ucfg_is_ftm_time_sync_enable(struct wlan_objmgr_psoc *psoc); * Return: None */ void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value); + +/** + * ucfg_ftm_time_sync_update_sta_connect_state() - Handler for STA state change + * @vdev: STA vdev + * @state: connected/disconnected state + * + * This function triggers the FTM time sync feature in case of connection and + * stops the ftm sync feature in case of disconnection. + * + * Return: None + */ +void +ucfg_ftm_time_sync_update_sta_connect_state(struct wlan_objmgr_vdev *vdev, + enum ftm_time_sync_sta_state state); + +/** + * ucfg_ftm_time_sync_update_bss_state() - Handler to notify bss start/stop + * @vdev: SAP vdev + * @ap_state: BSS start/stop state + * + * This function triggers the FTM time sync feature in case of bss start and + * stops the ftm sync feature in case of bss stop. + * + * Return: None. + */ +void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, + enum ftm_time_sync_bss_state ap_state); #else static inline @@ -91,5 +119,17 @@ static inline void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value) { } + +static inline void +ucfg_ftm_time_sync_update_sta_connect_state(struct wlan_objmgr_vdev *vdev, + enum ftm_time_sync_sta_state state) +{ +} + +static inline void +ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, + enum ftm_time_sync_bss_state ap_state) +{ +} #endif /* FEATURE_WLAN_TIME_SYNC_FTM */ #endif /* _FTM_TIME_SYNC_UCFG_API_H_ */ diff --git a/components/ftm_time_sync/dispatcher/inc/wlan_ftm_time_sync_public_struct.h b/components/ftm_time_sync/dispatcher/inc/wlan_ftm_time_sync_public_struct.h index 4ba7df4738..2a843b9992 100644 --- a/components/ftm_time_sync/dispatcher/inc/wlan_ftm_time_sync_public_struct.h +++ b/components/ftm_time_sync/dispatcher/inc/wlan_ftm_time_sync_public_struct.h @@ -49,6 +49,25 @@ enum ftm_time_sync_role { FTM_TIMESYNC_MASTER_ROLE, }; +/** + * enum ftm_time_sync_sta_state - ftm time sync sta states + * @FTM_TIME_SYNC_STA_CONNECTED: STA connected to AP + * @FTM_TIME_SYNC_STA_DISCONNECTED: STA disconnected + */ +enum ftm_time_sync_sta_state { + FTM_TIME_SYNC_STA_CONNECTED, + FTM_TIME_SYNC_STA_DISCONNECTED, +}; + +/** + * enum ftm_time_sync_bss_state - ftm time sync bss states + * @FTM_TIME_SYNC_BSS_STARTED: BSS started + * @FTM_TIME_SYNC_BSS_STOPPED: BSS stopped + */ +enum ftm_time_sync_bss_state { + FTM_TIME_SYNC_BSS_STARTED, + FTM_TIME_SYNC_BSS_STOPPED, +}; /** * struct wlan_ftm_time_sync_tx_ops - structure of tx operation function * pointers for ftm time_sync component 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 8dedaf4d4b..e845c7aa49 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 @@ -120,3 +120,49 @@ void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool enable) { return ftm_time_sync_set_enable(psoc, enable); } + +void ucfg_ftm_time_sync_update_sta_connect_state( + struct wlan_objmgr_vdev *vdev, + enum ftm_time_sync_sta_state sta_state) +{ + struct wlan_objmgr_psoc *psoc; + enum ftm_time_sync_role role; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + ftm_time_sync_err("Failed to get psoc"); + return; + } + + role = ftm_time_sync_get_role(psoc); + if (role == FTM_TIMESYNC_SLAVE_ROLE) { + if (sta_state == FTM_TIME_SYNC_STA_CONNECTED) + ftm_time_sync_send_trigger(vdev); + else + ftm_time_sync_stop(vdev); + } +} + +void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, + enum ftm_time_sync_bss_state ap_state) +{ + struct wlan_objmgr_psoc *psoc; + enum ftm_time_sync_role role; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + ftm_time_sync_err("Failed to get psoc"); + return; + } + + if (!ftm_time_sync_is_enable(psoc)) + return; + + role = ftm_time_sync_get_role(psoc); + if (role == FTM_TIMESYNC_MASTER_ROLE) { + if (ap_state == FTM_TIME_SYNC_BSS_STARTED) + ftm_time_sync_send_trigger(vdev); + else + ftm_time_sync_stop(vdev); + } +} diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index cd280ef461..ff8d705dea 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -71,6 +71,7 @@ #include #include "wlan_blm_ucfg_api.h" #include "wlan_hdd_sta_info.h" +#include "ftm_time_sync_ucfg_api.h" #include @@ -1668,6 +1669,32 @@ 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 @@ -1793,11 +1820,15 @@ static QDF_STATUS hdd_dis_connect_handler(struct hdd_adapter *adapter, ucfg_p2p_status_disconnect(adapter->vdev); } - /* Inform BLM about the disconnection with the AP */ - if (adapter->device_mode == QDF_STA_MODE) + if (adapter->device_mode == QDF_STA_MODE) { + /* Inform BLM about the disconnection with the AP */ ucfg_blm_update_bssid_connect_params(hdd_ctx->pdev, sta_ctx->conn_info.bssid, BLM_AP_DISCONNECTED); + /* Inform FTM TIME SYNC about the disconnection with the AP */ + hdd_ftm_time_sync_sta_state_notify( + adapter, FTM_TIME_SYNC_STA_DISCONNECTED); + } hdd_wmm_adapter_clear(adapter); mac_handle = hdd_ctx->mac_handle; @@ -3405,11 +3436,16 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, qdf_mem_zero(&adapter->hdd_stats.hdd_pmf_stats, sizeof(adapter->hdd_stats.hdd_pmf_stats)); #endif - if (adapter->device_mode == QDF_STA_MODE) + if (adapter->device_mode == QDF_STA_MODE) { ucfg_blm_update_bssid_connect_params(hdd_ctx->pdev, roam_info->bssid, BLM_AP_CONNECTED); + /* Inform FTM TIME SYNC about the connection with AP */ + hdd_ftm_time_sync_sta_state_notify( + adapter, FTM_TIME_SYNC_STA_CONNECTED); + } + policy_mgr_check_n_start_opportunistic_timer(hdd_ctx->psoc); hdd_debug("check for SAP restart"); policy_mgr_check_concurrent_intf_and_restart_sap( diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index d0d6e99ef3..08e4c3f26a 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -92,6 +92,7 @@ #include "nan_ucfg_api.h" #include #include "wlan_hdd_sta_info.h" +#include "ftm_time_sync_ucfg_api.h" #define ACS_SCAN_EXPIRY_TIMEOUT_S 4 @@ -5663,6 +5664,9 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter, /* Check and restart SAP if it is on unsafe channel */ hdd_unsafe_channel_restart_sap(hdd_ctx); + ucfg_ftm_time_sync_update_bss_state(adapter->vdev, + FTM_TIME_SYNC_BSS_STARTED); + hdd_set_connection_in_progress(false); policy_mgr_nan_sap_post_enable_conc_check(hdd_ctx->psoc); ret = 0; @@ -5875,6 +5879,8 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, hdd_destroy_acs_timer(adapter); ucfg_p2p_status_stop_bss(adapter->vdev); + ucfg_ftm_time_sync_update_bss_state(adapter->vdev, + FTM_TIME_SYNC_BSS_STOPPED); hdd_exit();