hal_bt_coexist.c 17 KB

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