/*
 * Copyright (c) 2017-2018 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.
 */

#ifndef _WLAN_SPECTRAL_UTILS_API_H_
#define _WLAN_SPECTRAL_UTILS_API_H_

#include <wlan_objmgr_cmn.h>
#include <wlan_lmac_if_def.h>

/**
 * wlan_spectral_init() - API to init spectral component
 *
 * This API is invoked from dispatcher init during all component init.
 * This API will register all required handlers for pdev and peer object
 * create/delete notification.
 *
 * Return: SUCCESS,
 *         Failure
 */
QDF_STATUS wlan_spectral_init(void);

/**
 * wlan_spectral_deinit() - API to deinit spectral component
 *
 * This API is invoked from dispatcher deinit during all component deinit.
 * This API will unregister all registered handlers for pdev and peer object
 * create/delete notification.
 *
 * Return: SUCCESS,
 *         Failure
 */
QDF_STATUS wlan_spectral_deinit(void);

/**
 * wlan_lmac_if_sptrl_register_rx_ops() - Register lmac interface Rx operations
 * @rx_ops: Pointer to lmac interface Rx operations structure
 *
 * API to register spectral related lmac interface Rx operations
 *
 * Return: None
 */
void
wlan_lmac_if_sptrl_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops);

/**
* wlan_register_wmi_spectral_cmd_ops() - Register operations related to wmi
* commands on spectral parameters
* @pdev    - the physical device object
* @cmd_ops - pointer to the structure holding the operations
*	     related to wmi commands on spectral parameters
*
* API to register operations related to wmi commands on spectral parameters
*
* Return: None
*/
void
wlan_register_wmi_spectral_cmd_ops(struct wlan_objmgr_pdev *pdev,
				   struct wmi_spectral_cmd_ops *cmd_ops);

/**
 * struct spectral_legacy_cbacks - Spectral legacy callbacks
 * @vdev_get_chan_freq:          Get channel frequency
 * @vdev_get_ch_width:           Get channel width
 * @vdev_get_sec20chan_freq_mhz: Get seconadry 20 frequency
 */
struct spectral_legacy_cbacks {
	int16_t (*vdev_get_chan_freq)(struct wlan_objmgr_vdev *vdev);
	enum phy_ch_width (*vdev_get_ch_width)(struct wlan_objmgr_vdev *vdev);
	int (*vdev_get_sec20chan_freq_mhz)(struct wlan_objmgr_vdev *vdev,
					   uint16_t *sec20chan_freq);
};

/**
 * spectral_vdev_get_chan_freq - Get vdev channel frequency
 * @vdev:          vdev object
 *
 * Return: vdev operating frequency
 */
int16_t spectral_vdev_get_chan_freq(struct wlan_objmgr_vdev *vdev);

/**
 * spectral_vdev_get_sec20chan_freq_mhz - Get vdev secondary channel frequncy
 * @vdev:   vdev object
 * @sec20chan_freq: secondary channel frequency
 *
 * Return: secondary channel freq
 */
int spectral_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
					uint16_t *sec20chan_freq);

/**
 * spectral_register_legacy_cb() - Register spectral legacy callbacks
 * commands on spectral parameters
 * @psoc    - the physical device object
 * @legacy_cbacks - Reference to struct spectral_legacy_cbacks from which
 * function pointers need to be copied
 *
 * API to register spectral related legacy callbacks
 *
 * Return: QDF_STATUS_SUCCESS upon successful registration,
 *         QDF_STATUS_E_FAILURE upon failure
 */
QDF_STATUS spectral_register_legacy_cb(
	struct wlan_objmgr_psoc *psoc,
	struct spectral_legacy_cbacks *legacy_cbacks);

/**
 * spectral_vdev_get_ch_width() - Get the channel bandwidth
 * @vdev    - Pointer to vdev
 *
 * API to get the channel bandwidth of a given vdev
 *
 * Return: Enumeration corresponding to the channel bandwidth
 */
enum phy_ch_width
spectral_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev);

/**
 * spectral_pdev_open() - Spectral pdev open handler
 * @pdev:  pointer to pdev object
 *
 * API to execute operations on pdev open
 *
 * Return: QDF_STATUS_SUCCESS upon successful registration,
 *         QDF_STATUS_E_FAILURE upon failure
 */
QDF_STATUS spectral_pdev_open(struct wlan_objmgr_pdev *pdev);

#endif /* _WLAN_SPECTRAL_UTILS_API_H_*/
