1 /******************************************************************************
3 * Copyright(c) 2009-2010 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
26 * Larry Finger <Larry.Finger@lwfinger.net>
28 *****************************************************************************/
30 #include "hal_bt_coexist.h"
38 static bool bt_operation_on = false;
40 void rtl8821ae_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw, bool b_reject)
43 struct rtl_priv rtlpriv = rtl_priv(hw);
44 PRX_TS_RECORD pRxTs = NULL;
47 // Do not allow receiving A-MPDU aggregation.
48 if (rtlpriv->mac80211.vendor == PEER_CISCO) {
49 if (pHTInfo->bAcceptAddbaReq) {
50 RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU \n"));
51 pHTInfo->bAcceptAddbaReq = FALSE;
52 if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE))
53 TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR);
56 if (!pHTInfo->bAcceptAddbaReq) {
57 RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT Idle\n"));
58 pHTInfo->bAcceptAddbaReq = TRUE;
62 if(rtlpriv->mac80211.vendor == PEER_CISCO) {
63 if (!pHTInfo->bAcceptAddbaReq) {
64 RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU \n"));
65 pHTInfo->bAcceptAddbaReq = TRUE;
72 void _rtl8821ae_dm_bt_check_wifi_state(struct ieee80211_hw *hw)
74 struct rtl_priv *rtlpriv = rtl_priv(hw);
75 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
76 struct rtl_phy *rtlphy = &(rtlpriv->phy);
78 if (rtlpriv->link_info.b_busytraffic) {
79 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_IDLE;
81 if(rtlpriv->link_info.b_tx_busy_traffic) {
82 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_UPLINK;
84 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_UPLINK;
87 if(rtlpriv->link_info.b_rx_busy_traffic) {
88 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_DOWNLINK;
90 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_DOWNLINK;
93 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_IDLE;
94 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_UPLINK;
95 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_DOWNLINK;
98 if (rtlpriv->mac80211.mode == WIRELESS_MODE_G
99 || rtlpriv->mac80211.mode == WIRELESS_MODE_B) {
100 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_LEGACY;
101 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_HT20;
102 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_HT40;
104 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_LEGACY;
105 if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
106 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_HT40;
107 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_HT20;
109 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_HT20;
110 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_HT40;
114 if (bt_operation_on) {
115 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BT30;
117 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_BT30;
122 u8 rtl8821ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
123 u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
126 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
127 struct rtl_priv *rtlpriv = rtl_priv(hw);
128 long undecoratedsmoothed_pwdb = 0;
129 u8 bt_rssi_state = 0;
131 undecoratedsmoothed_pwdb = rtl8821ae_dm_bt_get_rx_ss(hw);
134 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
136 if( (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_LOW) ||
137 (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_STAY_LOW)) {
138 if(undecoratedsmoothed_pwdb >= (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
139 bt_rssi_state = BT_RSSI_STATE_HIGH;
140 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_RSSI_1_HIGH;
141 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
142 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state switch to High\n"));
144 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
145 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
148 if(undecoratedsmoothed_pwdb < rssi_thresh) {
149 bt_rssi_state = BT_RSSI_STATE_LOW;
150 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_RSSI_1_LOW;
151 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
152 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state switch to Low\n"));
154 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
155 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
158 } else if(level_num == 3) {
159 if(rssi_thresh > rssi_thresh1) {
160 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 thresh error!!\n"));
161 return rtlpcipriv->btcoexist.bt_pre_rssi_state;
164 if( (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_LOW) ||
165 (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_STAY_LOW)) {
166 if(undecoratedsmoothed_pwdb >= (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {
167 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
168 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
169 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
170 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
171 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state switch to Medium\n"));
173 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
174 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
176 } else if( (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_MEDIUM) ||
177 (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_STAY_MEDIUM)) {
178 if(undecoratedsmoothed_pwdb >= (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
179 bt_rssi_state = BT_RSSI_STATE_HIGH;
180 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_RSSI_1_HIGH;
181 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
182 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
183 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state switch to High\n"));
184 } else if(undecoratedsmoothed_pwdb < rssi_thresh) {
185 bt_rssi_state = BT_RSSI_STATE_LOW;
186 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_RSSI_1_LOW;
187 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
188 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
189 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state switch to Low\n"));
191 bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
192 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state stay at Medium\n"));
195 if(undecoratedsmoothed_pwdb < rssi_thresh1) {
196 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
197 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
198 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
199 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
200 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,("[DM][BT], RSSI_1 state switch to Medium\n"));
202 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
203 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
208 rtlpcipriv->btcoexist.bt_pre_rssi_state1 = bt_rssi_state;
210 return bt_rssi_state;
213 u8 rtl8821ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
214 u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
216 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
217 struct rtl_priv *rtlpriv = rtl_priv(hw);
218 long undecoratedsmoothed_pwdb = 0;
219 u8 bt_rssi_state = 0;
221 undecoratedsmoothed_pwdb = rtl8821ae_dm_bt_get_rx_ss(hw);
223 if (level_num == 2) {
224 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
226 if ((rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_LOW) ||
227 (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_STAY_LOW)){
228 if (undecoratedsmoothed_pwdb
229 >= (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
230 bt_rssi_state = BT_RSSI_STATE_HIGH;
231 rtlpcipriv->btcoexist.current_state
232 |= BT_COEX_STATE_WIFI_RSSI_HIGH;
233 rtlpcipriv->btcoexist.current_state
234 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
235 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
236 ("[DM][BT], RSSI state switch to High\n"));
238 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
239 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
240 ("[DM][BT], RSSI state stay at Low\n"));
243 if (undecoratedsmoothed_pwdb < rssi_thresh) {
244 bt_rssi_state = BT_RSSI_STATE_LOW;
245 rtlpcipriv->btcoexist.current_state
246 |= BT_COEX_STATE_WIFI_RSSI_LOW;
247 rtlpcipriv->btcoexist.current_state
248 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
249 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
250 ("[DM][BT], RSSI state switch to Low\n"));
252 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
253 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
254 ("[DM][BT], RSSI state stay at High\n"));
258 else if (level_num == 3) {
259 if (rssi_thresh > rssi_thresh1) {
260 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
261 ("[DM][BT], RSSI thresh error!!\n"));
262 return rtlpcipriv->btcoexist.bt_pre_rssi_state;
264 if ((rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_LOW) ||
265 (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_STAY_LOW)) {
266 if(undecoratedsmoothed_pwdb
267 >= (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
268 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
269 rtlpcipriv->btcoexist.current_state
270 |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
271 rtlpcipriv->btcoexist.current_state
272 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
273 rtlpcipriv->btcoexist.current_state
274 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
275 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
276 ("[DM][BT], RSSI state switch to Medium\n"));
278 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
279 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
280 ("[DM][BT], RSSI state stay at Low\n"));
282 } else if ((rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_MEDIUM) ||
283 (rtlpcipriv->btcoexist.bt_pre_rssi_state == BT_RSSI_STATE_STAY_MEDIUM)) {
284 if (undecoratedsmoothed_pwdb
285 >= (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
286 bt_rssi_state = BT_RSSI_STATE_HIGH;
287 rtlpcipriv->btcoexist.current_state
288 |= BT_COEX_STATE_WIFI_RSSI_HIGH;
289 rtlpcipriv->btcoexist.current_state
290 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
291 rtlpcipriv->btcoexist.current_state
292 &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
293 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
294 ("[DM][BT], RSSI state switch to High\n"));
295 } else if(undecoratedsmoothed_pwdb < rssi_thresh)
297 bt_rssi_state = BT_RSSI_STATE_LOW;
298 rtlpcipriv->btcoexist.current_state
299 |= BT_COEX_STATE_WIFI_RSSI_LOW;
300 rtlpcipriv->btcoexist.current_state
301 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
302 rtlpcipriv->btcoexist.current_state
303 &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
304 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
305 ("[DM][BT], RSSI state switch to Low\n"));
307 bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
308 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
309 ("[DM][BT], RSSI state stay at Medium\n"));
312 if(undecoratedsmoothed_pwdb < rssi_thresh1) {
313 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
314 rtlpcipriv->btcoexist.current_state
315 |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
316 rtlpcipriv->btcoexist.current_state
317 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
318 rtlpcipriv->btcoexist.current_state
319 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
320 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
321 ("[DM][BT], RSSI state switch to Medium\n"));
323 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
324 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
325 ("[DM][BT], RSSI state stay at High\n"));
330 rtlpcipriv->btcoexist.bt_pre_rssi_state = bt_rssi_state;
331 return bt_rssi_state;
333 long rtl8821ae_dm_bt_get_rx_ss(struct ieee80211_hw *hw)
335 struct rtl_priv *rtlpriv = rtl_priv(hw);
336 long undecoratedsmoothed_pwdb = 0;
338 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
339 undecoratedsmoothed_pwdb = GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
341 undecoratedsmoothed_pwdb
342 = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
344 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
345 ("rtl8821ae_dm_bt_get_rx_ss() = %ld\n", undecoratedsmoothed_pwdb));
347 return undecoratedsmoothed_pwdb;
350 void rtl8821ae_dm_bt_balance(struct ieee80211_hw *hw,
351 bool b_balance_on, u8 ms0, u8 ms1)
353 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
354 struct rtl_priv *rtlpriv = rtl_priv(hw);
355 u8 h2c_parameter[3] ={0};
358 h2c_parameter[2] = 1;
359 h2c_parameter[1] = ms1;
360 h2c_parameter[0] = ms0;
361 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
363 h2c_parameter[2] = 0;
364 h2c_parameter[1] = 0;
365 h2c_parameter[0] = 0;
367 rtlpcipriv->btcoexist.b_balance_on = b_balance_on;
369 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
370 ("[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
371 b_balance_on?"ON":"OFF", ms0, ms1,
372 h2c_parameter[0]<<16 | h2c_parameter[1]<<8 | h2c_parameter[2]));
374 rtl8821ae_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);
378 void rtl8821ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
380 struct rtl_priv *rtlpriv = rtl_priv(hw);
381 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
383 if (type == BT_AGCTABLE_OFF) {
384 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BT]AGCTable Off!\n"));
385 rtl_write_dword(rtlpriv, 0xc78,0x641c0001);
386 rtl_write_dword(rtlpriv, 0xc78,0x631d0001);
387 rtl_write_dword(rtlpriv, 0xc78,0x621e0001);
388 rtl_write_dword(rtlpriv, 0xc78,0x611f0001);
389 rtl_write_dword(rtlpriv, 0xc78,0x60200001);
391 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
392 RF_RX_AGC_HP, 0xfffff, 0x32000);
393 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
394 RF_RX_AGC_HP, 0xfffff, 0x71000);
395 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
396 RF_RX_AGC_HP, 0xfffff, 0xb0000);
397 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
398 RF_RX_AGC_HP, 0xfffff, 0xfc000);
399 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
400 RF_RX_G1, 0xfffff, 0x30355);
401 } else if (type == BT_AGCTABLE_ON) {
402 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BT]AGCTable On!\n"));
403 rtl_write_dword(rtlpriv, 0xc78,0x4e1c0001);
404 rtl_write_dword(rtlpriv, 0xc78,0x4d1d0001);
405 rtl_write_dword(rtlpriv, 0xc78,0x4c1e0001);
406 rtl_write_dword(rtlpriv, 0xc78,0x4b1f0001);
407 rtl_write_dword(rtlpriv, 0xc78,0x4a200001);
409 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
410 RF_RX_AGC_HP, 0xfffff, 0xdc000);
411 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
412 RF_RX_AGC_HP, 0xfffff, 0x90000);
413 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
414 RF_RX_AGC_HP, 0xfffff, 0x51000);
415 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
416 RF_RX_AGC_HP, 0xfffff, 0x12000);
417 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A,
418 RF_RX_G1, 0xfffff, 0x00355);
420 rtlpcipriv->btcoexist.b_sw_coexist_all_off = false;
424 void rtl8821ae_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type)
426 struct rtl_priv *rtlpriv = rtl_priv(hw);
427 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
429 if (type == BT_BB_BACKOFF_OFF) {
430 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BT]BBBackOffLevel Off!\n"));
431 rtl_write_dword(rtlpriv, 0xc04,0x3a05611);
432 } else if (type == BT_BB_BACKOFF_ON) {
433 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BT]BBBackOffLevel On!\n"));
434 rtl_write_dword(rtlpriv, 0xc04,0x3a07611);
435 rtlpcipriv->btcoexist.b_sw_coexist_all_off = false;
439 void rtl8821ae_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
441 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
442 struct rtl_priv *rtlpriv = rtl_priv(hw);
443 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
444 ("rtl8821ae_dm_bt_fw_coex_all_off()\n"));
446 if(rtlpcipriv->btcoexist.b_fw_coexist_all_off)
449 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
450 ("rtl8821ae_dm_bt_fw_coex_all_off(), real Do\n"));
451 rtl8821ae_dm_bt_fw_coex_all_off_8723a(hw);
452 rtlpcipriv->btcoexist.b_fw_coexist_all_off = true;
455 void rtl8821ae_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
457 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
458 struct rtl_priv *rtlpriv = rtl_priv(hw);
460 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
461 ("rtl8821ae_dm_bt_sw_coex_all_off()\n"));
463 if(rtlpcipriv->btcoexist.b_sw_coexist_all_off)
466 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
467 ("rtl8821ae_dm_bt_sw_coex_all_off(), real Do\n"));
468 rtl8821ae_dm_bt_sw_coex_all_off_8723a(hw);
469 rtlpcipriv->btcoexist.b_sw_coexist_all_off = true;
472 void rtl8821ae_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
474 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
475 struct rtl_priv *rtlpriv = rtl_priv(hw);
477 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
478 ("rtl8821ae_dm_bt_hw_coex_all_off()\n"));
480 if(rtlpcipriv->btcoexist.b_hw_coexist_all_off)
482 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
483 ("rtl8821ae_dm_bt_hw_coex_all_off(), real Do\n"));
485 rtl8821ae_dm_bt_hw_coex_all_off_8723a(hw);
487 rtlpcipriv->btcoexist.b_hw_coexist_all_off = true;
490 void rtl8821ae_btdm_coex_all_off(struct ieee80211_hw *hw)
492 rtl8821ae_dm_bt_fw_coex_all_off(hw);
493 rtl8821ae_dm_bt_sw_coex_all_off(hw);
494 rtl8821ae_dm_bt_hw_coex_all_off(hw);
497 bool rtl8821ae_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)
499 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
501 if((rtlpcipriv->btcoexist.previous_state
502 == rtlpcipriv->btcoexist.current_state)
503 && (rtlpcipriv->btcoexist.previous_state_h
504 == rtlpcipriv->btcoexist.current_state_h))
510 bool rtl8821ae_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)
512 struct rtl_priv *rtlpriv = rtl_priv(hw);
514 if (rtlpriv->link_info.b_tx_busy_traffic)