/******************************************************************************
 *
 * Copyright(c) 2007 - 2016  Realtek Corporation.
 *
 * 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.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

#ifndef __ODM_INTERFACE_H__
#define __ODM_INTERFACE_H__

#define INTERFACE_VERSION "1.1" /*2015.07.29  YuChen*/

/*
 * =========== Constant/Structure/Enum/... Define
 */

/*
 * =========== Macro Define
 */

#define _reg_all(_name) ODM_##_name
#define _reg_ic(_name, _ic) ODM_##_name##_ic
#define _bit_all(_name) BIT_##_name
#define _bit_ic(_name, _ic) BIT_##_name##_ic

/* _cat: implemented by Token-Pasting Operator. */

/*===================================
 *
 * #define ODM_REG_DIG_11N	0xC50
 * #define ODM_REG_DIG_11AC	0xDDD
 *
 * ODM_REG(DIG,_pdm_odm)
 * ===================================
 */

#define _reg_11N(_name) ODM_REG_##_name##_11N
#define _reg_11AC(_name) ODM_REG_##_name##_11AC
#define _bit_11N(_name) ODM_BIT_##_name##_11N
#define _bit_11AC(_name) ODM_BIT_##_name##_11AC

#define _cat(_name, _ic_type, _func)                                           \
	(((_ic_type) & ODM_IC_11N_SERIES) ? _func##_11N(_name) :               \
					    _func##_11AC(_name))

/* _name: name of register or bit.
 * Example: "ODM_REG(R_A_AGC_CORE1, dm)"
 * gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C",
 * depends on support_ic_type.
 */
#define ODM_REG(_name, _pdm_odm) _cat(_name, _pdm_odm->support_ic_type, _reg)
#define ODM_BIT(_name, _pdm_odm) _cat(_name, _pdm_odm->support_ic_type, _bit)
enum phydm_h2c_cmd {
	PHYDM_H2C_TXBF = 0x41,
	ODM_H2C_RSSI_REPORT = 0x42,
	ODM_H2C_IQ_CALIBRATION = 0x45,
	ODM_H2C_RA_PARA_ADJUST = 0x47,
	PHYDM_H2C_DYNAMIC_TX_PATH = 0x48,
	PHYDM_H2C_FW_TRACE_EN = 0x49,
	ODM_H2C_WIFI_CALIBRATION = 0x6d,
	PHYDM_H2C_MU = 0x4a,
	ODM_MAX_H2CCMD
};

enum phydm_c2h_evt {
	PHYDM_C2H_DBG = 0,
	PHYDM_C2H_LB = 1,
	PHYDM_C2H_XBF = 2,
	PHYDM_C2H_TX_REPORT = 3,
	PHYDM_C2H_INFO = 9,
	PHYDM_C2H_BT_MP = 11,
	PHYDM_C2H_RA_RPT = 12,
	PHYDM_C2H_RA_PARA_RPT = 14,
	PHYDM_C2H_DYNAMIC_TX_PATH_RPT = 15,
	PHYDM_C2H_IQK_FINISH = 17, /*0x11*/
	PHYDM_C2H_DBG_CODE = 0xFE,
	PHYDM_C2H_EXTEND = 0xFF,
};

enum phydm_extend_c2h_evt {
	PHYDM_EXTEND_C2H_DBG_PRINT = 0

};

/*
 * =========== Extern Variable ??? It should be forbidden.
 */

/*
 * =========== EXtern Function Prototype
 */

u8 odm_read_1byte(struct phy_dm_struct *dm, u32 reg_addr);

u16 odm_read_2byte(struct phy_dm_struct *dm, u32 reg_addr);

u32 odm_read_4byte(struct phy_dm_struct *dm, u32 reg_addr);

void odm_write_1byte(struct phy_dm_struct *dm, u32 reg_addr, u8 data);

void odm_write_2byte(struct phy_dm_struct *dm, u32 reg_addr, u16 data);

void odm_write_4byte(struct phy_dm_struct *dm, u32 reg_addr, u32 data);

void odm_set_mac_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask,
		     u32 data);

u32 odm_get_mac_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask);

void odm_set_bb_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask,
		    u32 data);

u32 odm_get_bb_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask);

void odm_set_rf_reg(struct phy_dm_struct *dm, enum odm_rf_radio_path e_rf_path,
		    u32 reg_addr, u32 bit_mask, u32 data);

u32 odm_get_rf_reg(struct phy_dm_struct *dm, enum odm_rf_radio_path e_rf_path,
		   u32 reg_addr, u32 bit_mask);

/*
 * Memory Relative Function.
 */
void odm_allocate_memory(struct phy_dm_struct *dm, void **ptr, u32 length);
void odm_free_memory(struct phy_dm_struct *dm, void *ptr, u32 length);

void odm_move_memory(struct phy_dm_struct *dm, void *p_dest, void *src,
		     u32 length);

s32 odm_compare_memory(struct phy_dm_struct *dm, void *p_buf1, void *buf2,
		       u32 length);

void odm_memory_set(struct phy_dm_struct *dm, void *pbuf, s8 value, u32 length);

/*
 * ODM MISC-spin lock relative API.
 */
void odm_acquire_spin_lock(struct phy_dm_struct *dm,
			   enum rt_spinlock_type type);

void odm_release_spin_lock(struct phy_dm_struct *dm,
			   enum rt_spinlock_type type);

/*
 * ODM Timer relative API.
 */
void odm_stall_execution(u32 us_delay);

void ODM_delay_ms(u32 ms);

void ODM_delay_us(u32 us);

void ODM_sleep_ms(u32 ms);

void ODM_sleep_us(u32 us);

void odm_set_timer(struct phy_dm_struct *dm, struct timer_list *timer,
		   u32 ms_delay);

void odm_initialize_timer(struct phy_dm_struct *dm, struct timer_list *timer,
			  void *call_back_func, void *context,
			  const char *sz_id);

void odm_cancel_timer(struct phy_dm_struct *dm, struct timer_list *timer);

void odm_release_timer(struct phy_dm_struct *dm, struct timer_list *timer);

/*
 * ODM FW relative API.
 */
void odm_fill_h2c_cmd(struct phy_dm_struct *dm, u8 element_id, u32 cmd_len,
		      u8 *cmd_buffer);

u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len,
			     u8 *tmp_buf);

u64 odm_get_current_time(struct phy_dm_struct *dm);
u64 odm_get_progressing_time(struct phy_dm_struct *dm, u64 start_time);

void odm_set_tx_power_index_by_rate_section(struct phy_dm_struct *dm,
					    u8 rf_path, u8 channel,
					    u8 rate_section);

u8 odm_get_tx_power_index(struct phy_dm_struct *dm, u8 rf_path, u8 tx_rate,
			  u8 band_width, u8 channel);

#endif /* __ODM_INTERFACE_H__ */
