/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2007 - 2017 Realtek Corporation */

#ifndef	__PHYDMSOML_H__
#define    __PHYDMSOML_H__

#define ADAPTIVE_SOML_VERSION	"1.0"

#define ODM_ADAPTIVE_SOML_SUPPORT_IC	(ODM_RTL8822B | ODM_RTL8197F)

#define INIT_SOML_TIMMER			0
#define CANCEL_SOML_TIMMER		1
#define RELEASE_SOML_TIMMER		2

#define SOML_RSSI_TH_HIGH	25
#define SOML_RSSI_TH_LOW	20

#define HT_RATE_IDX			32
#define VHT_RATE_IDX		40

#define SOML_ON		1
#define SOML_OFF	0

#ifdef CONFIG_ADAPTIVE_SOML

struct adaptive_soml {
	bool		is_soml_method_enable;
	u8			soml_on_off;
	u8			soml_state_cnt;
	u8			soml_delay_time;
	u8			soml_intvl;
	u8			soml_train_num;
	u8			soml_counter;
	u8			soml_period;
	u8			soml_select;
	u8			soml_last_state;
	u32			num_ht_bytes[HT_RATE_IDX];
	u32			pre_num_ht_bytes[HT_RATE_IDX];
	u32			num_ht_bytes_on[HT_RATE_IDX];
	u32			num_ht_bytes_off[HT_RATE_IDX];
	u32			num_vht_bytes[VHT_RATE_IDX];
	u32			pre_num_vht_bytes[VHT_RATE_IDX];
	u32			num_vht_bytes_on[VHT_RATE_IDX];
	u32			num_vht_bytes_off[VHT_RATE_IDX];
	struct timer_list		phydm_adaptive_soml_timer;
};

void
phydm_soml_on_off(
	void		*p_dm_void,
	u8		swch
);

void
phydm_adaptive_soml_callback(
	void		*dm_void
);

void
phydm_adaptive_soml_workitem_callback(
	void		*context
);

void
phydm_soml_debug(
	void		*p_dm_void,
	u32		*const dm_value,
	u32		*_used,
	char			*output,
	u32		*_out_len
);

void
phydm_soml_statistics(
	void		*p_dm_void,
	u8		on_off_state

);

void
phydm_adsl(
	void		*p_dm_void
);

void
phydm_adaptive_soml_reset(
	void		*p_dm_void
);

#endif
#ifdef NEVER
void
phydm_dynamicsoftmletting(
	struct PHY_DM_STRUCT		*p_dm
);
#endif

void
phydm_soml_bytes_acq(
	void		*dm_void,
	u8		rate_id,
	u32		length
);

void
phydm_adaptive_soml_timers(
	void		*p_dm_void,
	u8		state
);

void
phydm_adaptive_soml_init(
	void		*p_dm_void
);

void
phydm_adaptive_soml(
	void		*p_dm_void
);

void
phydm_enable_adaptive_soml(
	void		*dm_void
);

void
phydm_stop_adaptive_soml(
	void		*dm_void
);

void
phydm_adaptive_soml_para_set(
	void		*dm_void,
	u8		train_num,
	u8		intvl,
	u8		period,
	u8		delay_time
);

void
phydm_init_soft_ml_setting(
	void		*p_dm_void
);

#endif /*#ifndef	__PHYDMSOML_H__*/
