Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / drivers / net / wireless / realtek / rtlwifi / rtl8723ae / hal_bt_coexist.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* 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
12 static bool bt_operation_on;
13
14 void rtl8723e_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
15                                                 bool b_reject)
16 {
17 }
18
19 void _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                 else
32                         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                 else
39                         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         else
76                 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT30;
77 }
78
79 u8 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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                         RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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                                 RT_TRACE(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
207 u8 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.cstate
230                                         |= BT_COEX_STATE_WIFI_RSSI_HIGH;
231                                 rtlpriv->btcoexist.cstate
232                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
233                                 RT_TRACE(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                                 RT_TRACE(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.cstate
244                                         |= BT_COEX_STATE_WIFI_RSSI_LOW;
245                                 rtlpriv->btcoexist.cstate
246                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
247                                 RT_TRACE(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                                 RT_TRACE(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                         RT_TRACE(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.cstate
269                                         |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
270                                 rtlpriv->btcoexist.cstate
271                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
272                                 rtlpriv->btcoexist.cstate
273                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
274                                 RT_TRACE(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                                 RT_TRACE(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.cstate
289                                         |= BT_COEX_STATE_WIFI_RSSI_HIGH;
290                                 rtlpriv->btcoexist.cstate
291                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
292                                 rtlpriv->btcoexist.cstate
293                                         &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
294                                 RT_TRACE(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.cstate
299                                         |= BT_COEX_STATE_WIFI_RSSI_LOW;
300                                 rtlpriv->btcoexist.cstate
301                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
302                                 rtlpriv->btcoexist.cstate
303                                         &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
304                                 RT_TRACE(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                                 RT_TRACE(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.cstate
315                                         |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
316                                 rtlpriv->btcoexist.cstate
317                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
318                                 rtlpriv->btcoexist.cstate
319                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
320                                 RT_TRACE(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                                 RT_TRACE(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
333 long 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_pwdb
343                         = rtlpriv->dm.entry_min_undec_sm_pwdb;
344         }
345         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
346                  "rtl8723e_dm_bt_get_rx_ss() = %ld\n",
347                  undecoratedsmoothed_pwdb);
348
349         return undecoratedsmoothed_pwdb;
350 }
351
352 void 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         RT_TRACE(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
379 void 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                 RT_TRACE(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                 RT_TRACE(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
426 void 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                 RT_TRACE(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                 RT_TRACE(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
442 void rtl8723e_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
443 {
444         struct rtl_priv *rtlpriv = rtl_priv(hw);
445         RT_TRACE(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         RT_TRACE(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
457 void rtl8723e_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
458 {
459         struct rtl_priv *rtlpriv = rtl_priv(hw);
460
461         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
462                  "rtl8723e_dm_bt_sw_coex_all_off()\n");
463
464         if (rtlpriv->btcoexist.sw_coexist_all_off)
465                 return;
466
467         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
468                  "rtl8723e_dm_bt_sw_coex_all_off(), real Do\n");
469         rtl8723e_dm_bt_sw_coex_all_off_8723a(hw);
470         rtlpriv->btcoexist.sw_coexist_all_off = true;
471 }
472
473 void rtl8723e_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
474 {
475         struct rtl_priv *rtlpriv = rtl_priv(hw);
476
477         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
478                  "rtl8723e_dm_bt_hw_coex_all_off()\n");
479
480         if (rtlpriv->btcoexist.hw_coexist_all_off)
481                 return;
482         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
483                  "rtl8723e_dm_bt_hw_coex_all_off(), real Do\n");
484
485         rtl8723e_dm_bt_hw_coex_all_off_8723a(hw);
486
487         rtlpriv->btcoexist.hw_coexist_all_off = true;
488 }
489
490 void 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
497 bool 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
508 bool 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 }