From 36627ac5e9963e215fd57ec3631753912c98cd5d Mon Sep 17 00:00:00 2001 From: Christopher Chopp Date: Thu, 17 Sep 2020 11:28:00 -0700 Subject: [PATCH] qcacmn: Add WMI Handler for TSF Event Add handling for WMI TSF Event, including registration, sending event and extracting response. Change-Id: Icccf9b5eb7e46bd87caf7a644be903747eac025c --- wmi/inc/wmi_unified_api.h | 22 ++++++++++++ wmi/inc/wmi_unified_param.h | 10 ++++++ wmi/inc/wmi_unified_priv.h | 7 ++++ wmi/src/wmi_unified_api.c | 41 +++++++++++++++++++++++ wmi/src/wmi_unified_tlv.c | 67 +++++++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+) diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 24a1edd2a3..b0fbd9c90f 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -4214,4 +4214,26 @@ QDF_STATUS wmi_unified_extract_cp_stats_more_pending(wmi_unified_t wmi_handle, void *evt_buf, uint32_t *more_flag); +/** + * wmi_unified_send_vdev_tsf_tstamp_action_cmd() - send vdev tsf action command + * @wmi: wmi handle + * @vdev_id: vdev id + * + * TSF_TSTAMP_READ_VALUE is the only operation supported + * Return: QDF_STATUS_SUCCESS for success or error code + */ +QDF_STATUS wmi_unified_send_vdev_tsf_tstamp_action_cmd(wmi_unified_t wmi_hdl, + uint8_t vdev_id); + +/** + * wmi_extract_vdev_tsf_report_event() - extract vdev tsf report from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @wmi_host_tsf_event param: Pointer to hold event info + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_vdev_tsf_report_event(wmi_unified_t wmi_hdl, + uint8_t *evt_buf, + struct wmi_host_tsf_event *param); #endif /* _WMI_UNIFIED_API_H_ */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 4bf3d829af..b93b0675e8 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -4611,6 +4611,16 @@ struct ftm_time_sync_offset { }; #endif +/** + * struct wmi_host_tsf_event_- Get tsf event info + * @vdev_id: vdev id + * @tsf: tsf + */ +struct wmi_host_tsf_event { + uint32_t vdev_id; + uint64_t tsf; +}; + #define WMI_EVENT_ID_INVALID 0 /** * Host based ENUM IDs for events to abstract target enums for event_id diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 8e264c313f..6c018bc7ff 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2469,6 +2469,13 @@ QDF_STATUS (*send_cp_stats_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*extract_cp_stats_more_pending)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t *more_flag); + +QDF_STATUS (*send_vdev_tsf_tstamp_action_cmd)(wmi_unified_t wmi, + uint8_t vdev_id); + +QDF_STATUS (*extract_vdev_tsf_report_event)(wmi_unified_t wmi_handle, + void *evt_buf, + struct wmi_host_tsf_event *param); }; /* Forward declartion for psoc*/ diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index e385d3d94d..40aaecb342 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -3339,3 +3339,44 @@ wmi_unified_extract_cp_stats_more_pending(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } +/** + * wmi_unified_send_vdev_tsf_tstamp_action_cmd() - send vdev tsf action command + * @wmi: wmi handle + * @vdev_id: vdev id + * + * TSF_TSTAMP_READ_VALUE is the only operation supported + * Return: QDF_STATUS_SUCCESS for success or erro code + */ +QDF_STATUS wmi_unified_send_vdev_tsf_tstamp_action_cmd(wmi_unified_t wmi_hdl, + uint8_t vdev_id) +{ + wmi_unified_t wmi_handle = wmi_hdl; + + if (wmi_handle->ops->send_vdev_tsf_tstamp_action_cmd) + return wmi_handle->ops->send_vdev_tsf_tstamp_action_cmd( + wmi_handle, vdev_id); + + return QDF_STATUS_E_FAILURE; +} + +/** + * wmi_extract_vdev_tsf_report_event() - extract vdev tsf report from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @wmi_host_tsf_event param: Pointer to hold event info + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_vdev_tsf_report_event(wmi_unified_t wmi_hdl, + uint8_t *evt_buf, + struct wmi_host_tsf_event *param) +{ + wmi_unified_t wmi_handle = wmi_hdl; + + if (wmi_handle->ops->extract_vdev_tsf_report_event) + return wmi_handle->ops->extract_vdev_tsf_report_event( + wmi_handle, evt_buf, param); + + return QDF_STATUS_E_FAILURE; +} + diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 1c53bcbf13..cede6f2cde 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -14014,6 +14014,71 @@ extract_time_sync_ftm_offset_event_tlv(wmi_unified_t wmi, void *buf, } #endif /* FEATURE_WLAN_TIME_SYNC_FTM */ +/** + * send_vdev_tsf_tstamp_action_cmd_tlv() - send vdev tsf action command + * @wmi: wmi handle + * @vdev_id: vdev id + * + * TSF_TSTAMP_READ_VALUE is the only operation supported + * Return: QDF_STATUS_SUCCESS for success or erro code + */ +static QDF_STATUS +send_vdev_tsf_tstamp_action_cmd_tlv(wmi_unified_t wmi, uint8_t vdev_id) +{ + wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + + buf = wmi_buf_alloc(wmi, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_tsf_tstamp_action_cmd_fixed_param)); + cmd->vdev_id = vdev_id; + cmd->tsf_action = TSF_TSTAMP_READ_VALUE; + wmi_mtrace(WMI_VDEV_TSF_TSTAMP_ACTION_CMDID, cmd->vdev_id, 0); + if (wmi_unified_cmd_send(wmi, buf, len, + WMI_VDEV_TSF_TSTAMP_ACTION_CMDID)) { + wmi_err("%s: Failed to send WMI_VDEV_TSF_TSTAMP_ACTION_CMDID", + __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_vdev_tsf_report_event_tlv() - extract vdev tsf report from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @wmi_host_tsf_event param: Pointer to struct to hold event info + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +static QDF_STATUS +extract_vdev_tsf_report_event_tlv(wmi_unified_t wmi_handle, void *evt_buf, + struct wmi_host_tsf_event *param) +{ + WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *param_buf; + wmi_vdev_tsf_report_event_fixed_param *evt; + + param_buf = (WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + wmi_err("Invalid tsf report event buffer"); + return QDF_STATUS_E_INVAL; + } + + evt = param_buf->fixed_param; + param->tsf = ((uint64_t)(evt->tsf_high) << 32) | evt->tsf_low; + param->vdev_id = evt->vdev_id; + + return QDF_STATUS_SUCCESS; +} + struct wmi_ops tlv_ops = { .send_vdev_create_cmd = send_vdev_create_cmd_tlv, .send_vdev_delete_cmd = send_vdev_delete_cmd_tlv, @@ -14368,6 +14433,8 @@ struct wmi_ops tlv_ops = { .send_cp_stats_cmd = send_cp_stats_cmd_tlv, .extract_cp_stats_more_pending = extract_cp_stats_more_pending_tlv, + .send_vdev_tsf_tstamp_action_cmd = send_vdev_tsf_tstamp_action_cmd_tlv, + .extract_vdev_tsf_report_event = extract_vdev_tsf_report_event_tlv, }; /**