/*
 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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: Implement API's specific to TWT component.
 */

#include "wmi_unified_priv.h"
#include "wmi_unified_twt_api.h"

#if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
#include <wlan_twt_public_structs.h>

QDF_STATUS
wmi_unified_twt_enable_cmd(wmi_unified_t wmi_handle,
			   struct twt_enable_param *params)
{
	if (wmi_handle->ops->send_twt_enable_cmd)
		return wmi_handle->ops->send_twt_enable_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_disable_cmd(wmi_unified_t wmi_handle,
			    struct twt_disable_param *params)
{
	if (wmi_handle->ops->send_twt_disable_cmd)
		return wmi_handle->ops->send_twt_disable_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_add_dialog_cmd(wmi_unified_t wmi_handle,
			       struct twt_add_dialog_param *params)
{
	if (wmi_handle->ops->send_twt_add_dialog_cmd)
		return wmi_handle->ops->send_twt_add_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_del_dialog_cmd(wmi_unified_t wmi_handle,
			       struct twt_del_dialog_param *params)
{
	if (wmi_handle->ops->send_twt_del_dialog_cmd)
		return wmi_handle->ops->send_twt_del_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_pause_dialog_cmd(wmi_unified_t wmi_handle,
				 struct twt_pause_dialog_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_pause_dialog_cmd)
		return wmi_handle->ops->send_twt_pause_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_nudge_dialog_cmd(wmi_unified_t wmi_handle,
				 struct twt_nudge_dialog_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_nudge_dialog_cmd)
		return wmi_handle->ops->send_twt_nudge_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_unified_twt_resume_dialog_cmd(
			wmi_unified_t wmi_handle,
			struct twt_resume_dialog_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_resume_dialog_cmd)
		return wmi_handle->ops->send_twt_resume_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

#ifdef WLAN_SUPPORT_BCAST_TWT
QDF_STATUS wmi_unified_twt_btwt_invite_sta_cmd(
			wmi_unified_t wmi_handle,
			struct twt_btwt_invite_sta_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_btwt_invite_sta_cmd)
		return wmi_handle->ops->send_twt_btwt_invite_sta_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_unified_twt_btwt_remove_sta_cmd(
			wmi_unified_t wmi_handle,
			struct twt_btwt_remove_sta_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_btwt_remove_sta_cmd)
		return wmi_handle->ops->send_twt_btwt_remove_sta_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}
#endif

QDF_STATUS wmi_extract_twt_enable_comp_event(
			wmi_unified_t wmi_handle,
			uint8_t *evt_buf,
			struct twt_enable_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_enable_comp_event)
		return wmi_handle->ops->extract_twt_enable_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_disable_comp_event(
			wmi_unified_t wmi_handle,
			uint8_t *evt_buf,
			struct twt_disable_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_disable_comp_event)
		return wmi_handle->ops->extract_twt_disable_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_add_dialog_comp_event(
			wmi_unified_t wmi_handle,
			uint8_t *evt_buf,
			struct twt_add_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_add_dialog_comp_event)
		return wmi_handle->ops->extract_twt_add_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_add_dialog_comp_additional_params(
		wmi_unified_t wmi_handle, uint8_t *evt_buf,
		uint32_t evt_buf_len, uint32_t idx,
		struct twt_add_dialog_additional_params *additional_params)
{
	if (wmi_handle->ops->extract_twt_add_dialog_comp_additional_params)
		return wmi_handle->ops->
			extract_twt_add_dialog_comp_additional_params(
			wmi_handle, evt_buf, evt_buf_len, idx,
			additional_params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_del_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_del_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_del_dialog_comp_event)
		return wmi_handle->ops->extract_twt_del_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_pause_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_pause_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_pause_dialog_comp_event)
		return wmi_handle->ops->extract_twt_pause_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_nudge_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_nudge_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_nudge_dialog_comp_event)
		return wmi_handle->ops->extract_twt_nudge_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_resume_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_resume_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_resume_dialog_comp_event)
		return wmi_handle->ops->extract_twt_resume_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_notify_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_notify_event_param *params)
{
	if (wmi_handle->ops->extract_twt_notify_event)
		return wmi_handle->ops->extract_twt_notify_event(wmi_handle,
								 evt_buf,
								 params);

	return QDF_STATUS_E_FAILURE;
}

#ifdef WLAN_SUPPORT_BCAST_TWT
QDF_STATUS wmi_extract_twt_btwt_invite_sta_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_btwt_invite_sta_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_btwt_invite_sta_comp_event)
		return wmi_handle->ops->extract_twt_btwt_invite_sta_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_btwt_remove_sta_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_btwt_remove_sta_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_btwt_remove_sta_comp_event)
		return wmi_handle->ops->extract_twt_btwt_remove_sta_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}
#endif

QDF_STATUS wmi_extract_twt_session_stats_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_session_stats_event_param *params)
{
	if (wmi_handle->ops->extract_twt_session_stats_event)
		return wmi_handle->ops->extract_twt_session_stats_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_session_stats_data(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_session_stats_event_param *params,
		struct twt_session_stats_info *session,
		uint32_t idx)
{
	if (wmi_handle->ops->extract_twt_session_stats_data)
		return wmi_handle->ops->extract_twt_session_stats_data(
				wmi_handle, evt_buf, params, session, idx);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_cap_service_ready_ext2(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_cap_bitmap_params *params)
{
	if (wmi_handle->ops->extract_twt_cap_service_ready_ext2)
		return wmi_handle->ops->extract_twt_cap_service_ready_ext2(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_ack_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct twt_ack_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_ack_comp_event)
		return wmi_handle->ops->extract_twt_ack_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}
#elif WLAN_SUPPORT_TWT
QDF_STATUS
wmi_unified_twt_enable_cmd(wmi_unified_t wmi_handle,
			   struct wmi_twt_enable_param *params)
{
	if (wmi_handle->ops->send_twt_enable_cmd)
		return wmi_handle->ops->send_twt_enable_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_disable_cmd(wmi_unified_t wmi_handle,
			    struct wmi_twt_disable_param *params)
{
	if (wmi_handle->ops->send_twt_disable_cmd)
		return wmi_handle->ops->send_twt_disable_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_add_dialog_cmd(wmi_unified_t wmi_handle,
			       struct wmi_twt_add_dialog_param *params)
{
	if (wmi_handle->ops->send_twt_add_dialog_cmd)
		return wmi_handle->ops->send_twt_add_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_del_dialog_cmd(wmi_unified_t wmi_handle,
			       struct wmi_twt_del_dialog_param *params)
{
	if (wmi_handle->ops->send_twt_del_dialog_cmd)
		return wmi_handle->ops->send_twt_del_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_pause_dialog_cmd(wmi_unified_t wmi_handle,
				 struct wmi_twt_pause_dialog_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_pause_dialog_cmd)
		return wmi_handle->ops->send_twt_pause_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS
wmi_unified_twt_nudge_dialog_cmd(wmi_unified_t wmi_handle,
				 struct wmi_twt_nudge_dialog_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_nudge_dialog_cmd)
		return wmi_handle->ops->send_twt_nudge_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_unified_twt_resume_dialog_cmd(
			wmi_unified_t wmi_handle,
			struct wmi_twt_resume_dialog_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_resume_dialog_cmd)
		return wmi_handle->ops->send_twt_resume_dialog_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

#ifdef WLAN_SUPPORT_BCAST_TWT
QDF_STATUS wmi_unified_twt_btwt_invite_sta_cmd(
			wmi_unified_t wmi_handle,
			struct wmi_twt_btwt_invite_sta_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_btwt_invite_sta_cmd)
		return wmi_handle->ops->send_twt_btwt_invite_sta_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_unified_twt_btwt_remove_sta_cmd(
			wmi_unified_t wmi_handle,
			struct wmi_twt_btwt_remove_sta_cmd_param *params)
{
	if (wmi_handle->ops->send_twt_btwt_remove_sta_cmd)
		return wmi_handle->ops->send_twt_btwt_remove_sta_cmd(
				wmi_handle, params);

	return QDF_STATUS_E_FAILURE;
}
#endif

QDF_STATUS wmi_extract_twt_enable_comp_event(
			wmi_unified_t wmi_handle,
			uint8_t *evt_buf,
			struct wmi_twt_enable_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_enable_comp_event)
		return wmi_handle->ops->extract_twt_enable_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_disable_comp_event(
			wmi_unified_t wmi_handle,
			uint8_t *evt_buf,
			struct wmi_twt_disable_complete_event *params)
{
	if (wmi_handle->ops->extract_twt_disable_comp_event)
		return wmi_handle->ops->extract_twt_disable_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_add_dialog_comp_event(
			wmi_unified_t wmi_handle,
			uint8_t *evt_buf,
			struct wmi_twt_add_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_add_dialog_comp_event)
		return wmi_handle->ops->extract_twt_add_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_add_dialog_comp_additional_params(
		wmi_unified_t wmi_handle, uint8_t *evt_buf,
		uint32_t evt_buf_len, uint32_t idx,
		struct wmi_twt_add_dialog_additional_params *additional_params)
{
	if (wmi_handle->ops->extract_twt_add_dialog_comp_additional_params)
		return wmi_handle->ops->
			extract_twt_add_dialog_comp_additional_params(
			wmi_handle, evt_buf, evt_buf_len, idx,
			additional_params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_del_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_del_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_del_dialog_comp_event)
		return wmi_handle->ops->extract_twt_del_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_pause_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_pause_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_pause_dialog_comp_event)
		return wmi_handle->ops->extract_twt_pause_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_nudge_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_nudge_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_nudge_dialog_comp_event)
		return wmi_handle->ops->extract_twt_nudge_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_resume_dialog_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_resume_dialog_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_resume_dialog_comp_event)
		return wmi_handle->ops->extract_twt_resume_dialog_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_notify_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_notify_event_param *params)
{
	if (wmi_handle->ops->extract_twt_notify_event)
		return wmi_handle->ops->extract_twt_notify_event(wmi_handle,
								 evt_buf,
								 params);

	return QDF_STATUS_E_FAILURE;
}

#ifdef WLAN_SUPPORT_BCAST_TWT
QDF_STATUS wmi_extract_twt_btwt_invite_sta_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_btwt_invite_sta_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_btwt_invite_sta_comp_event)
		return wmi_handle->ops->extract_twt_btwt_invite_sta_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_btwt_remove_sta_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_btwt_remove_sta_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_btwt_remove_sta_comp_event)
		return wmi_handle->ops->extract_twt_btwt_remove_sta_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}
#endif

QDF_STATUS wmi_extract_twt_session_stats_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_session_stats_event_param *params)
{
	if (wmi_handle->ops->extract_twt_session_stats_event)
		return wmi_handle->ops->extract_twt_session_stats_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_session_stats_data(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_session_stats_event_param *params,
		struct wmi_host_twt_session_stats_info *session,
		uint32_t idx)
{
	if (wmi_handle->ops->extract_twt_session_stats_data)
		return wmi_handle->ops->extract_twt_session_stats_data(
				wmi_handle, evt_buf, params, session, idx);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_cap_service_ready_ext2(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_cap_bitmap_params *params)
{
	if (wmi_handle->ops->extract_twt_cap_service_ready_ext2)
		return wmi_handle->ops->extract_twt_cap_service_ready_ext2(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}

QDF_STATUS wmi_extract_twt_ack_comp_event(
		wmi_unified_t wmi_handle,
		uint8_t *evt_buf,
		struct wmi_twt_ack_complete_event_param *params)
{
	if (wmi_handle->ops->extract_twt_ack_comp_event)
		return wmi_handle->ops->extract_twt_ack_comp_event(
				wmi_handle, evt_buf, params);

	return QDF_STATUS_E_FAILURE;
}
#endif