qcacld-3.0: Add function to handle the FTM time sync events from target

Add the function to parse the FTM timesync start/stop and offset
events received from target and populate them in ftm timsync
priv vdev structure.

Change-Id: Ibdcf97bb0a04fc6490c6bd2c26701036df92c5d4
CRs-Fixed: 2618646
This commit is contained in:
Surabhi Vishnoi
2020-02-07 13:06:20 +05:30
committed by nshrivas
parent b2884dad6e
commit 6ecac484fc
8 changed files with 320 additions and 5 deletions

View File

@@ -0,0 +1,52 @@
/*
* 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.
*/
/**
* DOC: Declares public API for ftm time sync to interact with target/WMI
*/
#ifndef _WLAN_FTM_TIME_SYNC_TGT_API_H_
#define _WLAN_FTM_TIME_SYNC_TGT_API_H_
#include <qdf_types.h>
struct wlan_objmgr_psoc;
struct ftm_time_sync_start_stop_params;
struct ftm_time_sync_offset;
/**
* tgt_ftm_ts_start_stop_evt() - receive start/stop ftm event
* from target if
* @psoc: objmgr psoc object
* @param: start/stop parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS
tgt_ftm_ts_start_stop_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_start_stop_params *param);
/**
* tgt_ftm_ts_offset_evt() - receive offset ftm event from target if
* @psoc: objmgr psoc object
* @param: offset parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_ftm_ts_offset_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_offset *param);
#endif /*_WLAN_FTM_TIME_SYNC_TGT_API_H_ */

View File

@@ -0,0 +1,103 @@
/*
*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.
*/
/**
* DOC: Implements public API for ftm time sync to interact with target/WMI
*/
#include "wlan_ftm_time_sync_tgt_api.h"
#include "ftm_time_sync_main.h"
#include "wlan_ftm_time_sync_public_struct.h"
#include <wmi_unified_api.h>
QDF_STATUS
tgt_ftm_ts_start_stop_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_start_stop_params *param)
{
struct wlan_objmgr_vdev *vdev;
struct ftm_timesync_vdev_priv *vdev_priv;
uint8_t vdev_id;
vdev_id = param->vdev_id;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
FTM_TIME_SYNC_ID);
if (!vdev) {
ftm_time_sync_err("failed to get vdev");
return QDF_STATUS_E_FAILURE;
}
vdev_priv = ftm_timesync_vdev_get_priv(vdev);
qdf_mutex_acquire(&vdev_priv->ftm_time_sync_mutex);
vdev_priv->time_sync_interval = param->timer_interval;
vdev_priv->num_reads = param->num_reads * 2;
if (vdev_priv->num_reads && vdev_priv->time_sync_interval) {
vdev_priv->num_reads--;
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
qdf_delayed_work_start(&vdev_priv->ftm_time_sync_work,
param->timer_interval);
} else if (vdev_priv->time_sync_interval == 0) {
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
vdev_priv->ftm_ts_priv.qtime_ref = param->qtime;
vdev_priv->ftm_ts_priv.mac_ref = param->mac_time;
qdf_delayed_work_stop_sync(&vdev_priv->ftm_time_sync_work);
} else {
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
}
ftm_timesync_vdev_put_ref(vdev);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS tgt_ftm_ts_offset_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_offset *param)
{
struct ftm_timesync_vdev_priv *vdev_priv;
struct wlan_objmgr_vdev *vdev;
uint8_t vdev_id;
int iter;
vdev_id = param->vdev_id;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
FTM_TIME_SYNC_ID);
if (!vdev) {
ftm_time_sync_err("failed to get vdev");
return QDF_STATUS_E_FAILURE;
}
vdev_priv = ftm_timesync_vdev_get_priv(vdev);
vdev_priv->num_qtime_pair = param->num_qtime <
FTM_TIME_SYNC_QTIME_PAIR_MAX ? param->num_qtime :
FTM_TIME_SYNC_QTIME_PAIR_MAX;
for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) {
vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master =
param->pairs[iter].qtime_master;
vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave =
param->pairs[iter].qtime_slave;
}
ftm_timesync_vdev_put_ref(vdev);
return QDF_STATUS_SUCCESS;
}