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