Lines Matching refs:rtwdev

13 static u8 rtw_coex_next_rssi_state(struct rtw_dev *rtwdev, u8 pre_state,
16 const struct rtw_chip_info *chip = rtwdev->chip;
36 static void rtw_coex_limited_tx(struct rtw_dev *rtwdev,
39 const struct rtw_chip_info *chip = rtwdev->chip;
40 struct rtw_coex *coex = &rtwdev->coex;
53 coex_stat->darfrc = rtw_read32(rtwdev, REG_DARFRC);
54 coex_stat->darfrch = rtw_read32(rtwdev, REG_DARFRCH);
55 coex_stat->retry_limit = rtw_read16(rtwdev, REG_RETRY_LIMIT);
60 rtw_read8(rtwdev, REG_AMPDU_MAX_TIME_V1);
69 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_GNT_BT_AWAKE);
75 rtw_write8_set(rtwdev, REG_LIFETIME_EN, 0xf);
76 rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x0808);
79 rtw_write32(rtwdev, REG_DARFRC, 0x1000000);
80 rtw_write32(rtwdev, REG_DARFRCH, 0x4030201);
82 rtw_write8_clr(rtwdev, REG_TX_HANG_CTRL, BIT_EN_GNT_BT_AWAKE);
83 rtw_write8_clr(rtwdev, REG_LIFETIME_EN, 0xf);
85 rtw_write16(rtwdev, REG_RETRY_LIMIT, coex_stat->retry_limit);
86 rtw_write32(rtwdev, REG_DARFRC, coex_stat->darfrc);
87 rtw_write32(rtwdev, REG_DARFRCH, coex_stat->darfrch);
91 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, 0x20);
93 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1,
97 static void rtw_coex_limited_wl(struct rtw_dev *rtwdev)
99 struct rtw_coex *coex = &rtwdev->coex;
109 rtw_coex_limited_tx(rtwdev, tx_limit, tx_agg_ctrl);
112 static bool rtw_coex_freerun_check(struct rtw_dev *rtwdev)
114 struct rtw_coex *coex = &rtwdev->coex;
117 struct rtw_efuse *efuse = &rtwdev->efuse;
148 static void rtw_coex_wl_slot_extend(struct rtw_dev *rtwdev, bool enable)
150 struct rtw_coex *coex = &rtwdev->coex;
163 rtw_fw_bt_wifi_control(rtwdev, para[0], &para[1]);
166 static void rtw_coex_wl_ccklock_action(struct rtw_dev *rtwdev)
168 struct rtw_coex *coex = &rtwdev->coex;
176 rtw_dbg(rtwdev, RTW_DBG_COEX,
178 rtw_coex_wl_slot_extend(rtwdev, false);
189 rtw_dbg(rtwdev, RTW_DBG_COEX,
194 rtw_dbg(rtwdev, RTW_DBG_COEX,
196 rtw_coex_wl_slot_extend(rtwdev, false);
199 rtw_dbg(rtwdev, RTW_DBG_COEX,
202 rtw_coex_wl_slot_extend(rtwdev, true);
206 static void rtw_coex_wl_ccklock_detect(struct rtw_dev *rtwdev)
208 struct rtw_coex *coex = &rtwdev->coex;
237 rtw_dbg(rtwdev, RTW_DBG_COEX,
243 rtw_dbg(rtwdev, RTW_DBG_COEX,
252 ieee80211_queue_delayed_work(rtwdev->hw, &coex->wl_ccklock_work,
258 static void rtw_coex_wl_noisy_detect(struct rtw_dev *rtwdev)
260 struct rtw_coex *coex = &rtwdev->coex;
262 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
303 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], wl_noisy_level = %d\n",
308 static void rtw_coex_tdma_timer_base(struct rtw_dev *rtwdev, u8 type)
310 struct rtw_coex *coex = &rtwdev->coex;
323 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], tbtt_interval = %d\n",
345 rtw_fw_bt_wifi_control(rtwdev, para[0], &para[1]);
347 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): h2c_0x69 = 0x%x\n",
352 rtw_coex_wl_ccklock_action(rtwdev);
355 static void rtw_coex_set_wl_pri_mask(struct rtw_dev *rtwdev, u8 bitmap,
363 rtw_write8_mask(rtwdev, addr, BIT(bitmap), data);
366 void rtw_coex_write_scbd(struct rtw_dev *rtwdev, u16 bitpos, bool set)
368 const struct rtw_chip_info *chip = rtwdev->chip;
369 struct rtw_coex *coex = &rtwdev->coex;
396 rtw_write16(rtwdev, REG_WIFI_BT_INFO, val);
401 static u16 rtw_coex_read_scbd(struct rtw_dev *rtwdev)
403 const struct rtw_chip_info *chip = rtwdev->chip;
408 return (rtw_read16(rtwdev, REG_WIFI_BT_INFO)) & ~(BIT_BT_INT_EN);
411 static void rtw_coex_check_rfk(struct rtw_dev *rtwdev)
413 const struct rtw_chip_info *chip = rtwdev->chip;
414 struct rtw_coex *coex = &rtwdev->coex;
423 rtw_dbg(rtwdev, RTW_DBG_COEX,
429 btk = !!(rtw_coex_read_scbd(rtwdev) & COEX_SCBD_BT_RFK);
432 wlk = !!(rtw_read8(rtwdev, REG_ARFR4) & BIT_WL_RFK);
437 rtw_dbg(rtwdev, RTW_DBG_COEX,
449 static void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
451 struct rtw_coex *coex = &rtwdev->coex;
457 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
459 rtw_fw_query_bt_info(rtwdev);
462 static void rtw_coex_gnt_workaround(struct rtw_dev *rtwdev, bool force, u8 mode)
464 rtw_coex_set_gnt_fix(rtwdev);
467 static void rtw_coex_monitor_bt_ctr(struct rtw_dev *rtwdev)
469 struct rtw_coex *coex = &rtwdev->coex;
473 tmp = rtw_read32(rtwdev, REG_BT_ACT_STATISTICS);
477 tmp = rtw_read32(rtwdev, REG_BT_ACT_STATISTICS_1);
481 rtw_write8(rtwdev, REG_BT_COEX_ENH_INTR_CTRL,
484 rtw_dbg(rtwdev, RTW_DBG_COEX,
490 static void rtw_coex_monitor_bt_enable(struct rtw_dev *rtwdev)
492 const struct rtw_chip_info *chip = rtwdev->chip;
493 struct rtw_coex *coex = &rtwdev->coex;
500 score_board = rtw_coex_read_scbd(rtwdev);
505 rtw_dbg(rtwdev, RTW_DBG_COEX,
515 ieee80211_queue_delayed_work(rtwdev->hw,
525 static void rtw_coex_update_wl_link_info(struct rtw_dev *rtwdev, u8 reason)
527 const struct rtw_chip_info *chip = rtwdev->chip;
528 struct rtw_coex *coex = &rtwdev->coex;
531 struct rtw_traffic_stats *stats = &rtwdev->stats;
540 scan = test_bit(RTW_FLAG_SCANNING, rtwdev->flags);
541 coex_stat->wl_connected = !!rtwdev->sta_cnt;
543 wl_busy = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
548 ieee80211_queue_delayed_work(rtwdev->hw,
564 rtw_coex_wl_noisy_detect(rtwdev);
569 rssi = rtwdev->dm_info.min_rssi;
570 rssi_state = rtw_coex_next_rssi_state(rtwdev, rssi_state,
577 rtw_coex_write_scbd(rtwdev, COEX_SCBD_SCAN, true);
579 rtw_coex_write_scbd(rtwdev, COEX_SCBD_SCAN, false);
595 if (rtwdev->hal.current_band_type == RTW_BAND_5G)
616 void rtw_coex_info_response(struct rtw_dev *rtwdev, struct sk_buff *skb)
618 struct rtw_coex *coex = &rtwdev->coex;
630 static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev,
633 struct rtw_coex *coex = &rtwdev->coex;
636 lockdep_assert_held(&rtwdev->mutex);
638 rtw_fw_query_bt_mp_info(rtwdev, req);
642 rtw_err(rtwdev, "coex request time out\n");
648 rtw_err(rtwdev, "failed to get coex info response\n");
656 static bool rtw_coex_get_bt_scan_type(struct rtw_dev *rtwdev, u8 *scan_type)
663 skb = rtw_coex_info_request(rtwdev, &req);
673 static bool rtw_coex_set_lna_constrain_level(struct rtw_dev *rtwdev,
681 skb = rtw_coex_info_request(rtwdev, &req);
706 static void rtw_coex_update_bt_link_info(struct rtw_dev *rtwdev)
708 const struct rtw_chip_info *chip = rtwdev->chip;
709 struct rtw_coex *coex = &rtwdev->coex;
722 rssi_state = rtw_coex_next_rssi_state(rtwdev, rssi_state, rssi,
731 if (rtw_coex_get_bt_scan_type(rtwdev, &scan_type)) {
802 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(), %s!!!\n", __func__,
806 static void rtw_coex_update_wl_ch_info(struct rtw_dev *rtwdev, u8 type)
808 const struct rtw_chip_info *chip = rtwdev->chip;
809 struct rtw_efuse *efuse = &rtwdev->efuse;
810 struct rtw_coex_dm *coex_dm = &rtwdev->coex.dm;
811 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
817 bw = rtwdev->hal.current_band_width;
820 center_chan = rtwdev->hal.current_channel;
850 rtw_fw_wl_ch_info(rtwdev, link, center_chan, bw);
851 rtw_dbg(rtwdev, RTW_DBG_COEX,
856 static void rtw_coex_set_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl)
858 struct rtw_coex *coex = &rtwdev->coex;
866 rtw_fw_force_bt_tx_power(rtwdev, bt_pwr_dec_lvl);
869 static void rtw_coex_set_bt_rx_gain(struct rtw_dev *rtwdev, u8 bt_lna_lvl)
871 struct rtw_coex *coex = &rtwdev->coex;
881 rtw_coex_set_lna_constrain_level(rtwdev, bt_lna_lvl);
882 rtw_coex_write_scbd(rtwdev, COEX_SCBD_RXGAIN, true);
884 rtw_coex_write_scbd(rtwdev, COEX_SCBD_RXGAIN, false);
886 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): bt_rx_LNA_level = %d\n",
890 static void rtw_coex_set_rf_para(struct rtw_dev *rtwdev,
893 struct rtw_coex *coex = &rtwdev->coex;
900 rtw_coex_set_wl_tx_power(rtwdev, para.wl_pwr_dec_lvl);
901 rtw_coex_set_bt_tx_power(rtwdev, para.bt_pwr_dec_lvl + offset);
902 rtw_coex_set_wl_rx_gain(rtwdev, para.wl_low_gain_en);
903 rtw_coex_set_bt_rx_gain(rtwdev, para.bt_lna_lvl);
906 u32 rtw_coex_read_indirect_reg(struct rtw_dev *rtwdev, u16 addr)
910 if (!ltecoex_read_reg(rtwdev, addr, &val)) {
911 rtw_err(rtwdev, "failed to read indirect register\n");
919 void rtw_coex_write_indirect_reg(struct rtw_dev *rtwdev, u16 addr,
925 tmp = rtw_coex_read_indirect_reg(rtwdev, addr);
928 if (!ltecoex_reg_write(rtwdev, addr, tmp))
929 rtw_err(rtwdev, "failed to write indirect register\n");
933 static void rtw_coex_coex_ctrl_owner(struct rtw_dev *rtwdev, bool wifi_control)
935 const struct rtw_chip_info *chip = rtwdev->chip;
939 rtw_write8_set(rtwdev, REG_SYS_SDIO_CTRL + 3,
942 rtw_write8_set(rtwdev, btg_reg->addr, btg_reg->mask);
944 rtw_write8_clr(rtwdev, REG_SYS_SDIO_CTRL + 3,
947 rtw_write8_clr(rtwdev, btg_reg->addr, btg_reg->mask);
951 static void rtw_coex_set_gnt_bt(struct rtw_dev *rtwdev, u8 state)
953 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0xc000, state);
954 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0c00, state);
957 static void rtw_coex_set_gnt_wl(struct rtw_dev *rtwdev, u8 state)
959 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x3000, state);
960 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0300, state);
963 static void rtw_coex_mimo_ps(struct rtw_dev *rtwdev, bool force, bool state)
965 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
972 rtw_set_txrx_1ss(rtwdev, state);
974 rtw_coex_update_wl_ch_info(rtwdev, (u8)coex_stat->wl_connected);
976 rtw_dbg(rtwdev, RTW_DBG_COEX,
980 static void rtw_btc_wltoggle_table_a(struct rtw_dev *rtwdev, bool force,
983 const struct rtw_chip_info *chip = rtwdev->chip;
984 struct rtw_efuse *efuse = &rtwdev->efuse;
1006 rtw_fw_bt_wifi_control(rtwdev, h2c_para[0], &h2c_para[1]);
1008 rtw_dbg(rtwdev, RTW_DBG_COEX,
1015 static void rtw_btc_wltoggle_table_b(struct rtw_dev *rtwdev, bool force,
1018 struct rtw_coex *coex = &rtwdev->coex;
1035 rtw_fw_bt_wifi_control(rtwdev, cur_h2c_para[0], &cur_h2c_para[1]);
1037 rtw_dbg(rtwdev, RTW_DBG_COEX,
1043 static void rtw_coex_set_table(struct rtw_dev *rtwdev, bool force, u32 table0,
1047 struct rtw_coex *coex = &rtwdev->coex;
1052 if (table0 == rtw_read32(rtwdev, REG_BT_COEX_TABLE0) &&
1053 table1 == rtw_read32(rtwdev, REG_BT_COEX_TABLE1))
1056 rtw_write32(rtwdev, REG_BT_COEX_TABLE0, table0);
1057 rtw_write32(rtwdev, REG_BT_COEX_TABLE1, table1);
1058 rtw_write32(rtwdev, REG_BT_COEX_BRK_TABLE, DEF_BRK_TABLE_VAL);
1060 rtw_dbg(rtwdev, RTW_DBG_COEX,
1065 static void rtw_coex_table(struct rtw_dev *rtwdev, bool force, u8 type)
1067 const struct rtw_chip_info *chip = rtwdev->chip;
1068 struct rtw_coex *coex = &rtwdev->coex;
1070 struct rtw_efuse *efuse = &rtwdev->efuse;
1075 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Coex_Table - %d\n", type);
1079 rtw_coex_set_table(rtwdev, force,
1085 rtw_coex_set_table(rtwdev, force,
1090 rtw_btc_wltoggle_table_a(rtwdev, true, type);
1093 static void rtw_coex_ignore_wlan_act(struct rtw_dev *rtwdev, bool enable)
1095 struct rtw_coex *coex = &rtwdev->coex;
1100 rtw_fw_bt_ignore_wlan_action(rtwdev, enable);
1103 static void rtw_coex_power_save_state(struct rtw_dev *rtwdev, u8 ps_type,
1106 struct rtw_coex *coex = &rtwdev->coex;
1110 lps_mode = rtwdev->lps_conf.mode;
1116 rtw_dbg(rtwdev, RTW_DBG_COEX,
1118 rtw_leave_lps(rtwdev);
1123 rtw_fw_coex_tdma_type(rtwdev, 0, 0, 0, 0, 0);
1125 rtw_leave_lps(rtwdev);
1126 rtw_dbg(rtwdev, RTW_DBG_COEX,
1134 static void rtw_coex_set_tdma(struct rtw_dev *rtwdev, u8 byte1, u8 byte2,
1137 const struct rtw_chip_info *chip = rtwdev->chip;
1138 struct rtw_coex *coex = &rtwdev->coex;
1145 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): AP mode\n",
1155 rtw_coex_power_save_state(rtwdev, ps_type, 0x0, 0x0);
1158 rtw_dbg(rtwdev, RTW_DBG_COEX,
1166 rtw_coex_power_save_state(rtwdev, ps_type, 0x50, 0x4);
1168 rtw_dbg(rtwdev, RTW_DBG_COEX,
1173 rtw_coex_power_save_state(rtwdev, ps_type, 0x0, 0x0);
1182 rtw_fw_coex_tdma_type(rtwdev, byte1, byte2, byte3, byte4, byte5);
1193 static void rtw_coex_tdma(struct rtw_dev *rtwdev, bool force, u32 tcase)
1195 const struct rtw_chip_info *chip = rtwdev->chip;
1196 struct rtw_coex *coex = &rtwdev->coex;
1199 struct rtw_efuse *efuse = &rtwdev->efuse;
1205 rtw_coex_tdma_timer_base(rtwdev, TDMA_TIMER_TYPE_4SLOT);
1207 rtw_coex_tdma_timer_base(rtwdev, TDMA_TIMER_TYPE_2SLOT);
1215 rtw_dbg(rtwdev, RTW_DBG_COEX,
1222 wl_busy = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
1227 rtw_coex_write_scbd(rtwdev, COEX_SCBD_TDMA, false);
1229 rtw_coex_write_scbd(rtwdev, COEX_SCBD_TDMA, true);
1237 rtw_coex_set_tdma(rtwdev,
1246 rtw_coex_set_tdma(rtwdev,
1255 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], coex tdma type(%s, %d)\n",
1259 static void rtw_coex_set_ant_path(struct rtw_dev *rtwdev, bool force, u8 phase)
1261 struct rtw_coex *coex = &rtwdev->coex;
1274 rtw_coex_check_rfk(rtwdev);
1276 rtw_dbg(rtwdev, RTW_DBG_COEX,
1282 rtw_dbg(rtwdev, RTW_DBG_COEX,
1286 rtw_coex_coex_ctrl_owner(rtwdev, true);
1288 rtw_coex_coex_ctrl_owner(rtwdev, false);
1294 rtw_dbg(rtwdev, RTW_DBG_COEX,
1298 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_SW_LOW);
1301 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_SW_HIGH);
1304 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_SW_HIGH);
1307 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_SW_LOW);
1311 rtw_coex_coex_ctrl_owner(rtwdev, true);
1317 rtw_dbg(rtwdev, RTW_DBG_COEX,
1320 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_SW_LOW);
1323 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_SW_HIGH);
1326 rtw_coex_coex_ctrl_owner(rtwdev, true);
1332 rtw_dbg(rtwdev, RTW_DBG_COEX,
1335 rtw_coex_coex_ctrl_owner(rtwdev, false);
1341 rtw_dbg(rtwdev, RTW_DBG_COEX,
1344 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_HW_PTA);
1347 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_HW_PTA);
1350 rtw_coex_coex_ctrl_owner(rtwdev, true);
1356 rtw_dbg(rtwdev, RTW_DBG_COEX,
1360 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_HW_PTA);
1363 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_SW_HIGH);
1366 rtw_coex_coex_ctrl_owner(rtwdev, true);
1372 rtw_dbg(rtwdev, RTW_DBG_COEX,
1376 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_HW_PTA);
1379 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_SW_HIGH);
1382 rtw_coex_coex_ctrl_owner(rtwdev, true);
1388 rtw_dbg(rtwdev, RTW_DBG_COEX,
1391 rtw_coex_set_gnt_bt(rtwdev, COEX_GNT_SET_HW_PTA);
1394 rtw_coex_set_gnt_wl(rtwdev, COEX_GNT_SET_HW_PTA);
1397 rtw_coex_coex_ctrl_owner(rtwdev, true);
1409 rtw_coex_set_ant_switch(rtwdev, ctrl_type, pos_type);
1459 static u8 rtw_coex_algorithm(struct rtw_dev *rtwdev)
1461 struct rtw_coex *coex = &rtwdev->coex;
1519 rtw_dbg(rtwdev, RTW_DBG_COEX,
1526 static void rtw_coex_action_coex_all_off(struct rtw_dev *rtwdev)
1528 const struct rtw_chip_info *chip = rtwdev->chip;
1529 struct rtw_efuse *efuse = &rtwdev->efuse;
1532 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1533 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1545 rtw_coex_table(rtwdev, false, table_case);
1546 rtw_coex_tdma(rtwdev, false, tdma_case);
1549 static void rtw_coex_action_freerun(struct rtw_dev *rtwdev)
1551 const struct rtw_chip_info *chip = rtwdev->chip;
1552 struct rtw_coex *coex = &rtwdev->coex;
1555 struct rtw_efuse *efuse = &rtwdev->efuse;
1559 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1567 rtw_coex_update_wl_ch_info(rtwdev, COEX_MEDIA_CONNECT);
1569 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G_FREERUN);
1571 rtw_coex_write_scbd(rtwdev, COEX_SCBD_FIX2M, false);
1586 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_tx[level]);
1588 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[level]);
1590 rtw_coex_table(rtwdev, false, 100);
1591 rtw_coex_tdma(rtwdev, false, 100);
1594 static void rtw_coex_action_rf4ce(struct rtw_dev *rtwdev)
1596 const struct rtw_chip_info *chip = rtwdev->chip;
1597 struct rtw_efuse *efuse = &rtwdev->efuse;
1600 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1602 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1603 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1615 rtw_coex_table(rtwdev, false, table_case);
1616 rtw_coex_tdma(rtwdev, false, tdma_case);
1619 static void rtw_coex_action_bt_whql_test(struct rtw_dev *rtwdev)
1621 const struct rtw_chip_info *chip = rtwdev->chip;
1622 struct rtw_efuse *efuse = &rtwdev->efuse;
1625 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1627 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1628 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1640 rtw_coex_table(rtwdev, false, table_case);
1641 rtw_coex_tdma(rtwdev, false, tdma_case);
1644 static void rtw_coex_action_bt_relink(struct rtw_dev *rtwdev)
1646 const struct rtw_chip_info *chip = rtwdev->chip;
1647 struct rtw_coex *coex = &rtwdev->coex;
1649 struct rtw_efuse *efuse = &rtwdev->efuse;
1653 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1655 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1656 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1680 rtw_coex_table(rtwdev, false, table_case);
1681 rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
1684 static void rtw_coex_action_bt_idle(struct rtw_dev *rtwdev)
1686 const struct rtw_chip_info *chip = rtwdev->chip;
1687 struct rtw_coex *coex = &rtwdev->coex;
1690 struct rtw_efuse *efuse = &rtwdev->efuse;
1694 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1695 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1711 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G_FREERUN);
1715 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1749 rtw_coex_table(rtwdev, false, table_case);
1750 rtw_coex_tdma(rtwdev, false, tdma_case);
1753 static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev)
1755 const struct rtw_chip_info *chip = rtwdev->chip;
1756 struct rtw_coex *coex = &rtwdev->coex;
1758 struct rtw_efuse *efuse = &rtwdev->efuse;
1763 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1764 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1765 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1774 rtw_dbg(rtwdev, RTW_DBG_COEX,
1787 rtw_dbg(rtwdev, RTW_DBG_COEX,
1803 rtw_dbg(rtwdev, RTW_DBG_COEX,
1808 rtw_dbg(rtwdev, RTW_DBG_COEX,
1816 rtw_dbg(rtwdev, RTW_DBG_COEX,
1829 rtw_dbg(rtwdev, RTW_DBG_COEX,
1834 rtw_dbg(rtwdev, RTW_DBG_COEX,
1839 rtw_dbg(rtwdev, RTW_DBG_COEX,
1846 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], wifi hi(%d), bt page(%d)\n",
1849 rtw_coex_table(rtwdev, false, table_case);
1850 rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
1853 static void rtw_coex_action_bt_game_hid(struct rtw_dev *rtwdev)
1855 const struct rtw_chip_info *chip = rtwdev->chip;
1856 struct rtw_coex *coex = &rtwdev->coex;
1858 struct rtw_efuse *efuse = &rtwdev->efuse;
1862 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1863 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1890 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_tx[6]);
1892 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[5]);
1894 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1897 rtw_coex_table(rtwdev, false, table_case);
1898 rtw_coex_tdma(rtwdev, false, tdma_case);
1901 static void rtw_coex_action_bt_hfp(struct rtw_dev *rtwdev)
1903 const struct rtw_chip_info *chip = rtwdev->chip;
1904 struct rtw_coex *coex = &rtwdev->coex;
1906 struct rtw_efuse *efuse = &rtwdev->efuse;
1909 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1910 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1911 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
1928 rtw_coex_table(rtwdev, false, table_case);
1929 rtw_coex_tdma(rtwdev, false, tdma_case);
1932 static void rtw_coex_action_bt_hid(struct rtw_dev *rtwdev)
1934 const struct rtw_chip_info *chip = rtwdev->chip;
1935 struct rtw_coex *coex = &rtwdev->coex;
1937 struct rtw_efuse *efuse = &rtwdev->efuse;
1942 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
1943 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
1944 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2006 rtw_coex_table(rtwdev, false, table_case);
2008 rtw_btc_wltoggle_table_a(rtwdev, true, table_case);
2009 rtw_btc_wltoggle_table_b(rtwdev, false, 1, COEX_WL_SLOT_TOGLLE);
2012 rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
2015 static void rtw_coex_action_bt_a2dp(struct rtw_dev *rtwdev)
2017 const struct rtw_chip_info *chip = rtwdev->chip;
2018 struct rtw_coex *coex = &rtwdev->coex;
2021 struct rtw_efuse *efuse = &rtwdev->efuse;
2025 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2027 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2028 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2053 rtw_coex_table(rtwdev, false, table_case);
2054 rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
2057 static void rtw_coex_action_bt_a2dpsink(struct rtw_dev *rtwdev)
2059 const struct rtw_chip_info *chip = rtwdev->chip;
2060 struct rtw_coex *coex = &rtwdev->coex;
2062 struct rtw_efuse *efuse = &rtwdev->efuse;
2066 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2068 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2069 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2092 rtw_coex_table(rtwdev, false, table_case);
2093 rtw_coex_tdma(rtwdev, false, tdma_case);
2096 static void rtw_coex_action_bt_pan(struct rtw_dev *rtwdev)
2098 const struct rtw_chip_info *chip = rtwdev->chip;
2099 struct rtw_coex *coex = &rtwdev->coex;
2101 struct rtw_efuse *efuse = &rtwdev->efuse;
2104 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2105 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2106 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2129 rtw_coex_table(rtwdev, false, table_case);
2130 rtw_coex_tdma(rtwdev, false, tdma_case);
2133 static void rtw_coex_action_bt_a2dp_hid(struct rtw_dev *rtwdev)
2135 const struct rtw_chip_info *chip = rtwdev->chip;
2136 struct rtw_coex *coex = &rtwdev->coex;
2139 struct rtw_efuse *efuse = &rtwdev->efuse;
2146 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2147 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2148 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2182 rtw_coex_table(rtwdev, false, table_case);
2184 rtw_btc_wltoggle_table_a(rtwdev, true, table_case);
2185 rtw_btc_wltoggle_table_b(rtwdev, false, interval, COEX_WL_SLOT_TOGLLE);
2187 rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
2190 static void rtw_coex_action_bt_a2dp_pan(struct rtw_dev *rtwdev)
2192 const struct rtw_chip_info *chip = rtwdev->chip;
2193 struct rtw_coex *coex = &rtwdev->coex;
2195 struct rtw_efuse *efuse = &rtwdev->efuse;
2199 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2201 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2202 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2239 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[1]);
2241 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2243 rtw_coex_table(rtwdev, false, table_case);
2244 rtw_coex_tdma(rtwdev, false, tdma_case);
2247 static void rtw_coex_action_bt_pan_hid(struct rtw_dev *rtwdev)
2249 const struct rtw_chip_info *chip = rtwdev->chip;
2250 struct rtw_coex *coex = &rtwdev->coex;
2252 struct rtw_efuse *efuse = &rtwdev->efuse;
2255 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2257 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2258 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2278 rtw_coex_table(rtwdev, false, table_case);
2279 rtw_coex_tdma(rtwdev, false, tdma_case);
2282 static void rtw_coex_action_bt_a2dp_pan_hid(struct rtw_dev *rtwdev)
2284 const struct rtw_chip_info *chip = rtwdev->chip;
2285 struct rtw_coex *coex = &rtwdev->coex;
2287 struct rtw_efuse *efuse = &rtwdev->efuse;
2290 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2291 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2292 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2312 rtw_coex_table(rtwdev, false, table_case);
2313 rtw_coex_tdma(rtwdev, false, tdma_case);
2316 static void rtw_coex_action_wl_under5g(struct rtw_dev *rtwdev)
2318 const struct rtw_chip_info *chip = rtwdev->chip;
2319 struct rtw_coex *coex = &rtwdev->coex;
2320 struct rtw_efuse *efuse = &rtwdev->efuse;
2324 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2326 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_5G);
2327 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2329 rtw_coex_write_scbd(rtwdev, COEX_SCBD_FIX2M, false);
2344 rtw_coex_table(rtwdev, false, table_case);
2345 rtw_coex_tdma(rtwdev, false, tdma_case);
2348 static void rtw_coex_action_wl_only(struct rtw_dev *rtwdev)
2350 const struct rtw_chip_info *chip = rtwdev->chip;
2351 struct rtw_efuse *efuse = &rtwdev->efuse;
2354 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2355 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2356 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2368 rtw_coex_table(rtwdev, false, table_case);
2369 rtw_coex_tdma(rtwdev, false, tdma_case);
2372 static void rtw_coex_action_wl_native_lps(struct rtw_dev *rtwdev)
2374 const struct rtw_chip_info *chip = rtwdev->chip;
2375 struct rtw_coex *coex = &rtwdev->coex;
2376 struct rtw_efuse *efuse = &rtwdev->efuse;
2383 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2385 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2400 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_tx[6]);
2402 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[5]);
2404 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2407 rtw_coex_table(rtwdev, false, table_case);
2408 rtw_coex_tdma(rtwdev, false, tdma_case);
2411 static void rtw_coex_action_wl_linkscan(struct rtw_dev *rtwdev)
2413 const struct rtw_chip_info *chip = rtwdev->chip;
2414 struct rtw_coex *coex = &rtwdev->coex;
2416 struct rtw_efuse *efuse = &rtwdev->efuse;
2420 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2421 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2422 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2447 rtw_coex_table(rtwdev, false, table_case);
2448 rtw_coex_tdma(rtwdev, false, tdma_case | slot_type);
2451 static void rtw_coex_action_wl_not_connected(struct rtw_dev *rtwdev)
2453 const struct rtw_chip_info *chip = rtwdev->chip;
2454 struct rtw_efuse *efuse = &rtwdev->efuse;
2457 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2458 rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G);
2459 rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]);
2471 rtw_coex_table(rtwdev, false, table_case);
2472 rtw_coex_tdma(rtwdev, false, tdma_case);
2475 static void rtw_coex_action_wl_connected(struct rtw_dev *rtwdev)
2477 struct rtw_coex *coex = &rtwdev->coex;
2481 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2483 algorithm = rtw_coex_algorithm(rtwdev);
2487 rtw_coex_action_bt_hfp(rtwdev);
2490 if (rtw_coex_freerun_check(rtwdev))
2491 rtw_coex_action_freerun(rtwdev);
2493 rtw_coex_action_bt_hid(rtwdev);
2496 if (rtw_coex_freerun_check(rtwdev))
2497 rtw_coex_action_freerun(rtwdev);
2499 rtw_coex_action_bt_a2dpsink(rtwdev);
2501 rtw_coex_action_bt_a2dp(rtwdev);
2504 rtw_coex_action_bt_pan(rtwdev);
2507 if (rtw_coex_freerun_check(rtwdev))
2508 rtw_coex_action_freerun(rtwdev);
2510 rtw_coex_action_bt_a2dp_hid(rtwdev);
2513 rtw_coex_action_bt_a2dp_pan(rtwdev);
2516 rtw_coex_action_bt_pan_hid(rtwdev);
2519 rtw_coex_action_bt_a2dp_pan_hid(rtwdev);
2523 rtw_coex_action_bt_idle(rtwdev);
2528 static void rtw_coex_run_coex(struct rtw_dev *rtwdev, u8 reason)
2530 const struct rtw_chip_info *chip = rtwdev->chip;
2531 struct rtw_coex *coex = &rtwdev->coex;
2536 lockdep_assert_held(&rtwdev->mutex);
2538 if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags))
2543 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): reason = %d\n", __func__,
2547 rtw_coex_update_wl_link_info(rtwdev, reason);
2549 rtw_coex_monitor_bt_enable(rtwdev);
2552 rtw_dbg(rtwdev, RTW_DBG_COEX,
2558 rtw_dbg(rtwdev, RTW_DBG_COEX,
2564 rtw_dbg(rtwdev, RTW_DBG_COEX,
2571 rtw_dbg(rtwdev, RTW_DBG_COEX,
2582 rtw_coex_action_wl_under5g(rtwdev);
2586 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], WiFi is single-port 2G!!\n");
2591 rtw_coex_action_rf4ce(rtwdev);
2593 rtw_coex_action_wl_not_connected(rtwdev);
2595 rtw_coex_action_wl_only(rtwdev);
2600 rtw_coex_action_wl_native_lps(rtwdev);
2605 rtw_coex_action_bt_game_hid(rtwdev);
2610 rtw_coex_action_bt_whql_test(rtwdev);
2615 rtw_coex_action_bt_relink(rtwdev);
2620 rtw_coex_action_bt_inquiry(rtwdev);
2627 rtw_coex_action_bt_idle(rtwdev);
2632 rtw_coex_action_wl_linkscan(rtwdev);
2637 rtw_coex_action_wl_connected(rtwdev);
2640 rtw_coex_action_wl_not_connected(rtwdev);
2649 rtw_coex_mimo_ps(rtwdev, true, true);
2651 rtw_coex_mimo_ps(rtwdev, false, true);
2653 rtw_coex_mimo_ps(rtwdev, false, false);
2657 rtw_coex_gnt_workaround(rtwdev, false, coex_stat->wl_coex_mode);
2658 rtw_coex_limited_wl(rtwdev);
2661 static void rtw_coex_init_coex_var(struct rtw_dev *rtwdev)
2663 struct rtw_coex *coex = &rtwdev->coex;
2688 static void __rtw_coex_init_hw_config(struct rtw_dev *rtwdev, bool wifi_only)
2690 struct rtw_coex *coex = &rtwdev->coex;
2693 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2695 rtw_coex_init_coex_var(rtwdev);
2697 coex_stat->kt_ver = u8_get_bits(rtw_read8(rtwdev, 0xf1), GENMASK(7, 4));
2699 rtw_coex_monitor_bt_enable(rtwdev);
2700 rtw_coex_wl_slot_extend(rtwdev, coex_stat->wl_slot_extend);
2702 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
2704 rtw_coex_set_rfe_type(rtwdev);
2705 rtw_coex_set_init(rtwdev);
2708 rtw_coex_set_wl_pri_mask(rtwdev, COEX_WLPRI_TX_RSP, 1);
2711 rtw_coex_set_wl_pri_mask(rtwdev, COEX_WLPRI_TX_BEACON, 1);
2714 rtw_coex_set_wl_pri_mask(rtwdev, COEX_WLPRI_TX_BEACONQ, 1);
2718 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_WOFF);
2719 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ALL, false);
2722 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): RF Off\n",
2725 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_WONLY);
2726 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE | COEX_SCBD_ONOFF,
2730 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_INIT);
2731 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE | COEX_SCBD_ONOFF,
2738 rtw_coex_table(rtwdev, true, 1);
2739 rtw_coex_tdma(rtwdev, true, 0);
2740 rtw_coex_query_bt_info(rtwdev);
2743 void rtw_coex_power_on_setting(struct rtw_dev *rtwdev)
2745 struct rtw_coex *coex = &rtwdev->coex;
2748 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
2754 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
2757 rtw_coex_monitor_bt_enable(rtwdev);
2758 rtw_coex_set_rfe_type(rtwdev);
2761 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_POWERON);
2763 rtw_coex_table(rtwdev, true, table_case);
2765 rtw_write8(rtwdev, 0xff1a, 0x0);
2766 rtw_coex_set_gnt_debug(rtwdev);
2769 void rtw_coex_power_off_setting(struct rtw_dev *rtwdev)
2771 rtw_write16(rtwdev, REG_WIFI_BT_INFO, BIT_BT_INT_EN);
2774 void rtw_coex_init_hw_config(struct rtw_dev *rtwdev, bool wifi_only)
2776 __rtw_coex_init_hw_config(rtwdev, wifi_only);
2779 void rtw_coex_ips_notify(struct rtw_dev *rtwdev, u8 type)
2781 struct rtw_coex *coex = &rtwdev->coex;
2788 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], IPS ENTER notify\n");
2793 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ALL, false);
2795 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_WOFF);
2796 rtw_coex_action_coex_all_off(rtwdev);
2798 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], IPS LEAVE notify\n");
2800 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE | COEX_SCBD_ONOFF, true);
2802 __rtw_coex_init_hw_config(rtwdev, false);
2808 void rtw_coex_lps_notify(struct rtw_dev *rtwdev, u8 type)
2810 struct rtw_coex *coex = &rtwdev->coex;
2817 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], LPS ENABLE notify\n");
2823 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE, true);
2826 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE, false);
2827 rtw_coex_write_scbd(rtwdev, COEX_SCBD_WLBUSY, false);
2829 rtw_coex_run_coex(rtwdev, COEX_RSN_LPS);
2832 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], LPS DISABLE notify\n");
2837 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE, true);
2840 rtw_coex_query_bt_info(rtwdev);
2842 rtw_coex_run_coex(rtwdev, COEX_RSN_LPS);
2846 void rtw_coex_scan_notify(struct rtw_dev *rtwdev, u8 type)
2848 struct rtw_coex *coex = &rtwdev->coex;
2855 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE | COEX_SCBD_ONOFF, true);
2858 rtw_dbg(rtwdev, RTW_DBG_COEX,
2861 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_5G);
2862 rtw_coex_run_coex(rtwdev, COEX_RSN_5GSCANSTART);
2864 rtw_dbg(rtwdev, RTW_DBG_COEX,
2870 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_2G);
2871 rtw_coex_run_coex(rtwdev, COEX_RSN_2GSCANSTART);
2875 rtw_dbg(rtwdev, RTW_DBG_COEX,
2880 rtw_coex_run_coex(rtwdev, COEX_RSN_SCANFINISH);
2884 void rtw_coex_switchband_notify(struct rtw_dev *rtwdev, u8 type)
2886 struct rtw_coex *coex = &rtwdev->coex;
2892 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): TO_5G\n",
2895 rtw_dbg(rtwdev, RTW_DBG_COEX,
2898 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): TO_2G\n",
2903 rtw_coex_run_coex(rtwdev, COEX_RSN_5GSWITCHBAND);
2905 rtw_coex_run_coex(rtwdev, COEX_RSN_2GSWITCHBAND);
2907 rtw_coex_scan_notify(rtwdev, COEX_SCAN_START_2G);
2910 void rtw_coex_connect_notify(struct rtw_dev *rtwdev, u8 type)
2912 struct rtw_coex *coex = &rtwdev->coex;
2918 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE | COEX_SCBD_ONOFF, true);
2921 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): 5G start\n",
2924 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_5G);
2925 rtw_coex_run_coex(rtwdev, COEX_RSN_5GCONSTART);
2927 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): 5G finish\n",
2930 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_5G);
2931 rtw_coex_run_coex(rtwdev, COEX_RSN_5GCONFINISH);
2937 ieee80211_queue_delayed_work(rtwdev->hw,
2940 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): 2G start\n",
2943 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_2G);
2945 rtw_coex_run_coex(rtwdev, COEX_RSN_2GCONSTART);
2951 ieee80211_queue_delayed_work(rtwdev->hw, &coex->defreeze_work,
2958 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): 2G finish\n",
2960 rtw_coex_run_coex(rtwdev, COEX_RSN_2GCONFINISH);
2964 void rtw_coex_media_status_notify(struct rtw_dev *rtwdev, u8 type)
2966 struct rtw_coex *coex = &rtwdev->coex;
2973 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): 5G\n", __func__);
2975 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE, true);
2977 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_5G);
2978 rtw_coex_run_coex(rtwdev, COEX_RSN_5GMEDIA);
2980 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): 2G\n", __func__);
2984 rtw_coex_write_scbd(rtwdev, COEX_SCBD_ACTIVE, true);
2987 rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_2G);
2990 rtw_coex_set_wl_pri_mask(rtwdev, COEX_WLPRI_RX_CCK, 1);
2991 rtw_coex_run_coex(rtwdev, COEX_RSN_2GMEDIA);
2993 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s(): disconnect!!\n",
2995 rtw_coex_set_wl_pri_mask(rtwdev, COEX_WLPRI_RX_CCK, 0);
2996 rtw_coex_run_coex(rtwdev, COEX_RSN_MEDIADISCON);
2999 rtw_coex_update_wl_ch_info(rtwdev, type);
3002 void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
3004 const struct rtw_chip_info *chip = rtwdev->chip;
3005 struct rtw_coex *coex = &rtwdev->coex;
3024 rtw_dbg(rtwdev, RTW_DBG_COEX,
3032 rtw_dbg(rtwdev, RTW_DBG_COEX,
3036 rtw_coex_monitor_bt_enable(rtwdev);
3039 rtw_coex_run_coex(rtwdev, COEX_RSN_BTINFO);
3045 rtw_dbg(rtwdev, RTW_DBG_COEX,
3055 rtw_dbg(rtwdev, RTW_DBG_COEX,
3058 rtw_coex_update_bt_link_info(rtwdev);
3067 ieee80211_queue_delayed_work(rtwdev->hw,
3070 rtw_dbg(rtwdev, RTW_DBG_COEX,
3076 rtw_dbg(rtwdev, RTW_DBG_COEX,
3082 rtw_dbg(rtwdev, RTW_DBG_COEX,
3096 rtw_dbg(rtwdev, RTW_DBG_COEX,
3120 ieee80211_queue_delayed_work(rtwdev->hw,
3195 ieee80211_queue_delayed_work(rtwdev->hw,
3199 rtw_dbg(rtwdev, RTW_DBG_COEX,
3216 ieee80211_queue_delayed_work(rtwdev->hw,
3224 rtw_dbg(rtwdev, RTW_DBG_COEX,
3231 rtw_coex_update_wl_ch_info(rtwdev, type);
3237 rtw_dbg(rtwdev, RTW_DBG_COEX,
3239 rtw_coex_ignore_wlan_act(rtwdev, false);
3262 rtw_coex_update_bt_link_info(rtwdev);
3263 rtw_coex_run_coex(rtwdev, COEX_RSN_BTINFO);
3270 void rtw_coex_bt_hid_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
3272 const struct rtw_chip_info *chip = rtwdev->chip;
3273 struct rtw_coex *coex = &rtwdev->coex;
3285 rtw_dbg(rtwdev, RTW_DBG_COEX,
3353 rtw_dbg(rtwdev, RTW_DBG_COEX,
3356 rtw_coex_run_coex(rtwdev, COEX_RSN_BTSTATUS);
3360 void rtw_coex_query_bt_hid_list(struct rtw_dev *rtwdev)
3362 const struct rtw_chip_info *chip = rtwdev->chip;
3363 struct rtw_coex *coex = &rtwdev->coex;
3379 rtw_fw_coex_query_hid_info(rtwdev, COEX_BT_HIDINFO_LIST, 0);
3389 rtw_fw_coex_query_hid_info(rtwdev,
3395 void rtw_coex_wl_fwdbginfo_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
3397 struct rtw_coex *coex = &rtwdev->coex;
3402 rtw_dbg(rtwdev, RTW_DBG_COEX,
3422 rtw_coex_wl_ccklock_action(rtwdev);
3423 rtw_coex_wl_ccklock_detect(rtwdev);
3426 void rtw_coex_wl_status_change_notify(struct rtw_dev *rtwdev, u32 type)
3428 rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
3431 void rtw_coex_wl_status_check(struct rtw_dev *rtwdev)
3433 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3439 rtw_coex_monitor_bt_ctr(rtwdev);
3444 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3446 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3448 mutex_lock(&rtwdev->mutex);
3450 rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
3451 mutex_unlock(&rtwdev->mutex);
3456 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3458 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3460 mutex_lock(&rtwdev->mutex);
3462 mutex_unlock(&rtwdev->mutex);
3467 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3469 struct rtw_coex *coex = &rtwdev->coex;
3470 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3472 mutex_lock(&rtwdev->mutex);
3475 rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
3476 mutex_unlock(&rtwdev->mutex);
3481 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3483 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3485 mutex_lock(&rtwdev->mutex);
3486 coex_stat->wl_gl_busy = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
3487 rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
3488 mutex_unlock(&rtwdev->mutex);
3493 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3495 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3497 mutex_lock(&rtwdev->mutex);
3499 rtw_coex_run_coex(rtwdev, COEX_RSN_BTSTATUS);
3500 mutex_unlock(&rtwdev->mutex);
3505 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3507 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3509 mutex_lock(&rtwdev->mutex);
3511 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], WL connecting stop!!\n");
3512 rtw_coex_run_coex(rtwdev, COEX_RSN_WLSTATUS);
3513 mutex_unlock(&rtwdev->mutex);
3518 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3520 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3522 mutex_lock(&rtwdev->mutex);
3524 mutex_unlock(&rtwdev->mutex);
3529 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
3531 struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
3533 mutex_lock(&rtwdev->mutex);
3535 mutex_unlock(&rtwdev->mutex);
3581 static u8 rtw_coex_get_table_index(struct rtw_dev *rtwdev, u32 wl_reg_6c0,
3584 const struct rtw_chip_info *chip = rtwdev->chip;
3585 struct rtw_efuse *efuse = &rtwdev->efuse;
3618 static u8 rtw_coex_get_tdma_index(struct rtw_dev *rtwdev, u8 *tdma_para)
3620 const struct rtw_chip_info *chip = rtwdev->chip;
3621 struct rtw_efuse *efuse = &rtwdev->efuse;
3656 static int rtw_coex_addr_info(struct rtw_dev *rtwdev,
3701 static int rtw_coex_val_info(struct rtw_dev *rtwdev,
3714 rtw_read32_mask(rtwdev, reg->addr, reg->mask));
3717 rtw_read16_mask(rtwdev, reg->addr, reg->mask));
3720 rtw_read8_mask(rtwdev, reg->addr, reg->mask));
3733 rtw_read_rf(rtwdev, rf_path, reg->addr, reg->mask));
3736 static void rtw_coex_set_coexinfo_hw(struct rtw_dev *rtwdev, struct seq_file *m)
3738 const struct rtw_chip_info *chip = rtwdev->chip;
3749 n_addr += rtw_coex_addr_info(rtwdev, reg, addr_info, n_addr);
3750 n_val += rtw_coex_val_info(rtwdev, reg, val_info, n_val);
3763 static bool rtw_coex_get_bt_reg(struct rtw_dev *rtwdev,
3776 skb = rtw_coex_info_request(rtwdev, &req);
3789 static bool rtw_coex_get_bt_patch_version(struct rtw_dev *rtwdev,
3797 skb = rtw_coex_info_request(rtwdev, &req);
3808 static bool rtw_coex_get_bt_supported_version(struct rtw_dev *rtwdev,
3816 skb = rtw_coex_info_request(rtwdev, &req);
3827 static bool rtw_coex_get_bt_supported_feature(struct rtw_dev *rtwdev,
3835 skb = rtw_coex_info_request(rtwdev, &req);
3870 struct rtw_dev *rtwdev;
3879 struct rtw_dev *rtwdev = vif_iter_data->rtwdev;
3892 rtw_iterate_stas_atomic(rtwdev, rtw_coex_sta_stat_iter,
3910 void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
3912 const struct rtw_chip_info *chip = rtwdev->chip;
3913 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
3914 struct rtw_coex *coex = &rtwdev->coex;
3917 struct rtw_hal *hal = &rtwdev->hal;
3918 struct rtw_efuse *efuse = &rtwdev->efuse;
3919 struct rtw_fw_state *fw = &rtwdev->fw;
3928 score_board_BW = rtw_coex_read_scbd(rtwdev);
3930 wl_reg_6c0 = rtw_read32(rtwdev, REG_BT_COEX_TABLE0);
3931 wl_reg_6c4 = rtw_read32(rtwdev, REG_BT_COEX_TABLE1);
3932 wl_reg_6c8 = rtw_read32(rtwdev, REG_BT_COEX_BRK_TABLE);
3933 wl_reg_6cc = rtw_read32(rtwdev, REG_BT_COEX_TABLE_H);
3934 wl_reg_778 = rtw_read8(rtwdev, REG_BT_STAT_CTRL);
3936 sys_lte = rtw_read8(rtwdev, 0x73);
3937 lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
3938 bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
3941 rtw_coex_get_bt_supported_version(rtwdev,
3943 rtw_coex_get_bt_patch_version(rtwdev, &coex_stat->patch_ver);
3944 rtw_coex_get_bt_supported_feature(rtwdev,
3946 rtw_coex_get_bt_reg(rtwdev, 3, 0xae, &coex_stat->bt_reg_vendor_ae);
3947 rtw_coex_get_bt_reg(rtwdev, 3, 0xac, &coex_stat->bt_reg_vendor_ac);
3953 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
4052 "Scanning", test_bit(RTW_FLAG_SCANNING, rtwdev->flags));
4056 rtwdev->stats.tx_throughput, rtwdev->stats.rx_throughput);
4059 !test_bit(RTW_FLAG_POWERON, rtwdev->flags),
4060 test_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags),
4061 rtwdev->lps_conf.mode);
4063 vif_iter_data.rtwdev = rtwdev;
4065 rtw_iterate_vifs_atomic(rtwdev, rtw_coex_vif_stat_iter, &vif_iter_data);
4074 rtw_coex_get_tdma_index(rtwdev,
4092 rtw_coex_get_table_index(rtwdev, wl_reg_6c0, wl_reg_6c4),
4156 rtw_coex_set_coexinfo_hw(rtwdev, m);