/******************************************************************************
 *
 * 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>
 *
 *****************************************************************************/

/* ************************************************************
 * include files
 * *************************************************************/
#include "mp_precomp.h"
#include "phydm_precomp.h"

static int get_igi_for_diff(int);

static inline void phydm_check_ap_write_dig(struct phy_dm_struct *dm,
					    u8 current_igi)
{
	switch (*dm->one_path_cca) {
	case ODM_CCA_2R:
		odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm),
			       current_igi);

		if (dm->rf_type > ODM_1T1R)
			odm_set_bb_reg(dm, ODM_REG(IGI_B, dm), ODM_BIT(IGI, dm),
				       current_igi);
		break;
	case ODM_CCA_1R_A:
		odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm),
			       current_igi);
		if (dm->rf_type != ODM_1T1R)
			odm_set_bb_reg(dm, ODM_REG(IGI_B, dm), ODM_BIT(IGI, dm),
				       get_igi_for_diff(current_igi));
		break;
	case ODM_CCA_1R_B:
		odm_set_bb_reg(dm, ODM_REG(IGI_B, dm), ODM_BIT(IGI, dm),
			       get_igi_for_diff(current_igi));
		if (dm->rf_type != ODM_1T1R)
			odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm),
				       current_igi);
		break;
	}
}

static inline u8 phydm_get_current_igi(u8 dig_max_of_min, u8 rssi_min,
				       u8 current_igi)
{
	if (rssi_min < dig_max_of_min) {
		if (current_igi < rssi_min)
			return rssi_min;
	} else {
		if (current_igi < dig_max_of_min)
			return dig_max_of_min;
	}
	return current_igi;
}

void odm_change_dynamic_init_gain_thresh(void *dm_void, u32 dm_type,
					 u32 dm_value)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;

	if (dm_type == DIG_TYPE_THRESH_HIGH) {
		dig_tab->rssi_high_thresh = dm_value;
	} else if (dm_type == DIG_TYPE_THRESH_LOW) {
		dig_tab->rssi_low_thresh = dm_value;
	} else if (dm_type == DIG_TYPE_ENABLE) {
		dig_tab->dig_enable_flag = true;
	} else if (dm_type == DIG_TYPE_DISABLE) {
		dig_tab->dig_enable_flag = false;
	} else if (dm_type == DIG_TYPE_BACKOFF) {
		if (dm_value > 30)
			dm_value = 30;
		dig_tab->backoff_val = (u8)dm_value;
	} else if (dm_type == DIG_TYPE_RX_GAIN_MIN) {
		if (dm_value == 0)
			dm_value = 0x1;
		dig_tab->rx_gain_range_min = (u8)dm_value;
	} else if (dm_type == DIG_TYPE_RX_GAIN_MAX) {
		if (dm_value > 0x50)
			dm_value = 0x50;
		dig_tab->rx_gain_range_max = (u8)dm_value;
	}
} /* dm_change_dynamic_init_gain_thresh */

static int get_igi_for_diff(int value_IGI)
{
#define ONERCCA_LOW_TH 0x30
#define ONERCCA_LOW_DIFF 8

	if (value_IGI < ONERCCA_LOW_TH) {
		if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
			return ONERCCA_LOW_TH;
		else
			return value_IGI + ONERCCA_LOW_DIFF;
	}

	return value_IGI;
}

static void odm_fa_threshold_check(void *dm_void, bool is_dfs_band,
				   bool is_performance, u32 rx_tp, u32 tx_tp,
				   u32 *dm_FA_thres)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;

	if (dm->is_linked && (is_performance || is_dfs_band)) {
		/*For NIC*/
		dm_FA_thres[0] = DM_DIG_FA_TH0;
		dm_FA_thres[1] = DM_DIG_FA_TH1;
		dm_FA_thres[2] = DM_DIG_FA_TH2;
	} else {
		if (is_dfs_band) {
			/* For DFS band and no link */
			dm_FA_thres[0] = 250;
			dm_FA_thres[1] = 1000;
			dm_FA_thres[2] = 2000;
		} else {
			dm_FA_thres[0] = 2000;
			dm_FA_thres[1] = 4000;
			dm_FA_thres[2] = 5000;
		}
	}
}

static u8 odm_forbidden_igi_check(void *dm_void, u8 dig_dynamic_min,
				  u8 current_igi)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	struct false_alarm_stat *fa_cnt =
		(struct false_alarm_stat *)phydm_get_structure(
			dm, PHYDM_FALSEALMCNT);
	u8 rx_gain_range_min = dig_tab->rx_gain_range_min;

	if (dig_tab->large_fa_timeout) {
		if (--dig_tab->large_fa_timeout == 0)
			dig_tab->large_fa_hit = 0;
	}

	if (fa_cnt->cnt_all > 10000) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Abnormally false alarm case.\n", __func__);

		if (dig_tab->large_fa_hit != 3)
			dig_tab->large_fa_hit++;

		if (dig_tab->forbidden_igi < current_igi) {
			dig_tab->forbidden_igi = current_igi;
			dig_tab->large_fa_hit = 1;
			dig_tab->large_fa_timeout = LARGE_FA_TIMEOUT;
		}

		if (dig_tab->large_fa_hit >= 3) {
			if ((dig_tab->forbidden_igi + 2) >
			    dig_tab->rx_gain_range_max)
				rx_gain_range_min = dig_tab->rx_gain_range_max;
			else
				rx_gain_range_min =
					(dig_tab->forbidden_igi + 2);
			dig_tab->recover_cnt = 1800;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"%s(): Abnormally false alarm case: recover_cnt = %d\n",
				__func__, dig_tab->recover_cnt);
		}
	}

	else if (fa_cnt->cnt_all > 2000) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "Abnormally false alarm case.\n");
		ODM_RT_TRACE(
			dm, ODM_COMP_DIG,
			"cnt_all=%d, cnt_all_pre=%d, current_igi=0x%x, pre_ig_value=0x%x\n",
			fa_cnt->cnt_all, fa_cnt->cnt_all_pre, current_igi,
			dig_tab->pre_ig_value);

		/* fa_cnt->cnt_all = 1.1875*fa_cnt->cnt_all_pre */
		if ((fa_cnt->cnt_all >
		     (fa_cnt->cnt_all_pre + (fa_cnt->cnt_all_pre >> 3) +
		      (fa_cnt->cnt_all_pre >> 4))) &&
		    (current_igi < dig_tab->pre_ig_value)) {
			if (dig_tab->large_fa_hit != 3)
				dig_tab->large_fa_hit++;

			if (dig_tab->forbidden_igi < current_igi) {
				ODM_RT_TRACE(
					dm, ODM_COMP_DIG,
					"Updating forbidden_igi by current_igi, forbidden_igi=0x%x, current_igi=0x%x\n",
					dig_tab->forbidden_igi, current_igi);

				dig_tab->forbidden_igi = current_igi;
				dig_tab->large_fa_hit = 1;
				dig_tab->large_fa_timeout = LARGE_FA_TIMEOUT;
			}
		}

		if (dig_tab->large_fa_hit >= 3) {
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"FaHit is greater than 3, rx_gain_range_max=0x%x, rx_gain_range_min=0x%x, forbidden_igi=0x%x\n",
				dig_tab->rx_gain_range_max, rx_gain_range_min,
				dig_tab->forbidden_igi);

			if ((dig_tab->forbidden_igi + 1) >
			    dig_tab->rx_gain_range_max)
				rx_gain_range_min = dig_tab->rx_gain_range_max;
			else
				rx_gain_range_min =
					(dig_tab->forbidden_igi + 1);

			dig_tab->recover_cnt = 1200;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"Abnormally false alarm case: recover_cnt = %d,  rx_gain_range_min = 0x%x\n",
				dig_tab->recover_cnt, rx_gain_range_min);
		}
	} else {
		if (dig_tab->recover_cnt != 0) {
			dig_tab->recover_cnt--;
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Normal Case: recover_cnt = %d\n",
				     __func__, dig_tab->recover_cnt);
			return rx_gain_range_min;
		}

		if (dig_tab->large_fa_hit >= 3) {
			dig_tab->large_fa_hit = 0;
			return rx_gain_range_min;
		}

		if ((dig_tab->forbidden_igi - 2) <
		    dig_dynamic_min) { /* DM_DIG_MIN) */
			dig_tab->forbidden_igi =
				dig_dynamic_min; /* DM_DIG_MIN; */
			rx_gain_range_min = dig_dynamic_min; /* DM_DIG_MIN; */
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Normal Case: At Lower Bound\n",
				     __func__);
		} else {
			if (dig_tab->large_fa_hit == 0) {
				dig_tab->forbidden_igi -= 2;
				rx_gain_range_min =
					(dig_tab->forbidden_igi + 2);
				ODM_RT_TRACE(
					dm, ODM_COMP_DIG,
					"%s(): Normal Case: Approach Lower Bound\n",
					__func__);
			}
		}
	}

	return rx_gain_range_min;
}

static void phydm_set_big_jump_step(void *dm_void, u8 current_igi)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	u8 step1[8] = {24, 30, 40, 50, 60, 70, 80, 90};
	u8 i;

	if (dig_tab->enable_adjust_big_jump == 0)
		return;

	for (i = 0; i <= dig_tab->big_jump_step1; i++) {
		if ((current_igi + step1[i]) >
		    dig_tab->big_jump_lmt[dig_tab->agc_table_idx]) {
			if (i != 0)
				i = i - 1;
			break;
		} else if (i == dig_tab->big_jump_step1) {
			break;
		}
	}
	if (dm->support_ic_type & ODM_RTL8822B)
		odm_set_bb_reg(dm, 0x8c8, 0xe, i);
	else if (dm->support_ic_type & ODM_RTL8197F)
		odm_set_bb_reg(dm, ODM_REG_BB_AGC_SET_2_11N, 0xe, i);

	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "%s(): bigjump = %d (ori = 0x%x), LMT=0x%x\n", __func__, i,
		     dig_tab->big_jump_step1,
		     dig_tab->big_jump_lmt[dig_tab->agc_table_idx]);
}

void odm_write_dig(void *dm_void, u8 current_igi)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;

	if (dig_tab->is_stop_dig) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): Stop Writing IGI\n",
			     __func__);
		return;
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "%s(): ODM_REG(IGI_A,dm)=0x%x, ODM_BIT(IGI,dm)=0x%x\n",
		     __func__, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm));

	/* 1 Check initial gain by upper bound */
	if ((!dig_tab->is_psd_in_progress) && dm->is_linked) {
		if (current_igi > dig_tab->rx_gain_range_max) {
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"%s(): current_igi(0x%02x) is larger than upper bound !!\n",
				__func__, current_igi);
			current_igi = dig_tab->rx_gain_range_max;
		}
		if (dm->support_ability & ODM_BB_ADAPTIVITY &&
		    dm->adaptivity_flag) {
			if (current_igi > dm->adaptivity_igi_upper)
				current_igi = dm->adaptivity_igi_upper;

			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"%s(): adaptivity case: Force upper bound to 0x%x !!!!!!\n",
				__func__, current_igi);
		}
	}

	if (dig_tab->cur_ig_value != current_igi) {
		/* Modify big jump step for 8822B and 8197F */
		if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F))
			phydm_set_big_jump_step(dm, current_igi);

		/* Set IGI value of CCK for new CCK AGC */
		if (dm->cck_new_agc) {
			if (dm->support_ic_type & ODM_IC_PHY_STATUE_NEW_TYPE)
				odm_set_bb_reg(dm, 0xa0c, 0x00003f00,
					       (current_igi >> 1));
		}

		/*Add by YuChen for USB IO too slow issue*/
		if ((dm->support_ability & ODM_BB_ADAPTIVITY) &&
		    (current_igi > dig_tab->cur_ig_value)) {
			dig_tab->cur_ig_value = current_igi;
			phydm_adaptivity(dm);
		}

		/* 1 Set IGI value */
		if (dm->support_platform & (ODM_WIN | ODM_CE)) {
			odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm),
				       current_igi);

			if (dm->rf_type > ODM_1T1R)
				odm_set_bb_reg(dm, ODM_REG(IGI_B, dm),
					       ODM_BIT(IGI, dm), current_igi);

		} else if (dm->support_platform & (ODM_AP)) {
			phydm_check_ap_write_dig(dm, current_igi);
		}

		dig_tab->cur_ig_value = current_igi;
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): current_igi(0x%02x).\n", __func__,
		     current_igi);
}

void odm_pause_dig(void *dm_void, enum phydm_pause_type pause_type,
		   enum phydm_pause_level pause_level, u8 igi_value)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	s8 max_level;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s()=========> level = %d\n", __func__,
		     pause_level);

	if ((dig_tab->pause_dig_level == 0) &&
	    (!(dm->support_ability & ODM_BB_DIG) ||
	     !(dm->support_ability & ODM_BB_FA_CNT))) {
		ODM_RT_TRACE(
			dm, ODM_COMP_DIG,
			"%s(): Return: support_ability DIG or FA is disabled !!\n",
			__func__);
		return;
	}

	if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Return: Wrong pause level !!\n", __func__);
		return;
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "%s(): pause level = 0x%x, Current value = 0x%x\n",
		     __func__, dig_tab->pause_dig_level, igi_value);
	ODM_RT_TRACE(
		dm, ODM_COMP_DIG,
		"%s(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
		__func__, dig_tab->pause_dig_value[7],
		dig_tab->pause_dig_value[6], dig_tab->pause_dig_value[5],
		dig_tab->pause_dig_value[4], dig_tab->pause_dig_value[3],
		dig_tab->pause_dig_value[2], dig_tab->pause_dig_value[1],
		dig_tab->pause_dig_value[0]);

	switch (pause_type) {
	/* Pause DIG */
	case PHYDM_PAUSE: {
		/* Disable DIG */
		odm_cmn_info_update(dm, ODM_CMNINFO_ABILITY,
				    dm->support_ability & (~ODM_BB_DIG));
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): Pause DIG !!\n",
			     __func__);

		/* Backup IGI value */
		if (dig_tab->pause_dig_level == 0) {
			dig_tab->igi_backup = dig_tab->cur_ig_value;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"%s(): Backup IGI  = 0x%x, new IGI = 0x%x\n",
				__func__, dig_tab->igi_backup, igi_value);
		}

		/* Record IGI value */
		dig_tab->pause_dig_value[pause_level] = igi_value;

		/* Update pause level */
		dig_tab->pause_dig_level =
			(dig_tab->pause_dig_level | BIT(pause_level));

		/* Write new IGI value */
		if (BIT(pause_level + 1) > dig_tab->pause_dig_level) {
			odm_write_dig(dm, igi_value);
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): IGI of higher level = 0x%x\n",
				     __func__, igi_value);
		}
		break;
	}
	/* Resume DIG */
	case PHYDM_RESUME: {
		/* check if the level is illegal or not */
		if ((dig_tab->pause_dig_level & (BIT(pause_level))) != 0) {
			dig_tab->pause_dig_level = dig_tab->pause_dig_level &
						   (~(BIT(pause_level)));
			dig_tab->pause_dig_value[pause_level] = 0;
			ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): Resume DIG !!\n",
				     __func__);
		} else {
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Wrong resume level !!\n", __func__);
			break;
		}

		/* Resume DIG */
		if (dig_tab->pause_dig_level == 0) {
			/* Write backup IGI value */
			odm_write_dig(dm, dig_tab->igi_backup);
			dig_tab->is_ignore_dig = true;
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Write original IGI = 0x%x\n",
				     __func__, dig_tab->igi_backup);

			/* Enable DIG */
			odm_cmn_info_update(dm, ODM_CMNINFO_ABILITY,
					    dm->support_ability | ODM_BB_DIG);
			break;
		}

		if (BIT(pause_level) <= dig_tab->pause_dig_level)
			break;

		/* Calculate the maximum level now */
		for (max_level = (pause_level - 1); max_level >= 0;
		     max_level--) {
			if ((dig_tab->pause_dig_level & BIT(max_level)) > 0)
				break;
		}

		/* pin max_level to be >= 0 */
		max_level = max_t(s8, 0, max_level);
		/* write IGI of lower level */
		odm_write_dig(dm, dig_tab->pause_dig_value[max_level]);
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Write IGI (0x%x) of level (%d)\n", __func__,
			     dig_tab->pause_dig_value[max_level], max_level);
		break;
	}
	default:
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): Wrong  type !!\n",
			     __func__);
		break;
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "%s(): pause level = 0x%x, Current value = 0x%x\n",
		     __func__, dig_tab->pause_dig_level, igi_value);
	ODM_RT_TRACE(
		dm, ODM_COMP_DIG,
		"%s(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
		__func__, dig_tab->pause_dig_value[7],
		dig_tab->pause_dig_value[6], dig_tab->pause_dig_value[5],
		dig_tab->pause_dig_value[4], dig_tab->pause_dig_value[3],
		dig_tab->pause_dig_value[2], dig_tab->pause_dig_value[1],
		dig_tab->pause_dig_value[0]);
}

static bool odm_dig_abort(void *dm_void)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;

	/* support_ability */
	if (!(dm->support_ability & ODM_BB_FA_CNT)) {
		ODM_RT_TRACE(
			dm, ODM_COMP_DIG,
			"%s(): Return: support_ability ODM_BB_FA_CNT is disabled\n",
			__func__);
		return true;
	}

	/* support_ability */
	if (!(dm->support_ability & ODM_BB_DIG)) {
		ODM_RT_TRACE(
			dm, ODM_COMP_DIG,
			"%s(): Return: support_ability ODM_BB_DIG is disabled\n",
			__func__);
		return true;
	}

	/* ScanInProcess */
	if (*dm->is_scan_in_process) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Return: In Scan Progress\n", __func__);
		return true;
	}

	if (dig_tab->is_ignore_dig) {
		dig_tab->is_ignore_dig = false;
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): Return: Ignore DIG\n",
			     __func__);
		return true;
	}

	/* add by Neil Chen to avoid PSD is processing */
	if (!dm->is_dm_initial_gain_enable) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Return: PSD is Processing\n", __func__);
		return true;
	}

	return false;
}

void odm_dig_init(void *dm_void)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	u32 ret_value;
	u8 i;

	dig_tab->is_stop_dig = false;
	dig_tab->is_ignore_dig = false;
	dig_tab->is_psd_in_progress = false;
	dig_tab->cur_ig_value =
		(u8)odm_get_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm));
	dig_tab->pre_ig_value = 0;
	dig_tab->rssi_low_thresh = DM_DIG_THRESH_LOW;
	dig_tab->rssi_high_thresh = DM_DIG_THRESH_HIGH;
	dig_tab->fa_low_thresh = DM_FALSEALARM_THRESH_LOW;
	dig_tab->fa_high_thresh = DM_FALSEALARM_THRESH_HIGH;
	dig_tab->backoff_val = DM_DIG_BACKOFF_DEFAULT;
	dig_tab->backoff_val_range_max = DM_DIG_BACKOFF_MAX;
	dig_tab->backoff_val_range_min = DM_DIG_BACKOFF_MIN;
	dig_tab->pre_cck_cca_thres = 0xFF;
	dig_tab->cur_cck_cca_thres = 0x83;
	dig_tab->forbidden_igi = DM_DIG_MIN_NIC;
	dig_tab->large_fa_hit = 0;
	dig_tab->large_fa_timeout = 0;
	dig_tab->recover_cnt = 0;
	dig_tab->is_media_connect_0 = false;
	dig_tab->is_media_connect_1 = false;

	/*To initialize dm->is_dm_initial_gain_enable==false to avoid DIG err*/
	dm->is_dm_initial_gain_enable = true;

	dig_tab->dig_dynamic_min_0 = DM_DIG_MIN_NIC;
	dig_tab->dig_dynamic_min_1 = DM_DIG_MIN_NIC;

	/* To Initi BT30 IGI */
	dig_tab->bt30_cur_igi = 0x32;

	odm_memory_set(dm, dig_tab->pause_dig_value, 0,
		       (DM_DIG_MAX_PAUSE_TYPE + 1));
	dig_tab->pause_dig_level = 0;
	odm_memory_set(dm, dig_tab->pause_cckpd_value, 0,
		       (DM_DIG_MAX_PAUSE_TYPE + 1));
	dig_tab->pause_cckpd_level = 0;

	if (dm->board_type & (ODM_BOARD_EXT_PA | ODM_BOARD_EXT_LNA)) {
		dig_tab->rx_gain_range_max = DM_DIG_MAX_NIC;
		dig_tab->rx_gain_range_min = DM_DIG_MIN_NIC;
	} else {
		dig_tab->rx_gain_range_max = DM_DIG_MAX_NIC;
		dig_tab->rx_gain_range_min = DM_DIG_MIN_NIC;
	}

	dig_tab->enable_adjust_big_jump = 1;
	if (dm->support_ic_type & ODM_RTL8822B) {
		ret_value = odm_get_bb_reg(dm, 0x8c8, MASKLWORD);
		dig_tab->big_jump_step1 = (u8)(ret_value & 0xe) >> 1;
		dig_tab->big_jump_step2 = (u8)(ret_value & 0x30) >> 4;
		dig_tab->big_jump_step3 = (u8)(ret_value & 0xc0) >> 6;

	} else if (dm->support_ic_type & ODM_RTL8197F) {
		ret_value =
			odm_get_bb_reg(dm, ODM_REG_BB_AGC_SET_2_11N, MASKLWORD);
		dig_tab->big_jump_step1 = (u8)(ret_value & 0xe) >> 1;
		dig_tab->big_jump_step2 = (u8)(ret_value & 0x30) >> 4;
		dig_tab->big_jump_step3 = (u8)(ret_value & 0xc0) >> 6;
	}
	if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F)) {
		for (i = 0; i < sizeof(dig_tab->big_jump_lmt); i++) {
			if (dig_tab->big_jump_lmt[i] == 0)
				dig_tab->big_jump_lmt[i] =
					0x64; /* Set -10dBm as default value */
		}
	}
}

void odm_DIG(void *dm_void)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;

	/* Common parameters */
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	struct false_alarm_stat *fa_cnt =
		(struct false_alarm_stat *)phydm_get_structure(
			dm, PHYDM_FALSEALMCNT);
	bool first_connect, first_dis_connect;
	u8 dig_max_of_min, dig_dynamic_min;
	u8 dm_dig_max, dm_dig_min;
	u8 current_igi = dig_tab->cur_ig_value;
	u8 offset;
	u32 dm_FA_thres[3];
	u32 tx_tp = 0, rx_tp = 0;
	bool is_dfs_band = false;
	bool is_performance = true, is_first_tp_target = false,
	     is_first_coverage = false;

	if (odm_dig_abort(dm))
		return;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "DIG Start===>\n");

	/* 1 Update status */
	{
		dig_dynamic_min = dig_tab->dig_dynamic_min_0;
		first_connect = (dm->is_linked) && !dig_tab->is_media_connect_0;
		first_dis_connect =
			(!dm->is_linked) && dig_tab->is_media_connect_0;
	}

	/* 1 Boundary Decision */
	{
		/* 2 For WIN\CE */
		if (dm->support_ic_type >= ODM_RTL8188E)
			dm_dig_max = 0x5A;
		else
			dm_dig_max = DM_DIG_MAX_NIC;

		if (dm->support_ic_type != ODM_RTL8821)
			dm_dig_min = DM_DIG_MIN_NIC;
		else
			dm_dig_min = 0x1C;

		dig_max_of_min = DM_DIG_MAX_AP;

		/* Modify lower bound for DFS band */
		if ((((*dm->channel >= 52) && (*dm->channel <= 64)) ||
		     ((*dm->channel >= 100) && (*dm->channel <= 140))) &&
		    phydm_dfs_master_enabled(dm)) {
			is_dfs_band = true;
			if (*dm->band_width == ODM_BW20M)
				dm_dig_min = DM_DIG_MIN_AP_DFS + 2;
			else
				dm_dig_min = DM_DIG_MIN_AP_DFS;
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "DIG: ====== In DFS band ======\n");
		}
	}
	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "DIG: Absolutly upper bound = 0x%x, lower bound = 0x%x\n",
		     dm_dig_max, dm_dig_min);

	if (dm->pu1_forced_igi_lb && (*dm->pu1_forced_igi_lb > 0)) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "DIG: Force IGI lb to: 0x%02x\n",
			     *dm->pu1_forced_igi_lb);
		dm_dig_min = *dm->pu1_forced_igi_lb;
		dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) :
							  (dm_dig_min + 1);
	}

	/* 1 Adjust boundary by RSSI */
	if (dm->is_linked && is_performance) {
		/* 2 Modify DIG upper bound */
		/* 4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT */
		if ((dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8723B |
					    ODM_RTL8812 | ODM_RTL8821)) &&
		    (dm->is_bt_limited_dig == 1)) {
			offset = 10;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"DIG: Coex. case: Force upper bound to RSSI + %d\n",
				offset);
		} else {
			offset = 15;
		}

		if ((dm->rssi_min + offset) > dm_dig_max)
			dig_tab->rx_gain_range_max = dm_dig_max;
		else if ((dm->rssi_min + offset) < dm_dig_min)
			dig_tab->rx_gain_range_max = dm_dig_min;
		else
			dig_tab->rx_gain_range_max = dm->rssi_min + offset;

		/* 2 Modify DIG lower bound */
		/* if(dm->is_one_entry_only) */
		{
			if (dm->rssi_min < dm_dig_min)
				dig_dynamic_min = dm_dig_min;
			else if (dm->rssi_min > dig_max_of_min)
				dig_dynamic_min = dig_max_of_min;
			else
				dig_dynamic_min = dm->rssi_min;

			if (is_dfs_band) {
				dig_dynamic_min = dm_dig_min;
				ODM_RT_TRACE(
					dm, ODM_COMP_DIG,
					"DIG: DFS band: Force lower bound to 0x%x after link\n",
					dm_dig_min);
			}
		}
	} else {
		if (is_performance && is_dfs_band) {
			dig_tab->rx_gain_range_max = 0x28;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"DIG: DFS band: Force upper bound to 0x%x before link\n",
				dig_tab->rx_gain_range_max);
		} else {
			if (is_performance)
				dig_tab->rx_gain_range_max = DM_DIG_MAX_OF_MIN;
			else
				dig_tab->rx_gain_range_max = dm_dig_max;
		}
		dig_dynamic_min = dm_dig_min;
	}

	/* 1 Force Lower Bound for AntDiv */
	if (dm->is_linked && !dm->is_one_entry_only &&
	    (dm->support_ic_type & ODM_ANTDIV_SUPPORT) &&
	    (dm->support_ability & ODM_BB_ANT_DIV)) {
		if (dm->ant_div_type == CG_TRX_HW_ANTDIV ||
		    dm->ant_div_type == CG_TRX_SMART_ANTDIV) {
			if (dig_tab->ant_div_rssi_max > dig_max_of_min)
				dig_dynamic_min = dig_max_of_min;
			else
				dig_dynamic_min = (u8)dig_tab->ant_div_rssi_max;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"DIG: AntDiv case: Force lower bound to 0x%x\n",
				dig_dynamic_min);
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "DIG: AntDiv case: rssi_max = 0x%x\n",
				     dig_tab->ant_div_rssi_max);
		}
	}
	ODM_RT_TRACE(
		dm, ODM_COMP_DIG,
		"DIG: Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",
		dig_tab->rx_gain_range_max, dig_dynamic_min);
	ODM_RT_TRACE(
		dm, ODM_COMP_DIG,
		"DIG: Link status: is_linked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n",
		dm->is_linked, dm->rssi_min, first_connect, first_dis_connect);

	/* 1 Modify DIG lower bound, deal with abnormal case */
	/* 2 Abnormal false alarm case */
	if (is_dfs_band) {
		dig_tab->rx_gain_range_min = dig_dynamic_min;
	} else {
		if (!dm->is_linked) {
			dig_tab->rx_gain_range_min = dig_dynamic_min;

			if (first_dis_connect)
				dig_tab->forbidden_igi = dig_dynamic_min;
		} else {
			dig_tab->rx_gain_range_min = odm_forbidden_igi_check(
				dm, dig_dynamic_min, current_igi);
		}
	}

	/* 2 Abnormal # beacon case */
	if (dm->is_linked && !first_connect) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "Beacon Num (%d)\n",
			     dm->phy_dbg_info.num_qry_beacon_pkt);
		if ((dm->phy_dbg_info.num_qry_beacon_pkt < 5) &&
		    (dm->bsta_state)) {
			dig_tab->rx_gain_range_min = 0x1c;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"DIG: Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x\n",
				dm->phy_dbg_info.num_qry_beacon_pkt,
				dig_tab->rx_gain_range_min);
		}
	}

	/* 2 Abnormal lower bound case */
	if (dig_tab->rx_gain_range_min > dig_tab->rx_gain_range_max) {
		dig_tab->rx_gain_range_min = dig_tab->rx_gain_range_max;
		ODM_RT_TRACE(
			dm, ODM_COMP_DIG,
			"DIG: Abnrormal lower bound case: Force lower bound to 0x%x\n",
			dig_tab->rx_gain_range_min);
	}

	/* 1 False alarm threshold decision */
	odm_fa_threshold_check(dm, is_dfs_band, is_performance, rx_tp, tx_tp,
			       dm_FA_thres);
	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "DIG: False alarm threshold = %d, %d, %d\n",
		     dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]);

	/* 1 Adjust initial gain by false alarm */
	if (dm->is_linked && is_performance) {
		/* 2 After link */
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "DIG: Adjust IGI after link\n");

		if (is_first_tp_target || (first_connect && is_performance)) {
			dig_tab->large_fa_hit = 0;

			if (is_dfs_band) {
				u8 rssi = dm->rssi_min;

				current_igi =
					(dm->rssi_min > 0x28) ? 0x28 : rssi;
				ODM_RT_TRACE(
					dm, ODM_COMP_DIG,
					"DIG: DFS band: One-shot to 0x28 upmost\n");
			} else {
				current_igi = phydm_get_current_igi(
					dig_max_of_min, dm->rssi_min,
					current_igi);
			}

			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"DIG: First connect case: IGI does on-shot to 0x%x\n",
				current_igi);

		} else {
			if (fa_cnt->cnt_all > dm_FA_thres[2])
				current_igi = current_igi + 4;
			else if (fa_cnt->cnt_all > dm_FA_thres[1])
				current_igi = current_igi + 2;
			else if (fa_cnt->cnt_all < dm_FA_thres[0])
				current_igi = current_igi - 2;

			/* 4 Abnormal # beacon case */
			if ((dm->phy_dbg_info.num_qry_beacon_pkt < 5) &&
			    (fa_cnt->cnt_all < DM_DIG_FA_TH1) &&
			    (dm->bsta_state)) {
				current_igi = dig_tab->rx_gain_range_min;
				ODM_RT_TRACE(
					dm, ODM_COMP_DIG,
					"DIG: Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n",
					dm->phy_dbg_info.num_qry_beacon_pkt,
					current_igi);
			}
		}
	} else {
		/* 2 Before link */
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "DIG: Adjust IGI before link\n");

		if (first_dis_connect || is_first_coverage) {
			current_igi = dm_dig_min;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"DIG: First disconnect case: IGI does on-shot to lower bound\n");
		} else {
			if (fa_cnt->cnt_all > dm_FA_thres[2])
				current_igi = current_igi + 4;
			else if (fa_cnt->cnt_all > dm_FA_thres[1])
				current_igi = current_igi + 2;
			else if (fa_cnt->cnt_all < dm_FA_thres[0])
				current_igi = current_igi - 2;
		}
	}

	/* 1 Check initial gain by upper/lower bound */
	if (current_igi < dig_tab->rx_gain_range_min)
		current_igi = dig_tab->rx_gain_range_min;

	if (current_igi > dig_tab->rx_gain_range_max)
		current_igi = dig_tab->rx_gain_range_max;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "DIG: cur_ig_value=0x%x, TotalFA = %d\n",
		     current_igi, fa_cnt->cnt_all);

	/* 1 Update status */
	if (dm->is_bt_hs_operation) {
		if (dm->is_linked) {
			if (dig_tab->bt30_cur_igi > (current_igi))
				odm_write_dig(dm, current_igi);
			else
				odm_write_dig(dm, dig_tab->bt30_cur_igi);

			dig_tab->is_media_connect_0 = dm->is_linked;
			dig_tab->dig_dynamic_min_0 = dig_dynamic_min;
		} else {
			if (dm->is_link_in_process)
				odm_write_dig(dm, 0x1c);
			else if (dm->is_bt_connect_process)
				odm_write_dig(dm, 0x28);
			else
				odm_write_dig(dm, dig_tab->bt30_cur_igi);
		}
	} else { /* BT is not using */
		odm_write_dig(dm, current_igi);
		dig_tab->is_media_connect_0 = dm->is_linked;
		dig_tab->dig_dynamic_min_0 = dig_dynamic_min;
	}
	ODM_RT_TRACE(dm, ODM_COMP_DIG, "DIG end\n");
}

void odm_dig_by_rssi_lps(void *dm_void)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct false_alarm_stat *fa_cnt =
		(struct false_alarm_stat *)phydm_get_structure(
			dm, PHYDM_FALSEALMCNT);

	u8 rssi_lower = DM_DIG_MIN_NIC; /* 0x1E or 0x1C */
	u8 current_igi = dm->rssi_min;

	if (odm_dig_abort(dm))
		return;

	current_igi = current_igi + RSSI_OFFSET_DIG;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s()==>\n", __func__);

	/* Using FW PS mode to make IGI */
	/* Adjust by  FA in LPS MODE */
	if (fa_cnt->cnt_all > DM_DIG_FA_TH2_LPS)
		current_igi = current_igi + 4;
	else if (fa_cnt->cnt_all > DM_DIG_FA_TH1_LPS)
		current_igi = current_igi + 2;
	else if (fa_cnt->cnt_all < DM_DIG_FA_TH0_LPS)
		current_igi = current_igi - 2;

	/* Lower bound checking */

	/* RSSI Lower bound check */
	if ((dm->rssi_min - 10) > DM_DIG_MIN_NIC)
		rssi_lower = (dm->rssi_min - 10);
	else
		rssi_lower = DM_DIG_MIN_NIC;

	/* Upper and Lower Bound checking */
	if (current_igi > DM_DIG_MAX_NIC)
		current_igi = DM_DIG_MAX_NIC;
	else if (current_igi < rssi_lower)
		current_igi = rssi_lower;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): fa_cnt->cnt_all = %d\n", __func__,
		     fa_cnt->cnt_all);
	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): dm->rssi_min = %d\n", __func__,
		     dm->rssi_min);
	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): current_igi = 0x%x\n", __func__,
		     current_igi);

	odm_write_dig(
		dm,
		current_igi); /* odm_write_dig(dm, dig_tab->cur_ig_value); */
}

/* 3============================================================
 * 3 FASLE ALARM CHECK
 * 3============================================================
 */

void odm_false_alarm_counter_statistics(void *dm_void)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct false_alarm_stat *false_alm_cnt =
		(struct false_alarm_stat *)phydm_get_structure(
			dm, PHYDM_FALSEALMCNT);
	struct rt_adcsmp *adc_smp = &dm->adcsmp;
	u32 ret_value;

	if (!(dm->support_ability & ODM_BB_FA_CNT))
		return;

	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT, "%s()======>\n", __func__);

	if (dm->support_ic_type & ODM_IC_11N_SERIES) {
		/* hold ofdm counter */
		odm_set_bb_reg(dm, ODM_REG_OFDM_FA_HOLDC_11N, BIT(31),
			       1); /* hold page C counter */
		odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RSTD_11N, BIT(31),
			       1); /* hold page D counter */

		ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11N,
					   MASKDWORD);
		false_alm_cnt->cnt_fast_fsync = (ret_value & 0xffff);
		false_alm_cnt->cnt_sb_search_fail =
			((ret_value & 0xffff0000) >> 16);

		ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11N,
					   MASKDWORD);
		false_alm_cnt->cnt_ofdm_cca = (ret_value & 0xffff);
		false_alm_cnt->cnt_parity_fail =
			((ret_value & 0xffff0000) >> 16);

		ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11N,
					   MASKDWORD);
		false_alm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
		false_alm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);

		ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11N,
					   MASKDWORD);
		false_alm_cnt->cnt_mcs_fail = (ret_value & 0xffff);

		false_alm_cnt->cnt_ofdm_fail =
			false_alm_cnt->cnt_parity_fail +
			false_alm_cnt->cnt_rate_illegal +
			false_alm_cnt->cnt_crc8_fail +
			false_alm_cnt->cnt_mcs_fail +
			false_alm_cnt->cnt_fast_fsync +
			false_alm_cnt->cnt_sb_search_fail;

		/* read CCK CRC32 counter */
		false_alm_cnt->cnt_cck_crc32_error = odm_get_bb_reg(
			dm, ODM_REG_CCK_CRC32_ERROR_CNT_11N, MASKDWORD);
		false_alm_cnt->cnt_cck_crc32_ok = odm_get_bb_reg(
			dm, ODM_REG_CCK_CRC32_OK_CNT_11N, MASKDWORD);

		/* read OFDM CRC32 counter */
		ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11N,
					   MASKDWORD);
		false_alm_cnt->cnt_ofdm_crc32_error =
			(ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_ofdm_crc32_ok = ret_value & 0xffff;

		/* read HT CRC32 counter */
		ret_value =
			odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11N, MASKDWORD);
		false_alm_cnt->cnt_ht_crc32_error =
			(ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_ht_crc32_ok = ret_value & 0xffff;

		/* read VHT CRC32 counter */
		false_alm_cnt->cnt_vht_crc32_error = 0;
		false_alm_cnt->cnt_vht_crc32_ok = 0;

		{
			/* hold cck counter */
			odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11N, BIT(12), 1);
			odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11N, BIT(14), 1);

			ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_FA_LSB_11N,
						   MASKBYTE0);
			false_alm_cnt->cnt_cck_fail = ret_value;

			ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_FA_MSB_11N,
						   MASKBYTE3);
			false_alm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;

			ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11N,
						   MASKDWORD);
			false_alm_cnt->cnt_cck_cca =
				((ret_value & 0xFF) << 8) |
				((ret_value & 0xFF00) >> 8);
		}

		false_alm_cnt->cnt_all_pre = false_alm_cnt->cnt_all;

		false_alm_cnt->cnt_all = (false_alm_cnt->cnt_fast_fsync +
					  false_alm_cnt->cnt_sb_search_fail +
					  false_alm_cnt->cnt_parity_fail +
					  false_alm_cnt->cnt_rate_illegal +
					  false_alm_cnt->cnt_crc8_fail +
					  false_alm_cnt->cnt_mcs_fail +
					  false_alm_cnt->cnt_cck_fail);

		false_alm_cnt->cnt_cca_all = false_alm_cnt->cnt_ofdm_cca +
					     false_alm_cnt->cnt_cck_cca;

		if (dm->support_ic_type >= ODM_RTL8188E) {
			/*reset false alarm counter registers*/
			odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RSTC_11N, BIT(31),
				       1);
			odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RSTC_11N, BIT(31),
				       0);
			odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RSTD_11N, BIT(27),
				       1);
			odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RSTD_11N, BIT(27),
				       0);

			/*update ofdm counter*/
			odm_set_bb_reg(dm, ODM_REG_OFDM_FA_HOLDC_11N, BIT(31),
				       0); /*update page C counter*/
			odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RSTD_11N, BIT(31),
				       0); /*update page D counter*/

			/*reset CCK CCA counter*/
			odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11N,
				       BIT(13) | BIT(12), 0);
			odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11N,
				       BIT(13) | BIT(12), 2);

			/*reset CCK FA counter*/
			odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11N,
				       BIT(15) | BIT(14), 0);
			odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11N,
				       BIT(15) | BIT(14), 2);

			/*reset CRC32 counter*/
			odm_set_bb_reg(dm, ODM_REG_PAGE_F_RST_11N, BIT(16), 1);
			odm_set_bb_reg(dm, ODM_REG_PAGE_F_RST_11N, BIT(16), 0);
		}

		/* Get debug port 0 */
		odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11N, MASKDWORD, 0x0);
		false_alm_cnt->dbg_port0 =
			odm_get_bb_reg(dm, ODM_REG_RPT_11N, MASKDWORD);

		/* Get EDCCA flag */
		odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11N, MASKDWORD, 0x208);
		false_alm_cnt->edcca_flag =
			(bool)odm_get_bb_reg(dm, ODM_REG_RPT_11N, BIT(30));

		ODM_RT_TRACE(
			dm, ODM_COMP_FA_CNT,
			"[OFDM FA Detail] Parity_Fail = (( %d )), Rate_Illegal = (( %d )), CRC8_fail = (( %d )), Mcs_fail = (( %d )), Fast_Fsync = (( %d )), SB_Search_fail = (( %d ))\n",
			false_alm_cnt->cnt_parity_fail,
			false_alm_cnt->cnt_rate_illegal,
			false_alm_cnt->cnt_crc8_fail,
			false_alm_cnt->cnt_mcs_fail,
			false_alm_cnt->cnt_fast_fsync,
			false_alm_cnt->cnt_sb_search_fail);
	}

	if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
		u32 cck_enable;

		/* read OFDM FA counter */
		false_alm_cnt->cnt_ofdm_fail =
			odm_get_bb_reg(dm, ODM_REG_OFDM_FA_11AC, MASKLWORD);

		/* Read CCK FA counter */
		false_alm_cnt->cnt_cck_fail =
			odm_get_bb_reg(dm, ODM_REG_CCK_FA_11AC, MASKLWORD);

		/* read CCK/OFDM CCA counter */
		ret_value =
			odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11AC, MASKDWORD);
		false_alm_cnt->cnt_ofdm_cca = (ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_cck_cca = ret_value & 0xffff;

		/* read CCK CRC32 counter */
		ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CRC32_CNT_11AC,
					   MASKDWORD);
		false_alm_cnt->cnt_cck_crc32_error =
			(ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_cck_crc32_ok = ret_value & 0xffff;

		/* read OFDM CRC32 counter */
		ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11AC,
					   MASKDWORD);
		false_alm_cnt->cnt_ofdm_crc32_error =
			(ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_ofdm_crc32_ok = ret_value & 0xffff;

		/* read HT CRC32 counter */
		ret_value = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11AC,
					   MASKDWORD);
		false_alm_cnt->cnt_ht_crc32_error =
			(ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_ht_crc32_ok = ret_value & 0xffff;

		/* read VHT CRC32 counter */
		ret_value = odm_get_bb_reg(dm, ODM_REG_VHT_CRC32_CNT_11AC,
					   MASKDWORD);
		false_alm_cnt->cnt_vht_crc32_error =
			(ret_value & 0xffff0000) >> 16;
		false_alm_cnt->cnt_vht_crc32_ok = ret_value & 0xffff;

		/* reset OFDM FA counter */
		odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 1);
		odm_set_bb_reg(dm, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 0);

		/* reset CCK FA counter */
		odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11AC, BIT(15), 0);
		odm_set_bb_reg(dm, ODM_REG_CCK_FA_RST_11AC, BIT(15), 1);

		/* reset CCA counter */
		odm_set_bb_reg(dm, ODM_REG_RST_RPT_11AC, BIT(0), 1);
		odm_set_bb_reg(dm, ODM_REG_RST_RPT_11AC, BIT(0), 0);

		cck_enable =
			odm_get_bb_reg(dm, ODM_REG_BB_RX_PATH_11AC, BIT(28));
		if (cck_enable) { /* if(*dm->band_type == ODM_BAND_2_4G) */
			false_alm_cnt->cnt_all = false_alm_cnt->cnt_ofdm_fail +
						 false_alm_cnt->cnt_cck_fail;
			false_alm_cnt->cnt_cca_all =
				false_alm_cnt->cnt_cck_cca +
				false_alm_cnt->cnt_ofdm_cca;
		} else {
			false_alm_cnt->cnt_all = false_alm_cnt->cnt_ofdm_fail;
			false_alm_cnt->cnt_cca_all =
				false_alm_cnt->cnt_ofdm_cca;
		}

		if (adc_smp->adc_smp_state == ADCSMP_STATE_IDLE) {
			if (phydm_set_bb_dbg_port(
				    dm, BB_DBGPORT_PRIORITY_1,
				    0x0)) { /*set debug port to 0x0*/
				false_alm_cnt->dbg_port0 =
					phydm_get_bb_dbg_port_value(dm);
				phydm_release_bb_dbg_port(dm);
			}

			if (phydm_set_bb_dbg_port(
				    dm, BB_DBGPORT_PRIORITY_1,
				    0x209)) { /*set debug port to 0x0*/
				false_alm_cnt->edcca_flag =
					(bool)((phydm_get_bb_dbg_port_value(
							dm) &
						BIT(30)) >>
					       30);
				phydm_release_bb_dbg_port(dm);
			}
		}
	}

	false_alm_cnt->cnt_crc32_error_all =
		false_alm_cnt->cnt_vht_crc32_error +
		false_alm_cnt->cnt_ht_crc32_error +
		false_alm_cnt->cnt_ofdm_crc32_error +
		false_alm_cnt->cnt_cck_crc32_error;
	false_alm_cnt->cnt_crc32_ok_all = false_alm_cnt->cnt_vht_crc32_ok +
					  false_alm_cnt->cnt_ht_crc32_ok +
					  false_alm_cnt->cnt_ofdm_crc32_ok +
					  false_alm_cnt->cnt_cck_crc32_ok;

	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
		     false_alm_cnt->cnt_cck_cca, false_alm_cnt->cnt_ofdm_cca,
		     false_alm_cnt->cnt_cca_all);

	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
		     false_alm_cnt->cnt_cck_fail, false_alm_cnt->cnt_ofdm_fail,
		     false_alm_cnt->cnt_all);

	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "[CCK]  CRC32 {error, ok}= {%d, %d}\n",
		     false_alm_cnt->cnt_cck_crc32_error,
		     false_alm_cnt->cnt_cck_crc32_ok);
	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT, "[OFDM]CRC32 {error, ok}= {%d, %d}\n",
		     false_alm_cnt->cnt_ofdm_crc32_error,
		     false_alm_cnt->cnt_ofdm_crc32_ok);
	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "[ HT ]  CRC32 {error, ok}= {%d, %d}\n",
		     false_alm_cnt->cnt_ht_crc32_error,
		     false_alm_cnt->cnt_ht_crc32_ok);
	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "[VHT]  CRC32 {error, ok}= {%d, %d}\n",
		     false_alm_cnt->cnt_vht_crc32_error,
		     false_alm_cnt->cnt_vht_crc32_ok);
	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "[VHT]  CRC32 {error, ok}= {%d, %d}\n",
		     false_alm_cnt->cnt_crc32_error_all,
		     false_alm_cnt->cnt_crc32_ok_all);
	ODM_RT_TRACE(dm, ODM_COMP_FA_CNT,
		     "FA_Cnt: Dbg port 0x0 = 0x%x, EDCCA = %d\n\n",
		     false_alm_cnt->dbg_port0, false_alm_cnt->edcca_flag);
}

/* 3============================================================
 * 3 CCK Packet Detect threshold
 * 3============================================================
 */

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)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	s8 max_level;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s()=========> level = %d\n", __func__,
		     pause_level);

	if ((dig_tab->pause_cckpd_level == 0) &&
	    (!(dm->support_ability & ODM_BB_CCK_PD) ||
	     !(dm->support_ability & ODM_BB_FA_CNT))) {
		ODM_RT_TRACE(
			dm, ODM_COMP_DIG,
			"Return: support_ability ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n");
		return;
	}

	if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Return: Wrong pause level !!\n", __func__);
		return;
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "%s(): pause level = 0x%x, Current value = 0x%x\n",
		     __func__, dig_tab->pause_cckpd_level, cck_pd_threshold);
	ODM_RT_TRACE(
		dm, ODM_COMP_DIG,
		"%s(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
		__func__, dig_tab->pause_cckpd_value[7],
		dig_tab->pause_cckpd_value[6], dig_tab->pause_cckpd_value[5],
		dig_tab->pause_cckpd_value[4], dig_tab->pause_cckpd_value[3],
		dig_tab->pause_cckpd_value[2], dig_tab->pause_cckpd_value[1],
		dig_tab->pause_cckpd_value[0]);

	switch (pause_type) {
	/* Pause CCK Packet Detection threshold */
	case PHYDM_PAUSE: {
		/* Disable CCK PD */
		odm_cmn_info_update(dm, ODM_CMNINFO_ABILITY,
				    dm->support_ability & (~ODM_BB_CCK_PD));
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Pause CCK packet detection threshold !!\n",
			     __func__);

		/*Backup original CCK PD threshold decided by CCK PD mechanism*/
		if (dig_tab->pause_cckpd_level == 0) {
			dig_tab->cck_pd_backup = dig_tab->cur_cck_cca_thres;
			ODM_RT_TRACE(
				dm, ODM_COMP_DIG,
				"%s(): Backup CCKPD  = 0x%x, new CCKPD = 0x%x\n",
				__func__, dig_tab->cck_pd_backup,
				cck_pd_threshold);
		}

		/* Update pause level */
		dig_tab->pause_cckpd_level =
			(dig_tab->pause_cckpd_level | BIT(pause_level));

		/* Record CCK PD threshold */
		dig_tab->pause_cckpd_value[pause_level] = cck_pd_threshold;

		/* Write new CCK PD threshold */
		if (BIT(pause_level + 1) > dig_tab->pause_cckpd_level) {
			odm_write_cck_cca_thres(dm, cck_pd_threshold);
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): CCKPD of higher level = 0x%x\n",
				     __func__, cck_pd_threshold);
		}
		break;
	}
	/* Resume CCK Packet Detection threshold */
	case PHYDM_RESUME: {
		/* check if the level is illegal or not */
		if ((dig_tab->pause_cckpd_level & (BIT(pause_level))) != 0) {
			dig_tab->pause_cckpd_level =
				dig_tab->pause_cckpd_level &
				(~(BIT(pause_level)));
			dig_tab->pause_cckpd_value[pause_level] = 0;
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Resume CCK PD !!\n", __func__);
		} else {
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Wrong resume level !!\n", __func__);
			break;
		}

		/* Resume DIG */
		if (dig_tab->pause_cckpd_level == 0) {
			/* Write backup IGI value */
			odm_write_cck_cca_thres(dm, dig_tab->cck_pd_backup);
			/* dig_tab->is_ignore_dig = true; */
			ODM_RT_TRACE(dm, ODM_COMP_DIG,
				     "%s(): Write original CCKPD = 0x%x\n",
				     __func__, dig_tab->cck_pd_backup);

			/* Enable DIG */
			odm_cmn_info_update(dm, ODM_CMNINFO_ABILITY,
					    dm->support_ability |
						    ODM_BB_CCK_PD);
			break;
		}

		if (BIT(pause_level) <= dig_tab->pause_cckpd_level)
			break;

		/* Calculate the maximum level now */
		for (max_level = (pause_level - 1); max_level >= 0;
		     max_level--) {
			if ((dig_tab->pause_cckpd_level & BIT(max_level)) > 0)
				break;
		}

		/* write CCKPD of lower level */
		odm_write_cck_cca_thres(dm,
					dig_tab->pause_cckpd_value[max_level]);
		ODM_RT_TRACE(dm, ODM_COMP_DIG,
			     "%s(): Write CCKPD (0x%x) of level (%d)\n",
			     __func__, dig_tab->pause_cckpd_value[max_level],
			     max_level);
		break;
	}
	default:
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "%s(): Wrong  type !!\n",
			     __func__);
		break;
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG,
		     "%s(): pause level = 0x%x, Current value = 0x%x\n",
		     __func__, dig_tab->pause_cckpd_level, cck_pd_threshold);
	ODM_RT_TRACE(
		dm, ODM_COMP_DIG,
		"%s(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
		__func__, dig_tab->pause_cckpd_value[7],
		dig_tab->pause_cckpd_value[6], dig_tab->pause_cckpd_value[5],
		dig_tab->pause_cckpd_value[4], dig_tab->pause_cckpd_value[3],
		dig_tab->pause_cckpd_value[2], dig_tab->pause_cckpd_value[1],
		dig_tab->pause_cckpd_value[0]);
}

void odm_cck_packet_detection_thresh(void *dm_void)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;
	struct false_alarm_stat *false_alm_cnt =
		(struct false_alarm_stat *)phydm_get_structure(
			dm, PHYDM_FALSEALMCNT);
	u8 cur_cck_cca_thres = dig_tab->cur_cck_cca_thres, rssi_thd = 35;

	if ((!(dm->support_ability & ODM_BB_CCK_PD)) ||
	    (!(dm->support_ability & ODM_BB_FA_CNT))) {
		ODM_RT_TRACE(dm, ODM_COMP_DIG, "CCK_PD: return==========\n");
		return;
	}

	if (dm->ext_lna)
		return;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "CCK_PD: ==========>\n");

	if (dig_tab->cck_fa_ma == 0xffffffff)
		dig_tab->cck_fa_ma = false_alm_cnt->cnt_cck_fail;
	else
		dig_tab->cck_fa_ma =
			((dig_tab->cck_fa_ma << 1) + dig_tab->cck_fa_ma +
			 false_alm_cnt->cnt_cck_fail) >>
			2;

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "CCK_PD: CCK FA moving average = %d\n",
		     dig_tab->cck_fa_ma);

	if (dm->is_linked) {
		if (dm->rssi_min > rssi_thd) {
			cur_cck_cca_thres = 0xcd;
		} else if (dm->rssi_min > 20) {
			if (dig_tab->cck_fa_ma >
			    ((DM_DIG_FA_TH1 >> 1) + (DM_DIG_FA_TH1 >> 3)))
				cur_cck_cca_thres = 0xcd;
			else if (dig_tab->cck_fa_ma < (DM_DIG_FA_TH0 >> 1))
				cur_cck_cca_thres = 0x83;
		} else if (dm->rssi_min > 7) {
			cur_cck_cca_thres = 0x83;
		} else {
			cur_cck_cca_thres = 0x40;
		}

	} else {
		if (dig_tab->cck_fa_ma > 0x400)
			cur_cck_cca_thres = 0x83;
		else if (dig_tab->cck_fa_ma < 0x200)
			cur_cck_cca_thres = 0x40;
	}

	{
		odm_write_cck_cca_thres(dm, cur_cck_cca_thres);
	}

	ODM_RT_TRACE(dm, ODM_COMP_DIG, "CCK_PD: cck_cca_th=((0x%x))\n\n",
		     cur_cck_cca_thres);
}

void odm_write_cck_cca_thres(void *dm_void, u8 cur_cck_cca_thres)
{
	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
	struct dig_thres *dig_tab = &dm->dm_dig_table;

	if (dig_tab->cur_cck_cca_thres !=
	    cur_cck_cca_thres) { /* modify by Guo.Mingzhi 2012-01-03 */
		odm_write_1byte(dm, ODM_REG(CCK_CCA, dm), cur_cck_cca_thres);
		dig_tab->cck_fa_ma = 0xffffffff;
	}
	dig_tab->pre_cck_cca_thres = dig_tab->cur_cck_cca_thres;
	dig_tab->cur_cck_cca_thres = cur_cck_cca_thres;
}

bool phydm_dig_go_up_check(void *dm_void)
{
	bool ret = true;

	return ret;
}
