brintos

brintos / linux-shallow public Read only

0
0
Text · 15.5 KiB · 6c4fedc Raw
516 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright(c) 2009-2012  Realtek Corporation.*/3 4#include "hal_bt_coexist.h"5#include "../pci.h"6#include "dm.h"7#include "fw.h"8#include "phy.h"9#include "reg.h"10#include "hal_btc.h"11 12static bool bt_operation_on;13 14void rtl8723e_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,15						bool b_reject)16{17}18 19void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw)20{21	struct rtl_priv *rtlpriv = rtl_priv(hw);22	struct rtl_phy *rtlphy = &(rtlpriv->phy);23 24	if (rtlpriv->link_info.busytraffic) {25		rtlpriv->btcoexist.cstate &=26			~BT_COEX_STATE_WIFI_IDLE;27 28		if (rtlpriv->link_info.tx_busy_traffic)29			rtlpriv->btcoexist.cstate |=30				BT_COEX_STATE_WIFI_UPLINK;31		else32			rtlpriv->btcoexist.cstate &=33				~BT_COEX_STATE_WIFI_UPLINK;34 35		if (rtlpriv->link_info.rx_busy_traffic)36			rtlpriv->btcoexist.cstate |=37				BT_COEX_STATE_WIFI_DOWNLINK;38		else39			rtlpriv->btcoexist.cstate &=40				~BT_COEX_STATE_WIFI_DOWNLINK;41	} else {42		rtlpriv->btcoexist.cstate |= BT_COEX_STATE_WIFI_IDLE;43		rtlpriv->btcoexist.cstate &=44			~BT_COEX_STATE_WIFI_UPLINK;45		rtlpriv->btcoexist.cstate &=46			~BT_COEX_STATE_WIFI_DOWNLINK;47	}48 49	if (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||50	    rtlpriv->mac80211.mode == WIRELESS_MODE_B) {51		rtlpriv->btcoexist.cstate |=52			BT_COEX_STATE_WIFI_LEGACY;53		rtlpriv->btcoexist.cstate &=54			~BT_COEX_STATE_WIFI_HT20;55		rtlpriv->btcoexist.cstate &=56			~BT_COEX_STATE_WIFI_HT40;57	} else {58		rtlpriv->btcoexist.cstate &=59			~BT_COEX_STATE_WIFI_LEGACY;60		if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {61			rtlpriv->btcoexist.cstate |=62				BT_COEX_STATE_WIFI_HT40;63			rtlpriv->btcoexist.cstate &=64				~BT_COEX_STATE_WIFI_HT20;65		} else {66			rtlpriv->btcoexist.cstate |=67				BT_COEX_STATE_WIFI_HT20;68			rtlpriv->btcoexist.cstate &=69				~BT_COEX_STATE_WIFI_HT40;70		}71	}72 73	if (bt_operation_on)74		rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT30;75	else76		rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT30;77}78 79u8 rtl8723e_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,80					 u8 level_num, u8 rssi_thresh,81					 u8 rssi_thresh1)82 83{84	struct rtl_priv *rtlpriv = rtl_priv(hw);85	long undecoratedsmoothed_pwdb;86	u8 bt_rssi_state = 0;87 88	undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);89 90	if (level_num == 2) {91		rtlpriv->btcoexist.cstate &=92			~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;93 94		if ((rtlpriv->btcoexist.bt_pre_rssi_state ==95		     BT_RSSI_STATE_LOW) ||96		    (rtlpriv->btcoexist.bt_pre_rssi_state ==97		     BT_RSSI_STATE_STAY_LOW)) {98			if (undecoratedsmoothed_pwdb >=99			    (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {100				bt_rssi_state = BT_RSSI_STATE_HIGH;101				rtlpriv->btcoexist.cstate |=102					BT_COEX_STATE_WIFI_RSSI_1_HIGH;103				rtlpriv->btcoexist.cstate &=104					~BT_COEX_STATE_WIFI_RSSI_1_LOW;105				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,106					"[DM][BT], RSSI_1 state switch to High\n");107			} else {108				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;109				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,110					"[DM][BT], RSSI_1 state stay at Low\n");111			}112		} else {113			if (undecoratedsmoothed_pwdb < rssi_thresh) {114				bt_rssi_state = BT_RSSI_STATE_LOW;115				rtlpriv->btcoexist.cstate |=116					BT_COEX_STATE_WIFI_RSSI_1_LOW;117				rtlpriv->btcoexist.cstate &=118					~BT_COEX_STATE_WIFI_RSSI_1_HIGH;119				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,120					"[DM][BT], RSSI_1 state switch to Low\n");121			} else {122				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;123				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,124					"[DM][BT], RSSI_1 state stay at High\n");125			}126		}127	} else if (level_num == 3) {128		if (rssi_thresh > rssi_thresh1) {129			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,130				"[DM][BT], RSSI_1 thresh error!!\n");131			return rtlpriv->btcoexist.bt_pre_rssi_state;132		}133 134		if ((rtlpriv->btcoexist.bt_pre_rssi_state ==135		     BT_RSSI_STATE_LOW) ||136		    (rtlpriv->btcoexist.bt_pre_rssi_state ==137		     BT_RSSI_STATE_STAY_LOW)) {138			if (undecoratedsmoothed_pwdb >=139			    (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {140				bt_rssi_state = BT_RSSI_STATE_MEDIUM;141				rtlpriv->btcoexist.cstate |=142					BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;143				rtlpriv->btcoexist.cstate &=144					~BT_COEX_STATE_WIFI_RSSI_1_LOW;145				rtlpriv->btcoexist.cstate &=146					~BT_COEX_STATE_WIFI_RSSI_1_HIGH;147				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,148					"[DM][BT], RSSI_1 state switch to Medium\n");149			} else {150				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;151				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,152					"[DM][BT], RSSI_1 state stay at Low\n");153			}154		} else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==155			    BT_RSSI_STATE_MEDIUM) ||156			   (rtlpriv->btcoexist.bt_pre_rssi_state ==157			    BT_RSSI_STATE_STAY_MEDIUM)) {158			if (undecoratedsmoothed_pwdb >=159			    (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {160				bt_rssi_state = BT_RSSI_STATE_HIGH;161				rtlpriv->btcoexist.cstate |=162					BT_COEX_STATE_WIFI_RSSI_1_HIGH;163				rtlpriv->btcoexist.cstate &=164					~BT_COEX_STATE_WIFI_RSSI_1_LOW;165				rtlpriv->btcoexist.cstate &=166					~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;167				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,168					"[DM][BT], RSSI_1 state switch to High\n");169			} else if (undecoratedsmoothed_pwdb < rssi_thresh) {170				bt_rssi_state = BT_RSSI_STATE_LOW;171				rtlpriv->btcoexist.cstate |=172					BT_COEX_STATE_WIFI_RSSI_1_LOW;173				rtlpriv->btcoexist.cstate &=174					~BT_COEX_STATE_WIFI_RSSI_1_HIGH;175				rtlpriv->btcoexist.cstate &=176					~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;177				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,178					"[DM][BT], RSSI_1 state switch to Low\n");179			} else {180				bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;181				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,182					"[DM][BT], RSSI_1 state stay at Medium\n");183			}184		} else {185			if (undecoratedsmoothed_pwdb < rssi_thresh1) {186				bt_rssi_state = BT_RSSI_STATE_MEDIUM;187				rtlpriv->btcoexist.cstate |=188					BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;189				rtlpriv->btcoexist.cstate &=190					~BT_COEX_STATE_WIFI_RSSI_1_HIGH;191				rtlpriv->btcoexist.cstate &=192					~BT_COEX_STATE_WIFI_RSSI_1_LOW;193				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,194					"[DM][BT], RSSI_1 state switch to Medium\n");195			} else {196				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;197				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,198					"[DM][BT], RSSI_1 state stay at High\n");199			}200		}201	}202	rtlpriv->btcoexist.bt_pre_rssi_state1 = bt_rssi_state;203 204	return bt_rssi_state;205}206 207u8 rtl8723e_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,208					u8 level_num,209					u8 rssi_thresh,210					u8 rssi_thresh1)211{212	struct rtl_priv *rtlpriv = rtl_priv(hw);213	long undecoratedsmoothed_pwdb = 0;214	u8 bt_rssi_state = 0;215 216	undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);217 218	if (level_num == 2) {219		rtlpriv->btcoexist.cstate &=220			~BT_COEX_STATE_WIFI_RSSI_MEDIUM;221 222		if ((rtlpriv->btcoexist.bt_pre_rssi_state ==223		     BT_RSSI_STATE_LOW) ||224		    (rtlpriv->btcoexist.bt_pre_rssi_state ==225		     BT_RSSI_STATE_STAY_LOW)) {226			if (undecoratedsmoothed_pwdb >=227			    (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {228				bt_rssi_state = BT_RSSI_STATE_HIGH;229				rtlpriv->btcoexist.cstate230					|= BT_COEX_STATE_WIFI_RSSI_HIGH;231				rtlpriv->btcoexist.cstate232					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;233				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,234					"[DM][BT], RSSI state switch to High\n");235			} else {236				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;237				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,238					"[DM][BT], RSSI state stay at Low\n");239			}240		} else {241			if (undecoratedsmoothed_pwdb < rssi_thresh) {242				bt_rssi_state = BT_RSSI_STATE_LOW;243				rtlpriv->btcoexist.cstate244					|= BT_COEX_STATE_WIFI_RSSI_LOW;245				rtlpriv->btcoexist.cstate246					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;247				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,248					"[DM][BT], RSSI state switch to Low\n");249			} else {250				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;251				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,252					"[DM][BT], RSSI state stay at High\n");253			}254		}255	} else if (level_num == 3) {256		if (rssi_thresh > rssi_thresh1) {257			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,258				"[DM][BT], RSSI thresh error!!\n");259			return rtlpriv->btcoexist.bt_pre_rssi_state;260		}261		if ((rtlpriv->btcoexist.bt_pre_rssi_state ==262		     BT_RSSI_STATE_LOW) ||263		    (rtlpriv->btcoexist.bt_pre_rssi_state ==264		     BT_RSSI_STATE_STAY_LOW)) {265			if (undecoratedsmoothed_pwdb >=266			    (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {267				bt_rssi_state = BT_RSSI_STATE_MEDIUM;268				rtlpriv->btcoexist.cstate269					|= BT_COEX_STATE_WIFI_RSSI_MEDIUM;270				rtlpriv->btcoexist.cstate271					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;272				rtlpriv->btcoexist.cstate273					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;274				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,275					"[DM][BT], RSSI state switch to Medium\n");276			} else {277				bt_rssi_state = BT_RSSI_STATE_STAY_LOW;278				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,279					"[DM][BT], RSSI state stay at Low\n");280			}281		} else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==282				BT_RSSI_STATE_MEDIUM) ||283			(rtlpriv->btcoexist.bt_pre_rssi_state ==284				BT_RSSI_STATE_STAY_MEDIUM)) {285			if (undecoratedsmoothed_pwdb >=286			    (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {287				bt_rssi_state = BT_RSSI_STATE_HIGH;288				rtlpriv->btcoexist.cstate289					|= BT_COEX_STATE_WIFI_RSSI_HIGH;290				rtlpriv->btcoexist.cstate291					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;292				rtlpriv->btcoexist.cstate293					&= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;294				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,295					"[DM][BT], RSSI state switch to High\n");296			} else if (undecoratedsmoothed_pwdb < rssi_thresh) {297				bt_rssi_state = BT_RSSI_STATE_LOW;298				rtlpriv->btcoexist.cstate299					|= BT_COEX_STATE_WIFI_RSSI_LOW;300				rtlpriv->btcoexist.cstate301					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;302				rtlpriv->btcoexist.cstate303					&= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;304				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,305					"[DM][BT], RSSI state switch to Low\n");306			} else {307				bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;308				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,309					"[DM][BT], RSSI state stay at Medium\n");310			}311		} else {312			if (undecoratedsmoothed_pwdb < rssi_thresh1) {313				bt_rssi_state = BT_RSSI_STATE_MEDIUM;314				rtlpriv->btcoexist.cstate315					|= BT_COEX_STATE_WIFI_RSSI_MEDIUM;316				rtlpriv->btcoexist.cstate317					&= ~BT_COEX_STATE_WIFI_RSSI_HIGH;318				rtlpriv->btcoexist.cstate319					&= ~BT_COEX_STATE_WIFI_RSSI_LOW;320				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,321					"[DM][BT], RSSI state switch to Medium\n");322			} else {323				bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;324				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,325					"[DM][BT], RSSI state stay at High\n");326			}327		}328	}329	rtlpriv->btcoexist.bt_pre_rssi_state = bt_rssi_state;330	return bt_rssi_state;331}332 333long rtl8723e_dm_bt_get_rx_ss(struct ieee80211_hw *hw)334{335	struct rtl_priv *rtlpriv = rtl_priv(hw);336	long undecoratedsmoothed_pwdb = 0;337 338	if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {339		undecoratedsmoothed_pwdb =340			GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);341	} else {342		undecoratedsmoothed_pwdb343			= rtlpriv->dm.entry_min_undec_sm_pwdb;344	}345	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,346		"%s = %ld\n", __func__,347		undecoratedsmoothed_pwdb);348 349	return undecoratedsmoothed_pwdb;350}351 352void rtl8723e_dm_bt_balance(struct ieee80211_hw *hw,353			    bool balance_on, u8 ms0, u8 ms1)354{355	struct rtl_priv *rtlpriv = rtl_priv(hw);356	u8 h2c_parameter[3] = {0};357 358	if (balance_on) {359		h2c_parameter[2] = 1;360		h2c_parameter[1] = ms1;361		h2c_parameter[0] = ms0;362		rtlpriv->btcoexist.fw_coexist_all_off = false;363	} else {364		h2c_parameter[2] = 0;365		h2c_parameter[1] = 0;366		h2c_parameter[0] = 0;367	}368	rtlpriv->btcoexist.balance_on = balance_on;369 370	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,371		"[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",372		balance_on ? "ON" : "OFF", ms0, ms1, h2c_parameter[0] << 16 |373		h2c_parameter[1] << 8 | h2c_parameter[2]);374 375	rtl8723e_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);376}377 378 379void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)380{381	struct rtl_priv *rtlpriv = rtl_priv(hw);382 383	if (type == BT_AGCTABLE_OFF) {384		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,385			"[BT]AGCTable Off!\n");386		rtl_write_dword(rtlpriv, 0xc78, 0x641c0001);387		rtl_write_dword(rtlpriv, 0xc78, 0x631d0001);388		rtl_write_dword(rtlpriv, 0xc78, 0x621e0001);389		rtl_write_dword(rtlpriv, 0xc78, 0x611f0001);390		rtl_write_dword(rtlpriv, 0xc78, 0x60200001);391 392		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,393					RF_RX_AGC_HP, 0xfffff, 0x32000);394		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,395					RF_RX_AGC_HP, 0xfffff, 0x71000);396		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,397					RF_RX_AGC_HP, 0xfffff, 0xb0000);398		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,399					RF_RX_AGC_HP, 0xfffff, 0xfc000);400		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,401					RF_RX_G1, 0xfffff, 0x30355);402	} else if (type == BT_AGCTABLE_ON) {403		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,404			"[BT]AGCTable On!\n");405		rtl_write_dword(rtlpriv, 0xc78, 0x4e1c0001);406		rtl_write_dword(rtlpriv, 0xc78, 0x4d1d0001);407		rtl_write_dword(rtlpriv, 0xc78, 0x4c1e0001);408		rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001);409		rtl_write_dword(rtlpriv, 0xc78, 0x4a200001);410 411		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,412					RF_RX_AGC_HP, 0xfffff, 0xdc000);413		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,414					RF_RX_AGC_HP, 0xfffff, 0x90000);415		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,416					RF_RX_AGC_HP, 0xfffff, 0x51000);417		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,418					RF_RX_AGC_HP, 0xfffff, 0x12000);419		rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,420					RF_RX_G1, 0xfffff, 0x00355);421 422		rtlpriv->btcoexist.sw_coexist_all_off = false;423	}424}425 426void rtl8723e_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type)427{428	struct rtl_priv *rtlpriv = rtl_priv(hw);429 430	if (type == BT_BB_BACKOFF_OFF) {431		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,432			"[BT]BBBackOffLevel Off!\n");433		rtl_write_dword(rtlpriv, 0xc04, 0x3a05611);434	} else if (type == BT_BB_BACKOFF_ON) {435		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,436			"[BT]BBBackOffLevel On!\n");437		rtl_write_dword(rtlpriv, 0xc04, 0x3a07611);438		rtlpriv->btcoexist.sw_coexist_all_off = false;439	}440}441 442void rtl8723e_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)443{444	struct rtl_priv *rtlpriv = rtl_priv(hw);445	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,446		"rtl8723e_dm_bt_fw_coex_all_off()\n");447 448	if (rtlpriv->btcoexist.fw_coexist_all_off)449		return;450 451	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,452		"rtl8723e_dm_bt_fw_coex_all_off(), real Do\n");453	rtl8723e_dm_bt_fw_coex_all_off_8723a(hw);454	rtlpriv->btcoexist.fw_coexist_all_off = true;455}456 457void rtl8723e_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)458{459	struct rtl_priv *rtlpriv = rtl_priv(hw);460 461	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,462		"%s\n", __func__);463 464	if (rtlpriv->btcoexist.sw_coexist_all_off)465		return;466 467	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,468		"%s, real Do\n", __func__);469	rtl8723e_dm_bt_sw_coex_all_off_8723a(hw);470	rtlpriv->btcoexist.sw_coexist_all_off = true;471}472 473void rtl8723e_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)474{475	struct rtl_priv *rtlpriv = rtl_priv(hw);476 477	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,478		"%s\n", __func__);479 480	if (rtlpriv->btcoexist.hw_coexist_all_off)481		return;482	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,483		"%s, real Do\n", __func__);484 485	rtl8723e_dm_bt_hw_coex_all_off_8723a(hw);486 487	rtlpriv->btcoexist.hw_coexist_all_off = true;488}489 490void rtl8723e_btdm_coex_all_off(struct ieee80211_hw *hw)491{492	rtl8723e_dm_bt_fw_coex_all_off(hw);493	rtl8723e_dm_bt_sw_coex_all_off(hw);494	rtl8723e_dm_bt_hw_coex_all_off(hw);495}496 497bool rtl8723e_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)498{499	struct rtl_priv *rtlpriv = rtl_priv(hw);500 501	if ((rtlpriv->btcoexist.previous_state == rtlpriv->btcoexist.cstate) &&502	    (rtlpriv->btcoexist.previous_state_h ==503	     rtlpriv->btcoexist.cstate_h))504		return false;505	return true;506}507 508bool rtl8723e_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)509{510	struct rtl_priv *rtlpriv = rtl_priv(hw);511 512	if (rtlpriv->link_info.tx_busy_traffic)513		return true;514	return false;515}516