/***************************************************************
 * Description:
 *
 * This file is for RTL8723B Co-exist mechanism
 *
 * History
 * 2012/11/15 Cosa first check in.
 *
 **************************************************************/
/**************************************************************
 * include files
 **************************************************************/
#include "halbt_precomp.h"
#if 1
/**************************************************************
 * Global variables, these are static variables
 **************************************************************/
static struct coex_dm_8723b_2ant glcoex_dm_8723b_2ant;
static struct coex_dm_8723b_2ant *coex_dm = &glcoex_dm_8723b_2ant;
static struct coex_sta_8723b_2ant glcoex_sta_8723b_2ant;
static struct coex_sta_8723b_2ant *coex_sta = &glcoex_sta_8723b_2ant;

const char *const glbt_info_src_8723b_2ant[] = {
	"BT Info[wifi fw]",
	"BT Info[bt rsp]",
	"BT Info[bt auto report]",
};

u32 glcoex_ver_date_8723b_2ant = 20131113;
u32 glcoex_ver_8723b_2ant = 0x3f;

/**************************************************************
 * local function proto type if needed
 **************************************************************/
/**************************************************************
 * local function start with halbtc8723b2ant_
 **************************************************************/
u8 halbtc8723b2ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
{
	s32 bt_rssi = 0;
	u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;

	bt_rssi = coex_sta->bt_rssi;

	if (level_num == 2) {
		if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
		    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
			if (bt_rssi >= rssi_thresh +
				       BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
				bt_rssi_state = BTC_RSSI_STATE_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "switch to High\n");
			} else {
				bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "stay at Low\n");
			}
		} else {
			if (bt_rssi < rssi_thresh) {
				bt_rssi_state = BTC_RSSI_STATE_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "switch to Low\n");
			} else {
				bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "stay at High\n");
			}
		}
	} else if (level_num == 3) {
		if (rssi_thresh > rssi_thresh1) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
				  "[BTCoex], BT Rssi thresh error!!\n");
			return coex_sta->pre_bt_rssi_state;
		}

		if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
		    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
			if (bt_rssi >= rssi_thresh +
				       BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
				bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "switch to Medium\n");
			} else {
				bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "stay at Low\n");
			}
		} else if ((coex_sta->pre_bt_rssi_state ==
						BTC_RSSI_STATE_MEDIUM) ||
			   (coex_sta->pre_bt_rssi_state ==
			   			BTC_RSSI_STATE_STAY_MEDIUM)) {
			if (bt_rssi >= rssi_thresh1 +
				       BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
				bt_rssi_state = BTC_RSSI_STATE_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "switch to High\n");
			} else if (bt_rssi < rssi_thresh) {
				bt_rssi_state = BTC_RSSI_STATE_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "switch to Low\n");
			} else {
				bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "stay at Medium\n");
			}
		} else {
			if (bt_rssi < rssi_thresh1) {
				bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "switch to Medium\n");
			} else {
				bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
					  "[BTCoex], BT Rssi state "
					  "stay at High\n");
			}
		}
	}

	coex_sta->pre_bt_rssi_state = bt_rssi_state;

	return bt_rssi_state;
}

u8 halbtc8723b2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
				   u8 index, u8 level_num,
				   u8 rssi_thresh, u8 rssi_thresh1)
{
	s32 wifi_rssi=0;
	u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];

	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);

	if (level_num == 2) {
		if ((coex_sta->pre_wifi_rssi_state[index] ==
						BTC_RSSI_STATE_LOW) ||
		    (coex_sta->pre_wifi_rssi_state[index] ==
		    				BTC_RSSI_STATE_STAY_LOW)) {
			if (wifi_rssi >= rssi_thresh +
					 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "switch to High\n");
			} else {
				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "stay at Low\n");
			}
		} else {
			if (wifi_rssi < rssi_thresh) {
				wifi_rssi_state = BTC_RSSI_STATE_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "switch to Low\n");
			} else {
				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "stay at High\n");
			}
		}
	} else if (level_num == 3) {
		if (rssi_thresh > rssi_thresh1) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE,
				  "[BTCoex], wifi RSSI thresh error!!\n");
			return coex_sta->pre_wifi_rssi_state[index];
		}

		if ((coex_sta->pre_wifi_rssi_state[index] ==
						BTC_RSSI_STATE_LOW) ||
		    (coex_sta->pre_wifi_rssi_state[index] ==
		    				BTC_RSSI_STATE_STAY_LOW)) {
			if(wifi_rssi >= rssi_thresh +
					BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "switch to Medium\n");
			} else {
				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "stay at Low\n");
			}
		} else if ((coex_sta->pre_wifi_rssi_state[index] ==
						BTC_RSSI_STATE_MEDIUM) ||
			   (coex_sta->pre_wifi_rssi_state[index] ==
			   			BTC_RSSI_STATE_STAY_MEDIUM)) {
			if (wifi_rssi >= rssi_thresh1 +
					 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "switch to High\n");
			} else if (wifi_rssi < rssi_thresh) {
				wifi_rssi_state = BTC_RSSI_STATE_LOW;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "switch to Low\n");
			} else {
				wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "stay at Medium\n");
			}
		} else {
			if (wifi_rssi < rssi_thresh1) {
				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "switch to Medium\n");
			} else {
				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_WIFI_RSSI_STATE,
					  "[BTCoex], wifi RSSI state "
					  "stay at High\n");
			}
		}
	}

	coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;

	return wifi_rssi_state;
}

void halbtc8723b2ant_monitor_bt_enable_disable(struct btc_coexist *btcoexist)
{
	static bool pre_bt_disabled = false;
	static u32 bt_disable_cnt = 0;
	bool bt_active = true, bt_disabled = false;

	/* This function check if bt is disabled */
	if (coex_sta->high_priority_tx == 0 &&
	    coex_sta->high_priority_rx == 0 &&
	    coex_sta->low_priority_tx == 0 &&
	    coex_sta->low_priority_rx == 0)
		bt_active = false;

	if (coex_sta->high_priority_tx == 0xffff &&
	    coex_sta->high_priority_rx == 0xffff &&
	    coex_sta->low_priority_tx == 0xffff &&
	    coex_sta->low_priority_rx == 0xffff)
		bt_active = true;

	if (bt_active) {
		bt_disable_cnt = 0;
		bt_disabled = false;
		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
				   &bt_disabled);
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
			  "[BTCoex], BT is enabled !!\n");
	} else {
		bt_disable_cnt++;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
			  "[BTCoex], bt all counters=0, %d times!!\n",
			  bt_disable_cnt);
		if (bt_disable_cnt >= 2) {
			bt_disabled = true;
			btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
					   &bt_disabled);
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
				  "[BTCoex], BT is disabled !!\n");
		}
	}

	if (pre_bt_disabled != bt_disabled) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
			  "[BTCoex], BT is from %s to %s!!\n",
			  (pre_bt_disabled ? "disabled":"enabled"),
			  (bt_disabled ? "disabled":"enabled"));

		pre_bt_disabled = bt_disabled;
		if (!bt_disabled) {
		} else {
		}
	}
}

void halbtc8723b2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
{
	u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
	u32 reg_hp_tx = 0, reg_hp_rx = 0;
	u32 reg_lp_tx = 0, reg_lp_rx = 0;

	reg_hp_txrx = 0x770;
	reg_lp_txrx = 0x774;

	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
	reg_hp_tx = u32tmp & MASKLWORD;
	reg_hp_rx = (u32tmp & MASKHWORD) >> 16;

	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
	reg_lp_tx = u32tmp & MASKLWORD;
	reg_lp_rx = (u32tmp & MASKHWORD) >> 16;

	coex_sta->high_priority_tx = reg_hp_tx;
	coex_sta->high_priority_rx = reg_hp_rx;
	coex_sta->low_priority_tx = reg_lp_tx;
	coex_sta->low_priority_rx = reg_lp_rx;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
		  "[BTCoex], High Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
		  reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
		  "[BTCoex], Low Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
		  reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);

	/* reset counter */
	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
}

void halbtc8723b2ant_query_bt_info(struct btc_coexist *btcoexist)
{
	u8 h2c_parameter[1] ={0};

	coex_sta->c2h_bt_info_req_sent = true;

	h2c_parameter[0] |= BIT0;	/* trigger */

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], Query Bt Info, FW write 0x61=0x%x\n",
		  h2c_parameter[0]);

	btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
}

bool halbtc8723b2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
{
	static bool pre_wifi_busy = false;
	static bool pre_under_4way = false;
	static bool pre_bt_hs_on = false;
	bool wifi_busy = false, under_4way = false, bt_hs_on = false;
	bool wifi_connected = false;

	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
			   &wifi_connected);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
			   &under_4way);

	if (wifi_connected) {
		if (wifi_busy != pre_wifi_busy) {
			pre_wifi_busy = wifi_busy;
			return true;
		}

		if (under_4way != pre_under_4way) {
			pre_under_4way = under_4way;
			return true;
		}

		if (bt_hs_on != pre_bt_hs_on) {
			pre_bt_hs_on = bt_hs_on;
			return true;
		}
	}

	return false;
}

void halbtc8723b2ant_update_bt_link_info(struct btc_coexist *btcoexist)
{
	/*struct btc_stack_info *stack_info = &btcoexist->stack_info;*/
	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
	bool bt_hs_on = false;

#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 1) /* profile from bt patch */
	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);

	bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
	bt_link_info->sco_exist = coex_sta->sco_exist;
	bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
	bt_link_info->pan_exist = coex_sta->pan_exist;
	bt_link_info->hid_exist = coex_sta->hid_exist;

	/* work around for HS mode. */
	if (bt_hs_on) {
		bt_link_info->pan_exist = true;
		bt_link_info->bt_link_exist = true;
	}
#else	/* profile from bt stack */
	bt_link_info->bt_link_exist = stack_info->bt_link_exist;
	bt_link_info->sco_exist = stack_info->sco_exist;
	bt_link_info->a2dp_exist = stack_info->a2dp_exist;
	bt_link_info->pan_exist = stack_info->pan_exist;
	bt_link_info->hid_exist = stack_info->hid_exist;

	/*for win-8 stack HID report error*/
	if (!stack_info->hid_exist)
		stack_info->hid_exist = coex_sta->hid_exist;
	/*sync  BTInfo with BT firmware and stack*/
	/* when stack HID report error, here we use the info from bt fw.*/
	if (!stack_info->bt_link_exist)
		stack_info->bt_link_exist = coex_sta->bt_link_exist;
#endif
	/* check if Sco only */
	if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
		bt_link_info->sco_only = true;
	else
		bt_link_info->sco_only = false;

	/* check if A2dp only */
	if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
		bt_link_info->a2dp_only = true;
	else
		bt_link_info->a2dp_only = false;

	/* check if Pan only */
	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
	    bt_link_info->pan_exist && !bt_link_info->hid_exist)
		bt_link_info->pan_only = true;
	else
		bt_link_info->pan_only = false;

	/* check if Hid only */
	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
	    !bt_link_info->pan_exist && bt_link_info->hid_exist)
		bt_link_info->hid_only = true;
	else
		bt_link_info->hid_only = false;
}

u8 halbtc8723b2ant_action_algorithm(struct btc_coexist *btcoexist)
{
	struct btc_bt_link_info *bt_link_info=&btcoexist->bt_link_info;
	bool bt_hs_on = false;
	u8 algorithm = BT_8723B_2ANT_COEX_ALGO_UNDEFINED;
	u8 num_of_diff_profile = 0;

	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);

	if (!bt_link_info->bt_link_exist) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], No BT link exists!!!\n");
		return algorithm;
	}

	if (bt_link_info->sco_exist)
		num_of_diff_profile++;
	if (bt_link_info->hid_exist)
		num_of_diff_profile++;
	if (bt_link_info->pan_exist)
		num_of_diff_profile++;
	if (bt_link_info->a2dp_exist)
		num_of_diff_profile++;

	if (num_of_diff_profile == 1) {
		if (bt_link_info->sco_exist) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], SCO only\n");
			algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
		} else {
			if (bt_link_info->hid_exist) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], HID only\n");
				algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
			} else if (bt_link_info->a2dp_exist) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], A2DP only\n");
				algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;
			} else if (bt_link_info->pan_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], PAN(HS) only\n");
					algorithm =
						BT_8723B_2ANT_COEX_ALGO_PANHS;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], PAN(EDR) only\n");
					algorithm =
						BT_8723B_2ANT_COEX_ALGO_PANEDR;
				}
			}
		}
	} else if (num_of_diff_profile == 2) {
		if (bt_link_info->sco_exist) {
			if (bt_link_info->hid_exist) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], SCO + HID\n");
				algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
			} else if (bt_link_info->a2dp_exist) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], SCO + A2DP ==> SCO\n");
				algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
			} else if (bt_link_info->pan_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + PAN(HS)\n");
					algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + PAN(EDR)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				}
			}
		} else {
			if (bt_link_info->hid_exist &&
			    bt_link_info->a2dp_exist) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], HID + A2DP\n");
				algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
			} else if (bt_link_info->hid_exist &&
				   bt_link_info->pan_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], HID + PAN(HS)\n");
					algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], HID + PAN(EDR)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				}
			} else if (bt_link_info->pan_exist &&
				   bt_link_info->a2dp_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], A2DP + PAN(HS)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex],A2DP + PAN(EDR)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;
				}
			}
		}
	} else if (num_of_diff_profile == 3) {
		if (bt_link_info->sco_exist) {
			if (bt_link_info->hid_exist &&
			    bt_link_info->a2dp_exist) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], SCO + HID + A2DP"
					  " ==> HID\n");
				algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
			} else if (bt_link_info->hid_exist &&
				   bt_link_info->pan_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + HID + "
						  "PAN(HS)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + HID + "
						  "PAN(EDR)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				}
			} else if (bt_link_info->pan_exist &&
				   bt_link_info->a2dp_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + A2DP + "
						  "PAN(HS)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + A2DP + "
						  "PAN(EDR) ==> HID\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				}
			}
		} else {
			if (bt_link_info->hid_exist &&
			    bt_link_info->pan_exist &&
			    bt_link_info->a2dp_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], HID + A2DP + "
						  "PAN(HS)\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], HID + A2DP + "
						  "PAN(EDR)\n");
					algorithm =
					BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
				}
			}
		}
	} else if (num_of_diff_profile >= 3) {
		if (bt_link_info->sco_exist) {
			if (bt_link_info->hid_exist &&
			    bt_link_info->pan_exist &&
			    bt_link_info->a2dp_exist) {
				if (bt_hs_on) {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], Error!!! SCO + HID"
						  " + A2DP + PAN(HS)\n");
				} else {
					BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
						  "[BTCoex], SCO + HID + A2DP +"
						  " PAN(EDR)==>PAN(EDR)+HID\n");
					algorithm =
					    BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
				}
			}
		}
	}

	return algorithm;
}

bool halbtc8723b2ant_need_to_dec_bt_pwr(struct btc_coexist *btcoexist)
{
	bool bRet = false;
	bool bt_hs_on = false, wifi_connected = false;
	s32 bt_hs_rssi=0;
	u8 bt_rssi_state;

	if (!btcoexist->btc_get(btcoexist,
			BTC_GET_BL_HS_OPERATION, &bt_hs_on))
		return false;
	if (!btcoexist->btc_get(btcoexist,
			BTC_GET_BL_WIFI_CONNECTED, &wifi_connected))
		return false;
	if (!btcoexist->btc_get(btcoexist,
			BTC_GET_S4_HS_RSSI, &bt_hs_rssi))
		return false;

	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	if (wifi_connected) {
		if (bt_hs_on) {
			if (bt_hs_rssi > 37) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
					  "[BTCoex], Need to decrease bt "
					  "power for HS mode!!\n");
				bRet = true;
			}
		} else {
			if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
			    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
					  "[BTCoex], Need to decrease bt "
					  "power for Wifi is connected!!\n");
				bRet = true;
			}
		}
	}

	return bRet;
}

void halbtc8723b2ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist,
					    u8 dac_swing_lvl)
{
	u8 h2c_parameter[1] ={0};

	/* There are several type of dacswing
	 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
	h2c_parameter[0] = dac_swing_lvl;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], FW write 0x64=0x%x\n", h2c_parameter[0]);

	btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
}

void halbtc8723b2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
				       bool dec_bt_pwr)
{
	u8 h2c_parameter[1] = {0};

	h2c_parameter[0] = 0;

	if (dec_bt_pwr)
		h2c_parameter[0] |= BIT1;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n",
		  (dec_bt_pwr? "Yes!!":"No!!"), h2c_parameter[0]);

	btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
}

void halbtc8723b2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
				bool force_exec, bool dec_bt_pwr)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
		  "[BTCoex], %s Dec BT power = %s\n",
		  (force_exec? "force to":""), (dec_bt_pwr? "ON":"OFF"));
	coex_dm->cur_dec_bt_pwr = dec_bt_pwr;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
			  coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr);

		if (coex_dm->pre_dec_bt_pwr == coex_dm->cur_dec_bt_pwr)
			return;
	}
	halbtc8723b2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr);

	coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr;
}

void halbtc8723b2ant_set_bt_auto_report(struct btc_coexist *btcoexist,
					bool enable_auto_report)
{
	u8 h2c_parameter[1] = {0};
	h2c_parameter[0] = 0;

	if (enable_auto_report)
		h2c_parameter[0] |= BIT0;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n",
		  (enable_auto_report? "Enabled!!":"Disabled!!"),
		  h2c_parameter[0]);

	btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
}

void halbtc8723b2ant_bt_auto_report(struct btc_coexist *btcoexist,
				    bool force_exec, bool enable_auto_report)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
		  "[BTCoex], %s BT Auto report = %s\n",
		  (force_exec? "force to":""),
		  ((enable_auto_report)? "Enabled":"Disabled"));
	coex_dm->cur_bt_auto_report = enable_auto_report;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], bPreBtAutoReport=%d, "
			  "bCurBtAutoReport=%d\n",
			  coex_dm->pre_bt_auto_report,
			  coex_dm->cur_bt_auto_report);

		if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
			return;
	}
	halbtc8723b2ant_set_bt_auto_report(btcoexist,
					   coex_dm->cur_bt_auto_report);

	coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
}

void halbtc8723b2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
				      bool force_exec, u8 fw_dac_swing_lvl)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
		  "[BTCoex], %s set FW Dac Swing level = %d\n",
		  (force_exec? "force to":""), fw_dac_swing_lvl);
	coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], preFwDacSwingLvl=%d, "
			  "curFwDacSwingLvl=%d\n",
			  coex_dm->pre_fw_dac_swing_lvl,
			  coex_dm->cur_fw_dac_swing_lvl);

		if(coex_dm->pre_fw_dac_swing_lvl ==
		   coex_dm->cur_fw_dac_swing_lvl)
			return;
	}

	halbtc8723b2ant_set_fw_dac_swing_level(btcoexist,
					       coex_dm->cur_fw_dac_swing_lvl);
	coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
}

void halbtc8723b2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist,
					     bool rx_rf_shrink_on)
{
	if (rx_rf_shrink_on) {
		/* Shrink RF Rx LPF corner */
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], Shrink RF Rx LPF corner!!\n");
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
					  0xfffff, 0xffffc);
	} else {
		/* Resume RF Rx LPF corner */
		/* After initialized, we can use coex_dm->btRf0x1eBackup */
		if (btcoexist->initilized) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
				  "[BTCoex], Resume RF Rx LPF corner!!\n");
			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
						  0xfffff,
						  coex_dm->bt_rf0x1e_backup);
		}
	}
}

void halbtc8723b2ant_rf_shrink(struct btc_coexist *btcoexist,
			       bool force_exec, bool rx_rf_shrink_on)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
		  "[BTCoex], %s turn Rx RF Shrink = %s\n",
		  (force_exec? "force to":""), (rx_rf_shrink_on? "ON":"OFF"));
	coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], bPreRfRxLpfShrink=%d, "
			  "bCurRfRxLpfShrink=%d\n",
			  coex_dm->pre_rf_rx_lpf_shrink,
			  coex_dm->cur_rf_rx_lpf_shrink);

		if (coex_dm->pre_rf_rx_lpf_shrink ==
		    coex_dm->cur_rf_rx_lpf_shrink)
			return;
	}
	halbtc8723b2ant_set_sw_rf_rx_lpf_corner(btcoexist,
						coex_dm->cur_rf_rx_lpf_shrink);

	coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
}

void halbtc8723b2ant_set_sw_penalty_txrate_adaptive(
						struct btc_coexist *btcoexist,
						bool low_penalty_ra)
{
	u8 h2c_parameter[6] ={0};

	h2c_parameter[0] = 0x6;	/* opCode, 0x6= Retry_Penalty*/

	if (low_penalty_ra) {
		h2c_parameter[1] |= BIT0;
		/*normal rate except MCS7/6/5, OFDM54/48/36*/
		h2c_parameter[2] = 0x00;
		h2c_parameter[3] = 0xf7;  /*MCS7 or OFDM54*/
		h2c_parameter[4] = 0xf8;  /*MCS6 or OFDM48*/
		h2c_parameter[5] = 0xf9;  /*MCS5 or OFDM36*/
	}

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], set WiFi Low-Penalty Retry: %s",
		  (low_penalty_ra? "ON!!":"OFF!!"));

	btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
}

void halbtc8723b2ant_low_penalty_ra(struct btc_coexist *btcoexist,
				    bool force_exec, bool low_penalty_ra)
{
	/*return; */
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
		  "[BTCoex], %s turn LowPenaltyRA = %s\n",
		  (force_exec? "force to":""), (low_penalty_ra? "ON":"OFF"));
	coex_dm->cur_low_penalty_ra = low_penalty_ra;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], bPreLowPenaltyRa=%d, "
			  "bCurLowPenaltyRa=%d\n",
			  coex_dm->pre_low_penalty_ra,
			  coex_dm->cur_low_penalty_ra);

		if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
			return;
	}
	halbtc8723b2ant_set_sw_penalty_txrate_adaptive(btcoexist,
						coex_dm->cur_low_penalty_ra);

	coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
}

void halbtc8723b2ant_set_dac_swing_reg(struct btc_coexist * btcoexist,
				       u32 level)
{
	u8 val = (u8) level;
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
		  "[BTCoex], Write SwDacSwing = 0x%x\n", level);
	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
}

void halbtc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist *btcoexist,
					       bool sw_dac_swing_on,
					       u32 sw_dac_swing_lvl)
{
	if(sw_dac_swing_on)
		halbtc8723b2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
	else
		halbtc8723b2ant_set_dac_swing_reg(btcoexist, 0x18);
}


void halbtc8723b2ant_dac_swing(struct btc_coexist *btcoexist,
			       bool force_exec, bool dac_swing_on,
			       u32 dac_swing_lvl)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
		  "[BTCoex], %s turn DacSwing=%s, dac_swing_lvl=0x%x\n",
		  (force_exec? "force to":""),
		  (dac_swing_on? "ON":"OFF"), dac_swing_lvl);
	coex_dm->cur_dac_swing_on = dac_swing_on;
	coex_dm->cur_dac_swing_lvl = dac_swing_lvl;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x,"
			  " bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
			  coex_dm->pre_dac_swing_on, coex_dm->pre_dac_swing_lvl,
			  coex_dm->cur_dac_swing_on,
			  coex_dm->cur_dac_swing_lvl);

		if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
		    (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
			return;
	}
	mdelay(30);
	halbtc8723b2ant_set_sw_fulltime_dac_swing(btcoexist, dac_swing_on,
						  dac_swing_lvl);

	coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
	coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
}

void halbtc8723b2ant_set_adc_backoff(struct btc_coexist *btcoexist,
				     bool adc_backoff)
{
	if (adc_backoff) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], BB BackOff Level On!\n");
		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc05, 0x30, 0x3);
	} else {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], BB BackOff Level Off!\n");
		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc05, 0x30, 0x1);
	}
}

void halbtc8723b2ant_adc_backoff(struct btc_coexist *btcoexist,
				 bool force_exec, bool adc_backoff)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
		  "[BTCoex], %s turn AdcBackOff = %s\n",
		  (force_exec? "force to":""), (adc_backoff? "ON":"OFF"));
	coex_dm->cur_adc_back_off = adc_backoff;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n",
			  coex_dm->pre_adc_back_off,
			  coex_dm->cur_adc_back_off);

		if (coex_dm->pre_adc_back_off == coex_dm->cur_adc_back_off)
			return;
	}
	halbtc8723b2ant_set_adc_backoff(btcoexist, coex_dm->cur_adc_back_off);

	coex_dm->pre_adc_back_off = coex_dm->cur_adc_back_off;
}

void halbtc8723b2ant_set_agc_table(struct btc_coexist *btcoexist,
				   bool agc_table_en)
{
	u8 rssi_adjust_val = 0;

	/*  BB AGC Gain Table */
	if (agc_table_en) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], BB Agc Table On!\n");
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6e1A0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6d1B0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6c1C0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6b1D0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6a1E0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x691F0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x68200001);
	} else {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], BB Agc Table Off!\n");
	 	btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001);
		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa4200001);
	}


	/* RF Gain */
	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
	if (agc_table_en) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], Agc Table On!\n");
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
					  0xfffff, 0x38fff);
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
					  0xfffff, 0x38ffe);
	} else {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], Agc Table Off!\n");
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
					  0xfffff, 0x380c3);
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
					  0xfffff, 0x28ce6);
	}
	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);

	if (agc_table_en) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], Agc Table On!\n");
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
					  0xfffff, 0x38fff);
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
					  0xfffff, 0x38ffe);
	} else {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
			  "[BTCoex], Agc Table Off!\n");
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
					  0xfffff, 0x380c3);
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
					  0xfffff, 0x28ce6);
	}
	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);

	/* set rssiAdjustVal for wifi module. */
	if (agc_table_en)
		rssi_adjust_val = 8;
	btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,
			   &rssi_adjust_val);
}

void halbtc8723b2ant_agc_table(struct btc_coexist *btcoexist,
			       bool force_exec, bool agc_table_en)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
		  "[BTCoex], %s %s Agc Table\n",
		  (force_exec? "force to":""),
		  (agc_table_en? "Enable":"Disable"));
	coex_dm->cur_agc_table_en = agc_table_en;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
			  coex_dm->pre_agc_table_en, coex_dm->cur_agc_table_en);

		if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
			return;
	}
	halbtc8723b2ant_set_agc_table(btcoexist, agc_table_en);

	coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
}

void halbtc8723b2ant_set_coex_table(struct btc_coexist *btcoexist,
				    u32 val0x6c0, u32 val0x6c4,
				    u32 val0x6c8, u8 val0x6cc)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
		  "[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0);
	btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
		  "[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4);
	btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
		  "[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8);
	btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
		  "[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc);
	btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
}

void halbtc8723b2ant_coex_table(struct btc_coexist *btcoexist,
				bool force_exec, u32 val0x6c0,
				u32 val0x6c4, u32 val0x6c8,
				u8 val0x6cc)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
		  "[BTCoex], %s write Coex Table 0x6c0=0x%x,"
		  " 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
		  (force_exec? "force to":""), val0x6c0,
		  val0x6c4, val0x6c8, val0x6cc);
	coex_dm->cur_val0x6c0 = val0x6c0;
	coex_dm->cur_val0x6c4 = val0x6c4;
	coex_dm->cur_val0x6c8 = val0x6c8;
	coex_dm->cur_val0x6cc = val0x6cc;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], preVal0x6c0=0x%x, "
			  "preVal0x6c4=0x%x, preVal0x6c8=0x%x, "
			  "preVal0x6cc=0x%x !!\n",
			  coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4,
			  coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc);
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
			  "[BTCoex], curVal0x6c0=0x%x, "
			  "curVal0x6c4=0x%x, curVal0x6c8=0x%x, "
			  "curVal0x6cc=0x%x !!\n",
			  coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4,
			  coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc);

		if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
		    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
		    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
		    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
			return;
	}
	halbtc8723b2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
				       val0x6c8, val0x6cc);

	coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
	coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
	coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
	coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
}

void halbtc8723b2ant_coex_table_with_type(struct btc_coexist *btcoexist,
					  bool force_exec, u8 type)
{
	switch (type) {
	case 0:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
					   0x55555555, 0xffff, 0x3);
		break;
	case 1:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
					   0x5afa5afa, 0xffff, 0x3);
		break;
	case 2:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
					   0x5a5a5a5a, 0xffff, 0x3);
		break;
	case 3:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
					   0xaaaaaaaa, 0xffff, 0x3);
		break;
	case 4:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0xffffffff,
					   0xffffffff, 0xffff, 0x3);
		break;
	case 5:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
					   0x5fff5fff, 0xffff, 0x3);
		break;
	case 6:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
					   0x5a5a5a5a, 0xffff, 0x3);
		break;
	case 7:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
					   0x5afa5afa, 0xffff, 0x3);
		break;
	case 8:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x5aea5aea,
					   0x5aea5aea, 0xffff, 0x3);
		break;
	case 9:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
					   0x5aea5aea, 0xffff, 0x3);
		break;
	case 10:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
					   0x5aff5aff, 0xffff, 0x3);
		break;
	case 11:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
					   0x5a5f5a5f, 0xffff, 0x3);
		break;
	case 12:
		halbtc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
					   0x5f5f5f5f, 0xffff, 0x3);
		break;
	default:
		break;
	}
}

void halbtc8723b2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
					    bool enable)
{
	u8 h2c_parameter[1] ={0};

	if (enable)
		h2c_parameter[0] |= BIT0;/* function enable*/

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], set FW for BT Ignore Wlan_Act, "
		  "FW write 0x63=0x%x\n", h2c_parameter[0]);

	btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
}

void halbtc8723b2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
				     bool force_exec, bool enable)
{
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
		  "[BTCoex], %s turn Ignore WlanAct %s\n",
		  (force_exec? "force to":""), (enable? "ON":"OFF"));
	coex_dm->cur_ignore_wlan_act = enable;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], bPreIgnoreWlanAct = %d, "
			  "bCurIgnoreWlanAct = %d!!\n",
			  coex_dm->pre_ignore_wlan_act,
			  coex_dm->cur_ignore_wlan_act);

		if (coex_dm->pre_ignore_wlan_act ==
		    coex_dm->cur_ignore_wlan_act)
			return;
	}
	halbtc8723b2ant_set_fw_ignore_wlan_act(btcoexist, enable);

	coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
}

void halbtc8723b2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
				    u8 byte2, u8 byte3, u8 byte4, u8 byte5)
{
	u8 h2c_parameter[5] ={0};

	h2c_parameter[0] = byte1;
	h2c_parameter[1] = byte2;
	h2c_parameter[2] = byte3;
	h2c_parameter[3] = byte4;
	h2c_parameter[4] = byte5;

	coex_dm->ps_tdma_para[0] = byte1;
	coex_dm->ps_tdma_para[1] = byte2;
	coex_dm->ps_tdma_para[2] = byte3;
	coex_dm->ps_tdma_para[3] = byte4;
	coex_dm->ps_tdma_para[4] = byte5;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
		  h2c_parameter[0],
		  h2c_parameter[1] << 24 | h2c_parameter[2] << 16 |
		  h2c_parameter[3] << 8 | h2c_parameter[4]);

	btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
}

void halbtc8723b2ant_sw_mechanism1(struct btc_coexist *btcoexist,
				   bool shrink_rx_lpf, bool low_penalty_ra,
				   bool limited_dig, bool bt_lna_constrain)
{
	/*
	u32	wifi_bw;

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	if(BTC_WIFI_BW_HT40 != wifi_bw)  //only shrink RF Rx LPF for HT40
	{
		if (shrink_rx_lpf)
			shrink_rx_lpf = false;
	}
	*/

	halbtc8723b2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf);
	halbtc8723b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
}

void halbtc8723b2ant_sw_mechanism2(struct btc_coexist *btcoexist,
				   bool agc_table_shift, bool adc_backoff,
				   bool sw_dac_swing, u32 dac_swing_lvl)
{
	halbtc8723b2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift);
	/*halbtc8723b2ant_adc_backoff(btcoexist, NORMAL_EXEC, adc_backoff);*/
	halbtc8723b2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
				  dac_swing_lvl);
}

void halbtc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
				  u8 antpos_type, bool init_hwcfg,
				  bool wifi_off)
{
	struct btc_board_info *board_info = &btcoexist->board_info;
	u32 fw_ver = 0, u32tmp=0;
	bool pg_ext_switch = false;
	bool use_ext_switch = false;
	u8 h2c_parameter[2] ={0};

	btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);

	if ((fw_ver<0xc0000) || pg_ext_switch)
		use_ext_switch = true;

	if (init_hwcfg) {
		/* 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT */
		u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
		u32tmp &= ~BIT23;
		u32tmp |= BIT24;
		btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);

		btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
		btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);

		/* Force GNT_BT to low */
		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
		btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);

		if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
			/* tell firmware "no antenna inverse" */
			h2c_parameter[0] = 0;
			h2c_parameter[1] = 1;  /* ext switch type */
			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
						h2c_parameter);
		} else {
			/* tell firmware "antenna inverse" */
			h2c_parameter[0] = 1;
			h2c_parameter[1] = 1;  /* ext switch type */
			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
						h2c_parameter);
		}
	}

	/* ext switch setting */
	if (use_ext_switch) {
		 /* fixed internal switch S1->WiFi, S0->BT */
		btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
		switch (antpos_type) {
		case BTC_ANT_WIFI_AT_MAIN:
			/* ext switch main at wifi */
			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c,
							   0x3, 0x1);
			break;
		case BTC_ANT_WIFI_AT_AUX:
			/* ext switch aux at wifi */
			btcoexist->btc_write_1byte_bitmask(btcoexist,
							   0x92c, 0x3, 0x2);
			break;
		}
	} else {	/* internal switch */
		/* fixed ext switch */
		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c, 0x3, 0x1);
		switch (antpos_type) {
		case BTC_ANT_WIFI_AT_MAIN:
			/* fixed internal switch S1->WiFi, S0->BT */
			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
			break;
		case BTC_ANT_WIFI_AT_AUX:
			/* fixed internal switch S0->WiFi, S1->BT */
			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
			break;
		}
	}
}


void halbtc8723b2ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
			     bool turn_on, u8 type)
{

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
		  "[BTCoex], %s turn %s PS TDMA, type=%d\n",
		  (force_exec? "force to":""), (turn_on? "ON":"OFF"), type);
	coex_dm->cur_ps_tdma_on = turn_on;
	coex_dm->cur_ps_tdma = type;

	if (!force_exec) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
			  coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
			  coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);

		if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
		    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
			return;
	}
	if (turn_on) {
		switch (type) {
		case 1:
		default:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
						       0x1a, 0xe1, 0x90);
			break;
		case 2:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
						       0x12, 0xe1, 0x90);
			break;
		case 3:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
						       0x3, 0xf1, 0x90);
			break;
		case 4:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
						       0x03, 0xf1, 0x90);
			break;
		case 5:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
						       0x1a, 0x60, 0x90);
			break;
		case 6:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
						       0x12, 0x60, 0x90);
			break;
		case 7:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
						       0x3, 0x70, 0x90);
			break;
		case 8:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
						       0x3, 0x70, 0x90);
			break;
		case 9:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
						       0x1a, 0xe1, 0x90);
			break;
		case 10:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
						       0x12, 0xe1, 0x90);
			break;
		case 11:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
						       0xa, 0xe1, 0x90);
			break;
		case 12:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
						       0x5, 0xe1, 0x90);
			break;
		case 13:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
						       0x1a, 0x60, 0x90);
			break;
		case 14:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
						       0x12, 0x60, 0x90);
			break;
		case 15:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
						       0xa, 0x60, 0x90);
			break;
		case 16:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
						       0x5, 0x60, 0x90);
			break;
		case 17:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
						       0x2f, 0x60, 0x90);
			break;
		case 18:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
						       0x5, 0xe1, 0x90);
			break;
		case 19:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
						       0x25, 0xe1, 0x90);
			break;
		case 20:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
						       0x25, 0x60, 0x90);
			break;
		case 21:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
						       0x03, 0x70, 0x90);
			break;
		case 71:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
						       0x1a, 0xe1, 0x90);
			break;
		}
	} else {
		/* disable PS tdma */
		switch (type) {
		case 0:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
						       0x40, 0x0);
			break;
		case 1:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
						       0x48, 0x0);
			break;
		default:
			halbtc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
						       0x40, 0x0);
			break;
		}
	}

	/* update pre state */
	coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
	coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
}

void halbtc8723b2ant_coex_alloff(struct btc_coexist *btcoexist)
{
	/* fw all off */
	halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
	halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	/* sw all off */
	halbtc8723b2ant_sw_mechanism1(btcoexist, false, false, false, false);
	halbtc8723b2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);

	/* hw all off */
	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
}

void halbtc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
{
	/* force to reset coex mechanism*/

	halbtc8723b2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
	halbtc8723b2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, false);

	halbtc8723b2ant_sw_mechanism1(btcoexist, false, false, false, false);
	halbtc8723b2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
}

void halbtc8723b2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
{
	bool wifi_connected = false;
	bool low_pwr_disable = true;

	btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
			   &low_pwr_disable);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
			   &wifi_connected);

	if (wifi_connected) {
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
	} else {
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
	}
	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
	halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	halbtc8723b2ant_sw_mechanism1(btcoexist, false, false, false, false);
	halbtc8723b2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);

	coex_dm->need_recover_0x948 = true;
	coex_dm->backup_0x948 = btcoexist->btc_read_2byte(btcoexist, 0x948);

	halbtc8723b2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_AUX,
				     false, false);
}

bool halbtc8723b2ant_is_common_action(struct btc_coexist *btcoexist)
{
	bool bCommon = false, wifi_connected = false;
	bool wifi_busy = false;
	bool bt_hs_on = false, low_pwr_disable = false;

	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
			   &wifi_connected);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);

	if (!wifi_connected) {
		low_pwr_disable = false;
		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
				   &low_pwr_disable);

		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], Wifi non-connected idle!!\n");

		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
					  0x0);
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
		halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

 		halbtc8723b2ant_sw_mechanism1(btcoexist, false, false, false,
					      false);
		halbtc8723b2ant_sw_mechanism2(btcoexist, false, false, false,
					      0x18);

		bCommon = true;
	} else {
		if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
		    coex_dm->bt_status) {
			low_pwr_disable = false;
			btcoexist->btc_set(btcoexist,
					   BTC_SET_ACT_DISABLE_LOW_POWER,
					   &low_pwr_disable);

			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Wifi connected + "
				  "BT non connected-idle!!\n");

			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
						  0xfffff, 0x0);
			halbtc8723b2ant_coex_table_with_type(btcoexist,
							     NORMAL_EXEC, 0);
			halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
						1);
			halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
							 0xb);
			halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
						   false);

	      		halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);

			bCommon = true;
		} else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE ==
			   coex_dm->bt_status) {
			low_pwr_disable = true;
			btcoexist->btc_set(btcoexist,
					   BTC_SET_ACT_DISABLE_LOW_POWER,
					   &low_pwr_disable);

			if(bt_hs_on)
				return false;
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Wifi connected + "
				  "BT connected-idle!!\n");

			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
						  0xfffff, 0x0);
			halbtc8723b2ant_coex_table_with_type(btcoexist,
							     NORMAL_EXEC, 0);
			halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
						1);
			halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
							 0xb);
			halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
						   false);

			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);

			bCommon = true;
		} else {
			low_pwr_disable = true;
			btcoexist->btc_set(btcoexist,
					   BTC_SET_ACT_DISABLE_LOW_POWER,
					   &low_pwr_disable);

			if (wifi_busy) {
				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], Wifi Connected-Busy + "
					  "BT Busy!!\n");
				bCommon = false;
			} else {
				if(bt_hs_on)
					return false;

				BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
					  "[BTCoex], Wifi Connected-Idle + "
					  "BT Busy!!\n");

				btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
							  0x1, 0xfffff, 0x0);
				halbtc8723b2ant_coex_table_with_type(btcoexist,
								    NORMAL_EXEC,
								    7);
				halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
							true, 21);
				halbtc8723b2ant_fw_dac_swing_lvl(btcoexist,
								 NORMAL_EXEC,
								 0xb);
				if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
					halbtc8723b2ant_dec_bt_pwr(btcoexist,
								   NORMAL_EXEC,
								   true);
				else
					halbtc8723b2ant_dec_bt_pwr(btcoexist,
								   NORMAL_EXEC,
								   false);
				halbtc8723b2ant_sw_mechanism1(btcoexist, false,
							      false, false,
							      false);
				halbtc8723b2ant_sw_mechanism2(btcoexist, false,
							      false, false,
							      0x18);
				bCommon = true;
			}
		}
	}

	return bCommon;
}
void halbtc8723b2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
					  bool sco_hid, bool tx_pause,
					  u8 max_interval)
{
	static s32 up, dn, m, n, wait_count;
	/*0: no change, +1: increase WiFi duration, -1: decrease WiFi duration*/
	s32 result;
	u8 retryCount=0;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
		  "[BTCoex], TdmaDurationAdjust()\n");

	if (!coex_dm->auto_tdma_adjust) {
		coex_dm->auto_tdma_adjust = true;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], first run TdmaDurationAdjust()!!\n");
		if (sco_hid) {
			if (tx_pause) {
				if (max_interval == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 13);
					coex_dm->ps_tdma_du_adj_type = 13;
				}else if (max_interval == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 14);
					coex_dm->ps_tdma_du_adj_type = 14;
				} else if (max_interval == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				} else {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				}
			} else {
				if(max_interval == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 9);
					coex_dm->ps_tdma_du_adj_type = 9;
				} else if (max_interval == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 10);
					coex_dm->ps_tdma_du_adj_type = 10;
				} else if (max_interval == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				} else {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				}
			}
		} else {
			if (tx_pause) {
				if (max_interval == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 5);
					coex_dm->ps_tdma_du_adj_type = 5;
				} else if (max_interval == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 6);
					coex_dm->ps_tdma_du_adj_type = 6;
				} else if (max_interval == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				} else {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				}
			} else {
				if (max_interval == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 1);
					coex_dm->ps_tdma_du_adj_type = 1;
				} else if (max_interval == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 2);
					coex_dm->ps_tdma_du_adj_type = 2;
				} else if (max_interval == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				} else {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				}
			}
		}

		up = 0;
		dn = 0;
		m = 1;
		n= 3;
		result = 0;
		wait_count = 0;
	} else {
		/*accquire the BT TRx retry count from BT_Info byte2*/
		retryCount = coex_sta->bt_retry_cnt;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], retryCount = %d\n", retryCount);
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_count=%d\n",
			  up, dn, m, n, wait_count);
		result = 0;
		wait_count++;
		 /* no retry in the last 2-second duration*/
		if (retryCount == 0) {
			up++;
			dn--;

			if (dn <= 0)
				dn = 0;

			if (up >= n) {
				wait_count = 0;
				n = 3;
				up = 0;
				dn = 0;
				result = 1;
 				BTC_PRINT(BTC_MSG_ALGORITHM,
 					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], Increase wifi "
					  "duration!!\n");
			}/* <=3 retry in the last 2-second duration*/
		} else if (retryCount <= 3) {
			up--;
			dn++;

			if (up <= 0)
				up = 0;

			if (dn == 2) {
				if (wait_count <= 2)
					m++;
				else
					m = 1;

				if (m >= 20)
					m = 20;

				n = 3 * m;
				up = 0;
				dn = 0;
				wait_count = 0;
				result = -1;
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], Decrease wifi duration "
					  "for retryCounter<3!!\n");
			}
		} else {
			if (wait_count == 1)
				m++;
			else
				m = 1;

			if (m >= 20)
				m = 20;

			n = 3 * m;
			up = 0;
			dn = 0;
			wait_count = 0;
			result = -1;
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
				  "[BTCoex], Decrease wifi duration "
				  "for retryCounter>3!!\n");
		}

		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], max Interval = %d\n", max_interval);
		if (max_interval == 1) {
			if (tx_pause) {
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], TxPause = 1\n");

				if (coex_dm->cur_ps_tdma == 71) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 5);
					coex_dm->ps_tdma_du_adj_type = 5;
				} else if (coex_dm->cur_ps_tdma == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 5);
					coex_dm->ps_tdma_du_adj_type = 5;
				} else if (coex_dm->cur_ps_tdma == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 6);
					coex_dm->ps_tdma_du_adj_type = 6;
				} else if (coex_dm->cur_ps_tdma == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				} else if (coex_dm->cur_ps_tdma == 4) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 8);
					coex_dm->ps_tdma_du_adj_type = 8;
				}

				if (coex_dm->cur_ps_tdma == 9) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 13);
					coex_dm->ps_tdma_du_adj_type = 13;
				} else if (coex_dm->cur_ps_tdma == 10) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 14);
					coex_dm->ps_tdma_du_adj_type = 14;
				} else if (coex_dm->cur_ps_tdma == 11) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				} else if (coex_dm->cur_ps_tdma == 12) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 16);
					coex_dm->ps_tdma_du_adj_type = 16;
				}

				if (result == -1) {
					if (coex_dm->cur_ps_tdma == 5) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 6);
						coex_dm->ps_tdma_du_adj_type =
									      6;
					} else if (coex_dm->cur_ps_tdma == 6) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 7) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 8);
						coex_dm->ps_tdma_du_adj_type =
									      8;
					} else if (coex_dm->cur_ps_tdma == 13) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 14);
						coex_dm->ps_tdma_du_adj_type =
									     14;
					} else if(coex_dm->cur_ps_tdma == 14) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if(coex_dm->cur_ps_tdma == 15) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 16);
						coex_dm->ps_tdma_du_adj_type =
									     16;
					}
				}  else if (result == 1) {
					if (coex_dm->cur_ps_tdma == 8) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 7) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 6);
						coex_dm->ps_tdma_du_adj_type =
									      6;
					} else if(coex_dm->cur_ps_tdma == 6) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 5);
						coex_dm->ps_tdma_du_adj_type =
									      5;
					} else if(coex_dm->cur_ps_tdma == 16) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if(coex_dm->cur_ps_tdma == 15) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 14);
						coex_dm->ps_tdma_du_adj_type =
									     14;
					} else if(coex_dm->cur_ps_tdma == 14) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 13);
						coex_dm->ps_tdma_du_adj_type =
									     13;
					}
				}
			} else {
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], TxPause = 0\n");
				if (coex_dm->cur_ps_tdma == 5) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 71);
					coex_dm->ps_tdma_du_adj_type = 71;
				} else if (coex_dm->cur_ps_tdma == 6) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 2);
					coex_dm->ps_tdma_du_adj_type = 2;
				} else if (coex_dm->cur_ps_tdma == 7) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				} else if (coex_dm->cur_ps_tdma == 8) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 4);
					coex_dm->ps_tdma_du_adj_type = 4;
				}

				if (coex_dm->cur_ps_tdma == 13) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 9);
					coex_dm->ps_tdma_du_adj_type = 9;
				} else if (coex_dm->cur_ps_tdma == 14) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 10);
					coex_dm->ps_tdma_du_adj_type = 10;
				} else if (coex_dm->cur_ps_tdma == 15) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				} else if(coex_dm->cur_ps_tdma == 16) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 12);
					coex_dm->ps_tdma_du_adj_type = 12;
				}

				if (result == -1) {
					if (coex_dm->cur_ps_tdma == 71) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 1);
						coex_dm->ps_tdma_du_adj_type =
									      1;
					} else if (coex_dm->cur_ps_tdma == 1) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 2);
						coex_dm->ps_tdma_du_adj_type =
									      2;
					} else if (coex_dm->cur_ps_tdma == 2) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if(coex_dm->cur_ps_tdma == 3) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 4);
						coex_dm->ps_tdma_du_adj_type =
									      4;
					} else if(coex_dm->cur_ps_tdma == 9) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 10);
						coex_dm->ps_tdma_du_adj_type =
									     10;
 					} else if (coex_dm->cur_ps_tdma == 10) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 11) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 12);
						coex_dm->ps_tdma_du_adj_type =
									     12;
					}
				}  else if (result == 1) {
					if (coex_dm->cur_ps_tdma == 4) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 3) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 2);
						coex_dm->ps_tdma_du_adj_type =
									      2;
					} else if (coex_dm->cur_ps_tdma == 2) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 1);
						coex_dm->ps_tdma_du_adj_type =
									      1;
					} else if (coex_dm->cur_ps_tdma == 1) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 71);
						coex_dm->ps_tdma_du_adj_type =
									     71;
					} else if (coex_dm->cur_ps_tdma == 12) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 11) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 10);
						coex_dm->ps_tdma_du_adj_type =
									     10;
					} else if (coex_dm->cur_ps_tdma == 10) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 9);
						coex_dm->ps_tdma_du_adj_type =
									      9;
					}
				}
			}
		} else if(max_interval == 2) {
			if (tx_pause) {
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], TxPause = 1\n");
				if (coex_dm->cur_ps_tdma == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 6);
					coex_dm->ps_tdma_du_adj_type = 6;
				} else if (coex_dm->cur_ps_tdma == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 6);
					coex_dm->ps_tdma_du_adj_type = 6;
				} else if (coex_dm->cur_ps_tdma == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				} else if (coex_dm->cur_ps_tdma == 4) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 8);
					coex_dm->ps_tdma_du_adj_type = 8;
				}
				if (coex_dm->cur_ps_tdma == 9) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 14);
					coex_dm->ps_tdma_du_adj_type = 14;
				} else if (coex_dm->cur_ps_tdma == 10) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 14);
					coex_dm->ps_tdma_du_adj_type = 14;
				} else if (coex_dm->cur_ps_tdma == 11) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				} else if (coex_dm->cur_ps_tdma == 12) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 16);
					coex_dm->ps_tdma_du_adj_type = 16;
				}
				if (result == -1) {
					if (coex_dm->cur_ps_tdma == 5) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 6);
						coex_dm->ps_tdma_du_adj_type =
									      6;
					} else if (coex_dm->cur_ps_tdma == 6) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 7) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 8);
						coex_dm->ps_tdma_du_adj_type =
									      8;
					} else if (coex_dm->cur_ps_tdma == 13) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 14);
						coex_dm->ps_tdma_du_adj_type =
									     14;
					} else if (coex_dm->cur_ps_tdma == 14) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if (coex_dm->cur_ps_tdma == 15) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 16);
						coex_dm->ps_tdma_du_adj_type =
									     16;
					}
				}  else if (result == 1) {
					if (coex_dm->cur_ps_tdma == 8) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 7) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 6);
						coex_dm->ps_tdma_du_adj_type =
									      6;
					} else if (coex_dm->cur_ps_tdma == 6) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 6);
						coex_dm->ps_tdma_du_adj_type =
									      6;
					} else if (coex_dm->cur_ps_tdma == 16) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if (coex_dm->cur_ps_tdma == 15) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 14);
						coex_dm->ps_tdma_du_adj_type =
									     14;
					} else if (coex_dm->cur_ps_tdma == 14) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 14);
						coex_dm->ps_tdma_du_adj_type =
									     14;
					}
				}
			} else {
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], TxPause = 0\n");
				if (coex_dm->cur_ps_tdma == 5) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 2);
					coex_dm->ps_tdma_du_adj_type = 2;
				} else if (coex_dm->cur_ps_tdma == 6) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 2);
					coex_dm->ps_tdma_du_adj_type = 2;
				} else if (coex_dm->cur_ps_tdma == 7) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				} else if (coex_dm->cur_ps_tdma == 8) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 4);
					coex_dm->ps_tdma_du_adj_type = 4;
				}
				if (coex_dm->cur_ps_tdma == 13) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 10);
					coex_dm->ps_tdma_du_adj_type = 10;
				} else if (coex_dm->cur_ps_tdma == 14){
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 10);
					coex_dm->ps_tdma_du_adj_type = 10;
				} else if (coex_dm->cur_ps_tdma == 15) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				} else if (coex_dm->cur_ps_tdma == 16) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 12);
					coex_dm->ps_tdma_du_adj_type = 12;
				}
				if (result == -1) {
					if (coex_dm->cur_ps_tdma == 1) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 2);
						coex_dm->ps_tdma_du_adj_type =
									      2;
					} else if (coex_dm->cur_ps_tdma == 2) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 3) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 4);
						coex_dm->ps_tdma_du_adj_type =
									      4;
					} else if (coex_dm->cur_ps_tdma == 9) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 10);
						coex_dm->ps_tdma_du_adj_type =
									     10;
					} else if (coex_dm->cur_ps_tdma == 10) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 11) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 12);
						coex_dm->ps_tdma_du_adj_type =
									     12;
					}
				} else if (result == 1) {
					if (coex_dm->cur_ps_tdma == 4) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 3) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 2);
						coex_dm->ps_tdma_du_adj_type =
									      2;
					} else if (coex_dm->cur_ps_tdma == 2) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 2);
						coex_dm->ps_tdma_du_adj_type =
									      2;
					} else if (coex_dm->cur_ps_tdma == 12) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 11) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 10);
						coex_dm->ps_tdma_du_adj_type =
									     10;
					} else if (coex_dm->cur_ps_tdma == 10) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 10);
						coex_dm->ps_tdma_du_adj_type =
									     10;
					}
				}
			}
		} else if (max_interval == 3) {
			if (tx_pause) {
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], TxPause = 1\n");
				if (coex_dm->cur_ps_tdma == 1) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				} else if (coex_dm->cur_ps_tdma == 2) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				} else if (coex_dm->cur_ps_tdma == 3) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 7);
					coex_dm->ps_tdma_du_adj_type = 7;
				} else if (coex_dm->cur_ps_tdma == 4) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 8);
					coex_dm->ps_tdma_du_adj_type = 8;
				}
				if (coex_dm->cur_ps_tdma == 9) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				} else if (coex_dm->cur_ps_tdma == 10) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				} else if (coex_dm->cur_ps_tdma == 11) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 15);
					coex_dm->ps_tdma_du_adj_type = 15;
				} else if (coex_dm->cur_ps_tdma == 12) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 16);
					coex_dm->ps_tdma_du_adj_type = 16;
				}
				if (result == -1) {
					if (coex_dm->cur_ps_tdma == 5) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 6) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 7) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 8);
						coex_dm->ps_tdma_du_adj_type =
									      8;
					} else if (coex_dm->cur_ps_tdma == 13) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if (coex_dm->cur_ps_tdma == 14) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if (coex_dm->cur_ps_tdma == 15) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 16);
						coex_dm->ps_tdma_du_adj_type =
									     16;
					}
				}  else if (result == 1) {
					if (coex_dm->cur_ps_tdma == 8) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 7) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 6) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 7);
						coex_dm->ps_tdma_du_adj_type =
									      7;
					} else if (coex_dm->cur_ps_tdma == 16) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if (coex_dm->cur_ps_tdma == 15) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					} else if (coex_dm->cur_ps_tdma == 14) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 15);
						coex_dm->ps_tdma_du_adj_type =
									     15;
					}
				}
			} else {
				BTC_PRINT(BTC_MSG_ALGORITHM,
					  ALGO_TRACE_FW_DETAIL,
					  "[BTCoex], TxPause = 0\n");
				if (coex_dm->cur_ps_tdma == 5) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				} else if (coex_dm->cur_ps_tdma == 6) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				} else if (coex_dm->cur_ps_tdma == 7) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 3);
					coex_dm->ps_tdma_du_adj_type = 3;
				} else if (coex_dm->cur_ps_tdma == 8) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 4);
					coex_dm->ps_tdma_du_adj_type = 4;
				}
				if (coex_dm->cur_ps_tdma == 13) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				} else if (coex_dm->cur_ps_tdma == 14) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				} else if (coex_dm->cur_ps_tdma == 15) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 11);
					coex_dm->ps_tdma_du_adj_type = 11;
				} else if (coex_dm->cur_ps_tdma == 16) {
					halbtc8723b2ant_ps_tdma(btcoexist,
								NORMAL_EXEC,
								true, 12);
					coex_dm->ps_tdma_du_adj_type = 12;
				}
				if (result == -1) {
					if (coex_dm->cur_ps_tdma == 1) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 2) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 3) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 4);
						coex_dm->ps_tdma_du_adj_type =
									      4;
					} else if (coex_dm->cur_ps_tdma == 9) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 10) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 11) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 12);
						coex_dm->ps_tdma_du_adj_type =
									     12;
					}
				} else if (result == 1) {
					if (coex_dm->cur_ps_tdma == 4) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 3) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 2) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 3);
						coex_dm->ps_tdma_du_adj_type =
									      3;
					} else if (coex_dm->cur_ps_tdma == 12) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 11) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					} else if (coex_dm->cur_ps_tdma == 10) {
						halbtc8723b2ant_ps_tdma(
								btcoexist,
								NORMAL_EXEC,
								true, 11);
						coex_dm->ps_tdma_du_adj_type =
									     11;
					}
				}
			}
		}
	}

	/*if current PsTdma not match with the recorded one (when scan, dhcp..),
	 *then we have to adjust it back to the previous record one.*/
	if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
		bool scan = false, link = false, roam = false;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
			  "[BTCoex], PsTdma type dismatch!!!, "
			  "curPsTdma=%d, recordPsTdma=%d\n",
			  coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);

		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);

		if (!scan && !link && !roam)
			halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
						coex_dm->ps_tdma_du_adj_type);
		else
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
				  "[BTCoex], roaming/link/scan is under"
				  " progress, will adjust next time!!!\n");
	}
}

/* SCO only or SCO+PAN(HS) */
void halbtc8723b2ant_action_sco(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	/*for SCO quality at 11b/g mode*/
	if (BTC_WIFI_BW_LEGACY == wifi_bw)
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
	else  /*for SCO quality & wifi performance balance at 11n mode*/
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);

	/*for voice quality */
	halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);

	/* sw mechanism */
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      true, 0x4);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      true, 0x4);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      true, 0x4);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      true, 0x4);
		}
	}
}


void halbtc8723b2ant_action_hid(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, bt_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	if (BTC_WIFI_BW_LEGACY == wifi_bw) /*/for HID at 11b/g mode*/
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
	else  /*for HID quality & wifi performance balance at 11n mode*/
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 9);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
	else
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);

	/* sw mechanism */
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
 			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
 			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

/*A2DP only / PAN(EDR) only/ A2DP+PAN(HS)*/
void halbtc8723b2ant_action_a2dp(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
	u32 wifi_bw;
	u8 ap_num = 0;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	wifi_rssi_state1 = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							   1, 2, 40, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);

	/* define the office environment */
	/* driver don't know AP num in Linux, so we will never enter this if */
	if (ap_num >= 10 && BTC_RSSI_HIGH(wifi_rssi_state1)) {
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
					  0x0);
		halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);

		/* sw mechanism */
		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
		if (BTC_WIFI_BW_HT40 == wifi_bw) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      true, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      true, 0x18);
		}
		return;
	}

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
		halbtc8723b2ant_tdma_duration_adjust(btcoexist,false, false, 1);
	else
		halbtc8723b2ant_tdma_duration_adjust(btcoexist,false, true, 1);

	/* sw mechanism */
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
 			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

void halbtc8723b2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);

	halbtc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 2);

	/* sw mechanism */
	btcoexist->btc_get(btcoexist,
		BTC_GET_U4_WIFI_BW, &wifi_bw);
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
 			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false,0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

void halbtc8723b2ant_action_pan_edr(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, bt_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
	else
		halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);

	/* sw mechanism */
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}


/*PAN(HS) only*/
void halbtc8723b2ant_action_pan_hs(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);

	halbtc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

/*PAN(EDR)+A2DP*/
void halbtc8723b2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, bt_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
		halbtc8723b2ant_coex_table_with_type(btcoexist,NORMAL_EXEC, 12);
		if (BTC_WIFI_BW_HT40 == wifi_bw)
			halbtc8723b2ant_tdma_duration_adjust(btcoexist, false,
							     true, 3);
		else
			halbtc8723b2ant_tdma_duration_adjust(btcoexist, false,
							     false, 3);
	} else {
		halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
		halbtc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 3);
	}

	/* sw mechanism	*/
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, false,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

void halbtc8723b2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, bt_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
		if (BTC_WIFI_BW_HT40 == wifi_bw) {
			halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
							 3);
			halbtc8723b2ant_coex_table_with_type(btcoexist,
							     NORMAL_EXEC, 11);
			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
						  0xfffff, 0x780);
		} else {
			halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
							 6);
			halbtc8723b2ant_coex_table_with_type(btcoexist,
							     NORMAL_EXEC, 7);
			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
						  0xfffff, 0x0);
		}
		halbtc8723b2ant_tdma_duration_adjust(btcoexist, true, false, 2);
	} else {
		halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
		halbtc8723b2ant_coex_table_with_type(btcoexist,NORMAL_EXEC, 11);
		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
					  0x0);
		halbtc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 2);
	}

	/* sw mechanism */
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
 			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)){
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

/* HID+A2DP+PAN(EDR) */
void halbtc8723b2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, bt_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
		if (BTC_WIFI_BW_HT40 == wifi_bw)
			halbtc8723b2ant_tdma_duration_adjust(btcoexist, true,
							     true, 2);
		else
			halbtc8723b2ant_tdma_duration_adjust(btcoexist, true,
							     false, 3);
	} else {
		halbtc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 3);
	}

	/* sw mechanism */
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

void halbtc8723b2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
{
	u8 wifi_rssi_state, bt_rssi_state;
	u32 wifi_bw;

	wifi_rssi_state = halbtc8723b2ant_wifi_rssi_state(btcoexist,
							  0, 2, 15, 0);
	bt_rssi_state = halbtc8723b2ant_bt_rssi_state(2, 29, 0);

	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);

	halbtc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);

	if (halbtc8723b2ant_need_to_dec_bt_pwr(btcoexist))
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
	else
		halbtc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);

	halbtc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);

	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
		halbtc8723b2ant_tdma_duration_adjust(btcoexist, true, false, 2);
	else
		halbtc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 2);

	/* sw mechanism */
	if (BTC_WIFI_BW_HT40 == wifi_bw) {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, true, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	} else {
		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, true, false,
						      false, 0x18);
		} else {
			halbtc8723b2ant_sw_mechanism1(btcoexist, false, true,
						      false, false);
			halbtc8723b2ant_sw_mechanism2(btcoexist, false, false,
						      false, 0x18);
		}
	}
}

void halbtc8723b2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
{
	u8 algorithm = 0;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
		  "[BTCoex], RunCoexistMechanism()===>\n");

	if (btcoexist->manual_control) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], RunCoexistMechanism(), "
			  "return for Manual CTRL <===\n");
		return;
	}

	if (coex_sta->under_ips) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], wifi is under IPS !!!\n");
		return;
	}

	algorithm = halbtc8723b2ant_action_algorithm(btcoexist);
	if (coex_sta->c2h_bt_inquiry_page &&
	    (BT_8723B_2ANT_COEX_ALGO_PANHS != algorithm)) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BT is under inquiry/page scan !!\n");
		halbtc8723b2ant_action_bt_inquiry(btcoexist);
		return;
	} else {
		if (coex_dm->need_recover_0x948) {
			coex_dm->need_recover_0x948 = false;
			btcoexist->btc_write_2byte(btcoexist, 0x948,
						   coex_dm->backup_0x948);
		}
	}

	coex_dm->cur_algorithm = algorithm;
	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Algorithm = %d \n",
		  coex_dm->cur_algorithm);

	if (halbtc8723b2ant_is_common_action(btcoexist)) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], Action 2-Ant common.\n");
		coex_dm->auto_tdma_adjust = false;
	} else {
		if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], preAlgorithm=%d, "
				  "curAlgorithm=%d\n", coex_dm->pre_algorithm,
				  coex_dm->cur_algorithm);
			coex_dm->auto_tdma_adjust = false;
		}
		switch (coex_dm->cur_algorithm) {
		case BT_8723B_2ANT_COEX_ALGO_SCO:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, algorithm = SCO.\n");
			halbtc8723b2ant_action_sco(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_HID:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, algorithm = HID.\n");
			halbtc8723b2ant_action_hid(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_A2DP:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = A2DP.\n");
			halbtc8723b2ant_action_a2dp(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = A2DP+PAN(HS).\n");
			halbtc8723b2ant_action_a2dp_pan_hs(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_PANEDR:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = PAN(EDR).\n");
			halbtc8723b2ant_action_pan_edr(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_PANHS:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = HS mode.\n");
			halbtc8723b2ant_action_pan_hs(btcoexist);
				break;
		case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = PAN+A2DP.\n");
			halbtc8723b2ant_action_pan_edr_a2dp(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = PAN(EDR)+HID.\n");
			halbtc8723b2ant_action_pan_edr_hid(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = HID+A2DP+PAN.\n");
			halbtc8723b2ant_action_hid_a2dp_pan_edr(btcoexist);
			break;
		case BT_8723B_2ANT_COEX_ALGO_HID_A2DP:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = HID+A2DP.\n");
			halbtc8723b2ant_action_hid_a2dp(btcoexist);
			break;
		default:
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], Action 2-Ant, "
				  "algorithm = coexist All Off!!\n");
			halbtc8723b2ant_coex_alloff(btcoexist);
			break;
		}
		coex_dm->pre_algorithm = coex_dm->cur_algorithm;
	}
}

void halbtc8723b2ant_wifioff_hwcfg(struct btc_coexist *btcoexist)
{
	/* set wlan_act to low */
	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
	/* Force GNT_BT to High */
	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);
	/* BT select s0/s1 is controlled by BT */
	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
}

/*********************************************************************
 *  work around function start with wa_halbtc8723b2ant_
 *********************************************************************/
/*********************************************************************
 *  extern function start with EXhalbtc8723b2ant_
 *********************************************************************/
void ex_halbtc8723b2ant_init_hwconfig(struct btc_coexist *btcoexist)
{
	u8 u8tmp = 0;

	BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
		  "[BTCoex], 2Ant Init HW Config!!\n");
	coex_dm->bt_rf0x1e_backup =
		btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);

	/* 0x790[5:0]=0x5 */
	u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
	u8tmp &= 0xc0;
	u8tmp |= 0x5;
	btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);


	/*Antenna config	*/
	halbtc8723b2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN,
				     true, false);




	/* PTA parameter */
	halbtc8723b2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);

	/* Enable counter statistics */
	/*0x76e[3] =1, WLAN_Act control by PTA*/
	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
	btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
}

void ex_halbtc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
{
	BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
		  "[BTCoex], Coex Mechanism Init!!\n");
	halbtc8723b2ant_init_coex_dm(btcoexist);
}

void ex_halbtc8723b2ant_display_coex_info(struct btc_coexist *btcoexist)
{
	struct btc_board_info *board_info = &btcoexist->board_info;
	struct btc_stack_info *stack_info = &btcoexist->stack_info;
	struct btc_bt_link_info* bt_link_info = &btcoexist->bt_link_info;
	u8 *cli_buf = btcoexist->cli_buf;
	u8 u8tmp[4], i, bt_info_ext, ps_tdma_case=0;
	u32 u32tmp[4];
	bool roam = false, scan = false;
	bool link = false, wifi_under_5g = false;
	bool bt_hs_on = false, wifi_busy = false;
	s32 wifi_rssi = 0, bt_hs_rssi = 0;
	u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck;
	u8 wifi_dot11_chnl, wifi_hs_chnl;
	u32 fw_ver = 0, bt_patch_ver = 0;
	u8 ap_num = 0;

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
		   "\r\n ============[BT Coexist info]============");
	CL_PRINTF(cli_buf);

	if (btcoexist->manual_control) {
		CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
			   "\r\n ==========[Under Manual Control]============");
		CL_PRINTF(cli_buf);
		CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
			   "\r\n ==========================================");
		CL_PRINTF(cli_buf);
	}

	if (!board_info->bt_exist) {
		CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
		CL_PRINTF(cli_buf);
		return;
	}

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
		   "Ant PG number/ Ant mechanism:",
		   board_info->pg_ant_num, board_info->btdm_ant_num);
	CL_PRINTF(cli_buf);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d",
		   "BT stack/ hci ext ver",
		   ((stack_info->profile_notified)? "Yes":"No"),
		   stack_info->hci_version);
	CL_PRINTF(cli_buf);

	btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
		   "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
		   "CoexVer/ fw_ver/ PatchVer",
		   glcoex_ver_date_8723b_2ant, glcoex_ver_8723b_2ant,
		   fw_ver, bt_patch_ver, bt_patch_ver);
	CL_PRINTF(cli_buf);

	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
			   &wifi_dot11_chnl);
	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)",
		   "Dot11 channel / HsChnl(HsMode)",
		   wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
	CL_PRINTF(cli_buf);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
		   "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info[0],
		   coex_dm->wifi_chnl_info[1], coex_dm->wifi_chnl_info[2]);
	CL_PRINTF(cli_buf);

	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
	btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
	btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d",
		   "Wifi rssi/ HS rssi/ AP#", wifi_rssi, bt_hs_rssi, ap_num);
	CL_PRINTF(cli_buf);

	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ",
		   "Wifi link/ roam/ scan", link, roam, scan);
	CL_PRINTF(cli_buf);

	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
			   &wifi_traffic_dir);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ",
		   "Wifi status", (wifi_under_5g? "5G":"2.4G"),
		   ((BTC_WIFI_BW_LEGACY == wifi_bw)? "Legacy":
		   (((BTC_WIFI_BW_HT40 == wifi_bw)? "HT40":"HT20"))),
		   ((!wifi_busy)? "idle":
		   ((BTC_WIFI_TRAFFIC_TX ==wifi_traffic_dir)?\
		   "uplink":"downlink")));
	CL_PRINTF(cli_buf);


	CL_PRINTF(cli_buf);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d",
		   "SCO/HID/PAN/A2DP",
		   bt_link_info->sco_exist, bt_link_info->hid_exist,
		   bt_link_info->pan_exist, bt_link_info->a2dp_exist);
	CL_PRINTF(cli_buf);
	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);

	bt_info_ext = coex_sta->bt_info_ext;
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
		   "BT Info A2DP rate",
		   (bt_info_ext&BIT0)? "Basic rate":"EDR rate");
	CL_PRINTF(cli_buf);

	for (i=0; i<BT_INFO_SRC_8723B_2ANT_MAX; i++) {
		if (coex_sta->bt_info_c2h_cnt[i]) {
			CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
				   "\r\n %-35s = %02x %02x %02x "
				   "%02x %02x %02x %02x(%d)",
				   glbt_info_src_8723b_2ant[i], \
				   coex_sta->bt_info_c2h[i][0],
				   coex_sta->bt_info_c2h[i][1],
				   coex_sta->bt_info_c2h[i][2],
				   coex_sta->bt_info_c2h[i][3],
				   coex_sta->bt_info_c2h[i][4],
				   coex_sta->bt_info_c2h[i][5],
				   coex_sta->bt_info_c2h[i][6],
				   coex_sta->bt_info_c2h_cnt[i]);
			CL_PRINTF(cli_buf);
		}
	}

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s",
		   "PS state, IPS/LPS",
		   ((coex_sta->under_ips? "IPS ON":"IPS OFF")),
		   ((coex_sta->under_lps? "LPS ON":"LPS OFF")));
	CL_PRINTF(cli_buf);
	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);

	/* Sw mechanism	*/
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
		   "\r\n %-35s", "============[Sw mechanism]============");
	CL_PRINTF(cli_buf);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ",
 		   "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink,
		   coex_dm->cur_low_penalty_ra, coex_dm->limited_dig);
	CL_PRINTF(cli_buf);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ",
		   "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
		   coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
		   coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
	CL_PRINTF(cli_buf);

	/* Fw mechanism	*/
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
		   "============[Fw mechanism]============");
	CL_PRINTF(cli_buf);

	ps_tdma_case = coex_dm->cur_ps_tdma;
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
		   "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)",
		   "PS TDMA", coex_dm->ps_tdma_para[0],
		   coex_dm->ps_tdma_para[1], coex_dm->ps_tdma_para[2],
		   coex_dm->ps_tdma_para[3], coex_dm->ps_tdma_para[4],
		   ps_tdma_case, coex_dm->auto_tdma_adjust);
	CL_PRINTF(cli_buf);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
		   "DecBtPwr/ IgnWlanAct", coex_dm->cur_dec_bt_pwr,
		   coex_dm->cur_ignore_wlan_act);
	CL_PRINTF(cli_buf);

	/* Hw setting */
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
		   "============[Hw setting]============");
	CL_PRINTF(cli_buf);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x",
		   "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
	CL_PRINTF(cli_buf);

	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x880);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
		   "0x778/0x880[29:25]", u8tmp[0],
		   (u32tmp[0]&0x3e000000) >> 25);
	CL_PRINTF(cli_buf);


	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
		   "0x948/ 0x67[5] / 0x765",
		   u32tmp[0], ((u8tmp[0]&0x20)>> 5), u8tmp[1]);
	CL_PRINTF(cli_buf);

	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
		   "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
		   u32tmp[0]&0x3, u32tmp[1]&0xff, u32tmp[2]&0x3);
	CL_PRINTF(cli_buf);


	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
	u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
		   "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
		   ((u8tmp[0] & 0x8)>>3), u8tmp[1],
		   ((u32tmp[0]&0x01800000)>>23), u8tmp[2]&0x1);
	CL_PRINTF(cli_buf);

	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
		   "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
	CL_PRINTF(cli_buf);

	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
		   "0xc50(dig)/0x49c(null-drop)", u32tmp[0]&0xff, u8tmp[0]);
	CL_PRINTF(cli_buf);

	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
	u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);

	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);

	fa_ofdm = ((u32tmp[0]&0xffff0000) >> 16) +
		  ((u32tmp[1]&0xffff0000) >> 16) +
		   (u32tmp[1] & 0xffff) +
		   (u32tmp[2] & 0xffff) +
		  ((u32tmp[3]&0xffff0000) >> 16) +
		   (u32tmp[3] & 0xffff) ;
	fa_cck = (u8tmp[0] << 8) + u8tmp[1];

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
		   "OFDM-CCA/OFDM-FA/CCK-FA", \
		   u32tmp[0]&0xffff, fa_ofdm, fa_cck);
	CL_PRINTF(cli_buf);

	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
		   "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
		   "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
		   u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
	CL_PRINTF(cli_buf);

	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
		   "0x770(high-pri rx/tx)",
		   coex_sta->high_priority_rx, coex_sta->high_priority_tx);
	CL_PRINTF(cli_buf);
	CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
		   "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
		   coex_sta->low_priority_tx);
	CL_PRINTF(cli_buf);
#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 1)
	halbtc8723b2ant_monitor_bt_ctr(btcoexist);
#endif
	btcoexist->btc_disp_dbg_msg(btcoexist,
	BTC_DBG_DISP_COEX_STATISTICS);
}


void ex_halbtc8723b2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
{
	if (BTC_IPS_ENTER == type) {
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], IPS ENTER notify\n");
		coex_sta->under_ips = true;
		halbtc8723b2ant_wifioff_hwcfg(btcoexist);
		halbtc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
		halbtc8723b2ant_coex_alloff(btcoexist);
	} else if (BTC_IPS_LEAVE == type) {
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], IPS LEAVE notify\n");
		coex_sta->under_ips = false;
		ex_halbtc8723b2ant_init_hwconfig(btcoexist);
		halbtc8723b2ant_init_coex_dm(btcoexist);
		halbtc8723b2ant_query_bt_info(btcoexist);
	}
}

void ex_halbtc8723b2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
{
	if (BTC_LPS_ENABLE == type) {
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], LPS ENABLE notify\n");
		coex_sta->under_lps = true;
	} else if (BTC_LPS_DISABLE == type) {
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], LPS DISABLE notify\n");
		coex_sta->under_lps = false;
	}
}

void ex_halbtc8723b2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
{
	if (BTC_SCAN_START == type)
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], SCAN START notify\n");
	else if (BTC_SCAN_FINISH == type)
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], SCAN FINISH notify\n");
}

void ex_halbtc8723b2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
{
	if (BTC_ASSOCIATE_START == type)
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], CONNECT START notify\n");
	else if (BTC_ASSOCIATE_FINISH == type)
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], CONNECT FINISH notify\n");
}

void ex_halbtc8723b2ant_media_status_notify(struct btc_coexist *btcoexist,
					    u8 type)
{
	u8 h2c_parameter[3] ={0};
	u32 wifi_bw;
	u8 wifi_central_chnl;

	if (BTC_MEDIA_CONNECT == type)
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], MEDIA connect notify\n");
	else
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], MEDIA disconnect notify\n");

	/* only 2.4G we need to inform bt the chnl mask */
	btcoexist->btc_get(btcoexist,
		BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifi_central_chnl);
	if ((BTC_MEDIA_CONNECT == type) &&
	    (wifi_central_chnl <= 14)) {
		h2c_parameter[0] = 0x1;
		h2c_parameter[1] = wifi_central_chnl;
		btcoexist->btc_get(btcoexist,
			BTC_GET_U4_WIFI_BW, &wifi_bw);
		if (BTC_WIFI_BW_HT40 == wifi_bw)
			h2c_parameter[2] = 0x30;
		else
			h2c_parameter[2] = 0x20;
	}

	coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
	coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
	coex_dm->wifi_chnl_info[2] = h2c_parameter[2];

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
		  "[BTCoex], FW write 0x66=0x%x\n",
		  h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
		  h2c_parameter[2]);

	btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
}

void ex_halbtc8723b2ant_special_packet_notify(struct btc_coexist *btcoexist,
					      u8 type)
{
	if (type == BTC_PACKET_DHCP)
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
			  "[BTCoex], DHCP Packet notify\n");
}

void ex_halbtc8723b2ant_bt_info_notify(struct btc_coexist *btcoexist,
				       u8 *tmpbuf, u8 length)
{
	u8 btInfo = 0;
	u8 i, rsp_source = 0;
	bool bt_busy = false, limited_dig = false;
	bool wifi_connected = false;

	coex_sta->c2h_bt_info_req_sent = false;

	rsp_source = tmpbuf[0]&0xf;
	if(rsp_source >= BT_INFO_SRC_8723B_2ANT_MAX)
		rsp_source = BT_INFO_SRC_8723B_2ANT_WIFI_FW;
	coex_sta->bt_info_c2h_cnt[rsp_source]++;

	BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
		  "[BTCoex], Bt info[%d], length=%d, hex data=[",
		  rsp_source, length);
	for (i = 0; i < length; i++) {
		coex_sta->bt_info_c2h[rsp_source][i] = tmpbuf[i];
		if (i == 1)
			btInfo = tmpbuf[i];
		if (i == length-1)
			BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
				  "0x%02x]\n", tmpbuf[i]);
		else
			BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
				  "0x%02x, ", tmpbuf[i]);
	}

	if (btcoexist->manual_control) {
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BtInfoNotify(), "
			  "return for Manual CTRL<===\n");
		return;
	}

	if (BT_INFO_SRC_8723B_2ANT_WIFI_FW != rsp_source) {
		coex_sta->bt_retry_cnt =	/* [3:0]*/
			coex_sta->bt_info_c2h[rsp_source][2] & 0xf;

		coex_sta->bt_rssi =
			coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;

		coex_sta->bt_info_ext =
			coex_sta->bt_info_c2h[rsp_source][4];

		/* Here we need to resend some wifi info to BT
		     because bt is reset and loss of the info.*/
		if ((coex_sta->bt_info_ext & BIT1)) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], BT ext info bit1 check,"
				  " send wifi BW&Chnl to BT!!\n");
			btcoexist->btc_get(btcoexist,BTC_GET_BL_WIFI_CONNECTED,
					   &wifi_connected);
			if (wifi_connected)
				ex_halbtc8723b2ant_media_status_notify(
							btcoexist,
							BTC_MEDIA_CONNECT);
			else
				ex_halbtc8723b2ant_media_status_notify(
							btcoexist,
							BTC_MEDIA_DISCONNECT);
		}

		if ((coex_sta->bt_info_ext & BIT3)) {
			BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
				  "[BTCoex], BT ext info bit3 check, "
				  "set BT NOT to ignore Wlan active!!\n");
			halbtc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC,
							false);
		} else {
			/* BT already NOT ignore Wlan active, do nothing here.*/
		}
#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)
		if ((coex_sta->bt_info_ext & BIT4)) {
			/* BT auto report already enabled, do nothing*/
		} else {
			halbtc8723b2ant_bt_auto_report(btcoexist, FORCE_EXEC,
						       true);
		}
#endif
	}

	/* check BIT2 first ==> check if bt is under inquiry or page scan*/
	if (btInfo & BT_INFO_8723B_2ANT_B_INQ_PAGE)
		coex_sta->c2h_bt_inquiry_page = true;
	else
		coex_sta->c2h_bt_inquiry_page = false;

	/* set link exist status*/
	if (!(btInfo & BT_INFO_8723B_2ANT_B_CONNECTION)) {
		coex_sta->bt_link_exist = false;
		coex_sta->pan_exist = false;
		coex_sta->a2dp_exist = false;
		coex_sta->hid_exist = false;
		coex_sta->sco_exist = false;
	} else {// connection exists
		coex_sta->bt_link_exist = true;
		if (btInfo & BT_INFO_8723B_2ANT_B_FTP)
			coex_sta->pan_exist = true;
		else
			coex_sta->pan_exist = false;
		if (btInfo & BT_INFO_8723B_2ANT_B_A2DP)
			coex_sta->a2dp_exist = true;
		else
			coex_sta->a2dp_exist = false;
		if (btInfo & BT_INFO_8723B_2ANT_B_HID)
			coex_sta->hid_exist = true;
		else
			coex_sta->hid_exist = false;
		if (btInfo & BT_INFO_8723B_2ANT_B_SCO_ESCO)
			coex_sta->sco_exist = true;
		else
			coex_sta->sco_exist = false;
	}

	halbtc8723b2ant_update_bt_link_info(btcoexist);

	if (!(btInfo & BT_INFO_8723B_2ANT_B_CONNECTION)) {
		coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BtInfoNotify(), "
			  "BT Non-Connected idle!!!\n");
	/* connection exists but no busy */
	} else if (btInfo == BT_INFO_8723B_2ANT_B_CONNECTION) {
		coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
	} else if ((btInfo & BT_INFO_8723B_2ANT_B_SCO_ESCO) ||
		   (btInfo & BT_INFO_8723B_2ANT_B_SCO_BUSY)) {
		coex_dm->bt_status =
			BT_8723B_2ANT_BT_STATUS_SCO_BUSY;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
	} else if (btInfo&BT_INFO_8723B_2ANT_B_ACL_BUSY) {
		coex_dm->bt_status =
			BT_8723B_2ANT_BT_STATUS_ACL_BUSY;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
	} else {
		coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_MAX;
		BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
			  "[BTCoex], BtInfoNotify(), "
			  "BT Non-Defined state!!!\n");
	}

	if ((BT_8723B_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
	    (BT_8723B_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
	    (BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
		bt_busy = true;
		limited_dig = true;
	} else {
		bt_busy = false;
		limited_dig = false;
	}

	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);

	coex_dm->limited_dig = limited_dig;
	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);

	halbtc8723b2ant_run_coexist_mechanism(btcoexist);
}

void ex_halbtc8723b2ant_halt_notify(struct btc_coexist *btcoexist)
{
	BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, "[BTCoex], Halt notify\n");

	halbtc8723b2ant_wifioff_hwcfg(btcoexist);
	halbtc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
	ex_halbtc8723b2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
}

void ex_halbtc8723b2ant_periodical(struct btc_coexist *btcoexist)
{
	struct btc_board_info *board_info = &btcoexist->board_info;
	struct btc_stack_info *stack_info = &btcoexist->stack_info;
	static u8 dis_ver_info_cnt = 0;
	u32 fw_ver = 0, bt_patch_ver = 0;

	BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
		  "[BTCoex], =========================="
		  "Periodical===========================\n");

	if (dis_ver_info_cnt <= 5) {
		dis_ver_info_cnt += 1;
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
			  "[BTCoex], ****************************"
			  "************************************\n");
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
			  "[BTCoex], Ant PG Num/ Ant Mech/ "
			  "Ant Pos = %d/ %d/ %d\n", board_info->pg_ant_num,
			  board_info->btdm_ant_num, board_info->btdm_ant_pos);
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
			  "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
			  ((stack_info->profile_notified)? "Yes":"No"),
			  stack_info->hci_version);
		btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
				   &bt_patch_ver);
		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
			  "[BTCoex], CoexVer/ fw_ver/ PatchVer = "
			  "%d_%x/ 0x%x/ 0x%x(%d)\n",
			  glcoex_ver_date_8723b_2ant, glcoex_ver_8723b_2ant,
			  fw_ver, bt_patch_ver, bt_patch_ver);
		BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
			  "[BTCoex], *****************************"
			  "***********************************\n");
	}

#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)
	halbtc8723b2ant_query_bt_info(btcoexist);
	halbtc8723b2ant_monitor_bt_ctr(btcoexist);
	halbtc8723b2ant_monitor_bt_enable_disable(btcoexist);
#else
	if (halbtc8723b2ant_is_wifi_status_changed(btcoexist) ||
	    coex_dm->auto_tdma_adjust)
		halbtc8723b2ant_run_coexist_mechanism(btcoexist);
#endif
}


#endif

