/** @file */
/******************************************************************************
 *
 * Copyright(c) 2019 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 ******************************************************************************/

#ifndef _MAC_AX_MPORT_H_
#define _MAC_AX_MPORT_H_

#include "../type.h"

/*--------------------Define -------------------------------------------*/
#define BCN_ERLY_DEF 160
#define BCN_SETUP_DEF 4
#define BCN_HOLD_DEF 400
#define BCN_MASK_DEF 0
#define TBTT_ERLY_DEF 5
#define TBTT_AGG_DEF 1
#define BCN_SET_TO_US 32
#define TU_TO_BCN_SET (1024 / BCN_SET_TO_US)
#define BCN_ERLY_SET_DLY 10

#define PTCL_DBG_BCNQ_NUM0 8
#define PTCL_DBG_BCNQ_NUM1 9
#define PTCL_DBG_DLY_US 100

#define TU_UNIT 1024
#define MS_UNIT 1000
#define PORT_DLY_TU_CNT_LMT 200
#define PORT_DLY_US_CNT_LMT 200

#define MAX_BCN_ITVL 0x639C

#define CHK_BCNQ_CNT 200
#define BCNQ_EMP_CONT_CNT 3

#define LBK_PLCP_DLY_DEF 0x28
#define LBK_PLCP_DLY_FPGA 0x46

#define BCN_FAST_DRP_TBTT 1

/* 50% hold time , 30% beacon early */
#define BCN_ERLY_RATIO 3
#define BCN_HOLD_RATIO 5
#define BCN_ITVL_RATIO 10

#define PORT_H2C_DLY_US 10
#define PORT_H2C_DLY_CNT 20000

#define TBTT_SHIFT_OFST_MSB 0x800

/*--------------------Define MACRO--------------------------------------*/
/*--------------------Define Enum---------------------------------------*/
enum port_stat {
	PORT_ST_DIS = 0,
	PORT_ST_NOLINK,
	PORT_ST_ADHOC,
	PORT_ST_INFRA,
	PORT_ST_AP,
};

enum C2H_MPORT_RET_CODE {
	C2H_MPORT_RET_SUCCESS = 0,
	C2H_MPORT_RET_PENDING,
	C2H_MPORT_RET_BAND_ERR,
	C2H_MPORT_RET_PORT_ERR,
	C2H_MPORT_RET_MBID_ERR,
	C2H_MPORT_RET_NO_CONTENT,
	C2H_MPORT_RET_TSF32TOG_C2H_FAIL,
	C2H_MPORT_RET_CFG_TYPE_ERR,
	C2H_MPORT_RET_SET_CFG_ILEGAL_EN,
	C2H_MPORT_RET_SET_CFG_ARDY_DIS,
	C2H_MPORT_RET_INPUT_ILEGAL,
	C2H_MPORT_RET_CHK_BELW_LMT,
	C2H_MPORT_RET_CHK_OVER_LMT,
	C2H_MPORT_RET_SUB_SPC_ERR,
	C2H_MPORT_RET_POLL_TO,
	C2H_MPORT_RET_TSF_NOT_RUN,
	C2H_MPORT_RET_MALLOC_FAIL,
	C2H_MPORT_RET_DEINIT_FAIL,
	C2H_MPORT_RET_PKT_DROP,
	C2H_MPORT_RET_ADD_PSTIMER,
	C2H_MPORT_RET_CHK_BCNQ_TO,
	C2H_MPORT_RET_CHK_BCNQ_FAIL,
	C2H_MPORT_RET_SEND_C2H_INIT,
	C2H_MPORT_RET_SEND_C2H_CFG,
};

/*--------------------Define Struct-------------------------------------*/

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */
/**
 * @brief dly_port_tu
 *
 * @param *adapter
 * @param band
 * @param port
 * @param dly_tu
 * @return Please Place Description here.
 * @retval u32
 */
u32 dly_port_tu(struct mac_ax_adapter *adapter, u8 band, u8 port, u32 dly_tu);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief dly_port_us
 *
 * @param *adapter
 * @param band
 * @param port
 * @param dly_us
 * @return Please Place Description here.
 * @retval u32
 */
u32 dly_port_us(struct mac_ax_adapter *adapter, u8 band, u8 port, u32 dly_us);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief rst_port_info
 *
 * @param *adapter
 * @param band
 * @return Please Place Description here.
 * @retval u32
 */
u32 rst_port_info(struct mac_ax_adapter *adapter, u8 band);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief mac_port_cfg
 *
 * @param *adapter
 * @param type
 * @param *para
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_port_cfg(struct mac_ax_adapter *adapter,
		 enum mac_ax_port_cfg_type type,
		 struct mac_ax_port_cfg_para *para);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief mac_port_init
 *
 * @param *adapter
 * @param *para
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_port_init(struct mac_ax_adapter *adapter,
		  struct mac_ax_port_init_para *para);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief mac_tsf_sync
 *
 * @param *adapter
 * @param from_port
 * @param to_port
 * @param sync_offset
 * @param action
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_tsf_sync(struct mac_ax_adapter *adapter, u8 from_port, u8 to_port,
		 s32 sync_offset, enum mac_ax_tsf_sync_act action);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief mac_parse_bcn_stats_c2h
 *
 * @param *adapter
 * @param *content
 * @param *val
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_parse_bcn_stats_c2h(struct mac_ax_adapter *adapter,
			    u8 *content, struct mac_ax_bcn_cnt *val);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Basic_TRX
 * @{
 * @addtogroup MultiPort
 * @{
 */

/**
 * @brief get_bcn_stats_event
 *
 * @param *adapter
 * @param *c2h
 * @param *id
 * @param *c2h_info
 * @return Please Place Description here.
 * @retval u32
 */
u32 get_bcn_stats_event(struct mac_ax_adapter *adapter,
			struct rtw_c2h_info *c2h,
			enum phl_msg_evt_id *id, u8 *c2h_info);
/**
 * @}
 * @}
 */

u32 mac_tsf32_togl_h2c(struct mac_ax_adapter *adapter,
		       struct mac_ax_t32_togl_info *info);

u32 mac_get_t32_togl_rpt(struct mac_ax_adapter *adapter,
			 struct mac_ax_t32_togl_rpt *ret_rpt);

u32 get_bp_idx(u8 band, u8 port);

u32 mport_info_init(struct mac_ax_adapter *adapter);

u32 mport_info_exit(struct mac_ax_adapter *adapter);

#endif
