/*
 * Copyright (c) 2020-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: This file contains definitions for target_if
 * roaming events.
 */

#ifndef TARGET_IF_CM_ROAM_EVENT_H__
#define TARGET_IF_CM_ROAM_EVENT_H__

#include "qdf_types.h"
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_cm_roam_public_struct.h"
#include <target_if.h>

/**
 * target_if_cm_get_roam_rx_ops() - Get CM roam rx ops registered
 * @psoc: pointer to psoc object
 *
 * Return: roam rx ops of connection mgr
 */
struct wlan_cm_roam_rx_ops *
target_if_cm_get_roam_rx_ops(struct wlan_objmgr_psoc *psoc);

/**
 * target_if_cm_roam_register_rx_ops  - Target IF API to register roam
 * related rx op.
 * @rx_ops: Pointer to rx ops fp struct
 *
 * Return: none
 */
void
target_if_cm_roam_register_rx_ops(struct wlan_cm_roam_rx_ops *rx_ops);

/**
 * target_if_cm_roam_event() - Target IF handler for roam events
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len);

/**
 * target_if_roam_register_common_events() - register common roam events
 * of LFR2/3
 * @psoc: pointer to psoc object
 *
 * Return: QDF_STATUS
 */
QDF_STATUS
target_if_roam_register_common_events(struct wlan_objmgr_psoc *psoc);

#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
 * target_if_cm_roam_sync_event() - Target IF handler for roam sync events
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int target_if_cm_roam_sync_event(ol_scn_t scn, uint8_t *event,
				 uint32_t len);

/**
 * target_if_cm_roam_sync_frame_event() - Target IF handler for
 * roam sync frame events
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_cm_roam_sync_frame_event(ol_scn_t scn,
				   uint8_t *event,
				   uint32_t len);

/**
 * target_if_cm_roam_stats_event() - Target IF handler for roam stats event
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_cm_roam_stats_event(ol_scn_t scn, uint8_t *event, uint32_t len);

/**
 * target_if_cm_roam_auth_offload_event - auth roam offload event handler
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_cm_roam_auth_offload_event(ol_scn_t scn, uint8_t *event,
				     uint32_t len);

/**
 * target_if_roam_offload_register_events() - register roam offload events
 * @psoc: pointer to psoc object
 *
 * Return: QDF_STATUS
 */
QDF_STATUS
target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc);

/**
 * target_if_cm_roam_vdev_disconnect_event_handler - vdev disconnect evt handler
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_cm_roam_vdev_disconnect_event_handler(ol_scn_t scn, uint8_t *event,
						uint32_t len);

/**
 * target_if_cm_roam_scan_chan_list_event_handler - roam scan ch evt handler
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_cm_roam_scan_chan_list_event_handler(ol_scn_t scn, uint8_t *event,
					       uint32_t len);

/**
 * target_if_pmkid_request_event_handler - pmkid request event handler
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_pmkid_request_event_handler(ol_scn_t scn, uint8_t *event,
				      uint32_t len);

/**
 * target_if_roam_frame_event_handler - Target IF API to receive
 * Beacon/probe for the roaming candidate.
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int
target_if_roam_frame_event_handler(ol_scn_t scn, uint8_t *event,
				   uint32_t len);
#else /* WLAN_FEATURE_ROAM_OFFLOAD */
static inline
QDF_STATUS
target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
{
	return QDF_STATUS_E_NOSUPPORT;
}

static inline int
target_if_cm_roam_vdev_disconnect_event_handler(ol_scn_t scn, uint8_t *event,
						uint32_t len)
{
	return 0;
}

static inline int
target_if_cm_roam_scan_chan_list_event_handler(ol_scn_t scn, uint8_t *event,
					       uint32_t len)
{
	return 0;
}

static inline int
target_if_pmkid_request_event_handler(ol_scn_t scn, uint8_t *event,
				      uint32_t len)
{
	return 0;
}

static inline int
target_if_roam_frame_event_handler(ol_scn_t scn, uint8_t *event,
				   uint32_t len)
{
	return 0;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */

#ifdef WLAN_VENDOR_HANDOFF_CONTROL
/**
 * target_if_get_roam_vendor_control_param_event_handler - event handler for
 * vendor control params event
 * @scn: target handle
 * @event: event buffer
 * @len: event buffer length
 *
 * Return: int for success or error code
 */
int target_if_get_roam_vendor_control_param_event_handler(ol_scn_t scn,
							  uint8_t *event,
							  uint32_t len);
#else
static inline int
target_if_get_roam_vendor_control_param_event_handler(ol_scn_t scn,
						      uint8_t *event,
						      uint32_t len)
{
	return 0;
}
#endif
#endif