Sfoglia il codice sorgente

qcacld-3.0: Add support to trigger FTM time sync feature

FTM time sync feature is triggered when connection takes place
in case of STA and bss starts in case of SAP. The feature is
stopped when STA disconnects and bss stops.

Change-Id: I963b0134b7432c9827c2fb3d9dce7c81a8666d4d
CRs-Fixed: 2621144
Surabhi Vishnoi 5 anni fa
parent
commit
bb69422804

+ 21 - 0
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_ */

+ 47 - 0
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;
+}

+ 40 - 0
components/ftm_time_sync/dispatcher/inc/ftm_time_sync_ucfg_api.h

@@ -25,6 +25,7 @@
 #include <qdf_status.h>
 #include <qdf_types.h>
 #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_ */

+ 19 - 0
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

+ 46 - 0
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);
+	}
+}

+ 39 - 3
core/hdd/src/wlan_hdd_assoc.c

@@ -71,6 +71,7 @@
 #include <wlan_crypto_global_api.h>
 #include "wlan_blm_ucfg_api.h"
 #include "wlan_hdd_sta_info.h"
+#include "ftm_time_sync_ucfg_api.h"
 
 #include <ol_defines.h>
 
@@ -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(

+ 6 - 0
core/hdd/src/wlan_hdd_hostapd.c

@@ -92,6 +92,7 @@
 #include "nan_ucfg_api.h"
 #include <wlan_reg_services_api.h>
 #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();