/******************************************************************************
 *
 * Copyright(c) 2009-2012  Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

#include "hal_bt_coexist.h"
#include "../pci.h"
#include "dm.h"
#include "fw.h"
#include "../rtl8723com/fw_common.h"
#include "../rtl8723com/fw_common.h"
#include "phy.h"
#include "reg.h"
#include "hal_btc.h"

void rtl8723ae_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
						 bool reject)
{
}

void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw)
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_phy *rtlphy = &(rtlpriv->phy);

	if (rtlpriv->link_info.busytraffic) {
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_IDLE;

		if (rtlpriv->link_info.tx_busy_traffic)
			rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_UPLINK;
		else
			rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_UPLINK;

		if (rtlpriv->link_info.rx_busy_traffic)
			rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_DOWNLINK;
		else
			rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_DOWNLINK;
	} else {
		rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_WIFI_IDLE;
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_UPLINK;
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_DOWNLINK;
	}

	if (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
	    rtlpriv->mac80211.mode == WIRELESS_MODE_B) {
		rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_WIFI_LEGACY;
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_HT20;
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_HT40;
	} else {
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_LEGACY;
		if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
			rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_HT40;
			rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_HT20;
		} else {
			rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_HT20;
			rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_HT40;
		}
	}

	if (rtlpriv->bt_operation_on)
		rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_BT30;
	else
		rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_BT30;
}

u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
					  u8 level_num, u8 rssi_thresh,
					  u8 rssi_thresh1)

{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	long smooth;
	u8 bt_rssi_state = 0;

	smooth =  rtl8723ae_dm_bt_get_rx_ss(hw);

	if (level_num == 2) {
		rtlpcipriv->bt_coexist.cstate &=
				~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;

		if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_LOW) ||
		    (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_STAY_LOW)) {
			if (smooth >= (rssi_thresh +
			    BT_FW_COEX_THRESH_TOL)) {
				bt_rssi_state = BT_RSSI_STATE_HIGH;
				rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_RSSI_1_HIGH;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_1_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state switch to High\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state stay at Low\n");
			}
		} else {
			if (smooth < rssi_thresh) {
				bt_rssi_state = BT_RSSI_STATE_LOW;
				rtlpcipriv->bt_coexist.cstate |=
					 BT_COEX_STATE_WIFI_RSSI_1_LOW;
				rtlpcipriv->bt_coexist.cstate &=
					 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state switch to Low\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state stay at High\n");
			}
		}
	} else if (level_num == 3) {
		if (rssi_thresh > rssi_thresh1) {
			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
				 "[DM][BT], RSSI_1 thresh error!!\n");
			return rtlpcipriv->bt_coexist.bt_pre_rssi_state;
		}

		if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_LOW) ||
		    (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_STAY_LOW)) {
			if (smooth >=
			    (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {
				bt_rssi_state = BT_RSSI_STATE_MEDIUM;
				rtlpcipriv->bt_coexist.cstate |=
					 BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
				rtlpcipriv->bt_coexist.cstate &=
					 ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
				rtlpcipriv->bt_coexist.cstate &=
					 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state switch to Medium\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state stay at Low\n");
			}
		} else if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
			   BT_RSSI_STATE_MEDIUM) ||
			   (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
			   BT_RSSI_STATE_STAY_MEDIUM)) {
			if (smooth >= (rssi_thresh1 +
			    BT_FW_COEX_THRESH_TOL)) {
				bt_rssi_state = BT_RSSI_STATE_HIGH;
				rtlpcipriv->bt_coexist.cstate |=
					 BT_COEX_STATE_WIFI_RSSI_1_HIGH;
				rtlpcipriv->bt_coexist.cstate &=
					 ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
				rtlpcipriv->bt_coexist.cstate &=
					 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state switch to High\n");
			} else if (smooth < rssi_thresh) {
				bt_rssi_state = BT_RSSI_STATE_LOW;
				rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_RSSI_1_LOW;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state switch to Low\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state stay at Medium\n");
			}
		} else {
			if (smooth < rssi_thresh1) {
				bt_rssi_state = BT_RSSI_STATE_MEDIUM;
				rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_1_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state switch to Medium\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI_1 state stay at High\n");
			}
		}
	}

	rtlpcipriv->bt_coexist.bt_pre_rssi_state1 = bt_rssi_state;

	return bt_rssi_state;
}

u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
					 u8 level_num, u8 rssi_thresh,
					 u8 rssi_thresh1)
{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	long smooth;
	u8 bt_rssi_state = 0;

	smooth = rtl8723ae_dm_bt_get_rx_ss(hw);

	if (level_num == 2) {
		rtlpcipriv->bt_coexist.cstate &=
					 ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;

		if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_LOW) ||
		    (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_STAY_LOW)){
			if (smooth >=
			    (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
				bt_rssi_state = BT_RSSI_STATE_HIGH;
				rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_RSSI_HIGH;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state switch to High\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state stay at Low\n");
			}
		} else {
			if (smooth < rssi_thresh) {
				bt_rssi_state = BT_RSSI_STATE_LOW;
				rtlpcipriv->bt_coexist.cstate |=
					BT_COEX_STATE_WIFI_RSSI_LOW;
				rtlpcipriv->bt_coexist.cstate &=
					~BT_COEX_STATE_WIFI_RSSI_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state switch to Low\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state stay at High\n");
			}
		}
	} else if (level_num == 3) {
		if (rssi_thresh > rssi_thresh1) {
			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
				 "[DM][BT], RSSI thresh error!!\n");
			return rtlpcipriv->bt_coexist.bt_pre_rssi_state;
		}
		if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_LOW) ||
		    (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
		    BT_RSSI_STATE_STAY_LOW)) {
			if (smooth >=
			    (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
				bt_rssi_state = BT_RSSI_STATE_MEDIUM;
				rtlpcipriv->bt_coexist.cstate
					|= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state switch to Medium\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state stay at Low\n");
			}
		} else if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
			   BT_RSSI_STATE_MEDIUM) ||
			   (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
			   BT_RSSI_STATE_STAY_MEDIUM)) {
			if (smooth >=
			    (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
				bt_rssi_state = BT_RSSI_STATE_HIGH;
				rtlpcipriv->bt_coexist.cstate
					|= BT_COEX_STATE_WIFI_RSSI_HIGH;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state switch to High\n");
			} else if (smooth < rssi_thresh) {
				bt_rssi_state = BT_RSSI_STATE_LOW;
				rtlpcipriv->bt_coexist.cstate
					|= BT_COEX_STATE_WIFI_RSSI_LOW;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state switch to Low\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state stay at Medium\n");
			}
		} else {
			if (smooth < rssi_thresh1) {
				bt_rssi_state = BT_RSSI_STATE_MEDIUM;
				rtlpcipriv->bt_coexist.cstate
					|= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
				rtlpcipriv->bt_coexist.cstate
					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state switch to Medium\n");
			} else {
				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
					 "[DM][BT], RSSI state stay at High\n");
			}
		}
	}

	rtlpcipriv->bt_coexist.bt_pre_rssi_state = bt_rssi_state;
	return bt_rssi_state;
}

long rtl8723ae_dm_bt_get_rx_ss(struct ieee80211_hw *hw)
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	long smooth = 0;

	if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
		smooth = GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
	else
		smooth = rtlpriv->dm.entry_min_undec_sm_pwdb;

	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_get_rx_ss() = %ld\n", smooth);

	return smooth;
}

void rtl8723ae_dm_bt_balance(struct ieee80211_hw *hw,
			     bool balance_on, u8 ms0, u8 ms1)
{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	u8 h2c_parameter[3] = {0};

	if (balance_on) {
		h2c_parameter[2] = 1;
		h2c_parameter[1] = ms1;
		h2c_parameter[0] = ms0;
		rtlpcipriv->bt_coexist.fw_coexist_all_off = false;
	} else {
		h2c_parameter[2] = 0;
		h2c_parameter[1] = 0;
		h2c_parameter[0] = 0;
	}
	rtlpcipriv->bt_coexist.balance_on = balance_on;

	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
		 balance_on ? "ON" : "OFF", ms0, ms1,
		 h2c_parameter[0]<<16 | h2c_parameter[1]<<8 | h2c_parameter[2]);

	rtl8723ae_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);
}


void rtl8723ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);

	if (type == BT_AGCTABLE_OFF) {
		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
			 "[BT]AGCTable Off!\n");
		rtl_write_dword(rtlpriv, 0xc78, 0x641c0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x631d0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x621e0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x611f0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x60200001);

		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0x32000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0x71000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0xb0000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0xfc000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_G1, 0xfffff, 0x30355);
	} else if (type == BT_AGCTABLE_ON) {
		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
			 "[BT]AGCTable On!\n");
		rtl_write_dword(rtlpriv, 0xc78, 0x4e1c0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x4d1d0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x4c1e0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001);
		rtl_write_dword(rtlpriv, 0xc78, 0x4a200001);

		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0xdc000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0x90000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0x51000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_AGC_HP, 0xfffff, 0x12000);
		rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
					RF_RX_G1, 0xfffff, 0x00355);

		rtlpcipriv->bt_coexist.sw_coexist_all_off = false;
	}
}

void rtl8723ae_dm_bt_bback_off_level(struct ieee80211_hw *hw, u8 type)
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);

	if (type == BT_BB_BACKOFF_OFF) {
		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
			 "[BT]BBBackOffLevel Off!\n");
		rtl_write_dword(rtlpriv, 0xc04, 0x3a05611);
	} else if (type == BT_BB_BACKOFF_ON) {
		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
			 "[BT]BBBackOffLevel On!\n");
		rtl_write_dword(rtlpriv, 0xc04, 0x3a07611);
		rtlpcipriv->bt_coexist.sw_coexist_all_off = false;
	}
}

void rtl8723ae_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_fw_coex_all_off()\n");

	if (rtlpcipriv->bt_coexist.fw_coexist_all_off)
		return;

	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_fw_coex_all_off(), real Do\n");
	rtl8723ae_dm_bt_fw_coex_all_off_8723a(hw);
	rtlpcipriv->bt_coexist.fw_coexist_all_off = true;
}

void rtl8723ae_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);

	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_sw_coex_all_off()\n");

	if (rtlpcipriv->bt_coexist.sw_coexist_all_off)
		return;

	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_sw_coex_all_off(), real Do\n");
	rtl8723ae_dm_bt_sw_coex_all_off_8723a(hw);
	rtlpcipriv->bt_coexist.sw_coexist_all_off = true;
}

void rtl8723ae_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);

	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_hw_coex_all_off()\n");

	if (rtlpcipriv->bt_coexist.hw_coexist_all_off)
		return;
	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
		 "rtl8723ae_dm_bt_hw_coex_all_off(), real Do\n");

	rtl8723ae_dm_bt_hw_coex_all_off_8723a(hw);

	rtlpcipriv->bt_coexist.hw_coexist_all_off = true;
}

void rtl8723ae_btdm_coex_all_off(struct ieee80211_hw *hw)
{
	rtl8723ae_dm_bt_fw_coex_all_off(hw);
	rtl8723ae_dm_bt_sw_coex_all_off(hw);
	rtl8723ae_dm_bt_hw_coex_all_off(hw);
}

bool rtl8723ae_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)
{
	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);

	if ((rtlpcipriv->bt_coexist.previous_state ==
	    rtlpcipriv->bt_coexist.cstate) &&
	    (rtlpcipriv->bt_coexist.previous_state_h ==
	    rtlpcipriv->bt_coexist.cstate_h))
		return false;
	else
		return true;
}

bool rtl8723ae_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);

	if (rtlpriv->link_info.tx_busy_traffic)
		return true;
	else
		return false;
}
