hal_bt_coexist.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  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. *
  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
  17. *
  18. * The full GNU General Public License is included in this distribution in the
  19. * file called LICENSE.
  20. *
  21. * Contact Information:
  22. * wlanfae <wlanfae@realtek.com>
  23. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  24. * Hsinchu 300, Taiwan.
  25. *
  26. * Larry Finger <Larry.Finger@lwfinger.net>
  27. *
  28. *****************************************************************************/
  29. #include "hal_bt_coexist.h"
  30. #include "../pci.h"
  31. #include "dm.h"
  32. #include "fw.h"
  33. #include "phy.h"
  34. #include "reg.h"
  35. #include "hal_btc.h"
  36. void rtl8723ae_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
  37. bool reject)
  38. {
  39. }
  40. void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw)
  41. {
  42. struct rtl_priv *rtlpriv = rtl_priv(hw);
  43. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  44. struct rtl_phy *rtlphy = &(rtlpriv->phy);
  45. if (rtlpriv->link_info.busytraffic) {
  46. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_IDLE;
  47. if (rtlpriv->link_info.tx_busy_traffic)
  48. rtlpcipriv->bt_coexist.cstate |=
  49. BT_COEX_STATE_WIFI_UPLINK;
  50. else
  51. rtlpcipriv->bt_coexist.cstate &=
  52. ~BT_COEX_STATE_WIFI_UPLINK;
  53. if (rtlpriv->link_info.rx_busy_traffic)
  54. rtlpcipriv->bt_coexist.cstate |=
  55. BT_COEX_STATE_WIFI_DOWNLINK;
  56. else
  57. rtlpcipriv->bt_coexist.cstate &=
  58. ~BT_COEX_STATE_WIFI_DOWNLINK;
  59. } else {
  60. rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_WIFI_IDLE;
  61. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_UPLINK;
  62. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_DOWNLINK;
  63. }
  64. if (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
  65. rtlpriv->mac80211.mode == WIRELESS_MODE_B) {
  66. rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_WIFI_LEGACY;
  67. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_HT20;
  68. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_HT40;
  69. } else {
  70. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_LEGACY;
  71. if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
  72. rtlpcipriv->bt_coexist.cstate |=
  73. BT_COEX_STATE_WIFI_HT40;
  74. rtlpcipriv->bt_coexist.cstate &=
  75. ~BT_COEX_STATE_WIFI_HT20;
  76. } else {
  77. rtlpcipriv->bt_coexist.cstate |=
  78. BT_COEX_STATE_WIFI_HT20;
  79. rtlpcipriv->bt_coexist.cstate &=
  80. ~BT_COEX_STATE_WIFI_HT40;
  81. }
  82. }
  83. if (rtlpriv->bt_operation_on)
  84. rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_BT30;
  85. else
  86. rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_BT30;
  87. }
  88. u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
  89. u8 level_num, u8 rssi_thresh,
  90. u8 rssi_thresh1)
  91. {
  92. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  93. struct rtl_priv *rtlpriv = rtl_priv(hw);
  94. long smooth;
  95. u8 bt_rssi_state = 0;
  96. smooth = rtl8723ae_dm_bt_get_rx_ss(hw);
  97. if (level_num == 2) {
  98. rtlpcipriv->bt_coexist.cstate &=
  99. ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
  100. if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  101. BT_RSSI_STATE_LOW) ||
  102. (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  103. BT_RSSI_STATE_STAY_LOW)) {
  104. if (smooth >= (rssi_thresh +
  105. BT_FW_COEX_THRESH_TOL)) {
  106. bt_rssi_state = BT_RSSI_STATE_HIGH;
  107. rtlpcipriv->bt_coexist.cstate |=
  108. BT_COEX_STATE_WIFI_RSSI_1_HIGH;
  109. rtlpcipriv->bt_coexist.cstate &=
  110. ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
  111. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  112. "[DM][BT], RSSI_1 state switch to High\n");
  113. } else {
  114. bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
  115. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  116. "[DM][BT], RSSI_1 state stay at Low\n");
  117. }
  118. } else {
  119. if (smooth < rssi_thresh) {
  120. bt_rssi_state = BT_RSSI_STATE_LOW;
  121. rtlpcipriv->bt_coexist.cstate |=
  122. BT_COEX_STATE_WIFI_RSSI_1_LOW;
  123. rtlpcipriv->bt_coexist.cstate &=
  124. ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
  125. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  126. "[DM][BT], RSSI_1 state switch to Low\n");
  127. } else {
  128. bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
  129. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  130. "[DM][BT], RSSI_1 state stay at High\n");
  131. }
  132. }
  133. } else if (level_num == 3) {
  134. if (rssi_thresh > rssi_thresh1) {
  135. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  136. "[DM][BT], RSSI_1 thresh error!!\n");
  137. return rtlpcipriv->bt_coexist.bt_pre_rssi_state;
  138. }
  139. if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  140. BT_RSSI_STATE_LOW) ||
  141. (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  142. BT_RSSI_STATE_STAY_LOW)) {
  143. if (smooth >=
  144. (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {
  145. bt_rssi_state = BT_RSSI_STATE_MEDIUM;
  146. rtlpcipriv->bt_coexist.cstate |=
  147. BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
  148. rtlpcipriv->bt_coexist.cstate &=
  149. ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
  150. rtlpcipriv->bt_coexist.cstate &=
  151. ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
  152. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  153. "[DM][BT], RSSI_1 state switch to Medium\n");
  154. } else {
  155. bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
  156. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  157. "[DM][BT], RSSI_1 state stay at Low\n");
  158. }
  159. } else if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  160. BT_RSSI_STATE_MEDIUM) ||
  161. (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  162. BT_RSSI_STATE_STAY_MEDIUM)) {
  163. if (smooth >= (rssi_thresh1 +
  164. BT_FW_COEX_THRESH_TOL)) {
  165. bt_rssi_state = BT_RSSI_STATE_HIGH;
  166. rtlpcipriv->bt_coexist.cstate |=
  167. BT_COEX_STATE_WIFI_RSSI_1_HIGH;
  168. rtlpcipriv->bt_coexist.cstate &=
  169. ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
  170. rtlpcipriv->bt_coexist.cstate &=
  171. ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
  172. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  173. "[DM][BT], RSSI_1 state switch to High\n");
  174. } else if (smooth < rssi_thresh) {
  175. bt_rssi_state = BT_RSSI_STATE_LOW;
  176. rtlpcipriv->bt_coexist.cstate |=
  177. BT_COEX_STATE_WIFI_RSSI_1_LOW;
  178. rtlpcipriv->bt_coexist.cstate &=
  179. ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
  180. rtlpcipriv->bt_coexist.cstate &=
  181. ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
  182. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  183. "[DM][BT], RSSI_1 state switch to Low\n");
  184. } else {
  185. bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
  186. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  187. "[DM][BT], RSSI_1 state stay at Medium\n");
  188. }
  189. } else {
  190. if (smooth < rssi_thresh1) {
  191. bt_rssi_state = BT_RSSI_STATE_MEDIUM;
  192. rtlpcipriv->bt_coexist.cstate |=
  193. BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
  194. rtlpcipriv->bt_coexist.cstate &=
  195. ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
  196. rtlpcipriv->bt_coexist.cstate &=
  197. ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
  198. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  199. "[DM][BT], RSSI_1 state switch to Medium\n");
  200. } else {
  201. bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
  202. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  203. "[DM][BT], RSSI_1 state stay at High\n");
  204. }
  205. }
  206. }
  207. rtlpcipriv->bt_coexist.bt_pre_rssi_state1 = bt_rssi_state;
  208. return bt_rssi_state;
  209. }
  210. u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
  211. u8 level_num, u8 rssi_thresh,
  212. u8 rssi_thresh1)
  213. {
  214. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  215. struct rtl_priv *rtlpriv = rtl_priv(hw);
  216. long smooth;
  217. u8 bt_rssi_state = 0;
  218. smooth = rtl8723ae_dm_bt_get_rx_ss(hw);
  219. if (level_num == 2) {
  220. rtlpcipriv->bt_coexist.cstate &=
  221. ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
  222. if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  223. BT_RSSI_STATE_LOW) ||
  224. (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  225. BT_RSSI_STATE_STAY_LOW)){
  226. if (smooth >=
  227. (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
  228. bt_rssi_state = BT_RSSI_STATE_HIGH;
  229. rtlpcipriv->bt_coexist.cstate |=
  230. BT_COEX_STATE_WIFI_RSSI_HIGH;
  231. rtlpcipriv->bt_coexist.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 (smooth < rssi_thresh) {
  242. bt_rssi_state = BT_RSSI_STATE_LOW;
  243. rtlpcipriv->bt_coexist.cstate |=
  244. BT_COEX_STATE_WIFI_RSSI_LOW;
  245. rtlpcipriv->bt_coexist.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 rtlpcipriv->bt_coexist.bt_pre_rssi_state;
  260. }
  261. if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  262. BT_RSSI_STATE_LOW) ||
  263. (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  264. BT_RSSI_STATE_STAY_LOW)) {
  265. if (smooth >=
  266. (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
  267. bt_rssi_state = BT_RSSI_STATE_MEDIUM;
  268. rtlpcipriv->bt_coexist.cstate
  269. |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
  270. rtlpcipriv->bt_coexist.cstate
  271. &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
  272. rtlpcipriv->bt_coexist.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 ((rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  282. BT_RSSI_STATE_MEDIUM) ||
  283. (rtlpcipriv->bt_coexist.bt_pre_rssi_state ==
  284. BT_RSSI_STATE_STAY_MEDIUM)) {
  285. if (smooth >=
  286. (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
  287. bt_rssi_state = BT_RSSI_STATE_HIGH;
  288. rtlpcipriv->bt_coexist.cstate
  289. |= BT_COEX_STATE_WIFI_RSSI_HIGH;
  290. rtlpcipriv->bt_coexist.cstate
  291. &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
  292. rtlpcipriv->bt_coexist.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 (smooth < rssi_thresh) {
  297. bt_rssi_state = BT_RSSI_STATE_LOW;
  298. rtlpcipriv->bt_coexist.cstate
  299. |= BT_COEX_STATE_WIFI_RSSI_LOW;
  300. rtlpcipriv->bt_coexist.cstate
  301. &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
  302. rtlpcipriv->bt_coexist.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 (smooth < rssi_thresh1) {
  313. bt_rssi_state = BT_RSSI_STATE_MEDIUM;
  314. rtlpcipriv->bt_coexist.cstate
  315. |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
  316. rtlpcipriv->bt_coexist.cstate
  317. &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
  318. rtlpcipriv->bt_coexist.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. rtlpcipriv->bt_coexist.bt_pre_rssi_state = bt_rssi_state;
  330. return bt_rssi_state;
  331. }
  332. long rtl8723ae_dm_bt_get_rx_ss(struct ieee80211_hw *hw)
  333. {
  334. struct rtl_priv *rtlpriv = rtl_priv(hw);
  335. long smooth = 0;
  336. if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
  337. smooth = GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
  338. else
  339. smooth = rtlpriv->dm.entry_min_undec_sm_pwdb;
  340. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  341. "rtl8723ae_dm_bt_get_rx_ss() = %ld\n", smooth);
  342. return smooth;
  343. }
  344. void rtl8723ae_dm_bt_balance(struct ieee80211_hw *hw,
  345. bool balance_on, u8 ms0, u8 ms1)
  346. {
  347. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  348. struct rtl_priv *rtlpriv = rtl_priv(hw);
  349. u8 h2c_parameter[3] = {0};
  350. if (balance_on) {
  351. h2c_parameter[2] = 1;
  352. h2c_parameter[1] = ms1;
  353. h2c_parameter[0] = ms0;
  354. rtlpcipriv->bt_coexist.fw_coexist_all_off = false;
  355. } else {
  356. h2c_parameter[2] = 0;
  357. h2c_parameter[1] = 0;
  358. h2c_parameter[0] = 0;
  359. }
  360. rtlpcipriv->bt_coexist.balance_on = balance_on;
  361. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  362. "[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
  363. balance_on ? "ON" : "OFF", ms0, ms1,
  364. h2c_parameter[0]<<16 | h2c_parameter[1]<<8 | h2c_parameter[2]);
  365. rtl8723ae_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);
  366. }
  367. void rtl8723ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
  368. {
  369. struct rtl_priv *rtlpriv = rtl_priv(hw);
  370. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  371. if (type == BT_AGCTABLE_OFF) {
  372. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  373. "[BT]AGCTable Off!\n");
  374. rtl_write_dword(rtlpriv, 0xc78, 0x641c0001);
  375. rtl_write_dword(rtlpriv, 0xc78, 0x631d0001);
  376. rtl_write_dword(rtlpriv, 0xc78, 0x621e0001);
  377. rtl_write_dword(rtlpriv, 0xc78, 0x611f0001);
  378. rtl_write_dword(rtlpriv, 0xc78, 0x60200001);
  379. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  380. RF_RX_AGC_HP, 0xfffff, 0x32000);
  381. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  382. RF_RX_AGC_HP, 0xfffff, 0x71000);
  383. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  384. RF_RX_AGC_HP, 0xfffff, 0xb0000);
  385. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  386. RF_RX_AGC_HP, 0xfffff, 0xfc000);
  387. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  388. RF_RX_G1, 0xfffff, 0x30355);
  389. } else if (type == BT_AGCTABLE_ON) {
  390. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  391. "[BT]AGCTable On!\n");
  392. rtl_write_dword(rtlpriv, 0xc78, 0x4e1c0001);
  393. rtl_write_dword(rtlpriv, 0xc78, 0x4d1d0001);
  394. rtl_write_dword(rtlpriv, 0xc78, 0x4c1e0001);
  395. rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001);
  396. rtl_write_dword(rtlpriv, 0xc78, 0x4a200001);
  397. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  398. RF_RX_AGC_HP, 0xfffff, 0xdc000);
  399. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  400. RF_RX_AGC_HP, 0xfffff, 0x90000);
  401. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  402. RF_RX_AGC_HP, 0xfffff, 0x51000);
  403. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  404. RF_RX_AGC_HP, 0xfffff, 0x12000);
  405. rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A,
  406. RF_RX_G1, 0xfffff, 0x00355);
  407. rtlpcipriv->bt_coexist.sw_coexist_all_off = false;
  408. }
  409. }
  410. void rtl8723ae_dm_bt_bback_off_level(struct ieee80211_hw *hw, u8 type)
  411. {
  412. struct rtl_priv *rtlpriv = rtl_priv(hw);
  413. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  414. if (type == BT_BB_BACKOFF_OFF) {
  415. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  416. "[BT]BBBackOffLevel Off!\n");
  417. rtl_write_dword(rtlpriv, 0xc04, 0x3a05611);
  418. } else if (type == BT_BB_BACKOFF_ON) {
  419. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  420. "[BT]BBBackOffLevel On!\n");
  421. rtl_write_dword(rtlpriv, 0xc04, 0x3a07611);
  422. rtlpcipriv->bt_coexist.sw_coexist_all_off = false;
  423. }
  424. }
  425. void rtl8723ae_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
  426. {
  427. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  428. struct rtl_priv *rtlpriv = rtl_priv(hw);
  429. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  430. "rtl8723ae_dm_bt_fw_coex_all_off()\n");
  431. if (rtlpcipriv->bt_coexist.fw_coexist_all_off)
  432. return;
  433. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  434. "rtl8723ae_dm_bt_fw_coex_all_off(), real Do\n");
  435. rtl8723ae_dm_bt_fw_coex_all_off_8723a(hw);
  436. rtlpcipriv->bt_coexist.fw_coexist_all_off = true;
  437. }
  438. void rtl8723ae_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
  439. {
  440. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  441. struct rtl_priv *rtlpriv = rtl_priv(hw);
  442. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  443. "rtl8723ae_dm_bt_sw_coex_all_off()\n");
  444. if (rtlpcipriv->bt_coexist.sw_coexist_all_off)
  445. return;
  446. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  447. "rtl8723ae_dm_bt_sw_coex_all_off(), real Do\n");
  448. rtl8723ae_dm_bt_sw_coex_all_off_8723a(hw);
  449. rtlpcipriv->bt_coexist.sw_coexist_all_off = true;
  450. }
  451. void rtl8723ae_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
  452. {
  453. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  454. struct rtl_priv *rtlpriv = rtl_priv(hw);
  455. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  456. "rtl8723ae_dm_bt_hw_coex_all_off()\n");
  457. if (rtlpcipriv->bt_coexist.hw_coexist_all_off)
  458. return;
  459. RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
  460. "rtl8723ae_dm_bt_hw_coex_all_off(), real Do\n");
  461. rtl8723ae_dm_bt_hw_coex_all_off_8723a(hw);
  462. rtlpcipriv->bt_coexist.hw_coexist_all_off = true;
  463. }
  464. void rtl8723ae_btdm_coex_all_off(struct ieee80211_hw *hw)
  465. {
  466. rtl8723ae_dm_bt_fw_coex_all_off(hw);
  467. rtl8723ae_dm_bt_sw_coex_all_off(hw);
  468. rtl8723ae_dm_bt_hw_coex_all_off(hw);
  469. }
  470. bool rtl8723ae_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)
  471. {
  472. struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
  473. if ((rtlpcipriv->bt_coexist.previous_state ==
  474. rtlpcipriv->bt_coexist.cstate) &&
  475. (rtlpcipriv->bt_coexist.previous_state_h ==
  476. rtlpcipriv->bt_coexist.cstate_h))
  477. return false;
  478. else
  479. return true;
  480. }
  481. bool rtl8723ae_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)
  482. {
  483. struct rtl_priv *rtlpriv = rtl_priv(hw);
  484. if (rtlpriv->link_info.tx_busy_traffic)
  485. return true;
  486. else
  487. return false;
  488. }