/******************************************************************************
 *
 * 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 __PHYDMDIG_H__
#define __PHYDMDIG_H__

#define DIG_VERSION "1.32" /* 2016.09.02  YuChen. add CCK PD for 8197F*/

/* Pause DIG & CCKPD */
#define DM_DIG_MAX_PAUSE_TYPE 0x7

enum dig_goupcheck_level {
	DIG_GOUPCHECK_LEVEL_0,
	DIG_GOUPCHECK_LEVEL_1,
	DIG_GOUPCHECK_LEVEL_2

};

struct dig_thres {
	bool is_stop_dig; /* for debug */
	bool is_ignore_dig;
	bool is_psd_in_progress;

	u8 dig_enable_flag;
	u8 dig_ext_port_stage;

	int rssi_low_thresh;
	int rssi_high_thresh;

	u32 fa_low_thresh;
	u32 fa_high_thresh;

	u8 cur_sta_connect_state;
	u8 pre_sta_connect_state;
	u8 cur_multi_sta_connect_state;

	u8 pre_ig_value;
	u8 cur_ig_value;
	u8 backup_ig_value; /* MP DIG */
	u8 bt30_cur_igi;
	u8 igi_backup;

	s8 backoff_val;
	s8 backoff_val_range_max;
	s8 backoff_val_range_min;
	u8 rx_gain_range_max;
	u8 rx_gain_range_min;
	u8 rssi_val_min;

	u8 pre_cck_cca_thres;
	u8 cur_cck_cca_thres;
	u8 pre_cck_pd_state;
	u8 cur_cck_pd_state;
	u8 cck_pd_backup;
	u8 pause_cckpd_level;
	u8 pause_cckpd_value[DM_DIG_MAX_PAUSE_TYPE + 1];

	u8 large_fa_hit;
	u8 large_fa_timeout; /*if (large_fa_hit), monitor "large_fa_timeout"
			      *sec, if timeout, large_fa_hit=0
			      */
	u8 forbidden_igi;
	u32 recover_cnt;

	u8 dig_dynamic_min_0;
	u8 dig_dynamic_min_1;
	bool is_media_connect_0;
	bool is_media_connect_1;

	u32 ant_div_rssi_max;
	u32 rssi_max;

	u8 *is_p2p_in_process;

	u8 pause_dig_level;
	u8 pause_dig_value[DM_DIG_MAX_PAUSE_TYPE + 1];

	u32 cck_fa_ma;
	enum dig_goupcheck_level dig_go_up_check_level;
	u8 aaa_default;

	u8 rf_gain_idx;
	u8 agc_table_idx;
	u8 big_jump_lmt[16];
	u8 enable_adjust_big_jump : 1;
	u8 big_jump_step1 : 3;
	u8 big_jump_step2 : 2;
	u8 big_jump_step3 : 2;
};

struct false_alarm_stat {
	u32 cnt_parity_fail;
	u32 cnt_rate_illegal;
	u32 cnt_crc8_fail;
	u32 cnt_mcs_fail;
	u32 cnt_ofdm_fail;
	u32 cnt_ofdm_fail_pre; /* For RTL8881A */
	u32 cnt_cck_fail;
	u32 cnt_all;
	u32 cnt_all_pre;
	u32 cnt_fast_fsync;
	u32 cnt_sb_search_fail;
	u32 cnt_ofdm_cca;
	u32 cnt_cck_cca;
	u32 cnt_cca_all;
	u32 cnt_bw_usc; /* Gary */
	u32 cnt_bw_lsc; /* Gary */
	u32 cnt_cck_crc32_error;
	u32 cnt_cck_crc32_ok;
	u32 cnt_ofdm_crc32_error;
	u32 cnt_ofdm_crc32_ok;
	u32 cnt_ht_crc32_error;
	u32 cnt_ht_crc32_ok;
	u32 cnt_vht_crc32_error;
	u32 cnt_vht_crc32_ok;
	u32 cnt_crc32_error_all;
	u32 cnt_crc32_ok_all;
	bool cck_block_enable;
	bool ofdm_block_enable;
	u32 dbg_port0;
	bool edcca_flag;
};

enum dm_dig_op {
	DIG_TYPE_THRESH_HIGH = 0,
	DIG_TYPE_THRESH_LOW = 1,
	DIG_TYPE_BACKOFF = 2,
	DIG_TYPE_RX_GAIN_MIN = 3,
	DIG_TYPE_RX_GAIN_MAX = 4,
	DIG_TYPE_ENABLE = 5,
	DIG_TYPE_DISABLE = 6,
	DIG_OP_TYPE_MAX
};

enum phydm_pause_type { PHYDM_PAUSE = BIT(0), PHYDM_RESUME = BIT(1) };

enum phydm_pause_level {
	/* number of pause level can't exceed DM_DIG_MAX_PAUSE_TYPE */
	PHYDM_PAUSE_LEVEL_0 = 0,
	PHYDM_PAUSE_LEVEL_1 = 1,
	PHYDM_PAUSE_LEVEL_2 = 2,
	PHYDM_PAUSE_LEVEL_3 = 3,
	PHYDM_PAUSE_LEVEL_4 = 4,
	PHYDM_PAUSE_LEVEL_5 = 5,
	PHYDM_PAUSE_LEVEL_6 = 6,
	PHYDM_PAUSE_LEVEL_7 = DM_DIG_MAX_PAUSE_TYPE /* maximum level */
};

#define DM_DIG_THRESH_HIGH 40
#define DM_DIG_THRESH_LOW 35

#define DM_FALSEALARM_THRESH_LOW 400
#define DM_FALSEALARM_THRESH_HIGH 1000

#define DM_DIG_MAX_NIC 0x3e
#define DM_DIG_MIN_NIC 0x20
#define DM_DIG_MAX_OF_MIN_NIC 0x3e

#define DM_DIG_MAX_AP 0x3e
#define DM_DIG_MIN_AP 0x20
#define DM_DIG_MAX_OF_MIN 0x2A /* 0x32 */
#define DM_DIG_MIN_AP_DFS 0x20

#define DM_DIG_MAX_NIC_HP 0x46
#define DM_DIG_MIN_NIC_HP 0x2e

#define DM_DIG_MAX_AP_HP 0x42
#define DM_DIG_MIN_AP_HP 0x30

/* vivi 92c&92d has different definition, 20110504
 * this is for 92c
 */
#define DM_DIG_FA_TH0 0x200 /* 0x20 */

#define DM_DIG_FA_TH1 0x300
#define DM_DIG_FA_TH2 0x400
/* this is for 92d */
#define DM_DIG_FA_TH0_92D 0x100
#define DM_DIG_FA_TH1_92D 0x400
#define DM_DIG_FA_TH2_92D 0x600

#define DM_DIG_BACKOFF_MAX 12
#define DM_DIG_BACKOFF_MIN -4
#define DM_DIG_BACKOFF_DEFAULT 10

#define DM_DIG_FA_TH0_LPS 4 /* -> 4 in lps */
#define DM_DIG_FA_TH1_LPS 15 /* -> 15 lps */
#define DM_DIG_FA_TH2_LPS 30 /* -> 30 lps */
#define RSSI_OFFSET_DIG 0x05
#define LARGE_FA_TIMEOUT 60

void odm_change_dynamic_init_gain_thresh(void *dm_void, u32 dm_type,
					 u32 dm_value);

void odm_write_dig(void *dm_void, u8 current_igi);

void odm_pause_dig(void *dm_void, enum phydm_pause_type pause_type,
		   enum phydm_pause_level pause_level, u8 igi_value);

void odm_dig_init(void *dm_void);

void odm_DIG(void *dm_void);

void odm_dig_by_rssi_lps(void *dm_void);

void odm_false_alarm_counter_statistics(void *dm_void);

void odm_pause_cck_packet_detection(void *dm_void,
				    enum phydm_pause_type pause_type,
				    enum phydm_pause_level pause_level,
				    u8 cck_pd_threshold);

void odm_cck_packet_detection_thresh(void *dm_void);

void odm_write_cck_cca_thres(void *dm_void, u8 cur_cck_cca_thres);

bool phydm_dig_go_up_check(void *dm_void);

#endif
