Lines Matching +full:rx +full:- +full:num +full:- +full:evt

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
268 #define RTW89_DEFAULT_BTC_VER_IDX (ARRAY_SIZE(rtw89_btc_ver_defs) - 1)
524 /* TDMA off + pri: WL_Hi-Tx > BT_Hi_Rx, BT_Hi > WL > BT_Lo */
527 /* TDMA off + pri: WL_Hi-Tx > BT, BT_Hi > other-WL > BT_Lo */
530 /* TDMA off + pri: WL_Hi-Tx = BT */
533 /* TDMA off + pri: WL > BT, Block-BT*/
536 /* TDMA off+Bcn-Protect + pri: WL_Hi-Tx > BT_Hi_Rx, BT_Hi > WL > BT_Lo*/
539 /* TDMA off + Ext-Ctrl + pri: default */
542 /* TDMA off + Ext-Ctrl + pri: E2G-slot block all BT */
545 /* TDMA off + Ext-Ctrl + pri: default */
548 /* TDMA off + Ext-Ctrl + pri: E2G-slot block all BT */
551 /* TDMA off + Ext-Ctrl + pri: E2G-slot WL > BT */
554 /* TDMA off + Ext-Ctrl + pri: E2G/EBT-slot WL > BT */
557 /* TDMA off + Ext-Ctrl + pri: default */
560 /* TDMA Fix slot-0: W1:B1 = 30:30 */
563 /* TDMA Fix slot-1: W1:B1 = 50:50 */
566 /* TDMA Fix slot-2: W1:B1 = 20:30 */
569 /* TDMA Fix slot-3: W1:B1 = 40:10 */
572 /* TDMA Fix slot-4: W1:B1 = 70:10 */
575 /* TDMA Fix slot-5: W1:B1 = 20:60 */
578 /* TDMA Fix slot-6: W1:B1 = 30:60 */
581 /* TDMA Fix slot-7: W1:B1 = 20:80 */
584 /* TDMA Fix slot-8: W1:B1 = user-define */
587 /* TDMA Fix slot-9: W1:B1 = 40:10 */
590 /* TDMA Fix slot-10: W1:B1 = 40:10 */
593 /* TDMA Fix slot-11: W1:B1 = 40:10 */
596 /* PS-TDMA Fix slot-0: W1:B1 = 30:30 */
599 /* PS-TDMA Fix slot-1: W1:B1 = 50:50 */
602 /* PS-TDMA Fix slot-2: W1:B1 = 20:30 */
605 /* PS-TDMA Fix slot-3: W1:B1 = 20:60 */
608 /* PS-TDMA Fix slot-4: W1:B1 = 30:70 */
611 /* PS-TDMA Fix slot-5: W1:B1 = 20:80 */
614 /* PS-TDMA Fix slot-6: W1:B1 = user-define */
617 /* TDMA Auto slot-0: W1:B1 = 50:200 */
620 /* TDMA Auto slot-1: W1:B1 = 60:200 */
623 /* TDMA Auto slot-2: W1:B1 = 20:200 */
626 /* TDMA Auto slot-3: W1:B1 = user-define */
629 /* PS-TDMA Auto slot-0: W1:B1 = 50:200 */
632 /* PS-TDMA Auto slot-1: W1:B1 = 60:200 */
635 /* PS-TDMA Auto slot-2: W1:B1 = 20:200 */
638 /* PS-TDMA Auto slot-3: W1:B1 = user-define */
641 /* TDMA Auto slot2-0: W1:B4 = 30:50 */
644 /* TDMA Auto slot2-1: W1:B4 = 30:70 */
647 /* TDMA Auto slot2-2: W1:B4 = 50:50 */
650 /* TDMA Auto slot2-3: W1:B4 = 60:60 */
653 /* TDMA Auto slot2-4: W1:B4 = 20:80 */
656 /* TDMA Auto slot2-5: W1:B4 = user-define */
659 /* PS-TDMA Auto slot2-0: W1:B4 = 30:50 */
662 /* PS-TDMA Auto slot2-1: W1:B4 = 30:70 */
665 /* PS-TDMA Auto slot2-2: W1:B4 = 50:50 */
668 /* PS-TDMA Auto slot2-3: W1:B4 = 60:60 */
671 /* PS-TDMA Auto slot2-4: W1:B4 = 20:80 */
674 /* PS-TDMA Auto slot2-5: W1:B4 = user-define */
862 BTC_ACT_NUM = BTC_ACT_LAST - BTC_ACT_NONE,
880 struct rtw89_btc *btc = &rtwdev->btc; in _send_fw_cmd()
881 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _send_fw_cmd()
882 struct rtw89_btc_cx *cx = &btc->cx; in _send_fw_cmd()
883 struct rtw89_btc_wl_info *wl = &cx->wl; in _send_fw_cmd()
884 struct rtw89_btc_dm *dm = &btc->dm; in _send_fw_cmd()
888 btc->fwinfo.cnt_h2c_fail++; in _send_fw_cmd()
889 dm->error.map.h2c_buffer_over = true; in _send_fw_cmd()
890 return -EINVAL; in _send_fw_cmd()
891 } else if (!wl->status.map.init_ok) { in _send_fw_cmd()
894 pfwinfo->cnt_h2c_fail++; in _send_fw_cmd()
895 return -EINVAL; in _send_fw_cmd()
896 } else if ((wl->status.map.rf_off_pre == BTC_LPS_RF_OFF && in _send_fw_cmd()
897 wl->status.map.rf_off == BTC_LPS_RF_OFF) || in _send_fw_cmd()
898 (wl->status.map.lps_pre == BTC_LPS_RF_OFF && in _send_fw_cmd()
899 wl->status.map.lps == BTC_LPS_RF_OFF)) { in _send_fw_cmd()
902 pfwinfo->cnt_h2c_fail++; in _send_fw_cmd()
903 return -EINVAL; in _send_fw_cmd()
909 pfwinfo->cnt_h2c_fail++; in _send_fw_cmd()
911 pfwinfo->cnt_h2c++; in _send_fw_cmd()
921 struct rtw89_btc *btc = &rtwdev->btc; in _reset_btc_var()
922 const struct rtw89_btc_ver *ver = btc->ver; in _reset_btc_var()
923 struct rtw89_btc_cx *cx = &btc->cx; in _reset_btc_var()
924 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _reset_btc_var()
925 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _reset_btc_var()
926 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _reset_btc_var()
939 memset(&btc->ctrl, 0, sizeof(btc->ctrl)); in _reset_btc_var()
940 btc->manual_ctrl = false; in _reset_btc_var()
941 if (ver->fcxctrl != 7) in _reset_btc_var()
942 btc->ctrl.ctrl.trace_step = FCXDEF_STEP; in _reset_btc_var()
947 memset(&btc->dm, 0, sizeof(btc->dm)); in _reset_btc_var()
948 memset(bt_linfo->rssi_state, 0, sizeof(bt_linfo->rssi_state)); in _reset_btc_var()
950 if (btc->ver->fwlrole == 8) in _reset_btc_var()
951 wl_linfo = &wl->rlink_info[i][0]; in _reset_btc_var()
953 wl_linfo = &wl->link_info[i]; in _reset_btc_var()
954 memset(wl_linfo->rssi_state, 0, sizeof(wl_linfo->rssi_state)); in _reset_btc_var()
958 btc->dm.tdma_now = t_def[CXTD_OFF]; in _reset_btc_var()
959 btc->dm.tdma = t_def[CXTD_OFF]; in _reset_btc_var()
960 if (ver->fcxslots >= 7) { in _reset_btc_var()
962 btc->dm.slot.v7[i].dur = s_def[i].dur; in _reset_btc_var()
963 btc->dm.slot.v7[i].cxtype = s_def[i].cxtype; in _reset_btc_var()
964 btc->dm.slot.v7[i].cxtbl = s_def[i].cxtbl; in _reset_btc_var()
966 memcpy(&btc->dm.slot_now.v7, &btc->dm.slot.v7, in _reset_btc_var()
967 sizeof(btc->dm.slot_now.v7)); in _reset_btc_var()
969 memcpy(&btc->dm.slot_now.v1, s_def, in _reset_btc_var()
970 sizeof(btc->dm.slot_now.v1)); in _reset_btc_var()
971 memcpy(&btc->dm.slot.v1, s_def, in _reset_btc_var()
972 sizeof(btc->dm.slot.v1)); in _reset_btc_var()
975 btc->policy_len = 0; in _reset_btc_var()
976 btc->bt_req_len = 0; in _reset_btc_var()
978 btc->dm.coex_info_map = BTC_COEX_INFO_ALL; in _reset_btc_var()
979 btc->dm.wl_tx_limit.tx_time = BTC_MAX_TX_TIME_DEF; in _reset_btc_var()
980 btc->dm.wl_tx_limit.tx_retry = BTC_MAX_TX_RETRY_DEF; in _reset_btc_var()
981 btc->dm.wl_pre_agc_rb = BTC_PREAGC_NOTFOUND; in _reset_btc_var()
982 btc->dm.wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_NOTFOUND; in _reset_btc_var()
986 memset(&btc->mdinfo, 0, sizeof(btc->mdinfo)); in _reset_btc_var()
988 bt->link_info.bt_txpwr_desc.br_dbm = BTC_BT_DEF_BR_TX_PWR; in _reset_btc_var()
989 bt->link_info.bt_txpwr_desc.le_dbm = BTC_BT_DEF_LE_TX_PWR; in _reset_btc_var()
994 const struct rtw89_chip_info *chip = rtwdev->chip; in _search_reg_index()
998 if (le16_to_cpu(chip->mon_reg[i].type) == reg_type && in _search_reg_index()
999 le32_to_cpu(chip->mon_reg[i].offset) == target) { in _search_reg_index()
1007 struct rtw89_btc *btc = &rtwdev->btc; in _get_reg_status()
1008 const struct rtw89_btc_ver *ver = btc->ver; in _get_reg_status()
1009 union rtw89_btc_module_info *md = &btc->mdinfo; in _get_reg_status()
1015 if (ver->fcxinit == 7) in _get_reg_status()
1016 switch_type = md->md_v7.switch_type; in _get_reg_status()
1018 switch_type = md->md.switch_type; in _get_reg_status()
1020 if (btc->btg_pos == RF_PATH_A) in _get_reg_status()
1037 if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid) in _get_reg_status()
1040 pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo; in _get_reg_status()
1041 if (ver->fcxmreg == 1) { in _get_reg_status()
1042 idx = _search_reg_index(rtwdev, pmreg->v1.reg_num, in _get_reg_status()
1047 reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]); in _get_reg_status()
1050 } else if (ver->fcxmreg == 2) { in _get_reg_status()
1051 idx = _search_reg_index(rtwdev, pmreg->v2.reg_num, in _get_reg_status()
1056 reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]); in _get_reg_status()
1067 if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid) in _get_reg_status()
1070 pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo; in _get_reg_status()
1071 if (ver->fcxmreg == 1) { in _get_reg_status()
1072 idx = _search_reg_index(rtwdev, pmreg->v1.reg_num, in _get_reg_status()
1077 reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]) & in _get_reg_status()
1081 } else if (ver->fcxmreg == 2) { in _get_reg_status()
1082 idx = _search_reg_index(rtwdev, pmreg->v2.reg_num, in _get_reg_status()
1087 reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]) & in _get_reg_status()
1105 struct rtw89_btc *btc = &rtwdev->btc; in _chk_btc_err()
1106 struct rtw89_btc_cx *cx = &btc->cx; in _chk_btc_err()
1107 struct rtw89_btc_bt_info *bt = &cx->bt; in _chk_btc_err()
1108 struct rtw89_btc_wl_info *wl = &cx->wl; in _chk_btc_err()
1109 struct rtw89_btc_dm *dm = &btc->dm; in _chk_btc_err()
1117 if ((wl->ver_info.fw_coex & 0xffff0000) != in _chk_btc_err()
1118 rtwdev->chip->wlcx_desired) { in _chk_btc_err()
1119 wl->fw_ver_mismatch = true; in _chk_btc_err()
1120 dm->error.map.wl_ver_mismatch = true; in _chk_btc_err()
1122 wl->fw_ver_mismatch = false; in _chk_btc_err()
1123 dm->error.map.wl_ver_mismatch = false; in _chk_btc_err()
1127 if (dm->cnt_dm[BTC_DCNT_RPT] == cnt && btc->fwinfo.rpt_en_map) in _chk_btc_err()
1128 dm->cnt_dm[BTC_DCNT_RPT_HANG]++; in _chk_btc_err()
1130 dm->cnt_dm[BTC_DCNT_RPT_HANG] = 0; in _chk_btc_err()
1132 if (dm->cnt_dm[BTC_DCNT_RPT_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1133 dm->error.map.wl_fw_hang = true; in _chk_btc_err()
1135 dm->error.map.wl_fw_hang = false; in _chk_btc_err()
1137 dm->cnt_dm[BTC_DCNT_RPT] = cnt; in _chk_btc_err()
1140 if (dm->cnt_dm[BTC_DCNT_CYCLE] == cnt && in _chk_btc_err()
1141 (dm->tdma_now.type != CXTDMA_OFF || in _chk_btc_err()
1142 dm->tdma_now.ext_ctrl == CXECTL_EXT)) in _chk_btc_err()
1143 dm->cnt_dm[BTC_DCNT_CYCLE_HANG]++; in _chk_btc_err()
1145 dm->cnt_dm[BTC_DCNT_CYCLE_HANG] = 0; in _chk_btc_err()
1147 if (dm->cnt_dm[BTC_DCNT_CYCLE_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1148 dm->error.map.cycle_hang = true; in _chk_btc_err()
1150 dm->error.map.cycle_hang = false; in _chk_btc_err()
1152 dm->cnt_dm[BTC_DCNT_CYCLE] = cnt; in _chk_btc_err()
1155 if (dm->cnt_dm[BTC_DCNT_W1] == cnt && in _chk_btc_err()
1156 dm->tdma_now.type != CXTDMA_OFF) in _chk_btc_err()
1157 dm->cnt_dm[BTC_DCNT_W1_HANG]++; in _chk_btc_err()
1159 dm->cnt_dm[BTC_DCNT_W1_HANG] = 0; in _chk_btc_err()
1161 if (dm->cnt_dm[BTC_DCNT_W1_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1162 dm->error.map.w1_hang = true; in _chk_btc_err()
1164 dm->error.map.w1_hang = false; in _chk_btc_err()
1166 dm->cnt_dm[BTC_DCNT_W1] = cnt; in _chk_btc_err()
1169 if (dm->cnt_dm[BTC_DCNT_B1] == cnt && in _chk_btc_err()
1170 dm->tdma_now.type != CXTDMA_OFF) in _chk_btc_err()
1171 dm->cnt_dm[BTC_DCNT_B1_HANG]++; in _chk_btc_err()
1173 dm->cnt_dm[BTC_DCNT_B1_HANG] = 0; in _chk_btc_err()
1175 if (dm->cnt_dm[BTC_DCNT_B1_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1176 dm->error.map.b1_hang = true; in _chk_btc_err()
1178 dm->error.map.b1_hang = false; in _chk_btc_err()
1180 dm->cnt_dm[BTC_DCNT_B1] = cnt; in _chk_btc_err()
1183 if (dm->cnt_dm[BTC_DCNT_E2G] == cnt && in _chk_btc_err()
1184 dm->tdma_now.ext_ctrl == CXECTL_EXT) in _chk_btc_err()
1185 dm->cnt_dm[BTC_DCNT_E2G_HANG]++; in _chk_btc_err()
1187 dm->cnt_dm[BTC_DCNT_E2G_HANG] = 0; in _chk_btc_err()
1189 if (dm->cnt_dm[BTC_DCNT_E2G_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1190 dm->error.map.wl_e2g_hang = true; in _chk_btc_err()
1192 dm->error.map.wl_e2g_hang = false; in _chk_btc_err()
1194 dm->cnt_dm[BTC_DCNT_E2G] = cnt; in _chk_btc_err()
1198 dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC]++; in _chk_btc_err()
1200 dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC] = 0; in _chk_btc_err()
1202 if (dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1203 dm->error.map.tdma_no_sync = true; in _chk_btc_err()
1205 dm->error.map.tdma_no_sync = false; in _chk_btc_err()
1209 dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC]++; in _chk_btc_err()
1211 dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC] = 0; in _chk_btc_err()
1213 if (dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1214 dm->error.map.slot_no_sync = true; in _chk_btc_err()
1216 dm->error.map.slot_no_sync = false; in _chk_btc_err()
1219 cnt = cx->cnt_bt[BTC_BCNT_LOPRI_TX]; in _chk_btc_err()
1221 if (cnt == 0 && bt->link_info.slave_role) in _chk_btc_err()
1222 dm->cnt_dm[BTC_DCNT_BTTX_HANG]++; in _chk_btc_err()
1224 dm->cnt_dm[BTC_DCNT_BTTX_HANG] = 0; in _chk_btc_err()
1226 if (dm->cnt_dm[BTC_DCNT_BTTX_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1227 dm->error.map.bt_tx_hang = true; in _chk_btc_err()
1229 dm->error.map.bt_tx_hang = false; in _chk_btc_err()
1232 cnt = cx->cnt_bt[BTC_BCNT_HIPRI_RX] + in _chk_btc_err()
1233 cx->cnt_bt[BTC_BCNT_HIPRI_TX] + in _chk_btc_err()
1234 cx->cnt_bt[BTC_BCNT_LOPRI_RX] + in _chk_btc_err()
1235 cx->cnt_bt[BTC_BCNT_LOPRI_TX]; in _chk_btc_err()
1238 dm->cnt_dm[BTC_DCNT_BTCNT_HANG]++; in _chk_btc_err()
1240 dm->cnt_dm[BTC_DCNT_BTCNT_HANG] = 0; in _chk_btc_err()
1242 if ((dm->cnt_dm[BTC_DCNT_BTCNT_HANG] >= BTC_CHK_HANG_MAX && in _chk_btc_err()
1243 bt->enable.now) || (!dm->cnt_dm[BTC_DCNT_BTCNT_HANG] && in _chk_btc_err()
1244 !bt->enable.now)) in _chk_btc_err()
1249 dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT]++; in _chk_btc_err()
1251 dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT] = 0; in _chk_btc_err()
1253 if (dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1254 dm->error.map.wl_slot_drift = true; in _chk_btc_err()
1256 dm->error.map.wl_slot_drift = false; in _chk_btc_err()
1260 dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT]++; in _chk_btc_err()
1262 dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT] = 0; in _chk_btc_err()
1264 if (dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1265 dm->error.map.bt_slot_drift = true; in _chk_btc_err()
1267 dm->error.map.bt_slot_drift = false; in _chk_btc_err()
1275 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_report()
1276 const struct rtw89_btc_ver *ver = btc->ver; in _update_bt_report()
1277 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _update_bt_report()
1278 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _update_bt_report()
1279 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt_linfo->a2dp_desc; in _update_bt_report()
1280 union rtw89_btc_fbtc_btver *pver = &btc->fwinfo.rpt_fbtc_btver.finfo; in _update_bt_report()
1297 if (ver->fcxbtver == 7) { in _update_bt_report()
1298 pver->v7 = *(struct rtw89_btc_fbtc_btver_v7 *)pfinfo; in _update_bt_report()
1299 bt->ver_info.fw = le32_to_cpu(pver->v7.fw_ver); in _update_bt_report()
1300 bt->ver_info.fw_coex = le32_get_bits(pver->v7.coex_ver, in _update_bt_report()
1302 bt->feature = le32_to_cpu(pver->v7.feature); in _update_bt_report()
1304 pver->v1 = *(struct rtw89_btc_fbtc_btver_v1 *)pfinfo; in _update_bt_report()
1305 bt->ver_info.fw = le32_to_cpu(pver->v1.fw_ver); in _update_bt_report()
1306 bt->ver_info.fw_coex = le32_get_bits(pver->v1.coex_ver, in _update_bt_report()
1308 bt->feature = le32_to_cpu(pver->v1.feature); in _update_bt_report()
1312 if (ver->fcxbtscan == 1) { in _update_bt_report()
1315 bt->scan_info_v1[i] = pscan_v1->scan[i]; in _update_bt_report()
1316 if (bt->scan_info_v1[i].win == 0 && in _update_bt_report()
1317 bt->scan_info_v1[i].intvl == 0) in _update_bt_report()
1320 } else if (ver->fcxbtscan == 2) { in _update_bt_report()
1323 bt->scan_info_v2[i] = pscan_v2->para[i]; in _update_bt_report()
1324 if ((pscan_v2->type & BIT(i)) && in _update_bt_report()
1325 pscan_v2->para[i].win == 0 && in _update_bt_report()
1326 pscan_v2->para[i].intvl == 0) in _update_bt_report()
1329 } else if (ver->fcxbtscan == 7) { in _update_bt_report()
1332 bt->scan_info_v2[i] = pscan_v7->para[i]; in _update_bt_report()
1333 if ((pscan_v7->type & BIT(i)) && in _update_bt_report()
1334 pscan_v7->para[i].win == 0 && in _update_bt_report()
1335 pscan_v7->para[i].intvl == 0) in _update_bt_report()
1340 bt->scan_info_update = 1; in _update_bt_report()
1343 if (ver->fcxbtafh == 2) { in _update_bt_report()
1345 if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LEGACY) { in _update_bt_report()
1346 memcpy(&bt_linfo->afh_map[0], pafh_v2->afh_l, 4); in _update_bt_report()
1347 memcpy(&bt_linfo->afh_map[4], pafh_v2->afh_m, 4); in _update_bt_report()
1348 memcpy(&bt_linfo->afh_map[8], pafh_v2->afh_h, 2); in _update_bt_report()
1350 if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LE) { in _update_bt_report()
1351 memcpy(&bt_linfo->afh_map_le[0], pafh_v2->afh_le_a, 4); in _update_bt_report()
1352 memcpy(&bt_linfo->afh_map_le[4], pafh_v2->afh_le_b, 1); in _update_bt_report()
1354 } else if (ver->fcxbtafh == 7) { in _update_bt_report()
1356 if (pafh_v7->map_type & RPT_BT_AFH_SEQ_LEGACY) { in _update_bt_report()
1357 memcpy(&bt_linfo->afh_map[0], pafh_v7->afh_l, 4); in _update_bt_report()
1358 memcpy(&bt_linfo->afh_map[4], pafh_v7->afh_m, 4); in _update_bt_report()
1359 memcpy(&bt_linfo->afh_map[8], pafh_v7->afh_h, 2); in _update_bt_report()
1361 if (pafh_v7->map_type & RPT_BT_AFH_SEQ_LE) { in _update_bt_report()
1362 memcpy(&bt_linfo->afh_map_le[0], pafh_v7->afh_le_a, 4); in _update_bt_report()
1363 memcpy(&bt_linfo->afh_map_le[4], pafh_v7->afh_le_b, 1); in _update_bt_report()
1365 } else if (ver->fcxbtafh == 1) { in _update_bt_report()
1367 memcpy(&bt_linfo->afh_map[0], pafh_v1->afh_l, 4); in _update_bt_report()
1368 memcpy(&bt_linfo->afh_map[4], pafh_v1->afh_m, 4); in _update_bt_report()
1369 memcpy(&bt_linfo->afh_map[8], pafh_v1->afh_h, 2); in _update_bt_report()
1374 a2dp->device_name = le32_to_cpu(pdev->dev_name); in _update_bt_report()
1375 a2dp->vendor_id = le16_to_cpu(pdev->vendor_id); in _update_bt_report()
1376 a2dp->flush_time = le32_to_cpu(pdev->flush_time); in _update_bt_report()
1385 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_rpt_evnt_ver()
1386 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_fw_rpt_evnt_ver()
1388 if (ver->fwevntrptl == 1) in rtw89_btc_fw_rpt_evnt_ver()
1412 struct rtw89_btc *btc = &rtwdev->btc; in _chk_btc_report()
1413 struct rtw89_btc_ver *fwsubver = &btc->fwinfo.fw_subver; in _chk_btc_report()
1414 const struct rtw89_btc_ver *ver = btc->ver; in _chk_btc_report()
1415 struct rtw89_btc_dm *dm = &btc->dm; in _chk_btc_report()
1417 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _chk_btc_report()
1418 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _chk_btc_report()
1434 pfwinfo->err[BTFRE_INVALID_INPUT]++; in _chk_btc_report()
1439 rpt_type = btc_prpt->type; in _chk_btc_report()
1440 rpt_len = le16_to_cpu(btc_prpt->len); in _chk_btc_report()
1441 rpt_content = btc_prpt->content; in _chk_btc_report()
1451 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _chk_btc_report()
1452 prpt = &pfwinfo->rpt_ctrl.finfo; in _chk_btc_report()
1453 if (ver->fcxbtcrpt == 1) { in _chk_btc_report()
1454 pfinfo = &pfwinfo->rpt_ctrl.finfo.v1; in _chk_btc_report()
1455 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v1); in _chk_btc_report()
1456 fwsubver->fcxbtcrpt = pfwinfo->rpt_ctrl.finfo.v1.fver; in _chk_btc_report()
1457 } else if (ver->fcxbtcrpt == 4) { in _chk_btc_report()
1458 pfinfo = &pfwinfo->rpt_ctrl.finfo.v4; in _chk_btc_report()
1459 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v4); in _chk_btc_report()
1460 fwsubver->fcxbtcrpt = pfwinfo->rpt_ctrl.finfo.v4.fver; in _chk_btc_report()
1461 } else if (ver->fcxbtcrpt == 5) { in _chk_btc_report()
1462 pfinfo = &pfwinfo->rpt_ctrl.finfo.v5; in _chk_btc_report()
1463 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v5); in _chk_btc_report()
1464 fwsubver->fcxbtcrpt = pfwinfo->rpt_ctrl.finfo.v5.fver; in _chk_btc_report()
1465 } else if (ver->fcxbtcrpt == 105) { in _chk_btc_report()
1466 pfinfo = &pfwinfo->rpt_ctrl.finfo.v105; in _chk_btc_report()
1467 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v105); in _chk_btc_report()
1468 fwsubver->fcxbtcrpt = pfwinfo->rpt_ctrl.finfo.v105.fver; in _chk_btc_report()
1469 pcinfo->req_fver = 5; in _chk_btc_report()
1471 } else if (ver->fcxbtcrpt == 8) { in _chk_btc_report()
1472 pfinfo = &pfwinfo->rpt_ctrl.finfo.v8; in _chk_btc_report()
1473 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v8); in _chk_btc_report()
1474 fwsubver->fcxbtcrpt = pfwinfo->rpt_ctrl.finfo.v8.fver; in _chk_btc_report()
1475 } else if (ver->fcxbtcrpt == 7) { in _chk_btc_report()
1476 pfinfo = &pfwinfo->rpt_ctrl.finfo.v7; in _chk_btc_report()
1477 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v7); in _chk_btc_report()
1478 fwsubver->fcxbtcrpt = pfwinfo->rpt_ctrl.finfo.v7.fver; in _chk_btc_report()
1482 pcinfo->req_fver = ver->fcxbtcrpt; in _chk_btc_report()
1485 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo; in _chk_btc_report()
1486 if (ver->fcxtdma == 1) { in _chk_btc_report()
1487 pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v1; in _chk_btc_report()
1488 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v1); in _chk_btc_report()
1489 fwsubver->fcxtdma = 0; in _chk_btc_report()
1490 } else if (ver->fcxtdma == 3 || ver->fcxtdma == 7) { in _chk_btc_report()
1491 pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v3; in _chk_btc_report()
1492 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v3); in _chk_btc_report()
1493 fwsubver->fcxtdma = pfwinfo->rpt_fbtc_tdma.finfo.v3.fver; in _chk_btc_report()
1497 pcinfo->req_fver = ver->fcxtdma; in _chk_btc_report()
1500 pcinfo = &pfwinfo->rpt_fbtc_slots.cinfo; in _chk_btc_report()
1501 if (ver->fcxslots == 1) { in _chk_btc_report()
1502 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo.v1; in _chk_btc_report()
1503 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo.v1); in _chk_btc_report()
1504 fwsubver->fcxslots = pfwinfo->rpt_fbtc_slots.finfo.v1.fver; in _chk_btc_report()
1505 } else if (ver->fcxslots == 7) { in _chk_btc_report()
1506 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo.v7; in _chk_btc_report()
1507 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo.v7); in _chk_btc_report()
1508 fwsubver->fcxslots = pfwinfo->rpt_fbtc_slots.finfo.v7.fver; in _chk_btc_report()
1512 pcinfo->req_fver = ver->fcxslots; in _chk_btc_report()
1515 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _chk_btc_report()
1516 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; in _chk_btc_report()
1517 if (ver->fcxcysta == 2) { in _chk_btc_report()
1518 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v2; in _chk_btc_report()
1519 pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2; in _chk_btc_report()
1520 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v2); in _chk_btc_report()
1521 fwsubver->fcxcysta = pfwinfo->rpt_fbtc_cysta.finfo.v2.fver; in _chk_btc_report()
1522 } else if (ver->fcxcysta == 3) { in _chk_btc_report()
1523 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v3; in _chk_btc_report()
1524 pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3; in _chk_btc_report()
1525 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v3); in _chk_btc_report()
1526 fwsubver->fcxcysta = pfwinfo->rpt_fbtc_cysta.finfo.v3.fver; in _chk_btc_report()
1527 } else if (ver->fcxcysta == 4) { in _chk_btc_report()
1528 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v4; in _chk_btc_report()
1529 pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4; in _chk_btc_report()
1530 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v4); in _chk_btc_report()
1531 fwsubver->fcxcysta = pfwinfo->rpt_fbtc_cysta.finfo.v4.fver; in _chk_btc_report()
1532 } else if (ver->fcxcysta == 5) { in _chk_btc_report()
1533 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v5; in _chk_btc_report()
1534 pcysta->v5 = pfwinfo->rpt_fbtc_cysta.finfo.v5; in _chk_btc_report()
1535 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v5); in _chk_btc_report()
1536 fwsubver->fcxcysta = pfwinfo->rpt_fbtc_cysta.finfo.v5.fver; in _chk_btc_report()
1537 } else if (ver->fcxcysta == 7) { in _chk_btc_report()
1538 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v7; in _chk_btc_report()
1539 pcysta->v7 = pfwinfo->rpt_fbtc_cysta.finfo.v7; in _chk_btc_report()
1540 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v7); in _chk_btc_report()
1541 fwsubver->fcxcysta = pfwinfo->rpt_fbtc_cysta.finfo.v7.fver; in _chk_btc_report()
1545 pcinfo->req_fver = ver->fcxcysta; in _chk_btc_report()
1548 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; in _chk_btc_report()
1549 if (ver->fcxctrl != 7) in _chk_btc_report()
1550 trace_step = btc->ctrl.ctrl.trace_step; in _chk_btc_report()
1552 if (ver->fcxstep == 2) { in _chk_btc_report()
1553 pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v2; in _chk_btc_report()
1554 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v2.step[0]) * in _chk_btc_report()
1557 fwsubver->fcxstep = pfwinfo->rpt_fbtc_step.finfo.v2.fver; in _chk_btc_report()
1558 } else if (ver->fcxstep == 3) { in _chk_btc_report()
1559 pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v3; in _chk_btc_report()
1560 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v3.step[0]) * in _chk_btc_report()
1563 fwsubver->fcxstep = pfwinfo->rpt_fbtc_step.finfo.v3.fver; in _chk_btc_report()
1567 pcinfo->req_fver = ver->fcxstep; in _chk_btc_report()
1570 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo; in _chk_btc_report()
1571 if (ver->fcxnullsta == 1) { in _chk_btc_report()
1572 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v1; in _chk_btc_report()
1573 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v1); in _chk_btc_report()
1574 fwsubver->fcxnullsta = pfwinfo->rpt_fbtc_nullsta.finfo.v1.fver; in _chk_btc_report()
1575 } else if (ver->fcxnullsta == 2) { in _chk_btc_report()
1576 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v2; in _chk_btc_report()
1577 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v2); in _chk_btc_report()
1578 fwsubver->fcxnullsta = pfwinfo->rpt_fbtc_nullsta.finfo.v2.fver; in _chk_btc_report()
1579 } else if (ver->fcxnullsta == 7) { in _chk_btc_report()
1580 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v7; in _chk_btc_report()
1581 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v7); in _chk_btc_report()
1582 fwsubver->fcxnullsta = pfwinfo->rpt_fbtc_nullsta.finfo.v7.fver; in _chk_btc_report()
1586 pcinfo->req_fver = ver->fcxnullsta; in _chk_btc_report()
1589 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _chk_btc_report()
1590 if (ver->fcxmreg == 1) { in _chk_btc_report()
1591 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v1; in _chk_btc_report()
1592 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v1); in _chk_btc_report()
1593 fwsubver->fcxmreg = pfwinfo->rpt_fbtc_mregval.finfo.v1.fver; in _chk_btc_report()
1594 } else if (ver->fcxmreg == 2) { in _chk_btc_report()
1595 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v2; in _chk_btc_report()
1596 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v2); in _chk_btc_report()
1597 fwsubver->fcxmreg = pfwinfo->rpt_fbtc_mregval.finfo.v2.fver; in _chk_btc_report()
1598 } else if (ver->fcxmreg == 7) { in _chk_btc_report()
1599 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v7; in _chk_btc_report()
1600 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v7); in _chk_btc_report()
1601 fwsubver->fcxmreg = pfwinfo->rpt_fbtc_mregval.finfo.v7.fver; in _chk_btc_report()
1605 pcinfo->req_fver = ver->fcxmreg; in _chk_btc_report()
1608 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo; in _chk_btc_report()
1609 if (ver->fcxgpiodbg == 7) { in _chk_btc_report()
1610 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7; in _chk_btc_report()
1611 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7); in _chk_btc_report()
1612 fwsubver->fcxgpiodbg = pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7.fver; in _chk_btc_report()
1614 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1; in _chk_btc_report()
1615 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1); in _chk_btc_report()
1616 fwsubver->fcxgpiodbg = pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1.fver; in _chk_btc_report()
1618 pcinfo->req_fver = ver->fcxgpiodbg; in _chk_btc_report()
1621 pcinfo = &pfwinfo->rpt_fbtc_btver.cinfo; in _chk_btc_report()
1622 if (ver->fcxbtver == 1) { in _chk_btc_report()
1623 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo.v1; in _chk_btc_report()
1624 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo.v1); in _chk_btc_report()
1625 fwsubver->fcxbtver = pfwinfo->rpt_fbtc_btver.finfo.v1.fver; in _chk_btc_report()
1626 } else if (ver->fcxbtver == 7) { in _chk_btc_report()
1627 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo.v7; in _chk_btc_report()
1628 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo.v7); in _chk_btc_report()
1629 fwsubver->fcxbtver = pfwinfo->rpt_fbtc_btver.finfo.v7.fver; in _chk_btc_report()
1631 pcinfo->req_fver = ver->fcxbtver; in _chk_btc_report()
1634 pcinfo = &pfwinfo->rpt_fbtc_btscan.cinfo; in _chk_btc_report()
1635 if (ver->fcxbtscan == 1) { in _chk_btc_report()
1636 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v1; in _chk_btc_report()
1637 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v1); in _chk_btc_report()
1638 fwsubver->fcxbtscan = pfwinfo->rpt_fbtc_btscan.finfo.v1.fver; in _chk_btc_report()
1639 } else if (ver->fcxbtscan == 2) { in _chk_btc_report()
1640 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v2; in _chk_btc_report()
1641 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v2); in _chk_btc_report()
1642 fwsubver->fcxbtscan = pfwinfo->rpt_fbtc_btscan.finfo.v2.fver; in _chk_btc_report()
1643 } else if (ver->fcxbtscan == 7) { in _chk_btc_report()
1644 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v7; in _chk_btc_report()
1645 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v7); in _chk_btc_report()
1646 fwsubver->fcxbtscan = pfwinfo->rpt_fbtc_btscan.finfo.v7.fver; in _chk_btc_report()
1650 pcinfo->req_fver = ver->fcxbtscan; in _chk_btc_report()
1653 pcinfo = &pfwinfo->rpt_fbtc_btafh.cinfo; in _chk_btc_report()
1654 if (ver->fcxbtafh == 1) { in _chk_btc_report()
1655 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v1; in _chk_btc_report()
1656 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v1); in _chk_btc_report()
1657 fwsubver->fcxbtafh = pfwinfo->rpt_fbtc_btafh.finfo.v1.fver; in _chk_btc_report()
1658 } else if (ver->fcxbtafh == 2) { in _chk_btc_report()
1659 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v2; in _chk_btc_report()
1660 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v2); in _chk_btc_report()
1661 fwsubver->fcxbtafh = pfwinfo->rpt_fbtc_btafh.finfo.v2.fver; in _chk_btc_report()
1662 } else if (ver->fcxbtafh == 7) { in _chk_btc_report()
1663 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v7; in _chk_btc_report()
1664 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v7); in _chk_btc_report()
1665 fwsubver->fcxbtafh = pfwinfo->rpt_fbtc_btafh.finfo.v7.fver; in _chk_btc_report()
1669 pcinfo->req_fver = ver->fcxbtafh; in _chk_btc_report()
1672 pcinfo = &pfwinfo->rpt_fbtc_btdev.cinfo; in _chk_btc_report()
1673 pfinfo = &pfwinfo->rpt_fbtc_btdev.finfo; in _chk_btc_report()
1674 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btdev.finfo); in _chk_btc_report()
1675 fwsubver->fcxbtdevinfo = pfwinfo->rpt_fbtc_btdev.finfo.fver; in _chk_btc_report()
1676 pcinfo->req_fver = ver->fcxbtdevinfo; in _chk_btc_report()
1679 pfwinfo->err[BTFRE_UNDEF_TYPE]++; in _chk_btc_report()
1683 pcinfo->rx_len = rpt_len; in _chk_btc_report()
1684 pcinfo->rx_cnt++; in _chk_btc_report()
1686 if (rpt_len != pcinfo->req_len) { in _chk_btc_report()
1688 pfwinfo->len_mismch |= (0x1 << rpt_type); in _chk_btc_report()
1690 pfwinfo->len_mismch |= BIT(31); in _chk_btc_report()
1693 __func__, rpt_type, rpt_len, pcinfo->req_len); in _chk_btc_report()
1695 pcinfo->valid = 0; in _chk_btc_report()
1697 } else if (!pfinfo || !rpt_content || !pcinfo->req_len) { in _chk_btc_report()
1698 pfwinfo->err[BTFRE_EXCEPTION]++; in _chk_btc_report()
1699 pcinfo->valid = 0; in _chk_btc_report()
1703 memcpy(pfinfo, rpt_content, pcinfo->req_len); in _chk_btc_report()
1704 pcinfo->valid = 1; in _chk_btc_report()
1708 if (ver->fcxbtcrpt == 1) { in _chk_btc_report()
1709 prpt->v1 = pfwinfo->rpt_ctrl.finfo.v1; in _chk_btc_report()
1710 btc->fwinfo.rpt_en_map = prpt->v1.rpt_enable; in _chk_btc_report()
1711 wl->ver_info.fw_coex = prpt->v1.wl_fw_coex_ver; in _chk_btc_report()
1712 wl->ver_info.fw = prpt->v1.wl_fw_ver; in _chk_btc_report()
1713 dm->wl_fw_cx_offload = !!prpt->v1.wl_fw_cx_offload; in _chk_btc_report()
1716 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1718 /* To avoid I/O if WL LPS or power-off */ in _chk_btc_report()
1719 if (wl->status.map.lps != BTC_LPS_RF_OFF && in _chk_btc_report()
1720 !wl->status.map.rf_off) { in _chk_btc_report()
1721 rtwdev->chip->ops->btc_update_bt_cnt(rtwdev); in _chk_btc_report()
1724 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1728 } else if (ver->fcxbtcrpt == 4) { in _chk_btc_report()
1729 prpt->v4 = pfwinfo->rpt_ctrl.finfo.v4; in _chk_btc_report()
1730 btc->fwinfo.rpt_en_map = le32_to_cpu(prpt->v4.rpt_info.en); in _chk_btc_report()
1731 wl->ver_info.fw_coex = le32_to_cpu(prpt->v4.wl_fw_info.cx_ver); in _chk_btc_report()
1732 wl->ver_info.fw = le32_to_cpu(prpt->v4.wl_fw_info.fw_ver); in _chk_btc_report()
1733 dm->wl_fw_cx_offload = !!le32_to_cpu(prpt->v4.wl_fw_info.cx_offload); in _chk_btc_report()
1736 memcpy(&dm->gnt.band[i], &prpt->v4.gnt_val[i], in _chk_btc_report()
1737 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1739 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1740 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_TX]); in _chk_btc_report()
1741 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1742 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_RX]); in _chk_btc_report()
1743 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1744 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_TX]); in _chk_btc_report()
1745 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1746 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_RX]); in _chk_btc_report()
1747 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1748 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_POLLUTED]); in _chk_btc_report()
1752 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1754 if (le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0) in _chk_btc_report()
1755 bt->rfk_info.map.timeout = 1; in _chk_btc_report()
1757 bt->rfk_info.map.timeout = 0; in _chk_btc_report()
1759 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; in _chk_btc_report()
1760 } else if (ver->fcxbtcrpt == 5) { in _chk_btc_report()
1761 prpt->v5 = pfwinfo->rpt_ctrl.finfo.v5; in _chk_btc_report()
1762 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v5.rpt_info.en); in _chk_btc_report()
1763 wl->ver_info.fw_coex = le32_to_cpu(prpt->v5.rpt_info.cx_ver); in _chk_btc_report()
1764 wl->ver_info.fw = le32_to_cpu(prpt->v5.rpt_info.fw_ver); in _chk_btc_report()
1765 dm->wl_fw_cx_offload = 0; in _chk_btc_report()
1768 memcpy(&dm->gnt.band[i], &prpt->v5.gnt_val[i][0], in _chk_btc_report()
1769 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1771 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1772 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_TX]); in _chk_btc_report()
1773 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1774 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_RX]); in _chk_btc_report()
1775 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1776 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_TX]); in _chk_btc_report()
1777 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1778 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_RX]); in _chk_btc_report()
1779 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1780 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_POLLUTED]); in _chk_btc_report()
1784 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1786 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; in _chk_btc_report()
1787 } else if (ver->fcxbtcrpt == 105) { in _chk_btc_report()
1788 prpt->v105 = pfwinfo->rpt_ctrl.finfo.v105; in _chk_btc_report()
1789 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v105.rpt_info.en); in _chk_btc_report()
1790 wl->ver_info.fw_coex = le32_to_cpu(prpt->v105.rpt_info.cx_ver); in _chk_btc_report()
1791 wl->ver_info.fw = le32_to_cpu(prpt->v105.rpt_info.fw_ver); in _chk_btc_report()
1792 dm->wl_fw_cx_offload = 0; in _chk_btc_report()
1795 memcpy(&dm->gnt.band[i], &prpt->v105.gnt_val[i][0], in _chk_btc_report()
1796 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1798 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1799 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_TX_V105]); in _chk_btc_report()
1800 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1801 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_RX_V105]); in _chk_btc_report()
1802 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1803 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_LO_TX_V105]); in _chk_btc_report()
1804 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1805 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_LO_RX_V105]); in _chk_btc_report()
1806 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1807 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1811 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1813 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; in _chk_btc_report()
1814 } else if (ver->fcxbtcrpt == 7) { in _chk_btc_report()
1815 prpt->v7 = pfwinfo->rpt_ctrl.finfo.v7; in _chk_btc_report()
1816 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v7.rpt_info.en); in _chk_btc_report()
1817 wl->ver_info.fw_coex = le32_to_cpu(prpt->v7.rpt_info.cx_ver); in _chk_btc_report()
1818 wl->ver_info.fw = le32_to_cpu(prpt->v7.rpt_info.fw_ver); in _chk_btc_report()
1821 memcpy(&dm->gnt.band[i], &prpt->v7.gnt_val[i][0], in _chk_btc_report()
1822 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1824 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1825 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_TX_V105]); in _chk_btc_report()
1826 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1827 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_RX_V105]); in _chk_btc_report()
1828 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1829 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_LO_TX_V105]); in _chk_btc_report()
1830 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1831 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_LO_RX_V105]); in _chk_btc_report()
1833 val1 = le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1834 if (val1 > btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]) in _chk_btc_report()
1835 val1 -= btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]; /* diff */ in _chk_btc_report()
1837 btc->cx.cnt_bt[BTC_BCNT_POLUT_DIFF] = val1; in _chk_btc_report()
1838 btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW] = in _chk_btc_report()
1839 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1841 val1 = pfwinfo->event[BTF_EVNT_RPT]; in _chk_btc_report()
1846 } else if (ver->fcxbtcrpt == 8) { in _chk_btc_report()
1847 prpt->v8 = pfwinfo->rpt_ctrl.finfo.v8; in _chk_btc_report()
1848 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v8.rpt_info.en); in _chk_btc_report()
1849 wl->ver_info.fw_coex = le32_to_cpu(prpt->v8.rpt_info.cx_ver); in _chk_btc_report()
1850 wl->ver_info.fw = le32_to_cpu(prpt->v8.rpt_info.fw_ver); in _chk_btc_report()
1853 memcpy(&dm->gnt.band[i], &prpt->v8.gnt_val[i][0], in _chk_btc_report()
1854 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1856 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1857 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_TX_V105]); in _chk_btc_report()
1858 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1859 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_RX_V105]); in _chk_btc_report()
1860 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1861 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_LO_TX_V105]); in _chk_btc_report()
1862 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1863 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_LO_RX_V105]); in _chk_btc_report()
1865 val1 = le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1866 if (val1 > btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]) in _chk_btc_report()
1867 val1 -= btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]; /* diff */ in _chk_btc_report()
1869 btc->cx.cnt_bt[BTC_BCNT_POLUT_DIFF] = val1; in _chk_btc_report()
1870 btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW] = in _chk_btc_report()
1871 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1873 val1 = pfwinfo->event[BTF_EVNT_RPT]; in _chk_btc_report()
1874 if (((prpt->v8.rpt_len_max_h << 8) + in _chk_btc_report()
1875 prpt->v8.rpt_len_max_l) != ver->info_buf) in _chk_btc_report()
1876 dm->error.map.h2c_c2h_buffer_mismatch = true; in _chk_btc_report()
1878 dm->error.map.h2c_c2h_buffer_mismatch = false; in _chk_btc_report()
1892 sizeof(dm->tdma_now)); in _chk_btc_report()
1893 if (ver->fcxtdma == 1) in _chk_btc_report()
1895 memcmp(&dm->tdma_now, in _chk_btc_report()
1896 &pfwinfo->rpt_fbtc_tdma.finfo.v1, in _chk_btc_report()
1897 sizeof(dm->tdma_now))); in _chk_btc_report()
1898 else if (ver->fcxtdma == 3 || ver->fcxtdma == 7) in _chk_btc_report()
1900 memcmp(&dm->tdma_now, in _chk_btc_report()
1901 &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma, in _chk_btc_report()
1902 sizeof(dm->tdma_now))); in _chk_btc_report()
1907 if (ver->fcxslots == 7) { in _chk_btc_report()
1911 sizeof(dm->slot_now.v7)); in _chk_btc_report()
1913 memcmp(dm->slot_now.v7, in _chk_btc_report()
1914 pfwinfo->rpt_fbtc_slots.finfo.v7.slot, in _chk_btc_report()
1915 sizeof(dm->slot_now.v7))); in _chk_btc_report()
1916 } else if (ver->fcxslots == 1) { in _chk_btc_report()
1920 sizeof(dm->slot_now.v1)); in _chk_btc_report()
1922 memcmp(dm->slot_now.v1, in _chk_btc_report()
1923 pfwinfo->rpt_fbtc_slots.finfo.v1.slot, in _chk_btc_report()
1924 sizeof(dm->slot_now.v1))); in _chk_btc_report()
1928 if (ver->fcxcysta == 2) { in _chk_btc_report()
1929 if (le16_to_cpu(pcysta->v2.cycles) < BTC_CYSTA_CHK_PERIOD) in _chk_btc_report()
1931 /* Check Leak-AP */ in _chk_btc_report()
1932 if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) != 0 && in _chk_btc_report()
1933 le32_to_cpu(pcysta->v2.leakrx_cnt) != 0 && dm->tdma_now.rxflctrl) { in _chk_btc_report()
1934 if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) < in _chk_btc_report()
1935 BTC_LEAK_AP_TH * le32_to_cpu(pcysta->v2.leakrx_cnt)) in _chk_btc_report()
1936 dm->leak_ap = 1; in _chk_btc_report()
1940 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
1941 dm->tdma_now.ext_ctrl == CXECTL_EXT) { in _chk_btc_report()
1942 if (ver->fcxslots == 1) in _chk_btc_report()
1943 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_E2G].dur); in _chk_btc_report()
1944 else if (ver->fcxslots == 7) in _chk_btc_report()
1945 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_E2G].dur); in _chk_btc_report()
1947 if (ver->fcxslots == 1) in _chk_btc_report()
1948 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
1949 else if (ver->fcxslots == 7) in _chk_btc_report()
1950 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
1953 if (le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) > wl_slot_set) { in _chk_btc_report()
1954 diff_t = le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) - wl_slot_set; in _chk_btc_report()
1960 le32_to_cpu(pcysta->v2.slot_cnt[CXST_W1])); in _chk_btc_report()
1962 le32_to_cpu(pcysta->v2.slot_cnt[CXST_B1])); in _chk_btc_report()
1964 le16_to_cpu(pcysta->v2.cycles)); in _chk_btc_report()
1965 } else if (ver->fcxcysta == 3) { in _chk_btc_report()
1966 if (le16_to_cpu(pcysta->v3.cycles) < BTC_CYSTA_CHK_PERIOD) in _chk_btc_report()
1969 cnt_leak_slot = le32_to_cpu(pcysta->v3.slot_cnt[CXST_LK]); in _chk_btc_report()
1970 cnt_rx_imr = le32_to_cpu(pcysta->v3.leak_slot.cnt_rximr); in _chk_btc_report()
1972 /* Check Leak-AP */ in _chk_btc_report()
1974 dm->tdma_now.rxflctrl) { in _chk_btc_report()
1976 dm->leak_ap = 1; in _chk_btc_report()
1980 if (dm->tdma_now.type == CXTDMA_OFF) { in _chk_btc_report()
1981 if (ver->fcxslots == 1) in _chk_btc_report()
1982 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
1983 else if (ver->fcxslots == 7) in _chk_btc_report()
1984 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
1985 wl_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
1987 diff_t = wl_slot_real - wl_slot_set; in _chk_btc_report()
1993 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
1994 dm->tdma_now.ext_ctrl == CXECTL_EXT && in _chk_btc_report()
1995 btc->bt_req_len != 0) { in _chk_btc_report()
1996 bt_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
1997 if (btc->bt_req_len > bt_slot_real) { in _chk_btc_report()
1998 diff_t = btc->bt_req_len - bt_slot_real; in _chk_btc_report()
2004 le32_to_cpu(pcysta->v3.slot_cnt[CXST_W1])); in _chk_btc_report()
2006 le32_to_cpu(pcysta->v3.slot_cnt[CXST_B1])); in _chk_btc_report()
2008 le16_to_cpu(pcysta->v3.cycles)); in _chk_btc_report()
2009 } else if (ver->fcxcysta == 4) { in _chk_btc_report()
2010 if (le16_to_cpu(pcysta->v4.cycles) < BTC_CYSTA_CHK_PERIOD) in _chk_btc_report()
2013 cnt_leak_slot = le16_to_cpu(pcysta->v4.slot_cnt[CXST_LK]); in _chk_btc_report()
2014 cnt_rx_imr = le32_to_cpu(pcysta->v4.leak_slot.cnt_rximr); in _chk_btc_report()
2016 /* Check Leak-AP */ in _chk_btc_report()
2018 dm->tdma_now.rxflctrl) { in _chk_btc_report()
2020 dm->leak_ap = 1; in _chk_btc_report()
2024 if (dm->tdma_now.type == CXTDMA_OFF) { in _chk_btc_report()
2025 if (ver->fcxslots == 1) in _chk_btc_report()
2026 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
2027 else if (ver->fcxslots == 7) in _chk_btc_report()
2028 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
2029 wl_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
2031 diff_t = wl_slot_real - wl_slot_set; in _chk_btc_report()
2037 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
2038 dm->tdma_now.ext_ctrl == CXECTL_EXT && in _chk_btc_report()
2039 btc->bt_req_len != 0) { in _chk_btc_report()
2040 bt_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
2042 if (btc->bt_req_len > bt_slot_real) { in _chk_btc_report()
2043 diff_t = btc->bt_req_len - bt_slot_real; in _chk_btc_report()
2049 le16_to_cpu(pcysta->v4.slot_cnt[CXST_W1])); in _chk_btc_report()
2051 le16_to_cpu(pcysta->v4.slot_cnt[CXST_B1])); in _chk_btc_report()
2053 le16_to_cpu(pcysta->v4.cycles)); in _chk_btc_report()
2054 } else if (ver->fcxcysta == 5) { in _chk_btc_report()
2055 if (dm->fddt_train == BTC_FDDT_ENABLE) in _chk_btc_report()
2057 cnt_leak_slot = le16_to_cpu(pcysta->v5.slot_cnt[CXST_LK]); in _chk_btc_report()
2058 cnt_rx_imr = le32_to_cpu(pcysta->v5.leak_slot.cnt_rximr); in _chk_btc_report()
2060 /* Check Leak-AP */ in _chk_btc_report()
2062 dm->tdma_now.rxflctrl) { in _chk_btc_report()
2063 if (le16_to_cpu(pcysta->v5.cycles) >= BTC_CYSTA_CHK_PERIOD && in _chk_btc_report()
2065 dm->leak_ap = 1; in _chk_btc_report()
2069 if (dm->tdma_now.type == CXTDMA_OFF) { in _chk_btc_report()
2070 if (ver->fcxslots == 1) in _chk_btc_report()
2071 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
2072 else if (ver->fcxslots == 7) in _chk_btc_report()
2073 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
2074 wl_slot_real = le16_to_cpu(pcysta->v5.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
2077 diff_t = wl_slot_real - wl_slot_set; in _chk_btc_report()
2079 diff_t = wl_slot_set - wl_slot_real; in _chk_btc_report()
2084 bt_slot_set = btc->bt_req_len; in _chk_btc_report()
2085 bt_slot_real = le16_to_cpu(pcysta->v5.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
2087 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
2088 dm->tdma_now.ext_ctrl == CXECTL_EXT && in _chk_btc_report()
2091 diff_t = bt_slot_set - bt_slot_real; in _chk_btc_report()
2093 diff_t = bt_slot_real - bt_slot_set; in _chk_btc_report()
2098 le16_to_cpu(pcysta->v5.slot_cnt[CXST_E2G])); in _chk_btc_report()
2100 le16_to_cpu(pcysta->v5.slot_cnt[CXST_W1])); in _chk_btc_report()
2102 le16_to_cpu(pcysta->v5.slot_cnt[CXST_B1])); in _chk_btc_report()
2104 le16_to_cpu(pcysta->v5.cycles)); in _chk_btc_report()
2105 } else if (ver->fcxcysta == 7) { in _chk_btc_report()
2106 if (dm->fddt_train == BTC_FDDT_ENABLE) in _chk_btc_report()
2109 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; in _chk_btc_report()
2111 if (dm->tdma_now.type != CXTDMA_OFF) { in _chk_btc_report()
2113 val16 = le16_to_cpu(pcysta->v7.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
2116 /* Check Leak-AP */ in _chk_btc_report()
2117 val1 = le32_to_cpu(pcysta->v7.leak_slot.cnt_rximr) * in _chk_btc_report()
2119 val2 = le16_to_cpu(pcysta->v7.slot_cnt[CXST_LK]); in _chk_btc_report()
2121 val16 = le16_to_cpu(pcysta->v7.cycles); in _chk_btc_report()
2122 if (dm->tdma_now.rxflctrl && in _chk_btc_report()
2124 dm->leak_ap = 1; in _chk_btc_report()
2125 } else if (dm->tdma_now.ext_ctrl == CXECTL_EXT) { in _chk_btc_report()
2126 val16 = le16_to_cpu(pcysta->v7.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
2131 val1 = le16_to_cpu(pcysta->v7.a2dp_ept.cnt_timeout) * in _chk_btc_report()
2133 val2 = le16_to_cpu(pcysta->v7.a2dp_ept.cnt); in _chk_btc_report()
2135 val16 = le16_to_cpu(pcysta->v7.cycles); in _chk_btc_report()
2137 dm->slot_req_more = 1; in _chk_btc_report()
2138 else if (bt->link_info.status.map.connect == 0) in _chk_btc_report()
2139 dm->slot_req_more = 0; in _chk_btc_report()
2143 le16_to_cpu(pcysta->v7.slot_cnt[CXST_E2G])); in _chk_btc_report()
2145 le16_to_cpu(pcysta->v7.slot_cnt[CXST_W1])); in _chk_btc_report()
2147 le16_to_cpu(pcysta->v7.slot_cnt[CXST_B1])); in _chk_btc_report()
2149 /* "BT_SLOT_FLOOD" error-check MUST before "CYCLE_HANG" */ in _chk_btc_report()
2151 le16_to_cpu(pcysta->v7.cycles)); in _chk_btc_report()
2153 le16_to_cpu(pcysta->v7.cycles)); in _chk_btc_report()
2159 if (ver->fcxmreg == 7) in _chk_btc_report()
2162 if (dm->wl_btg_rx == BTC_BTGCTRL_BB_GNT_FWCTRL) in _chk_btc_report()
2163 dm->wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_FWCTRL; in _chk_btc_report()
2165 dm->wl_btg_rx_rb = val; in _chk_btc_report()
2168 if (dm->wl_pre_agc == BTC_PREAGC_BB_FWCTRL) in _chk_btc_report()
2169 dm->wl_pre_agc_rb = BTC_PREAGC_BB_FWCTRL; in _chk_btc_report()
2171 dm->wl_pre_agc_rb = val; in _chk_btc_report()
2192 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in _parse_btc_report()
2202 if (index + 2 >= ver->info_buf) in _parse_btc_report()
2205 rpt_len = le16_to_cpu(btc_prpt->len); in _parse_btc_report()
2221 struct rtw89_btc *btc = &rtwdev->btc; in _append_tdma()
2222 const struct rtw89_btc_ver *ver = btc->ver; in _append_tdma()
2223 struct rtw89_btc_dm *dm = &btc->dm; in _append_tdma()
2228 u16 len = btc->policy_len; in _append_tdma()
2230 if (!btc->update_policy_force && in _append_tdma()
2231 !memcmp(&dm->tdma, &dm->tdma_now, sizeof(dm->tdma))) { in _append_tdma()
2238 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len]; in _append_tdma()
2239 tlv->type = CXPOLICY_TDMA; in _append_tdma()
2240 if (ver->fcxtdma == 1) { in _append_tdma()
2241 v = (struct rtw89_btc_fbtc_tdma *)&tlv->val[0]; in _append_tdma()
2242 tlv->len = sizeof(*v); in _append_tdma()
2243 *v = dm->tdma; in _append_tdma()
2244 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v); in _append_tdma()
2245 } else if (ver->fcxtdma == 7) { in _append_tdma()
2246 tlv_v7 = (struct rtw89_btc_btf_tlv_v7 *)&btc->policy[len]; in _append_tdma()
2247 tlv_v7->len = sizeof(dm->tdma); in _append_tdma()
2248 tlv_v7->ver = ver->fcxtdma; in _append_tdma()
2249 tlv_v7->type = CXPOLICY_TDMA; in _append_tdma()
2250 memcpy(tlv_v7->val, &dm->tdma, tlv_v7->len); in _append_tdma()
2251 btc->policy_len += BTC_TLV_HDR_LEN_V7 + tlv_v7->len; in _append_tdma()
2253 tlv->len = sizeof(*v3); in _append_tdma()
2254 v3 = (struct rtw89_btc_fbtc_tdma_v3 *)&tlv->val[0]; in _append_tdma()
2255 v3->fver = ver->fcxtdma; in _append_tdma()
2256 v3->tdma = dm->tdma; in _append_tdma()
2257 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v3); in _append_tdma()
2262 __func__, dm->tdma.type, dm->tdma.rxflctrl, in _append_tdma()
2263 dm->tdma.txpause, dm->tdma.wtgle_n, dm->tdma.leak_n, in _append_tdma()
2264 dm->tdma.ext_ctrl); in _append_tdma()
2269 struct rtw89_btc *btc = &rtwdev->btc; in _append_slot_v1()
2270 struct rtw89_btc_dm *dm = &btc->dm; in _append_slot_v1()
2277 "[BTC], %s(): A:btc->policy_len = %d\n", in _append_slot_v1()
2278 __func__, btc->policy_len); in _append_slot_v1()
2281 if (!btc->update_policy_force && in _append_slot_v1()
2282 !memcmp(&dm->slot.v1[i], &dm->slot_now.v1[i], in _append_slot_v1()
2283 sizeof(dm->slot.v1[i]))) in _append_slot_v1()
2286 len = btc->policy_len; in _append_slot_v1()
2288 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len]; in _append_slot_v1()
2289 v = (struct btc_fbtc_1slot *)&tlv->val[0]; in _append_slot_v1()
2290 tlv->type = CXPOLICY_SLOT; in _append_slot_v1()
2291 tlv->len = sizeof(*v); in _append_slot_v1()
2293 v->fver = btc->ver->fcxslots; in _append_slot_v1()
2294 v->sid = i; in _append_slot_v1()
2295 v->slot = dm->slot.v1[i]; in _append_slot_v1()
2298 "[BTC], %s(): slot-%d: dur=%d, table=0x%08x, type=%d\n", in _append_slot_v1()
2299 __func__, i, dm->slot.v1[i].dur, dm->slot.v1[i].cxtbl, in _append_slot_v1()
2300 dm->slot.v1[i].cxtype); in _append_slot_v1()
2303 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v); in _append_slot_v1()
2315 struct rtw89_btc *btc = &rtwdev->btc; in _append_slot_v7()
2316 struct rtw89_btc_dm *dm = &btc->dm; in _append_slot_v7()
2321 if (!btc->update_policy_force && in _append_slot_v7()
2322 !memcmp(&dm->slot.v7[i], &dm->slot_now.v7[i], in _append_slot_v7()
2323 sizeof(dm->slot.v7[i]))) in _append_slot_v7()
2326 len = btc->policy_len; in _append_slot_v7()
2335 tlv = (struct rtw89_btc_btf_tlv_v7 *)&btc->policy[len]; in _append_slot_v7()
2336 tlv->type = CXPOLICY_SLOT; in _append_slot_v7()
2337 tlv->ver = btc->ver->fcxslots; in _append_slot_v7()
2338 tlv->len = sizeof(dm->slot.v7[0]) + BTC_TLV_SLOT_ID_LEN_V7; in _append_slot_v7()
2342 if ((len + (u16)tlv->len) > RTW89_BTC_POLICY_MAXLEN) { in _append_slot_v7()
2348 btc->policy[len] = i; /* slot-id */ in _append_slot_v7()
2349 memcpy(&btc->policy[len + 1], &dm->slot.v7[i], in _append_slot_v7()
2350 sizeof(dm->slot.v7[0])); in _append_slot_v7()
2351 len += tlv->len; in _append_slot_v7()
2354 "[BTC], %s: policy_len=%d, slot-%d: dur=%d, type=%d, table=0x%08x\n", in _append_slot_v7()
2355 __func__, btc->policy_len, i, dm->slot.v7[i].dur, in _append_slot_v7()
2356 dm->slot.v7[i].cxtype, dm->slot.v7[i].cxtbl); in _append_slot_v7()
2358 btc->policy_len = len; /* update total length */ in _append_slot_v7()
2364 __func__, cnt, btc->policy_len); in _append_slot_v7()
2369 struct rtw89_btc *btc = &rtwdev->btc; in _append_slot()
2371 if (btc->ver->fcxslots == 7) in _append_slot()
2379 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_rpt_ver()
2380 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_fw_rpt_ver()
2400 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2415 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2430 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2443 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2457 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2476 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2493 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2512 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2531 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2556 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_set_slots()
2557 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_fw_set_slots()
2560 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_fw_set_slots()
2563 if (ver->fcxslots == 7) { in rtw89_btc_fw_set_slots()
2564 len = sizeof(*tlv_v7) + sizeof(dm->slot.v7); in rtw89_btc_fw_set_slots()
2569 tlv_v7->type = SET_SLOT_TABLE; in rtw89_btc_fw_set_slots()
2570 tlv_v7->ver = ver->fcxslots; in rtw89_btc_fw_set_slots()
2571 tlv_v7->len = ARRAY_SIZE(dm->slot.v7); in rtw89_btc_fw_set_slots()
2572 memcpy(tlv_v7->val, dm->slot.v7, sizeof(dm->slot.v7)); in rtw89_btc_fw_set_slots()
2583 tbl->fver = BTF_SET_SLOT_TABLE_VER; in rtw89_btc_fw_set_slots()
2584 tbl->tbl_num = CXST_MAX; in rtw89_btc_fw_set_slots()
2585 memcpy(tbl->tbls, dm->slot.v1, flex_array_size(tbl, tbls, CXST_MAX)); in rtw89_btc_fw_set_slots()
2596 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_en_rpt()
2597 struct rtw89_btc_wl_smap *wl_smap = &btc->cx.wl.status.map; in rtw89_btc_fw_en_rpt()
2598 struct rtw89_btc_btf_fwinfo *fwinfo = &btc->fwinfo; in rtw89_btc_fw_en_rpt()
2603 if ((wl_smap->rf_off || wl_smap->lps != BTC_LPS_OFF) && rpt_state != 0) in rtw89_btc_fw_en_rpt()
2613 val = fwinfo->rpt_en_map | bit_map; in rtw89_btc_fw_en_rpt()
2615 val = fwinfo->rpt_en_map & ~bit_map; in rtw89_btc_fw_en_rpt()
2617 if (val == fwinfo->rpt_en_map) in rtw89_btc_fw_en_rpt()
2620 if (btc->ver->fcxbtcrpt == 7 || btc->ver->fcxbtcrpt == 8) { in rtw89_btc_fw_en_rpt()
2622 r.v8.fver = btc->ver->fcxbtcrpt; in rtw89_btc_fw_en_rpt()
2628 if (btc->ver->fcxbtcrpt == 105) in rtw89_btc_fw_en_rpt()
2631 r.v1.fver = btc->ver->fcxbtcrpt; in rtw89_btc_fw_en_rpt()
2639 fwinfo->rpt_en_map = val; in rtw89_btc_fw_en_rpt()
2644 const struct rtw89_chip_info *chip = rtwdev->chip; in btc_fw_set_monreg()
2645 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in btc_fw_set_monreg()
2651 n = chip->mon_reg_num; in btc_fw_set_monreg()
2655 if (ver->fcxmreg == 1) in btc_fw_set_monreg()
2669 if (ver->fcxmreg == 7) { in btc_fw_set_monreg()
2674 v7->type = RPT_EN_MREG; in btc_fw_set_monreg()
2675 v7->fver = ver->fcxmreg; in btc_fw_set_monreg()
2676 v7->len = n; in btc_fw_set_monreg()
2678 v7->regs[i].type = chip->mon_reg[i].type; in btc_fw_set_monreg()
2679 v7->regs[i].bytes = chip->mon_reg[i].bytes; in btc_fw_set_monreg()
2680 v7->regs[i].offset = chip->mon_reg[i].offset; in btc_fw_set_monreg()
2690 v1->fver = ver->fcxmreg; in btc_fw_set_monreg()
2691 v1->reg_num = n; in btc_fw_set_monreg()
2692 memcpy(v1->regs, chip->mon_reg, flex_array_size(v1, regs, n)); in btc_fw_set_monreg()
2708 struct rtw89_btc *btc = &rtwdev->btc; in _update_dm_step()
2709 struct rtw89_btc_dm *dm = &btc->dm; in _update_dm_step()
2711 /* use ring-structure to store dm step */ in _update_dm_step()
2712 dm->dm_step.step[dm->dm_step.step_pos] = reason_or_action; in _update_dm_step()
2713 dm->dm_step.step_pos++; in _update_dm_step()
2715 if (dm->dm_step.step_pos >= ARRAY_SIZE(dm->dm_step.step)) { in _update_dm_step()
2716 dm->dm_step.step_pos = 0; in _update_dm_step()
2717 dm->dm_step.step_ov = true; in _update_dm_step()
2724 struct rtw89_btc *btc = &rtwdev->btc; in _fw_set_policy()
2725 struct rtw89_btc_dm *dm = &btc->dm; in _fw_set_policy()
2728 dm->run_action = action; in _fw_set_policy()
2733 btc->policy_len = 0; in _fw_set_policy()
2734 btc->policy_type = policy_type; in _fw_set_policy()
2739 if (btc->policy_len == 0 || btc->policy_len > RTW89_BTC_POLICY_MAXLEN) in _fw_set_policy()
2743 "[BTC], %s(): action = %d -> policy type/len: 0x%04x/%d\n", in _fw_set_policy()
2744 __func__, action, policy_type, btc->policy_len); in _fw_set_policy()
2746 if (dm->tdma.rxflctrl == CXFLC_NULLP || in _fw_set_policy()
2747 dm->tdma.rxflctrl == CXFLC_QOSNULL) in _fw_set_policy()
2748 btc->lps = 1; in _fw_set_policy()
2750 btc->lps = 0; in _fw_set_policy()
2752 if (btc->lps == 1) in _fw_set_policy()
2753 rtw89_set_coex_ctrl_lps(rtwdev, btc->lps); in _fw_set_policy()
2756 btc->policy, btc->policy_len); in _fw_set_policy()
2758 memcpy(&dm->tdma_now, &dm->tdma, sizeof(dm->tdma_now)); in _fw_set_policy()
2759 if (btc->ver->fcxslots == 7) in _fw_set_policy()
2760 memcpy(&dm->slot_now.v7, &dm->slot.v7, sizeof(dm->slot_now.v7)); in _fw_set_policy()
2762 memcpy(&dm->slot_now.v1, &dm->slot.v1, sizeof(dm->slot_now.v1)); in _fw_set_policy()
2765 if (btc->update_policy_force) in _fw_set_policy()
2766 btc->update_policy_force = false; in _fw_set_policy()
2768 if (btc->lps == 0) in _fw_set_policy()
2769 rtw89_set_coex_ctrl_lps(rtwdev, btc->lps); in _fw_set_policy()
2774 struct rtw89_btc *btc = &rtwdev->btc; in _fw_set_drv_info()
2775 const struct rtw89_btc_ver *ver = btc->ver; in _fw_set_drv_info()
2776 struct rtw89_btc_dm *dm = &btc->dm; in _fw_set_drv_info()
2777 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _fw_set_drv_info()
2778 struct rtw89_btc_rf_trx_para rf_para = dm->rf_trx_para; in _fw_set_drv_info()
2782 if (ver->fcxinit == 7) in _fw_set_drv_info()
2788 if (ver->fwlrole == 0) in _fw_set_drv_info()
2790 else if (ver->fwlrole == 1) in _fw_set_drv_info()
2792 else if (ver->fwlrole == 2) in _fw_set_drv_info()
2794 else if (ver->fwlrole == 7) in _fw_set_drv_info()
2796 else if (ver->fwlrole == 8) in _fw_set_drv_info()
2800 if (ver->drvinfo_type == 1) in _fw_set_drv_info()
2803 if (ver->fcxctrl == 7) in _fw_set_drv_info()
2809 if (ver->drvinfo_type == 1) in _fw_set_drv_info()
2812 dm->trx_info.tx_power = u32_get_bits(rf_para.wl_tx_power, in _fw_set_drv_info()
2814 dm->trx_info.rx_gain = u32_get_bits(rf_para.wl_rx_gain, in _fw_set_drv_info()
2816 dm->trx_info.bt_tx_power = u32_get_bits(rf_para.bt_tx_power, in _fw_set_drv_info()
2818 dm->trx_info.bt_rx_gain = u32_get_bits(rf_para.bt_rx_gain, in _fw_set_drv_info()
2820 dm->trx_info.cn = wl->cn_report; in _fw_set_drv_info()
2821 dm->trx_info.nhm = wl->nhm.pwr; in _fw_set_drv_info()
2825 if (ver->drvinfo_type == 1) in _fw_set_drv_info()
2834 if (!ver->fcxosi) in _fw_set_drv_info()
2837 if (ver->drvinfo_type == 2) in _fw_set_drv_info()
2852 struct rtw89_btc *btc = &rtwdev->btc; in btc_fw_event()
2853 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in btc_fw_event()
2873 struct rtw89_btc *btc = &rtwdev->btc; in _set_gnt()
2874 struct rtw89_btc_dm *dm = &btc->dm; in _set_gnt()
2875 struct rtw89_mac_ax_gnt *g = dm->gnt.band; in _set_gnt()
2916 rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt); in _set_gnt()
2922 struct rtw89_btc *btc = &rtwdev->btc; in _set_gnt_v1()
2923 struct rtw89_btc_dm *dm = &btc->dm; in _set_gnt_v1()
2924 struct rtw89_btc_fbtc_outsrc_set_info *osi = &dm->ost_info; in _set_gnt_v1()
2925 struct rtw89_mac_ax_wl_act *b = dm->gnt.bt; in _set_gnt_v1()
2926 struct rtw89_mac_ax_gnt *g = dm->gnt.band; in _set_gnt_v1()
2927 u8 i, bt_idx = dm->bt_select + 1; in _set_gnt_v1()
2967 if (rtwdev->chip->para_ver & BTC_FEAT_WLAN_ACT_MUX) { in _set_gnt_v1()
2989 if (!btc->ver->fcxosi) { in _set_gnt_v1()
2990 rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt); in _set_gnt_v1()
2994 memcpy(osi->gnt_set, dm->gnt.band, sizeof(osi->gnt_set)); in _set_gnt_v1()
2995 memcpy(osi->wlact_set, dm->gnt.bt, sizeof(osi->wlact_set)); in _set_gnt_v1()
2998 if (osi->rf_band[BTC_RF_S0] == 1 && in _set_gnt_v1()
2999 osi->rf_band[BTC_RF_S1] == 0) in _set_gnt_v1()
3000 osi->rf_gbt_source = BTC_RF_S1; in _set_gnt_v1()
3002 osi->rf_gbt_source = BTC_RF_S0; in _set_gnt_v1()
3026 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_wl_tx_power()
3027 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_tx_power()
3028 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_wl_tx_power()
3031 if (wl->rf_para.tx_pwr_freerun == level) in _set_wl_tx_power()
3034 wl->rf_para.tx_pwr_freerun = level; in _set_wl_tx_power()
3035 btc->dm.rf_trx_para.wl_tx_power = level; in _set_wl_tx_power()
3053 chip->ops->btc_set_wl_txpwr_ctrl(rtwdev, pwr_val); in _set_wl_tx_power()
3058 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_wl_rx_gain()
3059 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_rx_gain()
3060 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_wl_rx_gain()
3062 if (wl->rf_para.rx_gain_freerun == level) in _set_wl_rx_gain()
3065 wl->rf_para.rx_gain_freerun = level; in _set_wl_rx_gain()
3066 btc->dm.rf_trx_para.wl_rx_gain = level; in _set_wl_rx_gain()
3072 chip->ops->btc_set_wl_rx_gain(rtwdev, level); in _set_wl_rx_gain()
3077 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_tx_power()
3078 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_tx_power()
3082 if (btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE] == 0) in _set_bt_tx_power()
3085 if (bt->rf_para.tx_pwr_freerun == level) in _set_bt_tx_power()
3092 buf = (s8)(-level); in _set_bt_tx_power()
3095 bt->rf_para.tx_pwr_freerun = level; in _set_bt_tx_power()
3096 btc->dm.rf_trx_para.bt_tx_power = level; in _set_bt_tx_power()
3104 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_rx_gain()
3105 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_rx_gain()
3107 if (btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE] == 0) in _set_bt_rx_gain()
3110 if ((bt->rf_para.rx_gain_freerun == level || in _set_bt_rx_gain()
3112 (!rtwdev->chip->scbd || bt->lna_constrain == level)) in _set_bt_rx_gain()
3115 bt->rf_para.rx_gain_freerun = level; in _set_bt_rx_gain()
3116 btc->dm.rf_trx_para.bt_rx_gain = level; in _set_bt_rx_gain()
3132 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_rf_trx_para()
3133 struct rtw89_btc *btc = &rtwdev->btc; in _set_rf_trx_para()
3134 const struct rtw89_btc_ver *ver = btc->ver; in _set_rf_trx_para()
3135 struct rtw89_btc_dm *dm = &btc->dm; in _set_rf_trx_para()
3136 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_rf_trx_para()
3137 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_rf_trx_para()
3138 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _set_rf_trx_para()
3139 struct rtw89_btc_wl_smap *wl_smap = &wl->status.map; in _set_rf_trx_para()
3144 if (ver->fwlrole == 0) { in _set_rf_trx_para()
3145 link_mode = wl->role_info.link_mode; in _set_rf_trx_para()
3147 if (wl->dbcc_info.real_band[i] == RTW89_BAND_2G) in _set_rf_trx_para()
3150 } else if (ver->fwlrole == 1) { in _set_rf_trx_para()
3151 link_mode = wl->role_info_v1.link_mode; in _set_rf_trx_para()
3152 dbcc_2g_phy = wl->role_info_v1.dbcc_2g_phy; in _set_rf_trx_para()
3153 } else if (ver->fwlrole == 2) { in _set_rf_trx_para()
3154 link_mode = wl->role_info_v2.link_mode; in _set_rf_trx_para()
3155 dbcc_2g_phy = wl->role_info_v2.dbcc_2g_phy; in _set_rf_trx_para()
3159 if (btc->ant_type == BTC_ANT_SHARED) { in _set_rf_trx_para()
3161 if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) || in _set_rf_trx_para()
3162 dm->bt_only == 1) in _set_rf_trx_para()
3163 dm->trx_para_level = 1; /* for better BT ACI issue */ in _set_rf_trx_para()
3165 dm->trx_para_level = 0; in _set_rf_trx_para()
3166 } else { /* non-shared antenna */ in _set_rf_trx_para()
3167 dm->trx_para_level = 5; in _set_rf_trx_para()
3168 /* modify trx_para if WK 2.4G-STA-DL + bt link */ in _set_rf_trx_para()
3169 if (b->profile_cnt.now != 0 && in _set_rf_trx_para()
3171 wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { /* uplink */ in _set_rf_trx_para()
3172 if (wl->rssi_level == 4 && bt->rssi_level > 2) in _set_rf_trx_para()
3173 dm->trx_para_level = 6; in _set_rf_trx_para()
3174 else if (wl->rssi_level == 3 && bt->rssi_level > 3) in _set_rf_trx_para()
3175 dm->trx_para_level = 7; in _set_rf_trx_para()
3179 level_id = dm->trx_para_level; in _set_rf_trx_para()
3180 if (level_id >= chip->rf_para_dlink_num || in _set_rf_trx_para()
3181 level_id >= chip->rf_para_ulink_num) { in _set_rf_trx_para()
3188 if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) in _set_rf_trx_para()
3189 para = chip->rf_para_ulink[level_id]; in _set_rf_trx_para()
3191 para = chip->rf_para_dlink[level_id]; in _set_rf_trx_para()
3193 if (dm->fddt_train) { in _set_rf_trx_para()
3203 if (!bt->enable.now || dm->wl_only || wl_smap->rf_off || in _set_rf_trx_para()
3204 wl_smap->lps == BTC_LPS_RF_OFF || in _set_rf_trx_para()
3207 (rtwdev->dbcc_en && dbcc_2g_phy != RTW89_PHY_1)) in _set_rf_trx_para()
3212 if (wl_stb_chg != dm->wl_stb_chg) { in _set_rf_trx_para()
3213 dm->wl_stb_chg = wl_stb_chg; in _set_rf_trx_para()
3214 chip->ops->btc_wl_s1_standby(rtwdev, dm->wl_stb_chg); in _set_rf_trx_para()
3220 struct rtw89_btc *btc = &rtwdev->btc; in _update_btc_state_map()
3221 struct rtw89_btc_cx *cx = &btc->cx; in _update_btc_state_map()
3222 struct rtw89_btc_wl_info *wl = &cx->wl; in _update_btc_state_map()
3223 struct rtw89_btc_bt_info *bt = &cx->bt; in _update_btc_state_map()
3224 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _update_btc_state_map()
3226 if (wl->status.map.connecting || wl->status.map._4way || in _update_btc_state_map()
3227 wl->status.map.roaming || wl->status.map.dbccing) { in _update_btc_state_map()
3228 cx->state_map = BTC_WLINKING; in _update_btc_state_map()
3229 } else if (wl->status.map.scan) { /* wl scan */ in _update_btc_state_map()
3230 if (bt_linfo->status.map.inq_pag) in _update_btc_state_map()
3231 cx->state_map = BTC_WSCAN_BSCAN; in _update_btc_state_map()
3233 cx->state_map = BTC_WSCAN_BNOSCAN; in _update_btc_state_map()
3234 } else if (wl->status.map.busy) { /* only busy */ in _update_btc_state_map()
3235 if (bt_linfo->status.map.inq_pag) in _update_btc_state_map()
3236 cx->state_map = BTC_WBUSY_BSCAN; in _update_btc_state_map()
3238 cx->state_map = BTC_WBUSY_BNOSCAN; in _update_btc_state_map()
3240 cx->state_map = BTC_WIDLE; in _update_btc_state_map()
3246 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_bt_afh_info_v0()
3247 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_afh_info_v0()
3248 const struct rtw89_btc_ver *ver = btc->ver; in _set_bt_afh_info_v0()
3249 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_bt_afh_info_v0()
3250 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_afh_info_v0()
3251 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _set_bt_afh_info_v0()
3252 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _set_bt_afh_info_v0()
3253 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_bt_afh_info_v0()
3254 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_bt_afh_info_v0()
3255 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_bt_afh_info_v0()
3256 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_bt_afh_info_v0()
3265 if (btc->manual_ctrl || wl->status.map.scan) in _set_bt_afh_info_v0()
3268 if (ver->fwlrole == 0) { in _set_bt_afh_info_v0()
3269 mode = wl_rinfo->link_mode; in _set_bt_afh_info_v0()
3270 connect_cnt = wl_rinfo->connect_cnt; in _set_bt_afh_info_v0()
3271 } else if (ver->fwlrole == 1) { in _set_bt_afh_info_v0()
3272 mode = wl_rinfo_v1->link_mode; in _set_bt_afh_info_v0()
3273 connect_cnt = wl_rinfo_v1->connect_cnt; in _set_bt_afh_info_v0()
3274 } else if (ver->fwlrole == 2) { in _set_bt_afh_info_v0()
3275 mode = wl_rinfo_v2->link_mode; in _set_bt_afh_info_v0()
3276 connect_cnt = wl_rinfo_v2->connect_cnt; in _set_bt_afh_info_v0()
3277 } else if (ver->fwlrole == 7) { in _set_bt_afh_info_v0()
3278 mode = wl_rinfo_v7->link_mode; in _set_bt_afh_info_v0()
3279 connect_cnt = wl_rinfo_v7->connect_cnt; in _set_bt_afh_info_v0()
3280 } else if (ver->fwlrole == 8) { in _set_bt_afh_info_v0()
3281 mode = wl_rinfo_v8->link_mode; in _set_bt_afh_info_v0()
3282 connect_cnt = wl_rinfo_v8->connect_cnt; in _set_bt_afh_info_v0()
3287 if (wl->status.map.rf_off || bt->whql_test || in _set_bt_afh_info_v0()
3295 r = &wl_rinfo->active_role[i]; in _set_bt_afh_info_v0()
3296 r1 = &wl_rinfo_v1->active_role_v1[i]; in _set_bt_afh_info_v0()
3297 r2 = &wl_rinfo_v2->active_role_v2[i]; in _set_bt_afh_info_v0()
3298 r7 = &wl_rinfo_v7->active_role[i]; in _set_bt_afh_info_v0()
3299 rlink = &wl_rinfo_v8->rlink[i][0]; in _set_bt_afh_info_v0()
3301 if (ver->fwlrole == 0 && in _set_bt_afh_info_v0()
3302 (r->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info_v0()
3303 r->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info_v0()
3304 ch = r->ch; in _set_bt_afh_info_v0()
3305 bw = r->bw; in _set_bt_afh_info_v0()
3307 } else if (ver->fwlrole == 1 && in _set_bt_afh_info_v0()
3308 (r1->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info_v0()
3309 r1->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info_v0()
3310 ch = r1->ch; in _set_bt_afh_info_v0()
3311 bw = r1->bw; in _set_bt_afh_info_v0()
3313 } else if (ver->fwlrole == 2 && in _set_bt_afh_info_v0()
3314 (r2->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info_v0()
3315 r2->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info_v0()
3316 ch = r2->ch; in _set_bt_afh_info_v0()
3317 bw = r2->bw; in _set_bt_afh_info_v0()
3319 } else if (ver->fwlrole == 7 && in _set_bt_afh_info_v0()
3320 (r7->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info_v0()
3321 r7->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info_v0()
3322 ch = r7->ch; in _set_bt_afh_info_v0()
3323 bw = r7->bw; in _set_bt_afh_info_v0()
3325 } else if (ver->fwlrole == 8 && in _set_bt_afh_info_v0()
3326 (rlink->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info_v0()
3327 rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info_v0()
3328 ch = rlink->ch; in _set_bt_afh_info_v0()
3329 bw = rlink->bw; in _set_bt_afh_info_v0()
3337 r = &wl_rinfo->active_role[i]; in _set_bt_afh_info_v0()
3338 r1 = &wl_rinfo_v1->active_role_v1[i]; in _set_bt_afh_info_v0()
3339 r2 = &wl_rinfo_v2->active_role_v2[i]; in _set_bt_afh_info_v0()
3340 r7 = &wl_rinfo_v7->active_role[i]; in _set_bt_afh_info_v0()
3341 rlink = &wl_rinfo_v8->rlink[i][0]; in _set_bt_afh_info_v0()
3343 if (ver->fwlrole == 0 && in _set_bt_afh_info_v0()
3344 r->connected && r->band == RTW89_BAND_2G) { in _set_bt_afh_info_v0()
3345 ch = r->ch; in _set_bt_afh_info_v0()
3346 bw = r->bw; in _set_bt_afh_info_v0()
3348 } else if (ver->fwlrole == 1 && in _set_bt_afh_info_v0()
3349 r1->connected && r1->band == RTW89_BAND_2G) { in _set_bt_afh_info_v0()
3350 ch = r1->ch; in _set_bt_afh_info_v0()
3351 bw = r1->bw; in _set_bt_afh_info_v0()
3353 } else if (ver->fwlrole == 2 && in _set_bt_afh_info_v0()
3354 r2->connected && r2->band == RTW89_BAND_2G) { in _set_bt_afh_info_v0()
3355 ch = r2->ch; in _set_bt_afh_info_v0()
3356 bw = r2->bw; in _set_bt_afh_info_v0()
3358 } else if (ver->fwlrole == 7 && in _set_bt_afh_info_v0()
3359 r7->connected && r7->band == RTW89_BAND_2G) { in _set_bt_afh_info_v0()
3360 ch = r7->ch; in _set_bt_afh_info_v0()
3361 bw = r7->bw; in _set_bt_afh_info_v0()
3363 } else if (ver->fwlrole == 8 && in _set_bt_afh_info_v0()
3364 rlink->connected && rlink->rf_band == RTW89_BAND_2G) { in _set_bt_afh_info_v0()
3365 ch = rlink->ch; in _set_bt_afh_info_v0()
3366 bw = rlink->bw; in _set_bt_afh_info_v0()
3374 bw = 20 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v0()
3377 bw = 40 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v0()
3380 bw = 5 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v0()
3383 bw = 10 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v0()
3391 if (wl->afh_info.en == en && in _set_bt_afh_info_v0()
3392 wl->afh_info.ch == ch && in _set_bt_afh_info_v0()
3393 wl->afh_info.bw == bw && in _set_bt_afh_info_v0()
3394 b->profile_cnt.last == b->profile_cnt.now) { in _set_bt_afh_info_v0()
3401 wl->afh_info.en = en; in _set_bt_afh_info_v0()
3402 wl->afh_info.ch = ch; in _set_bt_afh_info_v0()
3403 wl->afh_info.bw = bw; in _set_bt_afh_info_v0()
3405 _send_fw_cmd(rtwdev, BTFC_SET, SET_BT_WL_CH_INFO, &wl->afh_info, 3); in _set_bt_afh_info_v0()
3410 btc->cx.cnt_wl[BTC_WCNT_CH_UPDATE]++; in _set_bt_afh_info_v0()
3415 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_bt_afh_info_v1()
3416 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_afh_info_v1()
3417 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_bt_afh_info_v1()
3418 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _set_bt_afh_info_v1()
3419 struct rtw89_btc_wl_afh_info *wl_afh = &wl->afh_info; in _set_bt_afh_info_v1()
3420 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_afh_info_v1()
3425 if (btc->manual_ctrl || wl->status.map.scan) in _set_bt_afh_info_v1()
3428 link_mode = wl_rinfo->link_mode; in _set_bt_afh_info_v1()
3430 for (i = 0; i < btc->ver->max_role_num; i++) { in _set_bt_afh_info_v1()
3432 if (wl->status.map.rf_off || bt->whql_test || in _set_bt_afh_info_v1()
3437 rlink = &wl_rinfo->rlink[i][j]; in _set_bt_afh_info_v1()
3439 /* Don't care no-connected/non-2G-band role */ in _set_bt_afh_info_v1()
3440 if (!rlink->connected || !rlink->active || in _set_bt_afh_info_v1()
3441 rlink->rf_band != RTW89_BAND_2G) in _set_bt_afh_info_v1()
3445 ch = rlink->ch; in _set_bt_afh_info_v1()
3446 bw = rlink->bw; in _set_bt_afh_info_v1()
3449 (rlink->role == RTW89_WIFI_ROLE_AP || in _set_bt_afh_info_v1()
3450 rlink->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info_v1()
3451 rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info_v1()
3455 rlink->bw == RTW89_CHANNEL_WIDTH_40) { in _set_bt_afh_info_v1()
3462 /* default AFH channel sapn = center-ch +- 6MHz */ in _set_bt_afh_info_v1()
3465 if (btc->dm.freerun || btc->dm.fddt_train) in _set_bt_afh_info_v1()
3468 bw = 20 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v1()
3471 if (btc->dm.freerun) in _set_bt_afh_info_v1()
3472 bw = 40 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v1()
3477 bw = 5 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v1()
3480 bw = 10 + chip->afh_guard_ch * 2; in _set_bt_afh_info_v1()
3495 if (wl_afh->en == en && in _set_bt_afh_info_v1()
3496 wl_afh->ch == ch && in _set_bt_afh_info_v1()
3497 wl_afh->bw == bw && in _set_bt_afh_info_v1()
3498 (!bt->enable.now || bt->enable.last)) in _set_bt_afh_info_v1()
3501 wl_afh->en = buf[0]; in _set_bt_afh_info_v1()
3502 wl_afh->ch = buf[1]; in _set_bt_afh_info_v1()
3503 wl_afh->bw = buf[2]; in _set_bt_afh_info_v1()
3505 if (_send_fw_cmd(rtwdev, BTFC_SET, SET_BT_WL_CH_INFO, &wl->afh_info, 3)) { in _set_bt_afh_info_v1()
3510 btc->cx.cnt_wl[BTC_WCNT_CH_UPDATE]++; in _set_bt_afh_info_v1()
3516 if (rtwdev->chip->chip_id == RTL8922A) in _set_bt_afh_info()
3524 struct rtw89_btc *btc = &rtwdev->btc; in _check_freerun()
3525 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _check_freerun()
3526 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _check_freerun()
3527 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _check_freerun()
3528 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _check_freerun()
3529 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _check_freerun()
3530 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _check_freerun()
3531 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _check_freerun()
3532 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _check_freerun()
3533 struct rtw89_btc_bt_hid_desc *hid = &bt_linfo->hid_desc; in _check_freerun()
3534 union rtw89_btc_module_info *md = &btc->mdinfo; in _check_freerun()
3535 const struct rtw89_btc_ver *ver = btc->ver; in _check_freerun()
3538 if (ver->fcxinit == 7) in _check_freerun()
3539 isolation = md->md_v7.ant.isolation; in _check_freerun()
3541 isolation = md->md.ant.isolation; in _check_freerun()
3543 if (ver->fwlrole == 0) in _check_freerun()
3544 connect_cnt = wl_rinfo->connect_cnt; in _check_freerun()
3545 else if (ver->fwlrole == 1) in _check_freerun()
3546 connect_cnt = wl_rinfo_v1->connect_cnt; in _check_freerun()
3547 else if (ver->fwlrole == 2) in _check_freerun()
3548 connect_cnt = wl_rinfo_v2->connect_cnt; in _check_freerun()
3549 else if (ver->fwlrole == 7) in _check_freerun()
3550 connect_cnt = wl_rinfo_v7->connect_cnt; in _check_freerun()
3551 else if (ver->fwlrole == 8) in _check_freerun()
3552 connect_cnt = wl_rinfo_v8->connect_cnt; in _check_freerun()
3554 if (btc->ant_type == BTC_ANT_SHARED) { in _check_freerun()
3555 btc->dm.trx_para_level = 0; in _check_freerun()
3561 btc->dm.trx_para_level = 5; in _check_freerun()
3565 if (bt_linfo->profile_cnt.now == 0) { in _check_freerun()
3566 btc->dm.trx_para_level = 5; in _check_freerun()
3570 if (hid->pair_cnt > BTC_TDMA_BTHID_MAX) { in _check_freerun()
3571 btc->dm.trx_para_level = 5; in _check_freerun()
3577 btc->dm.trx_para_level = 5; in _check_freerun()
3581 if (!wl->status.map.busy) {/* wl idle -> freerun */ in _check_freerun()
3582 btc->dm.trx_para_level = 5; in _check_freerun()
3584 } else if (wl->rssi_level > 1) {/* WL rssi < 50% (-60dBm) */ in _check_freerun()
3585 btc->dm.trx_para_level = 0; in _check_freerun()
3587 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { in _check_freerun()
3588 if (wl->rssi_level == 0 && bt_linfo->rssi > 31) { in _check_freerun()
3589 btc->dm.trx_para_level = 6; in _check_freerun()
3591 } else if (wl->rssi_level == 1 && bt_linfo->rssi > 36) { in _check_freerun()
3592 btc->dm.trx_para_level = 7; in _check_freerun()
3595 btc->dm.trx_para_level = 0; in _check_freerun()
3597 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) { in _check_freerun()
3598 if (bt_linfo->rssi > 28) { in _check_freerun()
3599 btc->dm.trx_para_level = 6; in _check_freerun()
3604 btc->dm.trx_para_level = 0; in _check_freerun()
3608 #define _tdma_set_flctrl(btc, flc) ({(btc)->dm.tdma.rxflctrl = flc; })
3609 #define _tdma_set_flctrl_role(btc, role) ({(btc)->dm.tdma.rxflctrl_role = role; })
3610 #define _tdma_set_tog(btc, wtg) ({(btc)->dm.tdma.wtgle_n = wtg; })
3611 #define _tdma_set_lek(btc, lek) ({(btc)->dm.tdma.leak_n = lek; })
3675 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_policy()
3677 chip->ops->btc_set_policy(rtwdev, policy_type); in _set_policy()
3684 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_set_policy()
3685 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_set_policy()
3686 struct rtw89_btc_fbtc_tdma *t = &dm->tdma; in rtw89_btc_set_policy()
3687 struct rtw89_btc_fbtc_slot *s = dm->slot.v1; in rtw89_btc_set_policy()
3691 if (btc->ant_type == BTC_ANT_SHARED) { in rtw89_btc_set_policy()
3692 if (btc->cx.wl.status.map._4way) in rtw89_btc_set_policy()
3705 btc->bt_req_en = false; in rtw89_btc_set_policy()
3712 btc->update_policy_force = true; in rtw89_btc_set_policy()
3760 btc->bt_req_en = true; in rtw89_btc_set_policy()
3778 case BTC_CXP_FIX: /* TDMA Fix-Slot */ in rtw89_btc_set_policy()
3826 case BTC_CXP_FIX_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3827 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3829 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy()
3834 case BTC_CXP_PFIX: /* PS-TDMA Fix-Slot */ in rtw89_btc_set_policy()
3837 if (btc->cx.wl.role_info.role_map.role.ap) in rtw89_btc_set_policy()
3867 case BTC_CXP_AUTO: /* TDMA Auto-Slot */ in rtw89_btc_set_policy()
3883 case BTC_CXP_AUTO_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3884 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3886 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy()
3891 case BTC_CXP_PAUTO: /* PS-TDMA Auto-Slot */ in rtw89_btc_set_policy()
3908 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3910 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy()
3915 case BTC_CXP_AUTO2: /* TDMA Auto-Slot2 */ in rtw89_btc_set_policy()
3944 case BTC_CXP_AUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3945 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3947 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy()
3952 case BTC_CXP_PAUTO2: /* PS-TDMA Auto-Slot2 */ in rtw89_btc_set_policy()
3981 case BTC_CXP_PAUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3982 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3984 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy()
3995 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_set_policy_v1()
3996 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_set_policy_v1()
3997 struct rtw89_btc_fbtc_tdma *t = &dm->tdma; in rtw89_btc_set_policy_v1()
3998 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &btc->cx.wl.role_info_v1; in rtw89_btc_set_policy_v1()
3999 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in rtw89_btc_set_policy_v1()
4000 struct rtw89_btc_bt_hid_desc *hid = &btc->cx.bt.link_info.hid_desc; in rtw89_btc_set_policy_v1()
4001 struct rtw89_btc_bt_hfp_desc *hfp = &btc->cx.bt.link_info.hfp_desc; in rtw89_btc_set_policy_v1()
4002 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_set_policy_v1()
4007 if (wl->status.map.lps) { in rtw89_btc_set_policy_v1()
4018 if (btc->ant_type == BTC_ANT_SHARED) { in rtw89_btc_set_policy_v1()
4019 if (btc->cx.wl.status.map._4way) in rtw89_btc_set_policy_v1()
4021 else if (hid->exist && hid->type == BTC_HID_218) in rtw89_btc_set_policy_v1()
4022 tbl_w1 = cxtbl[7]; /* Ack/BA no break bt Hi-Pri-rx */ in rtw89_btc_set_policy_v1()
4026 if (dm->leak_ap && in rtw89_btc_set_policy_v1()
4030 } else if (hid->exist && hid->type == BTC_HID_218) { in rtw89_btc_set_policy_v1()
4031 tbl_b1 = cxtbl[4]; /* Ack/BA no break bt Hi-Pri-rx */ in rtw89_btc_set_policy_v1()
4041 if (wl->bg_mode) in rtw89_btc_set_policy_v1()
4043 else if ((wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) && in rtw89_btc_set_policy_v1()
4044 hid->exist) in rtw89_btc_set_policy_v1()
4052 btc->update_policy_force = true; in rtw89_btc_set_policy_v1()
4128 /* To avoid wl-s0 tx break by hid/hfp tx */ in rtw89_btc_set_policy_v1()
4129 if (hid->exist || hfp->exist) in rtw89_btc_set_policy_v1()
4132 dur_2 = dm->e2g_slot_limit; in rtw89_btc_set_policy_v1()
4135 case BTC_CXP_OFFE_2GBWISOB: /* for normal-case */ in rtw89_btc_set_policy_v1()
4141 case BTC_CXP_OFFE_2GISOB: /* for bt no-link */ in rtw89_btc_set_policy_v1()
4167 if (a2dp->exist) in rtw89_btc_set_policy_v1()
4174 case BTC_CXP_OFFE_WL: /* for 4-way */ in rtw89_btc_set_policy_v1()
4186 case BTC_CXP_FIX: /* TDMA Fix-Slot */ in rtw89_btc_set_policy_v1()
4235 case BTC_CXP_FIX_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4236 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4238 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4245 case BTC_CXP_PFIX: /* PS-TDMA Fix-Slot */ in rtw89_btc_set_policy_v1()
4274 case BTC_CXP_PFIX_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4275 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4277 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4284 case BTC_CXP_AUTO: /* TDMA Auto-Slot */ in rtw89_btc_set_policy_v1()
4301 case BTC_CXP_AUTO_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4302 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4304 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4311 case BTC_CXP_PAUTO: /* PS-TDMA Auto-Slot */ in rtw89_btc_set_policy_v1()
4329 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4331 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4338 case BTC_CXP_AUTO2: /* TDMA Auto-Slot2 */ in rtw89_btc_set_policy_v1()
4368 case BTC_CXP_AUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4369 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4371 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4373 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy_v1()
4380 case BTC_CXP_PAUTO2: /* PS-TDMA Auto-Slot2 */ in rtw89_btc_set_policy_v1()
4410 case BTC_CXP_PAUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4411 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4413 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4415 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy_v1()
4424 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC && dm->tdma.rxflctrl) { in rtw89_btc_set_policy_v1()
4425 null_role = FIELD_PREP(0x0f, dm->wl_scc.null_role1) | in rtw89_btc_set_policy_v1()
4426 FIELD_PREP(0xf0, dm->wl_scc.null_role2); in rtw89_btc_set_policy_v1()
4430 /* enter leak_slot after each null-1 */ in rtw89_btc_set_policy_v1()
4431 if (dm->leak_ap && dm->tdma.leak_n > 1) in rtw89_btc_set_policy_v1()
4434 if (dm->tdma_instant_excute) { in rtw89_btc_set_policy_v1()
4435 btc->dm.tdma.option_ctrl |= BIT(0); in rtw89_btc_set_policy_v1()
4436 btc->update_policy_force = true; in rtw89_btc_set_policy_v1()
4444 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _set_bt_plut()
4448 plt.rx = rx_val; in _set_bt_plut()
4450 if (rtwdev->btc.ver->fwlrole == 8) { in _set_bt_plut()
4451 plt.band = wl->pta_req_mac; in _set_bt_plut()
4452 if (wl->bt_polut_type[plt.band] == tx_val) in _set_bt_plut()
4455 wl->bt_polut_type[plt.band] = tx_val; in _set_bt_plut()
4463 if (!rtwdev->dbcc_en) in _set_bt_plut()
4475 struct rtw89_btc *btc = &rtwdev->btc; in _set_ant_v0()
4476 struct rtw89_btc_dm *dm = &btc->dm; in _set_ant_v0()
4477 struct rtw89_btc_cx *cx = &btc->cx; in _set_ant_v0()
4478 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_ant_v0()
4479 struct rtw89_btc_bt_info *bt = &cx->bt; in _set_ant_v0()
4480 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _set_ant_v0()
4487 if (btc->ver->fwlrole == 1) in _set_ant_v0()
4488 dbcc_chg = wl->role_info_v1.dbcc_chg; in _set_ant_v0()
4489 else if (btc->ver->fwlrole == 2) in _set_ant_v0()
4490 dbcc_chg = wl->role_info_v2.dbcc_chg; in _set_ant_v0()
4491 else if (btc->ver->fwlrole == 7) in _set_ant_v0()
4492 dbcc_chg = wl->role_info_v7.dbcc_chg; in _set_ant_v0()
4493 else if (btc->ver->fwlrole == 8) in _set_ant_v0()
4494 dbcc_chg = wl->role_info_v8.dbcc_chg; in _set_ant_v0()
4496 if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF || in _set_ant_v0()
4497 btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE || in _set_ant_v0()
4498 btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || dbcc_chg) in _set_ant_v0()
4501 if (!force_exec && ant_path_type == dm->set_ant_path) { in _set_ant_v0()
4506 } else if (bt->rfk_info.map.run) { in _set_ant_v0()
4510 } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK && in _set_ant_v0()
4511 wl->rfk_info.state != BTC_WRFK_STOP) { in _set_ant_v0()
4517 dm->set_ant_path = ant_path_type; in _set_ant_v0()
4522 __func__, phy_map, dm->set_ant_path & 0xff); in _set_ant_v0()
4529 if (bt->enable.now) in _set_ant_v0()
4548 if (rtwdev->dbcc_en) { in _set_ant_v0()
4550 b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G); in _set_ant_v0()
4556 wl_dinfo->real_band[0] == RTW89_BAND_2G && in _set_ant_v0()
4557 wl_dinfo->real_band[1] == RTW89_BAND_5G) in _set_ant_v0()
4605 struct rtw89_btc *btc = &rtwdev->btc; in _set_ant_v1()
4606 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_ant_v1()
4607 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_ant_v1()
4608 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _set_ant_v1()
4610 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _set_ant_v1()
4611 struct rtw89_btc_dm *dm = &btc->dm; in _set_ant_v1()
4614 if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF || in _set_ant_v1()
4615 btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE || in _set_ant_v1()
4616 btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || wl_rinfo->dbcc_chg) in _set_ant_v1()
4619 if (wl_rinfo->link_mode != BTC_WLINK_25G_MCC && in _set_ant_v1()
4620 btc->dm.wl_btg_rx == 2) in _set_ant_v1()
4623 if (!force_exec && ant_path_type == dm->set_ant_path) { in _set_ant_v1()
4628 } else if (bt->rfk_info.map.run) { in _set_ant_v1()
4632 } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK && in _set_ant_v1()
4633 wl->rfk_info.state != BTC_WRFK_STOP) { in _set_ant_v1()
4639 dm->set_ant_path = ant_path_type; in _set_ant_v1()
4643 __func__, phy_map, dm->set_ant_path & 0xff); in _set_ant_v1()
4648 if (bt->enable.now && bt->run_patch_code) in _set_ant_v1()
4665 if (wl_rinfo->dbcc_en) { in _set_ant_v1()
4666 if (wl_dinfo->real_band[RTW89_PHY_0] == RTW89_BAND_2G) in _set_ant_v1()
4672 if (wl_dinfo->real_band[RTW89_PHY_1] == RTW89_BAND_2G) in _set_ant_v1()
4695 BTC_WLACT_SW_HI); /* no BT-Tx */ in _set_ant_v1()
4707 if (rtwdev->chip->chip_id == RTL8922A) in _set_ant()
4729 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_off()
4730 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_off()
4734 if (wl->status.map.rf_off || btc->dm.bt_only) { in _action_wl_off()
4736 } else if (wl->status.map.lps == BTC_LPS_RF_ON) { in _action_wl_off()
4745 } else if (wl->status.map.lps == BTC_LPS_RF_ON) { in _action_wl_off()
4746 if (btc->cx.bt.link_info.a2dp_desc.active) in _action_wl_off()
4757 struct rtw89_btc *btc = &rtwdev->btc; in _action_freerun()
4764 btc->dm.freerun = true; in _action_freerun()
4785 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_idle()
4786 struct rtw89_btc_bt_link_info *b = &btc->cx.bt.link_info; in _action_bt_idle()
4787 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_bt_idle()
4791 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_bt_idle()
4792 switch (btc->cx.state_map) { in _action_bt_idle()
4793 case BTC_WBUSY_BNOSCAN: /*wl-busy + bt idle*/ in _action_bt_idle()
4794 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-idle */ in _action_bt_idle()
4795 if (b->status.map.connect) in _action_bt_idle()
4797 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) in _action_bt_idle()
4802 case BTC_WBUSY_BSCAN: /*wl-busy + bt-inq */ in _action_bt_idle()
4806 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq */ in _action_bt_idle()
4810 case BTC_WLINKING: /* wl-connecting + bt-inq or bt-idle */ in _action_bt_idle()
4814 case BTC_WIDLE: /* wl-idle + bt-idle */ in _action_bt_idle()
4818 } else { /* dedicated-antenna */ in _action_bt_idle()
4825 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_hfp()
4826 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_bt_hfp()
4830 if (btc->ant_type == BTC_ANT_SHARED) { in _action_bt_hfp()
4831 if (btc->cx.wl.status.map._4way) { in _action_bt_hfp()
4833 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { in _action_bt_hfp()
4834 btc->cx.bt.scan_rx_low_pri = true; in _action_bt_hfp()
4840 if (wl->bg_mode) in _action_bt_hfp()
4842 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) in _action_bt_hfp()
4851 const struct rtw89_chip_info *chip = rtwdev->chip; in _action_bt_hid()
4852 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_hid()
4853 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_bt_hid()
4854 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_bt_hid()
4855 struct rtw89_btc_bt_hid_desc *hid = &bt->link_info.hid_desc; in _action_bt_hid()
4860 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_bt_hid()
4861 if (wl->status.map._4way) { in _action_bt_hid()
4863 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { in _action_bt_hid()
4864 btc->cx.bt.scan_rx_low_pri = true; in _action_bt_hid()
4865 if (hid->type & BTC_HID_BLE) in _action_bt_hid()
4869 } else if (hid->type == BTC_HID_218) { in _action_bt_hid()
4870 bt->scan_rx_low_pri = true; in _action_bt_hid()
4872 } else if (chip->para_ver == 0x1) { in _action_bt_hid()
4877 } else { /* dedicated-antenna */ in _action_bt_hid()
4878 if (wl->bg_mode) in _action_bt_hid()
4880 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) in _action_bt_hid()
4891 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp()
4892 struct rtw89_btc_dm *dm = &btc->dm; in _action_bt_a2dp()
4896 dm->slot_dur[CXST_W1] = 20; in _action_bt_a2dp()
4897 dm->slot_dur[CXST_B1] = BTC_B1_MAX; in _action_bt_a2dp()
4899 switch (btc->cx.state_map) { in _action_bt_a2dp()
4900 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP */ in _action_bt_a2dp()
4903 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP */ in _action_bt_a2dp()
4906 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP */ in _action_bt_a2dp()
4909 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP */ in _action_bt_a2dp()
4910 case BTC_WLINKING: /* wl-connecting + bt-A2DP */ in _action_bt_a2dp()
4911 if (btc->cx.wl.rfk_info.con_rfk) in _action_bt_a2dp()
4916 case BTC_WIDLE: /* wl-idle + bt-A2DP */ in _action_bt_a2dp()
4924 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dpsink()
4928 switch (btc->cx.state_map) { in _action_bt_a2dpsink()
4929 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4932 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4935 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4938 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4941 case BTC_WLINKING: /* wl-connecting + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4942 if (btc->cx.wl.rfk_info.con_rfk) in _action_bt_a2dpsink()
4947 case BTC_WIDLE: /* wl-idle + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4955 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_pan()
4956 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; in _action_bt_pan()
4957 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in _action_bt_pan()
4958 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc; in _action_bt_pan()
4962 switch (btc->cx.state_map) { in _action_bt_pan()
4963 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-PAN */ in _action_bt_pan()
4965 btc->dm.slot_dur[CXST_W1] = 80; in _action_bt_pan()
4966 btc->dm.slot_dur[CXST_B1] = 20; in _action_bt_pan()
4972 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-PAN */ in _action_bt_pan()
4975 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-PAN */ in _action_bt_pan()
4978 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-PAN */ in _action_bt_pan()
4981 case BTC_WLINKING: /* wl-connecting + bt-PAN */ in _action_bt_pan()
4984 case BTC_WIDLE: /* wl-idle + bt-pan */ in _action_bt_pan()
4992 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp_hid()
4993 struct rtw89_btc_dm *dm = &btc->dm; in _action_bt_a2dp_hid()
4997 dm->slot_dur[CXST_W1] = 20; in _action_bt_a2dp_hid()
4998 dm->slot_dur[CXST_B1] = BTC_B1_MAX; in _action_bt_a2dp_hid()
5000 switch (btc->cx.state_map) { in _action_bt_a2dp_hid()
5001 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+HID */ in _action_bt_a2dp_hid()
5002 case BTC_WIDLE: /* wl-idle + bt-A2DP */ in _action_bt_a2dp_hid()
5005 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+HID */ in _action_bt_a2dp_hid()
5009 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+HID */ in _action_bt_a2dp_hid()
5012 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+HID */ in _action_bt_a2dp_hid()
5013 case BTC_WLINKING: /* wl-connecting + bt-A2DP+HID */ in _action_bt_a2dp_hid()
5014 if (btc->cx.wl.rfk_info.con_rfk) in _action_bt_a2dp_hid()
5024 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp_pan()
5028 switch (btc->cx.state_map) { in _action_bt_a2dp_pan()
5029 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
5032 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
5035 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
5038 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
5041 case BTC_WLINKING: /* wl-connecting + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
5044 case BTC_WIDLE: /* wl-idle + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
5052 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_pan_hid()
5056 switch (btc->cx.state_map) { in _action_bt_pan_hid()
5057 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-PAN+HID */ in _action_bt_pan_hid()
5060 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-PAN+HID */ in _action_bt_pan_hid()
5063 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-PAN+HID */ in _action_bt_pan_hid()
5066 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-PAN+HID */ in _action_bt_pan_hid()
5069 case BTC_WLINKING: /* wl-connecting + bt-PAN+HID */ in _action_bt_pan_hid()
5072 case BTC_WIDLE: /* wl-idle + bt-PAN+HID */ in _action_bt_pan_hid()
5080 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp_pan_hid()
5084 switch (btc->cx.state_map) { in _action_bt_a2dp_pan_hid()
5085 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
5089 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
5093 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
5097 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
5098 case BTC_WLINKING: /* wl-connecting + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
5102 case BTC_WIDLE: /* wl-idle + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
5117 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_other()
5121 if (btc->ant_type == BTC_ANT_SHARED) in _action_wl_other()
5135 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_rfk()
5136 struct rtw89_btc_wl_rfk_info rfk = btc->cx.wl.rfk_info; in _action_wl_rfk()
5144 btc->dm.tdma_instant_excute = 1; in _action_wl_rfk()
5147 btc->ant_type == BTC_ANT_SHARED) { in _action_wl_rfk()
5158 struct rtw89_btc *btc = &rtwdev->btc; in _set_btg_ctrl()
5159 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_btg_ctrl()
5160 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_btg_ctrl()
5161 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_btg_ctrl()
5162 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_btg_ctrl()
5163 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_btg_ctrl()
5164 struct rtw89_btc_fbtc_outsrc_set_info *o_info = &btc->dm.ost_info; in _set_btg_ctrl()
5165 struct rtw89_btc_wl_role_info *wl_rinfo_v0 = &wl->role_info; in _set_btg_ctrl()
5166 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_btg_ctrl()
5167 const struct rtw89_btc_ver *ver = btc->ver; in _set_btg_ctrl()
5168 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_btg_ctrl()
5169 struct rtw89_btc_dm *dm = &btc->dm; in _set_btg_ctrl()
5173 if (btc->manual_ctrl) in _set_btg_ctrl()
5176 if (ver->fwlrole == 0) in _set_btg_ctrl()
5177 wl_rinfo.link_mode = wl_rinfo_v0->link_mode; in _set_btg_ctrl()
5178 else if (ver->fwlrole == 1) in _set_btg_ctrl()
5179 wl_rinfo.link_mode = wl_rinfo_v1->link_mode; in _set_btg_ctrl()
5180 else if (ver->fwlrole == 2) in _set_btg_ctrl()
5181 wl_rinfo.link_mode = wl_rinfo_v2->link_mode; in _set_btg_ctrl()
5182 else if (ver->fwlrole == 7) in _set_btg_ctrl()
5183 wl_rinfo.link_mode = wl_rinfo_v7->link_mode; in _set_btg_ctrl()
5184 else if (ver->fwlrole == 8) in _set_btg_ctrl()
5185 wl_rinfo.link_mode = wl_rinfo_v8->link_mode; in _set_btg_ctrl()
5189 /* notify halbb ignore GNT_BT or not for WL BB Rx-AGC control */ in _set_btg_ctrl()
5190 if (btc->ant_type == BTC_ANT_SHARED) { in _set_btg_ctrl()
5191 if (!(bt->run_patch_code && bt->enable.now)) in _set_btg_ctrl()
5199 if (!ver->fcxosi && in _set_btg_ctrl()
5204 if (is_btg == dm->wl_btg_rx) in _set_btg_ctrl()
5207 dm->wl_btg_rx = is_btg; in _set_btg_ctrl()
5210 if (!ver->fcxosi && is_btg > BTC_BTGCTRL_ENABLE) in _set_btg_ctrl()
5214 if (o_info->rf_band[BTC_RF_S0] != o_info->rf_band[BTC_RF_S1]) {/* 1+1 */ in _set_btg_ctrl()
5215 if (o_info->rf_band[BTC_RF_S0]) /* Non-2G */ in _set_btg_ctrl()
5216 o_info->btg_rx[BTC_RF_S0] = BTC_BTGCTRL_DISABLE; in _set_btg_ctrl()
5218 o_info->btg_rx[BTC_RF_S0] = is_btg; in _set_btg_ctrl()
5220 if (o_info->rf_band[BTC_RF_S1]) /* Non-2G */ in _set_btg_ctrl()
5221 o_info->btg_rx[BTC_RF_S1] = BTC_BTGCTRL_DISABLE; in _set_btg_ctrl()
5223 o_info->btg_rx[BTC_RF_S1] = is_btg; in _set_btg_ctrl()
5225 o_info->btg_rx[BTC_RF_S0] = is_btg; in _set_btg_ctrl()
5226 o_info->btg_rx[BTC_RF_S1] = is_btg; in _set_btg_ctrl()
5229 if (ver->fcxosi) in _set_btg_ctrl()
5232 chip->ops->ctrl_btg_bt_rx(rtwdev, o_info->btg_rx[BTC_RF_S0], in _set_btg_ctrl()
5234 if (chip->chip_id != RTL8922A) in _set_btg_ctrl()
5237 chip->ops->ctrl_btg_bt_rx(rtwdev, o_info->btg_rx[BTC_RF_S1], in _set_btg_ctrl()
5243 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_preagc_ctrl()
5244 struct rtw89_btc_fbtc_outsrc_set_info *o_info = &btc->dm.ost_info; in _set_wl_preagc_ctrl()
5245 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; in _set_wl_preagc_ctrl()
5246 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_wl_preagc_ctrl()
5247 struct rtw89_btc_wl_role_info_v2 *rinfo_v2 = &wl->role_info_v2; in _set_wl_preagc_ctrl()
5248 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7; in _set_wl_preagc_ctrl()
5249 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8; in _set_wl_preagc_ctrl()
5250 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_wl_preagc_ctrl()
5251 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_wl_preagc_ctrl()
5252 struct rtw89_btc_dm *dm = &btc->dm; in _set_wl_preagc_ctrl()
5254 u8 role_ver = rtwdev->btc.ver->fwlrole; in _set_wl_preagc_ctrl()
5257 if (btc->manual_ctrl) in _set_wl_preagc_ctrl()
5261 dbcc_en = rinfo_v2->dbcc_en; in _set_wl_preagc_ctrl()
5262 link_mode = rinfo_v2->link_mode; in _set_wl_preagc_ctrl()
5263 dbcc_2g_phy = rinfo_v2->dbcc_2g_phy; in _set_wl_preagc_ctrl()
5265 dbcc_en = rinfo_v7->dbcc_en; in _set_wl_preagc_ctrl()
5266 link_mode = rinfo_v7->link_mode; in _set_wl_preagc_ctrl()
5267 dbcc_2g_phy = rinfo_v7->dbcc_2g_phy; in _set_wl_preagc_ctrl()
5269 dbcc_en = rinfo_v8->dbcc_en; in _set_wl_preagc_ctrl()
5270 link_mode = rinfo_v8->link_mode; in _set_wl_preagc_ctrl()
5271 dbcc_2g_phy = rinfo_v7->dbcc_2g_phy; in _set_wl_preagc_ctrl()
5276 if (!(bt->run_patch_code && bt->enable.now)) { in _set_wl_preagc_ctrl()
5281 btc->cx.bt.link_info.profile_cnt.now == 0) { in _set_wl_preagc_ctrl()
5283 } else if (dm->tdma_now.type != CXTDMA_OFF && in _set_wl_preagc_ctrl()
5284 !bt_linfo->hfp_desc.exist && in _set_wl_preagc_ctrl()
5285 !bt_linfo->hid_desc.exist && in _set_wl_preagc_ctrl()
5286 dm->fddt_train == BTC_FDDT_DISABLE) { in _set_wl_preagc_ctrl()
5290 } else if (btc->ant_type == BTC_ANT_SHARED) { in _set_wl_preagc_ctrl()
5296 if (!btc->ver->fcxosi && link_mode == BTC_WLINK_25G_MCC) in _set_wl_preagc_ctrl()
5299 if (dm->wl_pre_agc_rb != dm->wl_pre_agc && in _set_wl_preagc_ctrl()
5300 dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND) { in _set_wl_preagc_ctrl()
5302 dm->wl_pre_agc_rb = val; in _set_wl_preagc_ctrl()
5305 if ((wl->coex_mode == BTC_MODE_NORMAL && in _set_wl_preagc_ctrl()
5306 (dm->run_reason == BTC_RSN_NTFY_INIT || in _set_wl_preagc_ctrl()
5307 dm->run_reason == BTC_RSN_NTFY_SWBAND || in _set_wl_preagc_ctrl()
5308 dm->wl_pre_agc_rb != dm->wl_pre_agc)) || in _set_wl_preagc_ctrl()
5309 is_preagc != dm->wl_pre_agc) { in _set_wl_preagc_ctrl()
5310 dm->wl_pre_agc = is_preagc; in _set_wl_preagc_ctrl()
5312 if (!btc->ver->fcxosi && is_preagc > BTC_PREAGC_ENABLE) in _set_wl_preagc_ctrl()
5315 if (o_info->rf_band[BTC_RF_S0] != o_info->rf_band[BTC_RF_S1]) {/* 1+1 */ in _set_wl_preagc_ctrl()
5316 if (o_info->rf_band[BTC_RF_S0]) /* Non-2G */ in _set_wl_preagc_ctrl()
5317 o_info->nbtg_tx[BTC_RF_S0] = BTC_PREAGC_DISABLE; in _set_wl_preagc_ctrl()
5319 o_info->nbtg_tx[BTC_RF_S0] = is_preagc; in _set_wl_preagc_ctrl()
5321 if (o_info->rf_band[BTC_RF_S1]) /* Non-2G */ in _set_wl_preagc_ctrl()
5322 o_info->nbtg_tx[BTC_RF_S1] = BTC_PREAGC_DISABLE; in _set_wl_preagc_ctrl()
5324 o_info->nbtg_tx[BTC_RF_S1] = is_preagc; in _set_wl_preagc_ctrl()
5327 o_info->nbtg_tx[BTC_RF_S0] = is_preagc; in _set_wl_preagc_ctrl()
5328 o_info->nbtg_tx[BTC_RF_S1] = is_preagc; in _set_wl_preagc_ctrl()
5331 if (btc->ver->fcxosi) in _set_wl_preagc_ctrl()
5334 chip->ops->ctrl_nbtg_bt_tx(rtwdev, o_info->nbtg_tx[BTC_RF_S0], in _set_wl_preagc_ctrl()
5336 if (chip->chip_id != RTL8922A) in _set_wl_preagc_ctrl()
5338 chip->ops->ctrl_nbtg_bt_tx(rtwdev, o_info->nbtg_tx[BTC_RF_S1], in _set_wl_preagc_ctrl()
5356 struct rtw89_dev *rtwdev = iter_data->rtwdev; in __rtw89_tx_time_iter()
5357 struct rtw89_btc *btc = &rtwdev->btc; in __rtw89_tx_time_iter()
5358 struct rtw89_btc_cx *cx = &btc->cx; in __rtw89_tx_time_iter()
5359 struct rtw89_btc_wl_info *wl = &cx->wl; in __rtw89_tx_time_iter()
5361 u8 port = rtwvif_link->port; in __rtw89_tx_time_iter()
5362 u32 tx_time = iter_data->tx_time; in __rtw89_tx_time_iter()
5363 u8 tx_retry = iter_data->tx_retry; in __rtw89_tx_time_iter()
5364 u16 enable = iter_data->enable; in __rtw89_tx_time_iter()
5365 bool reenable = iter_data->reenable; in __rtw89_tx_time_iter()
5367 if (btc->ver->fwlrole == 8) in __rtw89_tx_time_iter()
5368 plink = &wl->rlink_info[port][0]; in __rtw89_tx_time_iter()
5370 plink = &wl->link_info[port]; in __rtw89_tx_time_iter()
5375 if (!plink->connected) { in __rtw89_tx_time_iter()
5378 __func__, plink->connected); in __rtw89_tx_time_iter()
5382 /* backup the original tx time before tx-limit on */ in __rtw89_tx_time_iter()
5384 rtw89_mac_get_tx_time(rtwdev, rtwsta_link, &plink->tx_time); in __rtw89_tx_time_iter()
5385 rtw89_mac_get_tx_retry_limit(rtwdev, rtwsta_link, &plink->tx_retry); in __rtw89_tx_time_iter()
5388 __func__, plink->tx_time, plink->tx_retry); in __rtw89_tx_time_iter()
5391 /* restore the original tx time if no tx-limit */ in __rtw89_tx_time_iter()
5393 rtw89_mac_set_tx_time(rtwdev, rtwsta_link, true, plink->tx_time); in __rtw89_tx_time_iter()
5395 plink->tx_retry); in __rtw89_tx_time_iter()
5398 __func__, plink->tx_time, plink->tx_retry); in __rtw89_tx_time_iter()
5419 rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_tx_time_iter()
5426 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_tx_limit()
5427 const struct rtw89_btc_ver *ver = btc->ver; in _set_wl_tx_limit()
5428 struct rtw89_btc_cx *cx = &btc->cx; in _set_wl_tx_limit()
5429 struct rtw89_btc_dm *dm = &btc->dm; in _set_wl_tx_limit()
5430 struct rtw89_btc_wl_info *wl = &cx->wl; in _set_wl_tx_limit()
5431 struct rtw89_btc_bt_info *bt = &cx->bt; in _set_wl_tx_limit()
5432 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _set_wl_tx_limit()
5433 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc; in _set_wl_tx_limit()
5434 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc; in _set_wl_tx_limit()
5435 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _set_wl_tx_limit()
5436 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_wl_tx_limit()
5437 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_wl_tx_limit()
5438 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_wl_tx_limit()
5439 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_wl_tx_limit()
5446 if (btc->manual_ctrl) in _set_wl_tx_limit()
5449 if (ver->fwlrole == 0) in _set_wl_tx_limit()
5450 mode = wl_rinfo->link_mode; in _set_wl_tx_limit()
5451 else if (ver->fwlrole == 1) in _set_wl_tx_limit()
5452 mode = wl_rinfo_v1->link_mode; in _set_wl_tx_limit()
5453 else if (ver->fwlrole == 2) in _set_wl_tx_limit()
5454 mode = wl_rinfo_v2->link_mode; in _set_wl_tx_limit()
5455 else if (ver->fwlrole == 7) in _set_wl_tx_limit()
5456 mode = wl_rinfo_v7->link_mode; in _set_wl_tx_limit()
5457 else if (ver->fwlrole == 8) in _set_wl_tx_limit()
5458 mode = wl_rinfo_v8->link_mode; in _set_wl_tx_limit()
5462 if (ver->fcxctrl == 7) in _set_wl_tx_limit()
5463 igno_bt = btc->ctrl.ctrl_v7.igno_bt; in _set_wl_tx_limit()
5465 igno_bt = btc->ctrl.ctrl.igno_bt; in _set_wl_tx_limit()
5467 if (btc->dm.freerun || igno_bt || b->profile_cnt.now == 0 || in _set_wl_tx_limit()
5472 } else if ((hfp->exist && hid->exist) || hid->pair_cnt > 1) { in _set_wl_tx_limit()
5476 } else if (hfp->exist || hid->exist) { in _set_wl_tx_limit()
5486 if (dm->wl_tx_limit.enable == enable && in _set_wl_tx_limit()
5487 dm->wl_tx_limit.tx_time == tx_time && in _set_wl_tx_limit()
5488 dm->wl_tx_limit.tx_retry == tx_retry) in _set_wl_tx_limit()
5491 if (!dm->wl_tx_limit.enable && enable) in _set_wl_tx_limit()
5494 dm->wl_tx_limit.enable = enable; in _set_wl_tx_limit()
5495 dm->wl_tx_limit.tx_time = tx_time; in _set_wl_tx_limit()
5496 dm->wl_tx_limit.tx_retry = tx_retry; in _set_wl_tx_limit()
5503 ieee80211_iterate_stations_atomic(rtwdev->hw, in _set_wl_tx_limit()
5510 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_rx_agc()
5511 const struct rtw89_btc_ver *ver = btc->ver; in _set_bt_rx_agc()
5512 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_bt_rx_agc()
5513 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _set_bt_rx_agc()
5514 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_bt_rx_agc()
5515 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_bt_rx_agc()
5516 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_bt_rx_agc()
5517 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_bt_rx_agc()
5518 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_rx_agc()
5522 if (ver->fwlrole == 0) in _set_bt_rx_agc()
5523 mode = wl_rinfo->link_mode; in _set_bt_rx_agc()
5524 else if (ver->fwlrole == 1) in _set_bt_rx_agc()
5525 mode = wl_rinfo_v1->link_mode; in _set_bt_rx_agc()
5526 else if (ver->fwlrole == 2) in _set_bt_rx_agc()
5527 mode = wl_rinfo_v2->link_mode; in _set_bt_rx_agc()
5528 else if (ver->fwlrole == 7) in _set_bt_rx_agc()
5529 mode = wl_rinfo_v7->link_mode; in _set_bt_rx_agc()
5530 else if (ver->fwlrole == 8) in _set_bt_rx_agc()
5531 mode = wl_rinfo_v8->link_mode; in _set_bt_rx_agc()
5535 if (mode != BTC_WLINK_NOLINK && btc->dm.wl_btg_rx) in _set_bt_rx_agc()
5538 if (bt_hi_lna_rx == bt->hi_lna_rx) in _set_bt_rx_agc()
5546 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_rx_scan_pri()
5547 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_rx_scan_pri()
5549 _write_scbd(rtwdev, BTC_WSCB_RXSCAN_PRI, (bool)(!!bt->scan_rx_low_pri)); in _set_bt_rx_scan_pri()
5554 struct rtw89_btc *btc = &rtwdev->btc; in _wl_req_mac()
5555 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _wl_req_mac()
5556 struct rtw89_btc_dm *dm = &btc->dm; in _wl_req_mac()
5559 if (mac == wl->pta_req_mac) in _wl_req_mac()
5562 dm->ost_info.pta_req_hw_band = mac; in _wl_req_mac()
5563 wl->pta_req_mac = mac; in _wl_req_mac()
5564 wl->pta_reg_mac_chg = true; in _wl_req_mac()
5566 if (btc->ver->fcxosi) in _wl_req_mac()
5569 if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) in _wl_req_mac()
5582 struct rtw89_btc *btc = &rtwdev->btc; in _action_common()
5583 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_common()
5584 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8; in _action_common()
5585 struct rtw89_btc_wl_smap *wl_smap = &wl->status.map; in _action_common()
5586 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_common()
5587 struct rtw89_btc_dm *dm = &btc->dm; in _action_common()
5590 if (btc->ver->fwlrole == 8) in _action_common()
5591 _wl_req_mac(rtwdev, rinfo_v8->pta_req_band); in _action_common()
5601 bt_rom_code_id = chip_id_to_bt_rom_code_id(rtwdev->btc.ver->chip_id); in _action_common()
5602 bt_fw_ver = bt->ver_info.fw & 0xffff; in _action_common()
5603 if (bt->enable.now && in _action_common()
5605 (bt_fw_ver == bt_rom_code_id && bt->run_patch_code && rtwdev->chip->scbd))) in _action_common()
5610 if (dm->run_reason == BTC_RSN_NTFY_INIT || in _action_common()
5611 dm->run_reason == BTC_RSN_NTFY_RADIO_STATE || in _action_common()
5612 dm->run_reason == BTC_RSN_NTFY_POWEROFF) { in _action_common()
5615 if (wl_smap->rf_off == 1 || wl_smap->lps != BTC_LPS_OFF) in _action_common()
5621 if (wl->scbd_change) { in _action_common()
5622 rtw89_mac_cfg_sb(rtwdev, wl->scbd); in _action_common()
5624 wl->scbd); in _action_common()
5625 wl->scbd_change = false; in _action_common()
5626 btc->cx.cnt_wl[BTC_WCNT_SCBDUPDATE]++; in _action_common()
5629 if (btc->ver->fcxosi) { in _action_common()
5630 if (memcmp(&dm->ost_info_last, &dm->ost_info, in _action_common()
5631 sizeof(dm->ost_info_last)) || in _action_common()
5632 dm->run_reason == BTC_RSN_NTFY_INIT || in _action_common()
5633 dm->run_reason == BTC_RSN_NTFY_RADIO_STATE) { in _action_common()
5634 dm->ost_info_last = dm->ost_info; in _action_common()
5638 btc->dm.tdma_instant_excute = 0; in _action_common()
5639 wl->pta_reg_mac_chg = false; in _action_common()
5644 struct rtw89_btc *btc = &rtwdev->btc; in _action_by_bt()
5645 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_by_bt()
5646 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _action_by_bt()
5647 struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc; in _action_by_bt()
5648 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in _action_by_bt()
5649 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc; in _action_by_bt()
5650 struct rtw89_btc_dm *dm = &btc->dm; in _action_by_bt()
5653 if (dm->freerun_chk) { in _action_by_bt()
5658 if (bt_linfo->hfp_desc.exist) in _action_by_bt()
5661 if (bt_linfo->hid_desc.exist) in _action_by_bt()
5664 if (bt_linfo->a2dp_desc.exist) in _action_by_bt()
5667 if (bt_linfo->pan_desc.exist) in _action_by_bt()
5687 else if (bt_linfo->multi_link.now && !hid.pair_cnt) in _action_by_bt()
5734 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_25g_mcc()
5737 if (btc->ant_type == BTC_ANT_SHARED) { in _action_wl_25g_mcc()
5738 if (btc->cx.wl.status.map._4way) in _action_wl_25g_mcc()
5740 else if (btc->cx.wl.status.val & btc_scanning_map.val) in _action_wl_25g_mcc()
5742 else if (btc->cx.bt.link_info.status.map.connect == 0) in _action_wl_25g_mcc()
5746 } else { /* dedicated-antenna */ in _action_wl_25g_mcc()
5750 btc->dm.e2g_slot_limit = BTC_E2G_LIMIT_DEF; in _action_wl_25g_mcc()
5758 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_scan()
5759 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_scan()
5760 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _action_wl_scan()
5762 if (btc->cx.state_map != BTC_WLINKING && in _action_wl_scan()
5763 RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) { in _action_wl_scan()
5766 } else if (rtwdev->dbcc_en) { in _action_wl_scan()
5767 if (wl_dinfo->real_band[RTW89_PHY_0] != RTW89_BAND_2G && in _action_wl_scan()
5768 wl_dinfo->real_band[RTW89_PHY_1] != RTW89_BAND_2G) in _action_wl_scan()
5773 if (wl->scan_info.band[RTW89_PHY_0] != RTW89_BAND_2G) in _action_wl_scan()
5781 { struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_mcc()
5785 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_mcc()
5786 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_mcc()
5792 } else { /* dedicated-antenna */ in _action_wl_2g_mcc()
5799 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc()
5803 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_scc()
5804 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_scc()
5810 } else { /* dedicated-antenna */ in _action_wl_2g_scc()
5817 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc_v1()
5818 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_2g_scc_v1()
5819 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_wl_2g_scc_v1()
5820 struct rtw89_btc_dm *dm = &btc->dm; in _action_wl_2g_scc_v1()
5821 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &wl->role_info_v1; in _action_wl_2g_scc_v1()
5825 if (btc->ant_type == BTC_ANT_DEDICATED) { in _action_wl_2g_scc_v1()
5828 /* shared-antenna */ in _action_wl_2g_scc_v1()
5829 switch (wl_rinfo->mrole_type) { in _action_wl_2g_scc_v1()
5831 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5832 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_P2P_CLIENT; in _action_wl_2g_scc_v1()
5833 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v1()
5837 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5838 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5839 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v1()
5845 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5846 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_NONE; in _action_wl_2g_scc_v1()
5847 dur = wl_rinfo->mrole_noa_duration; in _action_wl_2g_scc_v1()
5849 if (wl->status.map._4way) { in _action_wl_2g_scc_v1()
5850 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v1()
5852 } else if (bt->link_info.status.map.connect == 0) { in _action_wl_2g_scc_v1()
5853 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v1()
5855 } else if (bt->link_info.a2dp_desc.exist && in _action_wl_2g_scc_v1()
5856 dur < btc->bt_req_len) { in _action_wl_2g_scc_v1()
5857 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v1()
5859 } else if (bt->link_info.a2dp_desc.exist || in _action_wl_2g_scc_v1()
5860 bt->link_info.pan_desc.exist) { in _action_wl_2g_scc_v1()
5861 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v1()
5864 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v1()
5879 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc_v2()
5880 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_2g_scc_v2()
5881 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_wl_2g_scc_v2()
5882 struct rtw89_btc_dm *dm = &btc->dm; in _action_wl_2g_scc_v2()
5883 struct rtw89_btc_wl_role_info_v2 *rinfo_v2 = &wl->role_info_v2; in _action_wl_2g_scc_v2()
5884 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7; in _action_wl_2g_scc_v2()
5888 if (btc->ver->fwlrole == 2) { in _action_wl_2g_scc_v2()
5889 mrole_type = rinfo_v2->mrole_type; in _action_wl_2g_scc_v2()
5890 mrole_noa_duration = rinfo_v2->mrole_noa_duration; in _action_wl_2g_scc_v2()
5891 } else if (btc->ver->fwlrole == 7) { in _action_wl_2g_scc_v2()
5892 mrole_type = rinfo_v7->mrole_type; in _action_wl_2g_scc_v2()
5893 mrole_noa_duration = rinfo_v7->mrole_noa_duration; in _action_wl_2g_scc_v2()
5898 if (btc->ant_type == BTC_ANT_DEDICATED) { in _action_wl_2g_scc_v2()
5901 /* shared-antenna */ in _action_wl_2g_scc_v2()
5904 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5905 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_P2P_CLIENT; in _action_wl_2g_scc_v2()
5906 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v2()
5910 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5911 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5912 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v2()
5918 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5919 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_NONE; in _action_wl_2g_scc_v2()
5922 if (wl->status.map._4way) { in _action_wl_2g_scc_v2()
5923 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v2()
5925 } else if (bt->link_info.status.map.connect == 0) { in _action_wl_2g_scc_v2()
5926 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v2()
5928 } else if (bt->link_info.a2dp_desc.exist && in _action_wl_2g_scc_v2()
5929 dur < btc->bt_req_len) { in _action_wl_2g_scc_v2()
5930 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v2()
5932 } else if (bt->link_info.a2dp_desc.exist || in _action_wl_2g_scc_v2()
5933 bt->link_info.pan_desc.exist) { in _action_wl_2g_scc_v2()
5934 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v2()
5937 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v2()
5952 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc_v8()
5953 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_2g_scc_v8()
5954 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_wl_2g_scc_v8()
5955 struct rtw89_btc_dm *dm = &btc->dm; in _action_wl_2g_scc_v8()
5958 if (btc->ant_type == BTC_ANT_SHARED) { in _action_wl_2g_scc_v8()
5959 if (wl->status.map._4way) in _action_wl_2g_scc_v8()
5961 else if (bt->link_info.status.map.connect == 0) in _action_wl_2g_scc_v8()
5969 dm->e2g_slot_limit = BTC_E2G_LIMIT_DEF; in _action_wl_2g_scc_v8()
5977 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_ap()
5981 if (btc->ant_type == BTC_ANT_SHARED) { in _action_wl_2g_ap()
5982 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_ap()
5987 } else {/* dedicated-antenna */ in _action_wl_2g_ap()
5994 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_go()
5998 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_go()
5999 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_go()
6005 } else { /* dedicated-antenna */ in _action_wl_2g_go()
6012 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_gc()
6016 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_gc()
6018 } else {/* dedicated-antenna */ in _action_wl_2g_gc()
6025 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_nan()
6029 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_nan()
6030 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_nan()
6036 } else { /* dedicated-antenna */ in _action_wl_2g_nan()
6043 const struct rtw89_chip_info *chip = rtwdev->chip; in _read_scbd()
6044 struct rtw89_btc *btc = &rtwdev->btc; in _read_scbd()
6047 if (!chip->scbd) in _read_scbd()
6054 btc->cx.cnt_bt[BTC_BCNT_SCBDREAD]++; in _read_scbd()
6060 const struct rtw89_chip_info *chip = rtwdev->chip; in _write_scbd()
6061 struct rtw89_btc *btc = &rtwdev->btc; in _write_scbd()
6062 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _write_scbd()
6066 if (!chip->scbd) in _write_scbd()
6069 scbd_val = state ? wl->scbd | val : wl->scbd & ~val; in _write_scbd()
6074 if (scbd_val != wl->scbd || force_exec) { in _write_scbd()
6075 wl->scbd = scbd_val; in _write_scbd()
6076 wl->scbd_change = true; in _write_scbd()
6083 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_rssi_state()
6084 u8 next_state, tol = chip->rssi_tol; in _update_rssi_state()
6105 struct rtw89_btc *btc = &rtwdev->btc; in _update_dbcc_band()
6107 btc->cx.wl.dbcc_info.real_band[phy_idx] = in _update_dbcc_band()
6108 btc->cx.wl.scan_info.phy_map & BIT(phy_idx) ? in _update_dbcc_band()
6109 btc->cx.wl.dbcc_info.scan_band[phy_idx] : in _update_dbcc_band()
6110 btc->cx.wl.dbcc_info.op_band[phy_idx]; in _update_dbcc_band()
6115 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info()
6116 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info()
6117 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info()
6118 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _update_wl_info()
6119 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info()
6133 wl_rinfo->active_role[cnt_active - 1].role = wl_linfo[i].role; in _update_wl_info()
6134 wl_rinfo->active_role[cnt_active - 1].pid = wl_linfo[i].pid; in _update_wl_info()
6135 wl_rinfo->active_role[cnt_active - 1].phy = wl_linfo[i].phy; in _update_wl_info()
6136 wl_rinfo->active_role[cnt_active - 1].band = wl_linfo[i].band; in _update_wl_info()
6137 wl_rinfo->active_role[cnt_active - 1].noa = (u8)wl_linfo[i].noa; in _update_wl_info()
6138 wl_rinfo->active_role[cnt_active - 1].connected = 0; in _update_wl_info()
6140 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid; in _update_wl_info()
6145 if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) { in _update_wl_info()
6146 wl_dinfo->role[phy] = wl_linfo[i].role; in _update_wl_info()
6147 wl_dinfo->op_band[phy] = wl_linfo[i].band; in _update_wl_info()
6164 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role); in _update_wl_info()
6165 wl_rinfo->active_role[cnt_active - 1].ch = wl_linfo[i].ch; in _update_wl_info()
6166 wl_rinfo->active_role[cnt_active - 1].bw = wl_linfo[i].bw; in _update_wl_info()
6167 wl_rinfo->active_role[cnt_active - 1].connected = 1; in _update_wl_info()
6171 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1) in _update_wl_info()
6176 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1) in _update_wl_info()
6183 wl_rinfo->connect_cnt = cnt_connect; in _update_wl_info()
6187 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info()
6188 wl_rinfo->role_map.role.none = 1; in _update_wl_info()
6190 wl_rinfo->link_mode = BTC_WLINK_5G; in _update_wl_info()
6191 } else if (wl_rinfo->role_map.role.nan) { in _update_wl_info()
6192 wl_rinfo->link_mode = BTC_WLINK_2G_NAN; in _update_wl_info()
6194 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info()
6196 if (rtwdev->dbcc_en) { in _update_wl_info()
6197 switch (wl_dinfo->role[RTW89_PHY_0]) { in _update_wl_info()
6199 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info()
6202 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info()
6205 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info()
6208 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info()
6211 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info()
6215 wl_rinfo->link_mode = BTC_WLINK_25G_MCC; in _update_wl_info()
6218 if (wl_rinfo->role_map.role.station && in _update_wl_info()
6219 (wl_rinfo->role_map.role.p2p_go || in _update_wl_info()
6220 wl_rinfo->role_map.role.p2p_gc || in _update_wl_info()
6221 wl_rinfo->role_map.role.ap)) { in _update_wl_info()
6223 wl_rinfo->link_mode = BTC_WLINK_2G_SCC; in _update_wl_info()
6225 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info()
6227 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info()
6230 if (wl_rinfo->role_map.role.station) in _update_wl_info()
6231 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info()
6232 else if (wl_rinfo->role_map.role.ap) in _update_wl_info()
6233 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info()
6234 else if (wl_rinfo->role_map.role.p2p_go) in _update_wl_info()
6235 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info()
6236 else if (wl_rinfo->role_map.role.p2p_gc) in _update_wl_info()
6237 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info()
6239 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info()
6242 /* if no client_joined, don't care P2P-GO/AP role */ in _update_wl_info()
6243 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) { in _update_wl_info()
6245 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC || in _update_wl_info()
6246 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) { in _update_wl_info()
6247 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info()
6248 wl_rinfo->connect_cnt = 1; in _update_wl_info()
6249 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO || in _update_wl_info()
6250 wl_rinfo->link_mode == BTC_WLINK_2G_AP) { in _update_wl_info()
6251 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info()
6252 wl_rinfo->connect_cnt = 0; in _update_wl_info()
6259 cnt_connect, cnt_connecting, wl_rinfo->link_mode); in _update_wl_info()
6266 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v1()
6267 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v1()
6268 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info_v1()
6269 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &wl->role_info_v1; in _update_wl_info_v1()
6270 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v1()
6284 wl_rinfo->active_role_v1[cnt_active - 1].role = wl_linfo[i].role; in _update_wl_info_v1()
6285 wl_rinfo->active_role_v1[cnt_active - 1].pid = wl_linfo[i].pid; in _update_wl_info_v1()
6286 wl_rinfo->active_role_v1[cnt_active - 1].phy = wl_linfo[i].phy; in _update_wl_info_v1()
6287 wl_rinfo->active_role_v1[cnt_active - 1].band = wl_linfo[i].band; in _update_wl_info_v1()
6288 wl_rinfo->active_role_v1[cnt_active - 1].noa = (u8)wl_linfo[i].noa; in _update_wl_info_v1()
6289 wl_rinfo->active_role_v1[cnt_active - 1].connected = 0; in _update_wl_info_v1()
6291 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid; in _update_wl_info_v1()
6295 if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) { in _update_wl_info_v1()
6296 wl_dinfo->role[phy] = wl_linfo[i].role; in _update_wl_info_v1()
6297 wl_dinfo->op_band[phy] = wl_linfo[i].band; in _update_wl_info_v1()
6314 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role); in _update_wl_info_v1()
6315 wl_rinfo->active_role_v1[cnt_active - 1].ch = wl_linfo[i].ch; in _update_wl_info_v1()
6316 wl_rinfo->active_role_v1[cnt_active - 1].bw = wl_linfo[i].bw; in _update_wl_info_v1()
6317 wl_rinfo->active_role_v1[cnt_active - 1].connected = 1; in _update_wl_info_v1()
6321 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1) in _update_wl_info_v1()
6326 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1) in _update_wl_info_v1()
6333 wl_rinfo->connect_cnt = cnt_connect; in _update_wl_info_v1()
6337 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v1()
6338 wl_rinfo->role_map.role.none = 1; in _update_wl_info_v1()
6340 wl_rinfo->link_mode = BTC_WLINK_5G; in _update_wl_info_v1()
6341 } else if (wl_rinfo->role_map.role.nan) { in _update_wl_info_v1()
6342 wl_rinfo->link_mode = BTC_WLINK_2G_NAN; in _update_wl_info_v1()
6344 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v1()
6346 if (rtwdev->dbcc_en) { in _update_wl_info_v1()
6347 switch (wl_dinfo->role[RTW89_PHY_0]) { in _update_wl_info_v1()
6349 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v1()
6352 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v1()
6355 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v1()
6358 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v1()
6361 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v1()
6365 wl_rinfo->link_mode = BTC_WLINK_25G_MCC; in _update_wl_info_v1()
6368 if (wl_rinfo->role_map.role.station && in _update_wl_info_v1()
6369 (wl_rinfo->role_map.role.p2p_go || in _update_wl_info_v1()
6370 wl_rinfo->role_map.role.p2p_gc || in _update_wl_info_v1()
6371 wl_rinfo->role_map.role.ap)) { in _update_wl_info_v1()
6373 wl_rinfo->link_mode = BTC_WLINK_2G_SCC; in _update_wl_info_v1()
6375 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v1()
6377 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v1()
6380 if (wl_rinfo->role_map.role.station) in _update_wl_info_v1()
6381 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v1()
6382 else if (wl_rinfo->role_map.role.ap) in _update_wl_info_v1()
6383 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v1()
6384 else if (wl_rinfo->role_map.role.p2p_go) in _update_wl_info_v1()
6385 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v1()
6386 else if (wl_rinfo->role_map.role.p2p_gc) in _update_wl_info_v1()
6387 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v1()
6389 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v1()
6392 /* if no client_joined, don't care P2P-GO/AP role */ in _update_wl_info_v1()
6393 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) { in _update_wl_info_v1()
6395 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC || in _update_wl_info_v1()
6396 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) { in _update_wl_info_v1()
6397 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v1()
6398 wl_rinfo->connect_cnt = 1; in _update_wl_info_v1()
6399 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO || in _update_wl_info_v1()
6400 wl_rinfo->link_mode == BTC_WLINK_2G_AP) { in _update_wl_info_v1()
6401 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v1()
6402 wl_rinfo->connect_cnt = 0; in _update_wl_info_v1()
6409 cnt_connect, cnt_connecting, wl_rinfo->link_mode); in _update_wl_info_v1()
6416 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v2()
6417 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v2()
6418 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info_v2()
6419 struct rtw89_btc_wl_role_info_v2 *wl_rinfo = &wl->role_info_v2; in _update_wl_info_v2()
6420 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v2()
6434 wl_rinfo->active_role_v2[cnt_active - 1].role = wl_linfo[i].role; in _update_wl_info_v2()
6435 wl_rinfo->active_role_v2[cnt_active - 1].pid = wl_linfo[i].pid; in _update_wl_info_v2()
6436 wl_rinfo->active_role_v2[cnt_active - 1].phy = wl_linfo[i].phy; in _update_wl_info_v2()
6437 wl_rinfo->active_role_v2[cnt_active - 1].band = wl_linfo[i].band; in _update_wl_info_v2()
6438 wl_rinfo->active_role_v2[cnt_active - 1].noa = (u8)wl_linfo[i].noa; in _update_wl_info_v2()
6439 wl_rinfo->active_role_v2[cnt_active - 1].connected = 0; in _update_wl_info_v2()
6441 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid; in _update_wl_info_v2()
6445 if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) { in _update_wl_info_v2()
6446 wl_dinfo->role[phy] = wl_linfo[i].role; in _update_wl_info_v2()
6447 wl_dinfo->op_band[phy] = wl_linfo[i].band; in _update_wl_info_v2()
6464 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role); in _update_wl_info_v2()
6465 wl_rinfo->active_role_v2[cnt_active - 1].ch = wl_linfo[i].ch; in _update_wl_info_v2()
6466 wl_rinfo->active_role_v2[cnt_active - 1].bw = wl_linfo[i].bw; in _update_wl_info_v2()
6467 wl_rinfo->active_role_v2[cnt_active - 1].connected = 1; in _update_wl_info_v2()
6471 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1) in _update_wl_info_v2()
6476 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1) in _update_wl_info_v2()
6483 wl_rinfo->connect_cnt = cnt_connect; in _update_wl_info_v2()
6487 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v2()
6488 wl_rinfo->role_map.role.none = 1; in _update_wl_info_v2()
6490 wl_rinfo->link_mode = BTC_WLINK_5G; in _update_wl_info_v2()
6491 } else if (wl_rinfo->role_map.role.nan) { in _update_wl_info_v2()
6492 wl_rinfo->link_mode = BTC_WLINK_2G_NAN; in _update_wl_info_v2()
6494 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v2()
6496 if (rtwdev->dbcc_en) { in _update_wl_info_v2()
6497 switch (wl_dinfo->role[RTW89_PHY_0]) { in _update_wl_info_v2()
6499 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v2()
6502 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v2()
6505 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v2()
6508 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v2()
6511 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v2()
6515 wl_rinfo->link_mode = BTC_WLINK_25G_MCC; in _update_wl_info_v2()
6518 if (wl_rinfo->role_map.role.station && in _update_wl_info_v2()
6519 (wl_rinfo->role_map.role.p2p_go || in _update_wl_info_v2()
6520 wl_rinfo->role_map.role.p2p_gc || in _update_wl_info_v2()
6521 wl_rinfo->role_map.role.ap)) { in _update_wl_info_v2()
6523 wl_rinfo->link_mode = BTC_WLINK_2G_SCC; in _update_wl_info_v2()
6525 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v2()
6527 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v2()
6530 if (wl_rinfo->role_map.role.station) in _update_wl_info_v2()
6531 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v2()
6532 else if (wl_rinfo->role_map.role.ap) in _update_wl_info_v2()
6533 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v2()
6534 else if (wl_rinfo->role_map.role.p2p_go) in _update_wl_info_v2()
6535 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v2()
6536 else if (wl_rinfo->role_map.role.p2p_gc) in _update_wl_info_v2()
6537 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v2()
6539 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v2()
6542 /* if no client_joined, don't care P2P-GO/AP role */ in _update_wl_info_v2()
6543 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) { in _update_wl_info_v2()
6545 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC || in _update_wl_info_v2()
6546 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) { in _update_wl_info_v2()
6547 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v2()
6548 wl_rinfo->connect_cnt = 1; in _update_wl_info_v2()
6549 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO || in _update_wl_info_v2()
6550 wl_rinfo->link_mode == BTC_WLINK_2G_AP) { in _update_wl_info_v2()
6551 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v2()
6552 wl_rinfo->connect_cnt = 0; in _update_wl_info_v2()
6559 cnt_connect, cnt_connecting, wl_rinfo->link_mode); in _update_wl_info_v2()
6586 if (r1->chan != r2->chan) { /* primary ch is different */ in _chk_role_ch_group()
6588 } else if (r1->bw == RTW89_CHANNEL_WIDTH_40 && in _chk_role_ch_group()
6589 r2->bw == RTW89_CHANNEL_WIDTH_40) { in _chk_role_ch_group()
6590 if (r1->offset != r2->offset) in _chk_role_ch_group()
6599 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _chk_dbcc()
6600 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7; in _chk_dbcc()
6601 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8; in _chk_dbcc()
6605 /* find out the 2G-PHY by connect-id ->ch */ in _chk_dbcc()
6613 /* If no any 2G-port exist, it's impossible because 5G-exclude */ in _chk_dbcc()
6625 if (rtwdev->btc.ver->fwlrole == 7) { in _chk_dbcc()
6626 rinfo_v7->dbcc_2g_phy = dbcc_2g_phy; in _chk_dbcc()
6627 } else if (rtwdev->btc.ver->fwlrole == 8) { in _chk_dbcc()
6628 rinfo_v8->dbcc_2g_phy = dbcc_2g_phy; in _chk_dbcc()
6629 rinfo_v8->pta_req_band = pta_req_band; in _chk_dbcc()
6636 /* find the other-port in the 2G-PHY, ex: PHY-0:6G, PHY1: mcc/scc */ in _chk_dbcc()
6648 /* Single-role in 2G-PHY */ in _chk_dbcc()
6652 /* 2-role in 2G-PHY */ in _chk_dbcc()
6664 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &rtwdev->btc.cx.wl.role_info_v8; in _update_role_link_mode()
6665 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &rtwdev->btc.cx.wl.role_info_v7; in _update_role_link_mode()
6666 u8 role_ver = rtwdev->btc.ver->fwlrole; in _update_role_link_mode()
6672 wl_role = rinfo_v7->role_map; in _update_role_link_mode()
6673 link_mode = rinfo_v7->link_mode; in _update_role_link_mode()
6674 connect_cnt = rinfo_v7->connect_cnt; in _update_role_link_mode()
6676 wl_role = rinfo_v8->role_map; in _update_role_link_mode()
6677 link_mode = rinfo_v8->link_mode; in _update_role_link_mode()
6678 connect_cnt = rinfo_v8->connect_cnt; in _update_role_link_mode()
6683 /* if no client_joined, don't care P2P-GO/AP role */ in _update_role_link_mode()
6688 rinfo_v7->link_mode = BTC_WLINK_2G_STA; in _update_role_link_mode()
6689 rinfo_v7->connect_cnt--; in _update_role_link_mode()
6691 rinfo_v8->link_mode = BTC_WLINK_2G_STA; in _update_role_link_mode()
6692 rinfo_v8->connect_cnt--; in _update_role_link_mode()
6697 rinfo_v7->link_mode = BTC_WLINK_NOLINK; in _update_role_link_mode()
6698 rinfo_v7->connect_cnt--; in _update_role_link_mode()
6700 rinfo_v8->link_mode = BTC_WLINK_NOLINK; in _update_role_link_mode()
6701 rinfo_v8->connect_cnt--; in _update_role_link_mode()
6706 /* Identify 2-Role type */ in _update_role_link_mode()
6724 rinfo_v7->mrole_type = type; in _update_role_link_mode()
6725 rinfo_v7->mrole_noa_duration = dur; in _update_role_link_mode()
6727 rinfo_v8->mrole_type = type; in _update_role_link_mode()
6728 rinfo_v8->mrole_noa_duration = dur; in _update_role_link_mode()
6735 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v7()
6736 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v7()
6737 struct rtw89_btc_wl_role_info_v7 *wl_rinfo = &wl->role_info_v7; in _update_wl_info_v7()
6738 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v7()
6739 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info_v7()
6755 act_role = &wl_rinfo->active_role[i]; in _update_wl_info_v7()
6756 act_role->role = wl_linfo[i].role; in _update_wl_info_v7()
6760 act_role->connected = 0; in _update_wl_info_v7()
6767 act_role->connected = 1; in _update_wl_info_v7()
6768 act_role->pid = wl_linfo[i].pid; in _update_wl_info_v7()
6769 act_role->phy = wl_linfo[i].phy; in _update_wl_info_v7()
6770 act_role->band = wl_linfo[i].band; in _update_wl_info_v7()
6771 act_role->ch = wl_linfo[i].ch; in _update_wl_info_v7()
6772 act_role->bw = wl_linfo[i].bw; in _update_wl_info_v7()
6773 act_role->noa = wl_linfo[i].noa; in _update_wl_info_v7()
6774 act_role->noa_dur = wl_linfo[i].noa_duration; in _update_wl_info_v7()
6775 cid_ch[cnt - 1] = wl_linfo[i].chdef; in _update_wl_info_v7()
6776 cid_phy[cnt - 1] = wl_linfo[i].phy; in _update_wl_info_v7()
6777 cid_role[cnt - 1] = wl_linfo[i].role; in _update_wl_info_v7()
6778 wl_rinfo->role_map |= BIT(wl_linfo[i].role); in _update_wl_info_v7()
6781 phy_now = act_role->phy; in _update_wl_info_v7()
6790 act_role->client_cnt = wl_linfo[i].client_cnt; in _update_wl_info_v7()
6792 act_role->client_cnt = 0; in _update_wl_info_v7()
6795 if (act_role->noa && act_role->noa_dur > 0) in _update_wl_info_v7()
6796 noa_duration = act_role->noa_dur; in _update_wl_info_v7()
6798 if (rtwdev->dbcc_en) { in _update_wl_info_v7()
6800 wl_dinfo->role[phy_dbcc] |= BIT(wl_linfo[i].role); in _update_wl_info_v7()
6801 wl_dinfo->op_band[phy_dbcc] = wl_linfo[i].chdef.band; in _update_wl_info_v7()
6812 wl_rinfo->p2p_2g = 1; in _update_wl_info_v7()
6816 wl->bg_mode = 1; in _update_wl_info_v7()
6818 wl->he_mode = true; in _update_wl_info_v7()
6824 if (act_role->band == RTW89_BAND_5G && act_role->ch >= 100) in _update_wl_info_v7()
6825 wl->is_5g_hi_channel = 1; in _update_wl_info_v7()
6827 wl->is_5g_hi_channel = 0; in _update_wl_info_v7()
6830 wl_rinfo->connect_cnt = cnt; in _update_wl_info_v7()
6831 wl->client_cnt_inc_2g = client_inc_2g; in _update_wl_info_v7()
6835 wl_rinfo->role_map = BIT(RTW89_WIFI_ROLE_NONE); in _update_wl_info_v7()
6838 } else if (wl_rinfo->role_map & BIT(RTW89_WIFI_ROLE_NAN)) { in _update_wl_info_v7()
6842 } else if (rtwdev->dbcc_en) { in _update_wl_info_v7()
6845 /* correct 2G-located PHY band for gnt ctrl */ in _update_wl_info_v7()
6847 wl_dinfo->op_band[dbcc_2g_phy] = RTW89_BAND_2G; in _update_wl_info_v7()
6851 if (_chk_role_ch_group(&cid_ch[0], &cid_ch[cnt - 1])) in _update_wl_info_v7()
6861 wl_rinfo->link_mode = mode; in _update_wl_info_v7()
6869 if (wl_rinfo->dbcc_en != rtwdev->dbcc_en) { in _update_wl_info_v7()
6870 wl_rinfo->dbcc_chg = 1; in _update_wl_info_v7()
6871 wl_rinfo->dbcc_en = rtwdev->dbcc_en; in _update_wl_info_v7()
6872 btc->cx.cnt_wl[BTC_WCNT_DBCC_CHG]++; in _update_wl_info_v7()
6875 if (rtwdev->dbcc_en) { in _update_wl_info_v7()
6876 wl_rinfo->dbcc_2g_phy = dbcc_2g_phy; in _update_wl_info_v7()
6890 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _update_wl_link_mode()
6891 struct rtw89_btc_wl_mlo_info *mlo_info = &wl->mlo_info; in _update_wl_link_mode()
6895 case RTW89_MR_WTYPE_NONE: /* no-link */ in _update_wl_link_mode()
6898 case RTW89_MR_WTYPE_NONMLD: /* Non_MLO 1-role 2+0/0+2 */ in _update_wl_link_mode()
6899 case RTW89_MR_WTYPE_MLD1L1R: /* MLO only-1 link 2+0/0+2 */ in _update_wl_link_mode()
6900 if (mlo_info->hwb_rf_band[hw_band] != RTW89_BAND_2G) { in _update_wl_link_mode()
6902 } else if (mlo_info->wmode[hw_band] == RTW89_MR_WMODE_1AP) { in _update_wl_link_mode()
6904 } else if (mlo_info->wmode[hw_band] == RTW89_MR_WMODE_1CLIENT) { in _update_wl_link_mode()
6905 if (wl->role_info_v8.p2p_2g) in _update_wl_link_mode()
6911 case RTW89_MR_WTYPE_NONMLD_NONMLD: /* Non_MLO 2-role 2+0/0+2 */ in _update_wl_link_mode()
6912 case RTW89_MR_WTYPE_MLD1L1R_NONMLD: /* MLO only-1 link + P2P 2+0/0+2 */ in _update_wl_link_mode()
6913 if (mlo_info->hwb_rf_band[hw_band] != RTW89_BAND_2G) { in _update_wl_link_mode()
6915 } else if (mlo_info->ch_type[hw_band] == RTW89_MR_CTX2_2GHZ_5GHZ || in _update_wl_link_mode()
6916 mlo_info->ch_type[hw_band] == RTW89_MR_CTX2_2GHZ_6GHZ) { in _update_wl_link_mode()
6918 } else if (mlo_info->ch_type[hw_band] == RTW89_MR_CTX2_2GHZ) { in _update_wl_link_mode()
6920 } else if (mlo_info->ch_type[hw_band] == RTW89_MR_CTX1_2GHZ) { in _update_wl_link_mode()
6925 if (mlo_info->hwb_rf_band[hw_band] != RTW89_BAND_2G) in _update_wl_link_mode()
6927 else if (wl->role_info_v8.p2p_2g) in _update_wl_link_mode()
6934 /* driver may doze 1-link to in _update_wl_link_mode()
6935 * 2G+5G -> TDMA slot switch by E2G/E5G in _update_wl_link_mode()
6936 * 5G only -> TDMA slot switch by E5G in _update_wl_link_mode()
6941 if (mlo_info->hwb_rf_band[hw_band] != RTW89_BAND_2G) { in _update_wl_link_mode()
6943 } else if (mlo_info->wmode[hw_band] == RTW89_MR_WMODE_1AP) { in _update_wl_link_mode()
6945 } else if (mlo_info->wmode[hw_band] == RTW89_MR_WMODE_1CLIENT) { in _update_wl_link_mode()
6946 if (wl->role_info_v8.p2p_2g) in _update_wl_link_mode()
6958 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _update_wl_mlo_info()
6959 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _update_wl_mlo_info()
6960 struct rtw89_btc_wl_mlo_info *mlo_info = &wl->mlo_info; in _update_wl_mlo_info()
6966 /* parse MLO info form PHL API for each HW-band */ in _update_wl_mlo_info()
6971 mlo_info->wmode[i] = qinfo.wmode; in _update_wl_mlo_info()
6972 mlo_info->ch_type[i] = qinfo.ctxtype; in _update_wl_mlo_info()
6973 mlo_info->wtype = qinfo.wtype; in _update_wl_mlo_info()
6975 if (mlo_info->ch_type[i] == RTW89_MR_CTX1_5GHZ || in _update_wl_mlo_info()
6976 mlo_info->ch_type[i] == RTW89_MR_CTX2_5GHZ || in _update_wl_mlo_info()
6977 mlo_info->ch_type[i] == RTW89_MR_CTX2_5GHZ_6GHZ) in _update_wl_mlo_info()
6978 mlo_info->hwb_rf_band[i] = RTW89_BAND_5G; in _update_wl_mlo_info()
6979 else if (mlo_info->ch_type[i] == RTW89_MR_CTX1_6GHZ || in _update_wl_mlo_info()
6980 mlo_info->ch_type[i] == RTW89_MR_CTX2_6GHZ) in _update_wl_mlo_info()
6981 mlo_info->hwb_rf_band[i] = RTW89_BAND_6G; in _update_wl_mlo_info()
6982 else /* check if "2G-included" or unknown in each HW-band */ in _update_wl_mlo_info()
6983 mlo_info->hwb_rf_band[i] = RTW89_BAND_2G; in _update_wl_mlo_info()
6986 mlo_info->link_status = rtwdev->mlo_dbcc_mode; in _update_wl_mlo_info()
6987 type = mlo_info->wtype; in _update_wl_mlo_info()
6989 if (mlo_info->wtype == RTW89_MR_WTYPE_MLD1L1R || in _update_wl_mlo_info()
6990 mlo_info->wtype == RTW89_MR_WTYPE_MLD2L1R || in _update_wl_mlo_info()
6991 mlo_info->wtype == RTW89_MR_WTYPE_MLD2L2R || in _update_wl_mlo_info()
6992 mlo_info->wtype == RTW89_MR_WTYPE_MLD1L1R_NONMLD || in _update_wl_mlo_info()
6993 mlo_info->wtype == RTW89_MR_WTYPE_MLD2L1R_NONMLD || in _update_wl_mlo_info()
6994 mlo_info->wtype == RTW89_MR_WTYPE_MLD2L2R_NONMLD) in _update_wl_mlo_info()
6995 mlo_info->mlo_en = 1; in _update_wl_mlo_info()
6997 mlo_info->mlo_en = 0; in _update_wl_mlo_info()
6999 if (mlo_info->ch_type[RTW89_MAC_0] != RTW89_MR_CTX_NONE && in _update_wl_mlo_info()
7000 mlo_info->ch_type[RTW89_MAC_0] != RTW89_MR_CTX_UNKNOWN && in _update_wl_mlo_info()
7001 mlo_info->ch_type[RTW89_MAC_1] != RTW89_MR_CTX_NONE && in _update_wl_mlo_info()
7002 mlo_info->ch_type[RTW89_MAC_1] != RTW89_MR_CTX_UNKNOWN) in _update_wl_mlo_info()
7003 mlo_info->dual_hw_band_en = 1; /* two HW-hand link exist */ in _update_wl_mlo_info()
7005 mlo_info->dual_hw_band_en = 0; in _update_wl_mlo_info()
7007 if (mlo_info->link_status == MLO_2_PLUS_0_2RF || in _update_wl_mlo_info()
7008 mlo_info->link_status == MLO_0_PLUS_2_2RF || in _update_wl_mlo_info()
7009 mlo_info->link_status == MLO_2_PLUS_2_2RF) in _update_wl_mlo_info()
7010 mlo_info->mlo_adie = 2; in _update_wl_mlo_info()
7012 mlo_info->mlo_adie = 1; in _update_wl_mlo_info()
7014 switch (mlo_info->link_status) { in _update_wl_mlo_info()
7018 mlo_info->rf_combination = BTC_MLO_RF_2_PLUS_0; in _update_wl_mlo_info()
7020 rf_band = mlo_info->hwb_rf_band[RTW89_MAC_0]; in _update_wl_mlo_info()
7021 mlo_info->path_rf_band[BTC_RF_S0] = rf_band; in _update_wl_mlo_info()
7022 mlo_info->path_rf_band[BTC_RF_S1] = rf_band; in _update_wl_mlo_info()
7024 wl_rinfo->pta_req_band = RTW89_MAC_0; in _update_wl_mlo_info()
7025 wl_rinfo->dbcc_2g_phy = RTW89_PHY_0; in _update_wl_mlo_info()
7026 wl_rinfo->dbcc_en = 0; in _update_wl_mlo_info()
7030 mlo_info->rf_combination = BTC_MLO_RF_0_PLUS_2; in _update_wl_mlo_info()
7032 rf_band = mlo_info->hwb_rf_band[RTW89_MAC_1]; in _update_wl_mlo_info()
7033 mlo_info->path_rf_band[BTC_RF_S0] = rf_band; in _update_wl_mlo_info()
7034 mlo_info->path_rf_band[BTC_RF_S1] = rf_band; in _update_wl_mlo_info()
7036 wl_rinfo->pta_req_band = RTW89_MAC_1; in _update_wl_mlo_info()
7037 wl_rinfo->dbcc_2g_phy = RTW89_PHY_1; in _update_wl_mlo_info()
7038 wl_rinfo->dbcc_en = 0; in _update_wl_mlo_info()
7044 if (mlo_info->link_status == MLO_2_PLUS_2_2RF) in _update_wl_mlo_info()
7045 mlo_info->rf_combination = BTC_MLO_RF_2_PLUS_2; in _update_wl_mlo_info()
7047 mlo_info->rf_combination = BTC_MLO_RF_1_PLUS_1; in _update_wl_mlo_info()
7049 if (mlo_info->hwb_rf_band[RTW89_MAC_0] == RTW89_BAND_2G) in _update_wl_mlo_info()
7054 mlo_info->path_rf_band[BTC_RF_S0] = in _update_wl_mlo_info()
7055 mlo_info->hwb_rf_band[RTW89_MAC_0]; in _update_wl_mlo_info()
7056 mlo_info->path_rf_band[BTC_RF_S1] = in _update_wl_mlo_info()
7057 mlo_info->hwb_rf_band[RTW89_MAC_1]; in _update_wl_mlo_info()
7059 /* Check ch count from ch_type @ 2.4G HW-band, and modify type */ in _update_wl_mlo_info()
7060 if (mlo_info->ch_type[track_band] == RTW89_MR_CTX1_2GHZ) in _update_wl_mlo_info()
7061 type = RTW89_MR_WTYPE_NONMLD; /* only 1-role at 2G */ in _update_wl_mlo_info()
7065 if (mlo_info->hwb_rf_band[RTW89_MAC_0] == RTW89_BAND_2G) { in _update_wl_mlo_info()
7066 wl_rinfo->pta_req_band = RTW89_MAC_0; in _update_wl_mlo_info()
7067 wl_rinfo->dbcc_2g_phy = RTW89_PHY_0; in _update_wl_mlo_info()
7069 wl_rinfo->pta_req_band = RTW89_MAC_1; in _update_wl_mlo_info()
7070 wl_rinfo->dbcc_2g_phy = RTW89_PHY_1; in _update_wl_mlo_info()
7073 if (mlo_info->wmode[RTW89_MAC_0] == RTW89_MR_WMODE_NONE && in _update_wl_mlo_info()
7074 mlo_info->wmode[RTW89_MAC_1] == RTW89_MR_WMODE_NONE) in _update_wl_mlo_info()
7075 wl_rinfo->dbcc_en = 0; in _update_wl_mlo_info()
7077 wl_rinfo->dbcc_en = 1; in _update_wl_mlo_info()
7081 wl_rinfo->link_mode = _update_wl_link_mode(rtwdev, track_band, type); in _update_wl_mlo_info()
7084 __func__, id_to_linkmode(wl_rinfo->link_mode), in _update_wl_mlo_info()
7085 wl_rinfo->pta_req_band); in _update_wl_mlo_info()
7090 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _update_wl_non_mlo_info()
7092 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _update_wl_non_mlo_info()
7103 rlink = &wl_rinfo->rlink[i][j]; in _update_wl_non_mlo_info()
7105 if (!rlink->active || !rlink->connected) in _update_wl_non_mlo_info()
7113 cid_ch[cnt] = wl->rlink_info[i][j].chdef; in _update_wl_non_mlo_info()
7114 cid_phy[cnt] = rlink->phy; in _update_wl_non_mlo_info()
7115 cid_role[cnt] = rlink->role; in _update_wl_non_mlo_info()
7118 if (rlink->rf_band != RTW89_BAND_2G) { in _update_wl_non_mlo_info()
7133 wl_rinfo->dbcc_en = rtwdev->dbcc_en; in _update_wl_non_mlo_info()
7139 } else if (wl_rinfo->dbcc_en) { in _update_wl_non_mlo_info()
7152 wl_rinfo->link_mode = mode; in _update_wl_non_mlo_info()
7157 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _modify_role_link_mode()
7158 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _modify_role_link_mode()
7159 u8 go_cleint_exist = wl->go_client_exist; in _modify_role_link_mode()
7160 u8 link_mode = wl_rinfo->link_mode; in _modify_role_link_mode()
7161 u32 role_map = wl_rinfo->role_map; in _modify_role_link_mode()
7162 u8 noa_exist = wl->noa_exist; in _modify_role_link_mode()
7165 /* if no client_joined, don't care P2P-GO/AP role */ in _modify_role_link_mode()
7169 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _modify_role_link_mode()
7172 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _modify_role_link_mode()
7176 /* Identify 2-Role type */ in _modify_role_link_mode()
7197 wl_rinfo->mrole_type = mrole; in _modify_role_link_mode()
7201 id_to_linkmode(wl_rinfo->link_mode), wl_rinfo->mrole_type); in _modify_role_link_mode()
7209 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v8()
7210 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v8()
7211 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _update_wl_info_v8()
7220 /* Extract wl->link_info[role_id][rlink_id] to wl->role_info in _update_wl_info_v8()
7222 * rlink_id: rlink index (= HW-band index) in _update_wl_info_v8()
7226 wl_linfo = &wl->rlink_info[role_id][rlink_id]; in _update_wl_info_v8()
7227 rlink = &wl_rinfo->rlink[role_id][rlink_id]; in _update_wl_info_v8()
7229 rlink->role = wl_linfo->role; in _update_wl_info_v8()
7230 rlink->active = wl_linfo->active; /* Doze or not */ in _update_wl_info_v8()
7231 rlink->pid = wl_linfo->pid; in _update_wl_info_v8()
7232 rlink->phy = wl_linfo->phy; in _update_wl_info_v8()
7233 rlink->rf_band = wl_linfo->band; in _update_wl_info_v8()
7234 rlink->ch = wl_linfo->ch; in _update_wl_info_v8()
7235 rlink->bw = wl_linfo->bw; in _update_wl_info_v8()
7236 rlink->noa = wl_linfo->noa; in _update_wl_info_v8()
7237 rlink->noa_dur = wl_linfo->noa_duration / 1000; in _update_wl_info_v8()
7238 rlink->client_cnt = wl_linfo->client_cnt; in _update_wl_info_v8()
7239 rlink->mode = wl_linfo->mode; in _update_wl_info_v8()
7241 switch (wl_linfo->connected) { in _update_wl_info_v8()
7243 rlink->connected = 0; in _update_wl_info_v8()
7246 rlink->connected = 1; in _update_wl_info_v8()
7254 rlink = &wl_rinfo->rlink[i][j]; in _update_wl_info_v8()
7256 if (!rlink->active || !rlink->connected) in _update_wl_info_v8()
7259 role_map |= BIT(rlink->role); in _update_wl_info_v8()
7261 /* only one noa-role exist */ in _update_wl_info_v8()
7262 if (rlink->noa && rlink->noa_dur > 0) in _update_wl_info_v8()
7265 /* for WL 5G-Rx interfered with BT issue */ in _update_wl_info_v8()
7266 if (rlink->rf_band == RTW89_BAND_5G) { in _update_wl_info_v8()
7267 if (rlink->ch >= 100) in _update_wl_info_v8()
7273 /* only if client connect for p2p-Go/AP */ in _update_wl_info_v8()
7274 if ((rlink->role == RTW89_WIFI_ROLE_P2P_GO || in _update_wl_info_v8()
7275 rlink->role == RTW89_WIFI_ROLE_AP) && in _update_wl_info_v8()
7276 rlink->client_cnt > 1) { in _update_wl_info_v8()
7281 /* Identify if P2P-Go (GO/GC/AP) exist at 2G band */ in _update_wl_info_v8()
7282 if (rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT) in _update_wl_info_v8()
7285 if ((rlink->mode & BIT(BTC_WL_MODE_11B)) || in _update_wl_info_v8()
7286 (rlink->mode & BIT(BTC_WL_MODE_11G))) in _update_wl_info_v8()
7291 link_mode_ori = wl_rinfo->link_mode; in _update_wl_info_v8()
7292 wl->is_5g_hi_channel = is_5g_hi_channel; in _update_wl_info_v8()
7293 wl->bg_mode = bg_mode; in _update_wl_info_v8()
7294 wl->go_client_exist = client_joined; in _update_wl_info_v8()
7295 wl->noa_exist = noa_exist; in _update_wl_info_v8()
7296 wl_rinfo->p2p_2g = p2p_exist; in _update_wl_info_v8()
7297 wl_rinfo->role_map = role_map; in _update_wl_info_v8()
7299 dbcc_en_ori = wl_rinfo->dbcc_en; in _update_wl_info_v8()
7301 if (rtwdev->chip->para_ver & BTC_FEAT_MLO_SUPPORT) { in _update_wl_info_v8()
7302 /* for MLO-supported, link-mode from driver directly */ in _update_wl_info_v8()
7305 /* for non-MLO-supported, link-mode by BTC */ in _update_wl_info_v8()
7311 if (link_mode_ori != wl_rinfo->link_mode) in _update_wl_info_v8()
7312 wl->link_mode_chg = true; in _update_wl_info_v8()
7314 if (wl_rinfo->dbcc_en != dbcc_en_ori) { in _update_wl_info_v8()
7315 wl->dbcc_chg = true; in _update_wl_info_v8()
7316 btc->cx.cnt_wl[BTC_WCNT_DBCC_CHG]++; in _update_wl_info_v8()
7324 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_act1_work()
7325 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_coex_act1_work()
7326 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_coex_act1_work()
7327 struct rtw89_btc_wl_info *wl = &cx->wl; in rtw89_coex_act1_work()
7332 dm->cnt_notify[BTC_NCNT_TIMER]++; in rtw89_coex_act1_work()
7333 if (wl->status.map._4way) in rtw89_coex_act1_work()
7334 wl->status.map._4way = false; in rtw89_coex_act1_work()
7335 if (wl->status.map.connecting) in rtw89_coex_act1_work()
7336 wl->status.map.connecting = false; in rtw89_coex_act1_work()
7345 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_bt_devinfo_work()
7346 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_coex_bt_devinfo_work()
7347 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in rtw89_coex_bt_devinfo_work()
7352 dm->cnt_notify[BTC_NCNT_TIMER]++; in rtw89_coex_bt_devinfo_work()
7353 a2dp->play_latency = 0; in rtw89_coex_bt_devinfo_work()
7361 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_rfk_chk_work()
7362 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_coex_rfk_chk_work()
7363 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_coex_rfk_chk_work()
7364 struct rtw89_btc_wl_info *wl = &cx->wl; in rtw89_coex_rfk_chk_work()
7369 dm->cnt_notify[BTC_NCNT_TIMER]++; in rtw89_coex_rfk_chk_work()
7370 if (wl->rfk_info.state != BTC_WRFK_STOP) { in rtw89_coex_rfk_chk_work()
7373 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]++; in rtw89_coex_rfk_chk_work()
7374 dm->error.map.wl_rfk_timeout = true; in rtw89_coex_rfk_chk_work()
7375 wl->rfk_info.state = BTC_WRFK_STOP; in rtw89_coex_rfk_chk_work()
7383 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_bt_scbd()
7384 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_scbd()
7385 struct rtw89_btc_cx *cx = &btc->cx; in _update_bt_scbd()
7386 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _update_bt_scbd()
7390 if (!chip->scbd) in _update_bt_scbd()
7404 bt->enable.now = 0; in _update_bt_scbd()
7406 bt->enable.now = 1; in _update_bt_scbd()
7408 if (bt->enable.now != bt->enable.last) in _update_bt_scbd()
7411 /* reset bt info if bt re-enable */ in _update_bt_scbd()
7412 if (bt->enable.now && !bt->enable.last) { in _update_bt_scbd()
7414 cx->cnt_bt[BTC_BCNT_REENABLE]++; in _update_bt_scbd()
7415 bt->enable.now = 1; in _update_bt_scbd()
7418 bt->enable.last = bt->enable.now; in _update_bt_scbd()
7419 bt->scbd = val; in _update_bt_scbd()
7420 bt->mbx_avl = !!(val & BTC_BSCB_ACT); in _update_bt_scbd()
7422 if (bt->whql_test != !!(val & BTC_BSCB_WHQL)) in _update_bt_scbd()
7425 bt->whql_test = !!(val & BTC_BSCB_WHQL); in _update_bt_scbd()
7426 bt->btg_type = val & BTC_BSCB_BT_S1 ? BTC_BT_BTG : BTC_BT_ALONE; in _update_bt_scbd()
7427 bt->link_info.a2dp_desc.exist = !!(val & BTC_BSCB_A2DP_ACT); in _update_bt_scbd()
7429 bt->lna_constrain = !!(val & BTC_BSCB_BT_LNAB0) + in _update_bt_scbd()
7432 /* if rfk run 1->0 */ in _update_bt_scbd()
7433 if (bt->rfk_info.map.run && !(val & BTC_BSCB_RFK_RUN)) in _update_bt_scbd()
7436 bt->rfk_info.map.run = !!(val & BTC_BSCB_RFK_RUN); in _update_bt_scbd()
7437 bt->rfk_info.map.req = !!(val & BTC_BSCB_RFK_REQ); in _update_bt_scbd()
7438 bt->hi_lna_rx = !!(val & BTC_BSCB_BT_HILNA); in _update_bt_scbd()
7439 bt->link_info.status.map.connect = !!(val & BTC_BSCB_BT_CONNECT); in _update_bt_scbd()
7440 if (bt->run_patch_code != !!(val & BTC_BSCB_PATCH_CODE)) in _update_bt_scbd()
7442 bt->run_patch_code = !!(val & BTC_BSCB_PATCH_CODE); in _update_bt_scbd()
7451 struct rtw89_btc_bt_info *bt = &rtwdev->btc.cx.bt; in _update_bt_txpwr_info()
7452 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _update_bt_txpwr_info()
7457 if (!memcmp(bt->txpwr_info, buf, sizeof(bt->txpwr_info))) { in _update_bt_txpwr_info()
7463 memcpy(bt->txpwr_info, buf, BTC_BTINFO_MAX); in _update_bt_txpwr_info()
7464 memcpy(&b->bt_txpwr_desc, &buf[2], sizeof(b->bt_txpwr_desc)); in _update_bt_txpwr_info()
7469 struct rtw89_btc *btc = &rtwdev->btc; in _chk_wl_rfk_request()
7470 struct rtw89_btc_cx *cx = &btc->cx; in _chk_wl_rfk_request()
7471 struct rtw89_btc_bt_info *bt = &cx->bt; in _chk_wl_rfk_request()
7475 cx->cnt_wl[BTC_WCNT_RFK_REQ]++; in _chk_wl_rfk_request()
7477 if ((bt->rfk_info.map.run || bt->rfk_info.map.req) && in _chk_wl_rfk_request()
7478 !bt->rfk_info.map.timeout) { in _chk_wl_rfk_request()
7479 cx->cnt_wl[BTC_WCNT_RFK_REJECT]++; in _chk_wl_rfk_request()
7481 cx->cnt_wl[BTC_WCNT_RFK_GO]++; in _chk_wl_rfk_request()
7490 struct rtw89_btc *btc = &rtwdev->btc; in _run_coex()
7491 const struct rtw89_btc_ver *ver = btc->ver; in _run_coex()
7492 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _run_coex()
7493 struct rtw89_btc_cx *cx = &btc->cx; in _run_coex()
7494 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _run_coex()
7495 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _run_coex()
7496 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _run_coex()
7497 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _run_coex()
7498 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _run_coex()
7499 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _run_coex()
7500 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _run_coex()
7503 lockdep_assert_wiphy(rtwdev->hw->wiphy); in _run_coex()
7505 dm->run_reason = reason; in _run_coex()
7509 if (ver->fwlrole == 0) in _run_coex()
7510 mode = wl_rinfo->link_mode; in _run_coex()
7511 else if (ver->fwlrole == 1) in _run_coex()
7512 mode = wl_rinfo_v1->link_mode; in _run_coex()
7513 else if (ver->fwlrole == 2) in _run_coex()
7514 mode = wl_rinfo_v2->link_mode; in _run_coex()
7515 else if (ver->fwlrole == 7) in _run_coex()
7516 mode = wl_rinfo_v7->link_mode; in _run_coex()
7517 else if (ver->fwlrole == 8) in _run_coex()
7518 mode = wl_rinfo_v8->link_mode; in _run_coex()
7522 if (ver->fcxctrl == 7) { in _run_coex()
7523 igno_bt = btc->ctrl.ctrl_v7.igno_bt; in _run_coex()
7524 always_freerun = btc->ctrl.ctrl_v7.always_freerun; in _run_coex()
7526 igno_bt = btc->ctrl.ctrl.igno_bt; in _run_coex()
7527 always_freerun = btc->ctrl.ctrl.always_freerun; in _run_coex()
7533 __func__, dm->wl_only, dm->bt_only); in _run_coex()
7536 if (btc->manual_ctrl) { in _run_coex()
7552 if (!wl->status.map.init_ok) { in _run_coex()
7559 if (wl->status.map.rf_off_pre == wl->status.map.rf_off && in _run_coex()
7560 wl->status.map.lps_pre == wl->status.map.lps) { in _run_coex()
7568 if (wl->status.map.rf_off == 1 || in _run_coex()
7569 wl->status.map.lps == BTC_LPS_RF_OFF) { in _run_coex()
7577 dm->freerun = false; in _run_coex()
7578 dm->cnt_dm[BTC_DCNT_RUN]++; in _run_coex()
7579 dm->fddt_train = BTC_FDDT_DISABLE; in _run_coex()
7580 bt->scan_rx_low_pri = false; in _run_coex()
7583 dm->freerun_chk = _check_freerun(rtwdev); /* check if meet freerun */ in _run_coex()
7591 if (dm->wl_only) { in _run_coex()
7597 if (wl->status.map.rf_off || wl->status.map.lps || dm->bt_only) { in _run_coex()
7608 if (!cx->bt.enable.now && !cx->other.type) { in _run_coex()
7613 if (cx->bt.whql_test) { in _run_coex()
7618 if (wl->rfk_info.state != BTC_WRFK_STOP) { in _run_coex()
7623 if (wl->status.val & btc_scanning_map.val && !wl->rfk_info.con_rfk) { in _run_coex()
7625 bt->scan_rx_low_pri = true; in _run_coex()
7634 if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) in _run_coex()
7635 bt->scan_rx_low_pri = true; in _run_coex()
7639 bt->scan_rx_low_pri = true; in _run_coex()
7643 bt->scan_rx_low_pri = true; in _run_coex()
7647 bt->scan_rx_low_pri = true; in _run_coex()
7651 bt->scan_rx_low_pri = true; in _run_coex()
7652 if (ver->fwlrole == 0) in _run_coex()
7654 else if (ver->fwlrole == 1) in _run_coex()
7656 else if (ver->fwlrole == 2 || ver->fwlrole == 7) in _run_coex()
7658 else if (ver->fwlrole == 8) in _run_coex()
7662 bt->scan_rx_low_pri = true; in _run_coex()
7666 bt->scan_rx_low_pri = true; in _run_coex()
7682 if (ver->fcxctrl == 7) in _run_coex()
7683 btc->ctrl.ctrl_v7.igno_bt = igno_bt; in _run_coex()
7685 btc->ctrl.ctrl.igno_bt = igno_bt; in _run_coex()
7691 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_poweron()
7694 btc->dm.cnt_notify[BTC_NCNT_POWER_ON]++; in rtw89_btc_ntfy_poweron()
7699 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_poweroff()
7700 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_poweroff()
7703 btc->dm.cnt_notify[BTC_NCNT_POWER_OFF]++; in rtw89_btc_ntfy_poweroff()
7705 btc->cx.wl.status.map.rf_off = 1; in rtw89_btc_ntfy_poweroff()
7706 btc->cx.wl.status.map.busy = 0; in rtw89_btc_ntfy_poweroff()
7707 wl->status.map.lps = BTC_LPS_OFF; in rtw89_btc_ntfy_poweroff()
7714 btc->cx.wl.status.map.rf_off_pre = btc->cx.wl.status.map.rf_off; in rtw89_btc_ntfy_poweroff()
7719 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_init_info()
7720 struct rtw89_btc *btc = &rtwdev->btc; in _set_init_info()
7721 const struct rtw89_btc_ver *ver = btc->ver; in _set_init_info()
7722 struct rtw89_btc_dm *dm = &btc->dm; in _set_init_info()
7723 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_init_info()
7725 if (ver->fcxinit == 7) { in _set_init_info()
7726 dm->init_info.init_v7.wl_only = (u8)dm->wl_only; in _set_init_info()
7727 dm->init_info.init_v7.bt_only = (u8)dm->bt_only; in _set_init_info()
7728 dm->init_info.init_v7.wl_init_ok = (u8)wl->status.map.init_ok; in _set_init_info()
7729 dm->init_info.init_v7.cx_other = btc->cx.other.type; in _set_init_info()
7730 dm->init_info.init_v7.wl_guard_ch = chip->afh_guard_ch; in _set_init_info()
7731 dm->init_info.init_v7.module = btc->mdinfo.md_v7; in _set_init_info()
7733 dm->init_info.init.wl_only = (u8)dm->wl_only; in _set_init_info()
7734 dm->init_info.init.bt_only = (u8)dm->bt_only; in _set_init_info()
7735 dm->init_info.init.wl_init_ok = (u8)wl->status.map.init_ok; in _set_init_info()
7736 dm->init_info.init.dbcc_en = rtwdev->dbcc_en; in _set_init_info()
7737 dm->init_info.init.cx_other = btc->cx.other.type; in _set_init_info()
7738 dm->init_info.init.wl_guard_ch = chip->afh_guard_ch; in _set_init_info()
7739 dm->init_info.init.module = btc->mdinfo.md; in _set_init_info()
7745 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_init()
7746 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_btc_ntfy_init()
7747 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_init()
7748 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_btc_ntfy_init()
7749 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_ntfy_init()
7752 btc->dm.run_reason = BTC_RSN_NONE; in rtw89_btc_ntfy_init()
7753 btc->dm.run_action = BTC_ACT_NONE; in rtw89_btc_ntfy_init()
7754 if (ver->fcxctrl == 7) in rtw89_btc_ntfy_init()
7755 btc->ctrl.ctrl_v7.igno_bt = true; in rtw89_btc_ntfy_init()
7757 btc->ctrl.ctrl.igno_bt = true; in rtw89_btc_ntfy_init()
7762 wl->coex_mode = mode; in rtw89_btc_ntfy_init()
7763 dm->cnt_notify[BTC_NCNT_INIT_COEX]++; in rtw89_btc_ntfy_init()
7764 dm->wl_only = mode == BTC_MODE_WL ? 1 : 0; in rtw89_btc_ntfy_init()
7765 dm->bt_only = mode == BTC_MODE_BT ? 1 : 0; in rtw89_btc_ntfy_init()
7766 wl->status.map.rf_off = mode == BTC_MODE_WLOFF ? 1 : 0; in rtw89_btc_ntfy_init()
7768 chip->ops->btc_set_rfe(rtwdev); in rtw89_btc_ntfy_init()
7769 chip->ops->btc_init_cfg(rtwdev); in rtw89_btc_ntfy_init()
7771 if (!wl->status.map.init_ok) { in rtw89_btc_ntfy_init()
7775 dm->error.map.init = true; in rtw89_btc_ntfy_init()
7786 dm->error.map.pta_owner = true; in rtw89_btc_ntfy_init()
7801 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_scan_start()
7802 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_scan_start()
7811 btc->dm.cnt_notify[BTC_NCNT_SCAN_START]++; in rtw89_btc_ntfy_scan_start()
7812 wl->status.map.scan = true; in rtw89_btc_ntfy_scan_start()
7813 wl->scan_info.band[phy_idx] = band; in rtw89_btc_ntfy_scan_start()
7814 wl->scan_info.phy_map |= BIT(phy_idx); in rtw89_btc_ntfy_scan_start()
7817 if (rtwdev->dbcc_en) { in rtw89_btc_ntfy_scan_start()
7818 wl->dbcc_info.scan_band[phy_idx] = band; in rtw89_btc_ntfy_scan_start()
7828 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_scan_finish()
7829 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_scan_finish()
7833 btc->dm.cnt_notify[BTC_NCNT_SCAN_FINISH]++; in rtw89_btc_ntfy_scan_finish()
7835 wl->status.map.scan = false; in rtw89_btc_ntfy_scan_finish()
7836 wl->scan_info.phy_map &= ~BIT(phy_idx); in rtw89_btc_ntfy_scan_finish()
7839 if (rtwdev->dbcc_en) { in rtw89_btc_ntfy_scan_finish()
7844 btc->dm.tdma_instant_excute = 1; in rtw89_btc_ntfy_scan_finish()
7851 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_switch_band()
7852 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_switch_band()
7861 btc->dm.cnt_notify[BTC_NCNT_SWITCH_BAND]++; in rtw89_btc_ntfy_switch_band()
7863 if (rtwdev->dbcc_en) { in rtw89_btc_ntfy_switch_band()
7864 wl->dbcc_info.scan_band[phy_idx] = band; in rtw89_btc_ntfy_switch_band()
7874 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_specific_packet()
7875 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_btc_ntfy_specific_packet()
7876 struct rtw89_btc_wl_info *wl = &cx->wl; in rtw89_btc_ntfy_specific_packet()
7877 struct rtw89_btc_bt_link_info *b = &cx->bt.link_info; in rtw89_btc_ntfy_specific_packet()
7878 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc; in rtw89_btc_ntfy_specific_packet()
7879 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc; in rtw89_btc_ntfy_specific_packet()
7886 cnt = ++cx->cnt_wl[BTC_WCNT_DHCP]; in rtw89_btc_ntfy_specific_packet()
7889 wl->status.map.connecting = true; in rtw89_btc_ntfy_specific_packet()
7893 cnt = ++cx->cnt_wl[BTC_WCNT_EAPOL]; in rtw89_btc_ntfy_specific_packet()
7896 wl->status.map._4way = true; in rtw89_btc_ntfy_specific_packet()
7898 if (hfp->exist || hid->exist) in rtw89_btc_ntfy_specific_packet()
7902 cnt = ++cx->cnt_wl[BTC_WCNT_EAPOL]; in rtw89_btc_ntfy_specific_packet()
7906 wl->status.map._4way = false; in rtw89_btc_ntfy_specific_packet()
7907 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work); in rtw89_btc_ntfy_specific_packet()
7910 cnt = ++cx->cnt_wl[BTC_WCNT_ARP]; in rtw89_btc_ntfy_specific_packet()
7926 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work); in rtw89_btc_ntfy_specific_packet()
7927 wiphy_delayed_work_queue(rtwdev->hw->wiphy, in rtw89_btc_ntfy_specific_packet()
7928 &rtwdev->coex_act1_work, delay); in rtw89_btc_ntfy_specific_packet()
7931 btc->dm.cnt_notify[BTC_NCNT_SPECIAL_PACKET]++; in rtw89_btc_ntfy_specific_packet()
7980 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_bt_rssi_level()
7981 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_rssi_level()
7982 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _update_bt_rssi_level()
7987 * if rssi >= 40% (-60dBm) --> rssi_level = 4 in _update_bt_rssi_level()
7988 * if 36% <= rssi < 40% --> rssi_level = 3 in _update_bt_rssi_level()
7989 * if 31% <= rssi < 36% --> rssi_level = 2 in _update_bt_rssi_level()
7990 * if 28% <= rssi < 31% --> rssi_level = 1 in _update_bt_rssi_level()
7991 * if rssi < 28% --> rssi_level = 0 in _update_bt_rssi_level()
7996 rssi_th = chip->bt_rssi_thres[i]; in _update_bt_rssi_level()
7997 rssi_st = &bt->link_info.rssi_state[i]; in _update_bt_rssi_level()
8002 rssi_level = BTC_BT_RSSI_THMAX - i; in _update_bt_rssi_level()
8011 u8 mode = rtwdev->btc.cx.wl.role_info.link_mode; in _update_zb_coex_tbl()
8014 if (mode == BTC_WLINK_5G || rtwdev->btc.dm.freerun) { in _update_zb_coex_tbl()
8029 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_bt_info()
8030 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_info()
8031 struct rtw89_btc_cx *cx = &btc->cx; in _update_bt_info()
8032 struct rtw89_btc_bt_info *bt = &cx->bt; in _update_bt_info()
8033 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _update_bt_info()
8034 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc; in _update_bt_info()
8035 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc; in _update_bt_info()
8036 struct rtw89_btc_bt_a2dp_desc *a2dp = &b->a2dp_desc; in _update_bt_info()
8037 struct rtw89_btc_bt_pan_desc *pan = &b->pan_desc; in _update_bt_info()
8043 if (!memcmp(bt->raw_info, buf, BTC_BTINFO_MAX)) { in _update_bt_info()
8045 "[BTC], %s(): return by bt-info duplicate!!\n", in _update_bt_info()
8047 cx->cnt_bt[BTC_BCNT_INFOSAME]++; in _update_bt_info()
8051 memcpy(bt->raw_info, buf, BTC_BTINFO_MAX); in _update_bt_info()
8055 __func__, bt->raw_info[2]); in _update_bt_info()
8057 b->profile_cnt.last = b->profile_cnt.now; in _update_bt_info()
8058 b->profile_cnt.now = 0; in _update_bt_info()
8059 hid->type = 0; in _update_bt_info()
8061 /* parse raw info low-Byte2 */ in _update_bt_info()
8062 btinfo.val = bt->raw_info[BTC_BTINFO_L2]; in _update_bt_info()
8063 b->status.map.connect = btinfo.lb2.connect; in _update_bt_info()
8064 b->status.map.sco_busy = btinfo.lb2.sco_busy; in _update_bt_info()
8065 b->status.map.acl_busy = btinfo.lb2.acl_busy; in _update_bt_info()
8066 b->status.map.inq_pag = btinfo.lb2.inq_pag; in _update_bt_info()
8067 bt->inq_pag.now = btinfo.lb2.inq_pag; in _update_bt_info()
8068 cx->cnt_bt[BTC_BCNT_INQPAG] += !!(bt->inq_pag.now && !bt->inq_pag.last); in _update_bt_info()
8070 hfp->exist = btinfo.lb2.hfp; in _update_bt_info()
8071 b->profile_cnt.now += (u8)hfp->exist; in _update_bt_info()
8072 hid->exist = btinfo.lb2.hid; in _update_bt_info()
8073 b->profile_cnt.now += (u8)hid->exist; in _update_bt_info()
8074 a2dp->exist = btinfo.lb2.a2dp; in _update_bt_info()
8075 b->profile_cnt.now += (u8)a2dp->exist; in _update_bt_info()
8076 pan->exist = btinfo.lb2.pan; in _update_bt_info()
8077 b->profile_cnt.now += (u8)pan->exist; in _update_bt_info()
8078 btc->dm.trx_info.bt_profile = u32_get_bits(btinfo.val, BT_PROFILE_PROTOCOL_MASK); in _update_bt_info()
8080 /* parse raw info low-Byte3 */ in _update_bt_info()
8081 btinfo.val = bt->raw_info[BTC_BTINFO_L3]; in _update_bt_info()
8083 cx->cnt_bt[BTC_BCNT_RETRY]++; in _update_bt_info()
8084 b->cqddr = btinfo.lb3.cqddr; in _update_bt_info()
8085 cx->cnt_bt[BTC_BCNT_INQ] += !!(btinfo.lb3.inq && !bt->inq); in _update_bt_info()
8086 bt->inq = btinfo.lb3.inq; in _update_bt_info()
8087 cx->cnt_bt[BTC_BCNT_PAGE] += !!(btinfo.lb3.pag && !bt->pag); in _update_bt_info()
8088 bt->pag = btinfo.lb3.pag; in _update_bt_info()
8090 b->status.map.mesh_busy = btinfo.lb3.mesh_busy; in _update_bt_info()
8091 /* parse raw info high-Byte0 */ in _update_bt_info()
8092 btinfo.val = bt->raw_info[BTC_BTINFO_H0]; in _update_bt_info()
8093 /* raw val is dBm unit, translate from -100~ 0dBm to 0~100%*/ in _update_bt_info()
8094 b->rssi = chip->ops->btc_get_bt_rssi(rtwdev, btinfo.hb0.rssi); in _update_bt_info()
8095 bt->rssi_level = _update_bt_rssi_level(rtwdev, b->rssi); in _update_bt_info()
8096 btc->dm.trx_info.bt_rssi = bt->rssi_level; in _update_bt_info()
8098 /* parse raw info high-Byte1 */ in _update_bt_info()
8099 btinfo.val = bt->raw_info[BTC_BTINFO_H1]; in _update_bt_info()
8100 b->status.map.ble_connect = btinfo.hb1.ble_connect; in _update_bt_info()
8102 if (hid->exist) in _update_bt_info()
8103 hid->type |= BTC_HID_BLE; in _update_bt_info()
8105 hid->type |= BTC_HID_RCU_VOICE; in _update_bt_info()
8107 hid->type |= BTC_HID_RCU; in _update_bt_info()
8110 cx->cnt_bt[BTC_BCNT_REINIT] += !!(btinfo.hb1.reinit && !bt->reinit); in _update_bt_info()
8111 bt->reinit = btinfo.hb1.reinit; in _update_bt_info()
8112 cx->cnt_bt[BTC_BCNT_RELINK] += !!(btinfo.hb1.relink && !b->relink.now); in _update_bt_info()
8113 b->relink.now = btinfo.hb1.relink; in _update_bt_info()
8114 cx->cnt_bt[BTC_BCNT_IGNOWL] += !!(btinfo.hb1.igno_wl && !bt->igno_wl); in _update_bt_info()
8115 bt->igno_wl = btinfo.hb1.igno_wl; in _update_bt_info()
8117 if (bt->igno_wl && !cx->wl.status.map.rf_off) in _update_bt_info()
8120 bt->ble_scan_en = btinfo.hb1.ble_scan; in _update_bt_info()
8122 cx->cnt_bt[BTC_BCNT_ROLESW] += !!(btinfo.hb1.role_sw && !b->role_sw); in _update_bt_info()
8123 b->role_sw = btinfo.hb1.role_sw; in _update_bt_info()
8125 b->multi_link.now = btinfo.hb1.multi_link; in _update_bt_info()
8127 /* parse raw info high-Byte2 */ in _update_bt_info()
8128 btinfo.val = bt->raw_info[BTC_BTINFO_H2]; in _update_bt_info()
8129 pan->active = !!btinfo.hb2.pan_active; in _update_bt_info()
8131 cx->cnt_bt[BTC_BCNT_AFH] += !!(btinfo.hb2.afh_update && !b->afh_update); in _update_bt_info()
8132 b->afh_update = btinfo.hb2.afh_update; in _update_bt_info()
8133 a2dp->active = btinfo.hb2.a2dp_active; in _update_bt_info()
8134 b->slave_role = btinfo.hb2.slave; in _update_bt_info()
8135 hid->slot_info = btinfo.hb2.hid_slot; in _update_bt_info()
8136 hid->pair_cnt = btinfo.hb2.hid_cnt; in _update_bt_info()
8137 if (!b->status.map.ble_connect || hid->pair_cnt > 1) in _update_bt_info()
8138 hid->type |= (hid->slot_info == BTC_HID_218 ? in _update_bt_info()
8140 /* parse raw info high-Byte3 */ in _update_bt_info()
8141 btinfo.val = bt->raw_info[BTC_BTINFO_H3]; in _update_bt_info()
8142 a2dp->bitpool = btinfo.hb3.a2dp_bitpool; in _update_bt_info()
8144 if (b->tx_3m != (u32)btinfo.hb3.tx_3m) in _update_bt_info()
8145 cx->cnt_bt[BTC_BCNT_RATECHG]++; in _update_bt_info()
8146 b->tx_3m = (u32)btinfo.hb3.tx_3m; in _update_bt_info()
8148 a2dp->sink = btinfo.hb3.a2dp_sink; in _update_bt_info()
8150 if (!a2dp->exist_last && a2dp->exist) { in _update_bt_info()
8151 a2dp->vendor_id = 0; in _update_bt_info()
8152 a2dp->flush_time = 0; in _update_bt_info()
8153 a2dp->play_latency = 1; in _update_bt_info()
8154 wiphy_delayed_work_queue(rtwdev->hw->wiphy, in _update_bt_info()
8155 &rtwdev->coex_bt_devinfo_work, in _update_bt_info()
8168 rtwvif_link->chanctx_idx); in rtw89_btc_ntfy_role_info()
8172 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_role_info()
8173 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_ntfy_role_info()
8174 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_role_info()
8186 vif->type == NL80211_IFTYPE_STATION); in rtw89_btc_ntfy_role_info()
8187 rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], port=%d\n", rtwvif_link->port); in rtw89_btc_ntfy_role_info()
8189 chan->band_type, chan->channel, chan->band_width); in rtw89_btc_ntfy_role_info()
8194 bss_conf->beacon_int, bss_conf->dtim_period); in rtw89_btc_ntfy_role_info()
8200 rtwsta_link->mac_id); in rtw89_btc_ntfy_role_info()
8204 link_sta->he_cap.has_he, in rtw89_btc_ntfy_role_info()
8205 link_sta->vht_cap.vht_supported, in rtw89_btc_ntfy_role_info()
8206 link_sta->ht_cap.ht_supported); in rtw89_btc_ntfy_role_info()
8207 if (link_sta->he_cap.has_he) in rtw89_btc_ntfy_role_info()
8209 if (link_sta->vht_cap.vht_supported) in rtw89_btc_ntfy_role_info()
8211 if (link_sta->ht_cap.ht_supported) in rtw89_btc_ntfy_role_info()
8217 if (rtwvif_link->wifi_role >= RTW89_WIFI_ROLE_MLME_MAX) { in rtw89_btc_ntfy_role_info()
8223 "[BTC], wifi_role=%d\n", rtwvif_link->wifi_role); in rtw89_btc_ntfy_role_info()
8225 r.role = rtwvif_link->wifi_role; in rtw89_btc_ntfy_role_info()
8226 r.phy = rtwvif_link->phy_idx; in rtw89_btc_ntfy_role_info()
8227 r.pid = rtwvif_link->port; in rtw89_btc_ntfy_role_info()
8230 r.bcn_period = bss_conf->beacon_int; in rtw89_btc_ntfy_role_info()
8231 r.dtim_period = bss_conf->dtim_period; in rtw89_btc_ntfy_role_info()
8232 r.band = chan->band_type; in rtw89_btc_ntfy_role_info()
8233 r.ch = chan->channel; in rtw89_btc_ntfy_role_info()
8234 r.bw = chan->band_width; in rtw89_btc_ntfy_role_info()
8235 r.chdef.band = chan->band_type; in rtw89_btc_ntfy_role_info()
8236 r.chdef.center_ch = chan->channel; in rtw89_btc_ntfy_role_info()
8237 r.chdef.bw = chan->band_width; in rtw89_btc_ntfy_role_info()
8238 r.chdef.chan = chan->primary_channel; in rtw89_btc_ntfy_role_info()
8239 ether_addr_copy(r.mac_addr, rtwvif_link->mac_addr); in rtw89_btc_ntfy_role_info()
8243 if (rtwsta_link && vif->type == NL80211_IFTYPE_STATION) in rtw89_btc_ntfy_role_info()
8244 r.mac_id = rtwsta_link->mac_id; in rtw89_btc_ntfy_role_info()
8246 btc->dm.cnt_notify[BTC_NCNT_ROLE_INFO]++; in rtw89_btc_ntfy_role_info()
8248 wlinfo = &wl->link_info[r.pid]; in rtw89_btc_ntfy_role_info()
8250 if (ver->fwlrole == 0) { in rtw89_btc_ntfy_role_info()
8253 } else if (ver->fwlrole == 1) { in rtw89_btc_ntfy_role_info()
8256 } else if (ver->fwlrole == 2) { in rtw89_btc_ntfy_role_info()
8259 } else if (ver->fwlrole == 7) { in rtw89_btc_ntfy_role_info()
8262 } else if (ver->fwlrole == 8) { in rtw89_btc_ntfy_role_info()
8263 rlink_id = rtwvif_link->mac_idx; in rtw89_btc_ntfy_role_info()
8264 wlinfo = &wl->rlink_info[r.pid][rlink_id]; in rtw89_btc_ntfy_role_info()
8266 link_mode_ori = wl->role_info_v8.link_mode; in rtw89_btc_ntfy_role_info()
8267 pta_req_mac_ori = wl->pta_req_mac; in rtw89_btc_ntfy_role_info()
8270 if (wl->role_info_v8.link_mode != link_mode_ori) { in rtw89_btc_ntfy_role_info()
8271 wl->role_info_v8.link_mode_chg = 1; in rtw89_btc_ntfy_role_info()
8272 if (ver->fcxinit == 7) in rtw89_btc_ntfy_role_info()
8273 wa_type = btc->mdinfo.md_v7.wa_type; in rtw89_btc_ntfy_role_info()
8275 wa_type = btc->mdinfo.md.wa_type; in rtw89_btc_ntfy_role_info()
8281 if (wl->pta_req_mac != pta_req_mac_ori) in rtw89_btc_ntfy_role_info()
8282 wl->pta_reg_mac_chg = 1; in rtw89_btc_ntfy_role_info()
8285 if (wlinfo->role == RTW89_WIFI_ROLE_STATION && in rtw89_btc_ntfy_role_info()
8286 wlinfo->connected == MLME_NO_LINK) in rtw89_btc_ntfy_role_info()
8287 btc->dm.leak_ap = 0; in rtw89_btc_ntfy_role_info()
8290 wl->status.map.connecting = 1; in rtw89_btc_ntfy_role_info()
8292 wl->status.map.connecting = 0; in rtw89_btc_ntfy_role_info()
8296 wl->status.map._4way = false; in rtw89_btc_ntfy_role_info()
8303 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_btc_ntfy_radio_state()
8304 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_radio_state()
8305 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_radio_state()
8310 btc->dm.cnt_notify[BTC_NCNT_RADIO_STATE]++; in rtw89_btc_ntfy_radio_state()
8314 wl->status.map.rf_off = 1; in rtw89_btc_ntfy_radio_state()
8315 wl->status.map.lps = BTC_LPS_OFF; in rtw89_btc_ntfy_radio_state()
8316 wl->status.map.busy = 0; in rtw89_btc_ntfy_radio_state()
8319 wl->status.map.rf_off = 0; in rtw89_btc_ntfy_radio_state()
8320 wl->status.map.lps = BTC_LPS_RF_OFF; in rtw89_btc_ntfy_radio_state()
8321 wl->status.map.busy = 0; in rtw89_btc_ntfy_radio_state()
8323 case BTC_RFCTRL_LPS_WL_ON: /* LPS-Protocol (RFon) */ in rtw89_btc_ntfy_radio_state()
8324 wl->status.map.rf_off = 0; in rtw89_btc_ntfy_radio_state()
8325 wl->status.map.lps = BTC_LPS_RF_ON; in rtw89_btc_ntfy_radio_state()
8326 wl->status.map.busy = 0; in rtw89_btc_ntfy_radio_state()
8330 wl->status.map.rf_off = 0; in rtw89_btc_ntfy_radio_state()
8331 wl->status.map.lps = BTC_LPS_OFF; in rtw89_btc_ntfy_radio_state()
8340 chip->ops->btc_init_cfg(rtwdev); in rtw89_btc_ntfy_radio_state()
8351 wl->status.map.lps_pre != BTC_LPS_OFF) in rtw89_btc_ntfy_radio_state()
8355 btc->dm.cnt_dm[BTC_DCNT_BTCNT_HANG] = 0; in rtw89_btc_ntfy_radio_state()
8356 btc->dm.tdma_instant_excute = 1; in rtw89_btc_ntfy_radio_state()
8359 wl->status.map.rf_off_pre = wl->status.map.rf_off; in rtw89_btc_ntfy_radio_state()
8360 wl->status.map.lps_pre = wl->status.map.lps; in rtw89_btc_ntfy_radio_state()
8367 struct rtw89_btc *btc = &rtwdev->btc; in _ntfy_wl_rfk()
8368 struct rtw89_btc_cx *cx = &btc->cx; in _ntfy_wl_rfk()
8369 struct rtw89_btc_wl_info *wl = &cx->wl; in _ntfy_wl_rfk()
8372 wl->rfk_info.type = type; in _ntfy_wl_rfk()
8373 wl->rfk_info.path_map = FIELD_GET(BTC_RFK_PATH_MAP, phy_path); in _ntfy_wl_rfk()
8374 wl->rfk_info.phy_map = FIELD_GET(BTC_RFK_PHY_MAP, phy_path); in _ntfy_wl_rfk()
8375 wl->rfk_info.band = FIELD_GET(BTC_RFK_BAND_MAP, phy_path); in _ntfy_wl_rfk()
8379 __func__, wl->rfk_info.phy_map, wl->rfk_info.path_map, in _ntfy_wl_rfk()
8385 wl->rfk_info.state = result ? BTC_WRFK_START : BTC_WRFK_STOP; in _ntfy_wl_rfk()
8389 btc->dm.cnt_notify[BTC_NCNT_WL_RFK]++; in _ntfy_wl_rfk()
8393 if (wl->rfk_info.state == BTC_WRFK_STOP) { in _ntfy_wl_rfk()
8397 wl->rfk_info.state = state; in _ntfy_wl_rfk()
8402 wl->rfk_info.state = BTC_WRFK_STOP; in _ntfy_wl_rfk()
8405 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_rfk_chk_work); in _ntfy_wl_rfk()
8414 if (wl->rfk_info.state == BTC_WRFK_START || in _ntfy_wl_rfk()
8415 wl->rfk_info.state == BTC_WRFK_STOP) in _ntfy_wl_rfk()
8418 if (wl->rfk_info.state == BTC_WRFK_START) in _ntfy_wl_rfk()
8419 wiphy_delayed_work_queue(rtwdev->hw->wiphy, in _ntfy_wl_rfk()
8420 &rtwdev->coex_rfk_chk_work, in _ntfy_wl_rfk()
8426 __func__, btc->dm.cnt_notify[BTC_NCNT_WL_RFK], result); in _ntfy_wl_rfk()
8439 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_btc_ntfy_wl_rfk()
8452 state == BTC_WRFK_ONESHOT_START ? "ONE-SHOT_START" : in rtw89_btc_ntfy_wl_rfk()
8453 "ONE-SHOT_STOP"); in rtw89_btc_ntfy_wl_rfk()
8455 if (state != BTC_WRFK_START || rtwdev->is_bt_iqk_timeout) { in rtw89_btc_ntfy_wl_rfk()
8464 rtwdev->is_bt_iqk_timeout = true; in rtw89_btc_ntfy_wl_rfk()
8483 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in __rtw89_btc_ntfy_wl_sta_iter()
8484 struct rtw89_dev *rtwdev = iter_data->rtwdev; in __rtw89_btc_ntfy_wl_sta_iter()
8485 struct rtw89_btc *btc = &rtwdev->btc; in __rtw89_btc_ntfy_wl_sta_iter()
8486 struct rtw89_btc_dm *dm = &btc->dm; in __rtw89_btc_ntfy_wl_sta_iter()
8487 const struct rtw89_btc_ver *ver = btc->ver; in __rtw89_btc_ntfy_wl_sta_iter()
8488 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in __rtw89_btc_ntfy_wl_sta_iter()
8491 struct rtw89_traffic_stats *stats = &rtwvif->stats; in __rtw89_btc_ntfy_wl_sta_iter()
8492 const struct rtw89_chip_info *chip = rtwdev->chip; in __rtw89_btc_ntfy_wl_sta_iter()
8497 u8 port = rtwvif_link->port; in __rtw89_btc_ntfy_wl_sta_iter()
8505 rssi = ewma_rssi_read(&rtwsta_link->avg_rssi) >> RSSI_FACTOR; in __rtw89_btc_ntfy_wl_sta_iter()
8508 if (btc->ver->fwlrole != 8) in __rtw89_btc_ntfy_wl_sta_iter()
8509 link_info = &wl->link_info[port]; in __rtw89_btc_ntfy_wl_sta_iter()
8511 link_info = &wl->rlink_info[port][rtwvif_link->mac_idx]; in __rtw89_btc_ntfy_wl_sta_iter()
8513 link_info->stat.traffic = *stats; in __rtw89_btc_ntfy_wl_sta_iter()
8514 link_info_t = &link_info->stat.traffic; in __rtw89_btc_ntfy_wl_sta_iter()
8516 if (link_info->connected == MLME_NO_LINK) { in __rtw89_btc_ntfy_wl_sta_iter()
8517 link_info->rx_rate_drop_cnt = 0; in __rtw89_btc_ntfy_wl_sta_iter()
8521 link_info->stat.rssi = rssi; in __rtw89_btc_ntfy_wl_sta_iter()
8523 link_info->rssi_state[i] = in __rtw89_btc_ntfy_wl_sta_iter()
8525 link_info->rssi_state[i], in __rtw89_btc_ntfy_wl_sta_iter()
8526 link_info->stat.rssi, in __rtw89_btc_ntfy_wl_sta_iter()
8527 chip->wl_rssi_thres[i]); in __rtw89_btc_ntfy_wl_sta_iter()
8528 if (BTC_RSSI_LOW(link_info->rssi_state[i])) in __rtw89_btc_ntfy_wl_sta_iter()
8531 if (btc->ant_type == BTC_ANT_DEDICATED && in __rtw89_btc_ntfy_wl_sta_iter()
8532 BTC_RSSI_CHANGE(link_info->rssi_state[i])) in __rtw89_btc_ntfy_wl_sta_iter()
8535 iter_data->rssi_map_all |= rssi_map; in __rtw89_btc_ntfy_wl_sta_iter()
8537 last_tx_rate = link_info_t->tx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8538 last_rx_rate = link_info_t->rx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8539 last_tx_lvl = (u16)link_info_t->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8540 last_rx_lvl = (u16)link_info_t->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8542 if (stats->tx_tfc_lv != RTW89_TFC_IDLE || in __rtw89_btc_ntfy_wl_sta_iter()
8543 stats->rx_tfc_lv != RTW89_TFC_IDLE) in __rtw89_btc_ntfy_wl_sta_iter()
8546 if (stats->tx_tfc_lv > stats->rx_tfc_lv) in __rtw89_btc_ntfy_wl_sta_iter()
8551 link_info = &wl->link_info[port]; in __rtw89_btc_ntfy_wl_sta_iter()
8552 if (link_info->busy != busy || link_info->dir != dir) { in __rtw89_btc_ntfy_wl_sta_iter()
8554 link_info->busy = busy; in __rtw89_btc_ntfy_wl_sta_iter()
8555 link_info->dir = dir; in __rtw89_btc_ntfy_wl_sta_iter()
8558 iter_data->busy_all |= busy; in __rtw89_btc_ntfy_wl_sta_iter()
8559 iter_data->dir_all |= BIT(dir); in __rtw89_btc_ntfy_wl_sta_iter()
8561 if (rtwsta_link->rx_hw_rate <= RTW89_HW_RATE_CCK2 && in __rtw89_btc_ntfy_wl_sta_iter()
8563 link_info_t->rx_tfc_lv > RTW89_TFC_IDLE) in __rtw89_btc_ntfy_wl_sta_iter()
8564 link_info->rx_rate_drop_cnt++; in __rtw89_btc_ntfy_wl_sta_iter()
8566 if (last_tx_rate != rtwsta_link->ra_report.hw_rate || in __rtw89_btc_ntfy_wl_sta_iter()
8567 last_rx_rate != rtwsta_link->rx_hw_rate || in __rtw89_btc_ntfy_wl_sta_iter()
8568 last_tx_lvl != link_info_t->tx_tfc_lv || in __rtw89_btc_ntfy_wl_sta_iter()
8569 last_rx_lvl != link_info_t->rx_tfc_lv) in __rtw89_btc_ntfy_wl_sta_iter()
8572 link_info_t->tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8573 link_info_t->rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8575 if (link_info->role == RTW89_WIFI_ROLE_STATION || in __rtw89_btc_ntfy_wl_sta_iter()
8576 link_info->role == RTW89_WIFI_ROLE_P2P_CLIENT) { in __rtw89_btc_ntfy_wl_sta_iter()
8577 dm->trx_info.tx_rate = link_info_t->tx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8578 dm->trx_info.rx_rate = link_info_t->rx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8581 if (ver->fwlrole == 0) { in __rtw89_btc_ntfy_wl_sta_iter()
8582 r = &wl->role_info; in __rtw89_btc_ntfy_wl_sta_iter()
8583 r->active_role[port].tx_lvl = stats->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8584 r->active_role[port].rx_lvl = stats->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8585 r->active_role[port].tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8586 r->active_role[port].rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8587 } else if (ver->fwlrole == 1) { in __rtw89_btc_ntfy_wl_sta_iter()
8588 r1 = &wl->role_info_v1; in __rtw89_btc_ntfy_wl_sta_iter()
8589 r1->active_role_v1[port].tx_lvl = stats->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8590 r1->active_role_v1[port].rx_lvl = stats->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8591 r1->active_role_v1[port].tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8592 r1->active_role_v1[port].rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8595 dm->trx_info.tx_lvl = stats->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8596 dm->trx_info.rx_lvl = stats->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
8597 dm->trx_info.tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8598 dm->trx_info.rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
8599 dm->trx_info.tx_tp = link_info_t->tx_throughput; in __rtw89_btc_ntfy_wl_sta_iter()
8600 dm->trx_info.rx_tp = link_info_t->rx_throughput; in __rtw89_btc_ntfy_wl_sta_iter()
8602 /* Trigger coex-run if 0x10980 reg-value is diff with coex setup */ in __rtw89_btc_ntfy_wl_sta_iter()
8603 if ((dm->wl_btg_rx_rb != dm->wl_btg_rx && in __rtw89_btc_ntfy_wl_sta_iter()
8604 dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) || in __rtw89_btc_ntfy_wl_sta_iter()
8605 (dm->wl_pre_agc_rb != dm->wl_pre_agc && in __rtw89_btc_ntfy_wl_sta_iter()
8606 dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND)) in __rtw89_btc_ntfy_wl_sta_iter()
8607 iter_data->is_sta_change = true; in __rtw89_btc_ntfy_wl_sta_iter()
8610 iter_data->is_sta_change = true; in __rtw89_btc_ntfy_wl_sta_iter()
8613 iter_data->is_traffic_change = true; in __rtw89_btc_ntfy_wl_sta_iter()
8626 rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_btc_ntfy_wl_sta_iter()
8635 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_wl_sta()
8636 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_ntfy_wl_sta()
8637 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_wl_sta()
8641 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_btc_ntfy_wl_sta()
8645 wl->rssi_level = 0; in rtw89_btc_ntfy_wl_sta()
8646 btc->dm.cnt_notify[BTC_NCNT_WL_STA]++; in rtw89_btc_ntfy_wl_sta()
8647 for (i = BTC_WL_RSSI_THMAX; i > 0; i--) { in rtw89_btc_ntfy_wl_sta()
8649 if (data.rssi_map_all & BIT(i - 1)) { in rtw89_btc_ntfy_wl_sta()
8650 wl->rssi_level = i; in rtw89_btc_ntfy_wl_sta()
8655 if (dm->trx_info.wl_rssi != wl->rssi_level) in rtw89_btc_ntfy_wl_sta()
8656 dm->trx_info.wl_rssi = wl->rssi_level; in rtw89_btc_ntfy_wl_sta()
8659 __func__, !!wl->status.map.busy); in rtw89_btc_ntfy_wl_sta()
8661 _write_scbd(rtwdev, BTC_WSCB_WLBUSY, (!!wl->status.map.busy)); in rtw89_btc_ntfy_wl_sta()
8666 wl->status.map.busy = data.busy_all; in rtw89_btc_ntfy_wl_sta()
8667 wl->status.map.traffic_dir = data.dir_all; in rtw89_btc_ntfy_wl_sta()
8669 } else if (btc->dm.cnt_notify[BTC_NCNT_WL_STA] >= in rtw89_btc_ntfy_wl_sta()
8670 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] + BTC_NHM_CHK_INTVL) { in rtw89_btc_ntfy_wl_sta()
8671 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] = in rtw89_btc_ntfy_wl_sta()
8672 btc->dm.cnt_notify[BTC_NCNT_WL_STA]; in rtw89_btc_ntfy_wl_sta()
8673 } else if (btc->dm.cnt_notify[BTC_NCNT_WL_STA] < in rtw89_btc_ntfy_wl_sta()
8674 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST]) { in rtw89_btc_ntfy_wl_sta()
8675 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] = in rtw89_btc_ntfy_wl_sta()
8676 btc->dm.cnt_notify[BTC_NCNT_WL_STA]; in rtw89_btc_ntfy_wl_sta()
8682 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_c2h_get_index_by_ver()
8683 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_c2h_get_index_by_ver()
8694 if (ver->fwc2hfunc == 0) in rtw89_btc_c2h_get_index_by_ver()
8699 if (ver->fwc2hfunc == 0) in rtw89_btc_c2h_get_index_by_ver()
8701 else if (ver->fwc2hfunc == 1) in rtw89_btc_c2h_get_index_by_ver()
8703 else if (ver->fwc2hfunc == 2) in rtw89_btc_c2h_get_index_by_ver()
8705 else if (ver->fwc2hfunc == 3) in rtw89_btc_c2h_get_index_by_ver()
8710 if (ver->fwc2hfunc == 0) in rtw89_btc_c2h_get_index_by_ver()
8712 else if (ver->fwc2hfunc == 1) in rtw89_btc_c2h_get_index_by_ver()
8714 else if (ver->fwc2hfunc == 2) in rtw89_btc_c2h_get_index_by_ver()
8716 else if (ver->fwc2hfunc == 3) in rtw89_btc_c2h_get_index_by_ver()
8721 if (ver->fwc2hfunc == 2) in rtw89_btc_c2h_get_index_by_ver()
8723 else if (ver->fwc2hfunc == 3) in rtw89_btc_c2h_get_index_by_ver()
8728 if (ver->fwc2hfunc == 3) in rtw89_btc_c2h_get_index_by_ver()
8741 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_c2h_handle()
8742 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in rtw89_btc_c2h_handle()
8743 u8 *buf = &skb->data[RTW89_C2H_HEADER_LEN]; in rtw89_btc_c2h_handle()
8745 len -= RTW89_C2H_HEADER_LEN; in rtw89_btc_c2h_handle()
8755 pfwinfo->cnt_c2h++; in rtw89_btc_c2h_handle()
8759 pfwinfo->event[func]++; in rtw89_btc_c2h_handle()
8762 pfwinfo->event[func]++; in rtw89_btc_c2h_handle()
8769 btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE]++; in rtw89_btc_c2h_handle()
8775 btc->cx.cnt_bt[BTC_BCNT_SCBDUPDATE]++; in rtw89_btc_c2h_handle()
8781 btc->dbg.rb_done = true; in rtw89_btc_c2h_handle()
8782 btc->dbg.rb_val = le32_to_cpu(*((__le32 *)buf)); in rtw89_btc_c2h_handle()
8786 btc->dbg.rb_done = true; in rtw89_btc_c2h_handle()
8787 btc->dbg.rb_val = buf[0]; in rtw89_btc_c2h_handle()
8790 btc->dm.cnt_dm[BTC_DCNT_CX_RUNINFO]++; in rtw89_btc_c2h_handle()
8793 btc->cx.cnt_bt[BTC_BCNT_BTTXPWR_UPDATE]++; in rtw89_btc_c2h_handle()
8802 union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; in _show_cx_info()
8803 const struct rtw89_chip_info *chip = rtwdev->chip; in _show_cx_info()
8804 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in _show_cx_info()
8805 struct rtw89_hal *hal = &rtwdev->hal; in _show_cx_info()
8806 struct rtw89_btc *btc = &rtwdev->btc; in _show_cx_info()
8807 struct rtw89_btc_dm *dm = &btc->dm; in _show_cx_info()
8808 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_cx_info()
8809 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_cx_info()
8814 if (!(dm->coex_info_map & BTC_COEX_INFO_CX)) in _show_cx_info()
8817 p += scnprintf(p, end - p, in _show_cx_info()
8819 chip_id_str(chip->chip_id)); in _show_cx_info()
8825 p += scnprintf(p, end - p, " %-15s : Coex:%d.%d.%d(branch:%d), ", in _show_cx_info()
8829 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw_coex); in _show_cx_info()
8830 ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw_coex); in _show_cx_info()
8831 ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw_coex); in _show_cx_info()
8832 id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw_coex); in _show_cx_info()
8833 p += scnprintf(p, end - p, "WL_FW_coex:%d.%d.%d(branch:%d)", in _show_cx_info()
8836 ver_main = FIELD_GET(GENMASK(31, 24), chip->wlcx_desired); in _show_cx_info()
8837 ver_sub = FIELD_GET(GENMASK(23, 16), chip->wlcx_desired); in _show_cx_info()
8838 ver_hotfix = FIELD_GET(GENMASK(15, 8), chip->wlcx_desired); in _show_cx_info()
8839 p += scnprintf(p, end - p, "(%s, desired:%d.%d.%d), ", in _show_cx_info()
8840 (wl->ver_info.fw_coex >= chip->wlcx_desired ? in _show_cx_info()
8843 p += scnprintf(p, end - p, "BT_FW_coex:%d(%s, desired:%d)\n", in _show_cx_info()
8844 bt->ver_info.fw_coex, in _show_cx_info()
8845 (bt->ver_info.fw_coex >= ver->bt_desired ? in _show_cx_info()
8846 "Match" : "Mismatch"), ver->bt_desired); in _show_cx_info()
8848 if (bt->enable.now && bt->ver_info.fw == 0) in _show_cx_info()
8853 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw); in _show_cx_info()
8854 ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw); in _show_cx_info()
8855 ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw); in _show_cx_info()
8856 id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw); in _show_cx_info()
8857 p += scnprintf(p, end - p, in _show_cx_info()
8858 " %-15s : WL_FW:%d.%d.%d.%d, BT_FW:0x%x(%s)\n", in _show_cx_info()
8861 bt->ver_info.fw, bt->run_patch_code ? "patch" : "ROM"); in _show_cx_info()
8863 if (ver->fcxinit == 7) { in _show_cx_info()
8864 cv = md->md_v7.kt_ver; in _show_cx_info()
8865 rfe = md->md_v7.rfe_type; in _show_cx_info()
8866 iso = md->md_v7.ant.isolation; in _show_cx_info()
8867 ant_num = md->md_v7.ant.num; in _show_cx_info()
8868 ant_single_pos = md->md_v7.ant.single_pos; in _show_cx_info()
8870 cv = md->md.cv; in _show_cx_info()
8871 rfe = md->md.rfe_type; in _show_cx_info()
8872 iso = md->md.ant.isolation; in _show_cx_info()
8873 ant_num = md->md.ant.num; in _show_cx_info()
8874 ant_single_pos = md->md.ant.single_pos; in _show_cx_info()
8877 p += scnprintf(p, end - p, in _show_cx_info()
8878 " %-15s : cv:%x, rfe_type:0x%x, ant_iso:%d, ant_pg:%d, %s", in _show_cx_info()
8883 p += scnprintf(p, end - p, in _show_cx_info()
8885 btc->cx.other.type, rtwdev->dbcc_en, hal->tx_nss, in _show_cx_info()
8886 hal->rx_nss); in _show_cx_info()
8888 return p - buf; in _show_cx_info()
8893 struct rtw89_btc *btc = &rtwdev->btc; in _show_wl_role_info()
8899 for (i = 0; i < btc->ver->max_role_num; i++) { in _show_wl_role_info()
8901 if (btc->ver->fwlrole == 8) in _show_wl_role_info()
8902 plink = &btc->cx.wl.rlink_info[i][j]; in _show_wl_role_info()
8904 plink = &btc->cx.wl.link_info[i]; in _show_wl_role_info()
8906 if (!plink->active) in _show_wl_role_info()
8909 p += scnprintf(p, end - p, in _show_wl_role_info()
8910 … " [port_%d] : role=%d(phy-%d), connect=%s(client_cnt=%d), mode=%d, center_ch=%d, bw=%d", in _show_wl_role_info()
8911 plink->pid, plink->role, plink->phy, in _show_wl_role_info()
8912 id_to_mlme_state(plink->connected), in _show_wl_role_info()
8913 plink->client_cnt - 1, plink->mode, in _show_wl_role_info()
8914 plink->ch, plink->bw); in _show_wl_role_info()
8916 if (plink->connected == MLME_NO_LINK) in _show_wl_role_info()
8919 p += scnprintf(p, end - p, in _show_wl_role_info()
8921 plink->mac_id, plink->tx_time, plink->tx_retry); in _show_wl_role_info()
8923 p += scnprintf(p, end - p, in _show_wl_role_info()
8924 " [port_%d] : rssi=-%ddBm(%d), busy=%d, dir=%s, ", in _show_wl_role_info()
8925 plink->pid, 110 - plink->stat.rssi, in _show_wl_role_info()
8926 plink->stat.rssi, plink->busy, in _show_wl_role_info()
8927 plink->dir == RTW89_TFC_UL ? "UL" : "DL"); in _show_wl_role_info()
8929 t = &plink->stat.traffic; in _show_wl_role_info()
8931 p += scnprintf(p, end - p, in _show_wl_role_info()
8933 t->tx_rate, t->tx_tfc_lv); in _show_wl_role_info()
8935 p += scnprintf(p, end - p, in _show_wl_role_info()
8936 "rx[rate:%d/busy_level:%d/drop:%d]\n", in _show_wl_role_info()
8937 t->rx_rate, in _show_wl_role_info()
8938 t->rx_tfc_lv, plink->rx_rate_drop_cnt); in _show_wl_role_info()
8941 return p - buf; in _show_wl_role_info()
8946 struct rtw89_btc *btc = &rtwdev->btc; in _show_wl_info()
8947 const struct rtw89_btc_ver *ver = btc->ver; in _show_wl_info()
8948 struct rtw89_btc_cx *cx = &btc->cx; in _show_wl_info()
8949 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_wl_info()
8950 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _show_wl_info()
8951 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _show_wl_info()
8952 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _show_wl_info()
8953 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _show_wl_info()
8954 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _show_wl_info()
8958 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_WL)) in _show_wl_info()
8961 p += scnprintf(p, end - p, "========== [WL Status] ==========\n"); in _show_wl_info()
8963 if (ver->fwlrole == 0) in _show_wl_info()
8964 mode = wl_rinfo->link_mode; in _show_wl_info()
8965 else if (ver->fwlrole == 1) in _show_wl_info()
8966 mode = wl_rinfo_v1->link_mode; in _show_wl_info()
8967 else if (ver->fwlrole == 2) in _show_wl_info()
8968 mode = wl_rinfo_v2->link_mode; in _show_wl_info()
8969 else if (ver->fwlrole == 7) in _show_wl_info()
8970 mode = wl_rinfo_v7->link_mode; in _show_wl_info()
8971 else if (ver->fwlrole == 8) in _show_wl_info()
8972 mode = wl_rinfo_v8->link_mode; in _show_wl_info()
8976 p += scnprintf(p, end - p, " %-15s : link_mode:%s, ", "[status]", in _show_wl_info()
8979 p += scnprintf(p, end - p, in _show_wl_info()
8981 wl->status.map.rf_off, wl->status.map.lps, in _show_wl_info()
8982 wl->status.map.scan ? "Y" : "N", in _show_wl_info()
8983 wl->scan_info.band[RTW89_PHY_0], wl->scan_info.phy_map); in _show_wl_info()
8985 p += scnprintf(p, end - p, in _show_wl_info()
8987 wl->status.map.connecting ? "Y" : "N", in _show_wl_info()
8988 wl->status.map.roaming ? "Y" : "N", in _show_wl_info()
8989 wl->status.map._4way ? "Y" : "N", in _show_wl_info()
8990 wl->status.map.init_ok ? "Y" : "N"); in _show_wl_info()
8992 p += _show_wl_role_info(rtwdev, p, end - p); in _show_wl_info()
8995 return p - buf; in _show_wl_info()
9006 struct rtw89_btc *btc = &rtwdev->btc; in _show_bt_profile_info()
9007 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; in _show_bt_profile_info()
9008 struct rtw89_btc_bt_hfp_desc hfp = bt_linfo->hfp_desc; in _show_bt_profile_info()
9009 struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc; in _show_bt_profile_info()
9010 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in _show_bt_profile_info()
9011 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc; in _show_bt_profile_info()
9015 p += scnprintf(p, end - p, in _show_bt_profile_info()
9016 " %-15s : type:%s, sut_pwr:%d, golden-rx:%d", in _show_bt_profile_info()
9018 bt_linfo->sut_pwr_level[0], in _show_bt_profile_info()
9019 bt_linfo->golden_rx_shift[0]); in _show_bt_profile_info()
9023 p += scnprintf(p, end - p, in _show_bt_profile_info()
9024 "\n\r %-15s : type:%s%s%s%s%s pair-cnt:%d, sut_pwr:%d, golden-rx:%d\n", in _show_bt_profile_info()
9030 hid.type & BTC_HID_RCU_VOICE ? "RCU-Voice," : "", in _show_bt_profile_info()
9031 hid.pair_cnt, bt_linfo->sut_pwr_level[1], in _show_bt_profile_info()
9032 bt_linfo->golden_rx_shift[1]); in _show_bt_profile_info()
9036 p += scnprintf(p, end - p, in _show_bt_profile_info()
9037 " %-15s : type:%s, bit-pool:%d, flush-time:%d, ", in _show_bt_profile_info()
9042 p += scnprintf(p, end - p, in _show_bt_profile_info()
9043 "vid:0x%x, Dev-name:0x%x, sut_pwr:%d, golden-rx:%d\n", in _show_bt_profile_info()
9045 bt_linfo->sut_pwr_level[2], in _show_bt_profile_info()
9046 bt_linfo->golden_rx_shift[2]); in _show_bt_profile_info()
9050 p += scnprintf(p, end - p, in _show_bt_profile_info()
9051 " %-15s : sut_pwr:%d, golden-rx:%d\n", in _show_bt_profile_info()
9053 bt_linfo->sut_pwr_level[3], in _show_bt_profile_info()
9054 bt_linfo->golden_rx_shift[3]); in _show_bt_profile_info()
9057 return p - buf; in _show_bt_profile_info()
9062 struct rtw89_btc *btc = &rtwdev->btc; in _show_bt_info()
9063 const struct rtw89_btc_ver *ver = btc->ver; in _show_bt_info()
9064 struct rtw89_btc_cx *cx = &btc->cx; in _show_bt_info()
9065 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_bt_info()
9066 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_bt_info()
9067 u32 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw_coex); in _show_bt_info()
9068 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _show_bt_info()
9069 union rtw89_btc_module_info *md = &btc->mdinfo; in _show_bt_info()
9070 s8 br_dbm = bt->link_info.bt_txpwr_desc.br_dbm; in _show_bt_info()
9071 s8 le_dbm = bt->link_info.bt_txpwr_desc.le_dbm; in _show_bt_info()
9073 u8 *afh = bt_linfo->afh_map; in _show_bt_info()
9074 u8 *afh_le = bt_linfo->afh_map_le; in _show_bt_info()
9077 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_BT)) in _show_bt_info()
9080 if (ver->fcxinit == 7) in _show_bt_info()
9081 bt_pos = md->md_v7.bt_pos; in _show_bt_info()
9083 bt_pos = md->md.bt_pos; in _show_bt_info()
9085 p += scnprintf(p, end - p, "========== [BT Status] ==========\n"); in _show_bt_info()
9087 p += scnprintf(p, end - p, in _show_bt_info()
9088 " %-15s : enable:%s, btg:%s%s, connect:%s, ", in _show_bt_info()
9089 "[status]", bt->enable.now ? "Y" : "N", in _show_bt_info()
9090 bt->btg_type ? "Y" : "N", in _show_bt_info()
9091 (bt->enable.now && (bt->btg_type != bt_pos) ? in _show_bt_info()
9092 "(efuse-mismatch!!)" : ""), in _show_bt_info()
9093 (bt_linfo->status.map.connect ? "Y" : "N")); in _show_bt_info()
9095 p += scnprintf(p, end - p, in _show_bt_info()
9097 bt->igno_wl ? "Y" : "N", in _show_bt_info()
9098 bt->mbx_avl ? "Y" : "N", bt->rfk_info.val); in _show_bt_info()
9100 p += scnprintf(p, end - p, " %-15s : profile:%s%s%s%s%s ", in _show_bt_info()
9102 (bt_linfo->profile_cnt.now == 0) ? "None," : "", in _show_bt_info()
9103 bt_linfo->hfp_desc.exist ? "HFP," : "", in _show_bt_info()
9104 bt_linfo->hid_desc.exist ? "HID," : "", in _show_bt_info()
9105 bt_linfo->a2dp_desc.exist ? in _show_bt_info()
9106 (bt_linfo->a2dp_desc.sink ? "A2DP_sink," : "A2DP,") : "", in _show_bt_info()
9107 bt_linfo->pan_desc.exist ? "PAN," : ""); in _show_bt_info()
9109 p += scnprintf(p, end - p, in _show_bt_info()
9110 "multi-link:%s, role:%s, ble-connect:%s, CQDDR:%s, A2DP_active:%s, PAN_active:%s\n", in _show_bt_info()
9111 bt_linfo->multi_link.now ? "Y" : "N", in _show_bt_info()
9112 bt_linfo->slave_role ? "Slave" : "Master", in _show_bt_info()
9113 bt_linfo->status.map.ble_connect ? "Y" : "N", in _show_bt_info()
9114 bt_linfo->cqddr ? "Y" : "N", in _show_bt_info()
9115 bt_linfo->a2dp_desc.active ? "Y" : "N", in _show_bt_info()
9116 bt_linfo->pan_desc.active ? "Y" : "N"); in _show_bt_info()
9118 p += scnprintf(p, end - p, in _show_bt_info()
9119 " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s", in _show_bt_info()
9120 "[link]", bt_linfo->rssi - 100, in _show_bt_info()
9121 bt->rssi_level, in _show_bt_info()
9122 bt_linfo->tx_3m ? 3 : 2, in _show_bt_info()
9123 bt_linfo->status.map.inq_pag ? " inq-page!!" : "", in _show_bt_info()
9124 bt_linfo->status.map.acl_busy ? " acl_busy!!" : "", in _show_bt_info()
9125 bt_linfo->status.map.mesh_busy ? " mesh_busy!!" : ""); in _show_bt_info()
9127 p += scnprintf(p, end - p, in _show_bt_info()
9129 bt_linfo->relink.now ? " ReLink!!" : "", in _show_bt_info()
9133 if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect) in _show_bt_info()
9134 p += scnprintf(p, end - p, in _show_bt_info()
9139 p += scnprintf(p, end - p, "wl_ch_map[en:%d/ch:%d/bw:%d]\n", in _show_bt_info()
9140 wl->afh_info.en, wl->afh_info.ch, wl->afh_info.bw); in _show_bt_info()
9142 p += scnprintf(p, end - p, in _show_bt_info()
9143 " %-15s : retry:%d, relink:%d, rate_chg:%d, reinit:%d, reenable:%d, ", in _show_bt_info()
9144 "[stat_cnt]", cx->cnt_bt[BTC_BCNT_RETRY], in _show_bt_info()
9145 cx->cnt_bt[BTC_BCNT_RELINK], in _show_bt_info()
9146 cx->cnt_bt[BTC_BCNT_RATECHG], in _show_bt_info()
9147 cx->cnt_bt[BTC_BCNT_REINIT], in _show_bt_info()
9148 cx->cnt_bt[BTC_BCNT_REENABLE]); in _show_bt_info()
9150 p += scnprintf(p, end - p, in _show_bt_info()
9151 "role-switch:%d, afh:%d, inq_page:%d(inq:%d/page:%d), igno_wl:%d\n", in _show_bt_info()
9152 cx->cnt_bt[BTC_BCNT_ROLESW], cx->cnt_bt[BTC_BCNT_AFH], in _show_bt_info()
9153 cx->cnt_bt[BTC_BCNT_INQPAG], cx->cnt_bt[BTC_BCNT_INQ], in _show_bt_info()
9154 cx->cnt_bt[BTC_BCNT_PAGE], cx->cnt_bt[BTC_BCNT_IGNOWL]); in _show_bt_info()
9156 p += _show_bt_profile_info(rtwdev, p, end - p); in _show_bt_info()
9158 p += scnprintf(p, end - p, in _show_bt_info()
9159 " %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)\n", in _show_bt_info()
9160 "[bt_info]", bt->raw_info[2], bt->raw_info[3], in _show_bt_info()
9161 bt->raw_info[4], bt->raw_info[5], bt->raw_info[6], in _show_bt_info()
9162 bt->raw_info[7], in _show_bt_info()
9163 bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply", in _show_bt_info()
9164 cx->cnt_bt[BTC_BCNT_INFOUPDATE], in _show_bt_info()
9165 cx->cnt_bt[BTC_BCNT_INFOSAME]); in _show_bt_info()
9167 p += scnprintf(p, end - p, in _show_bt_info()
9168 " %-15s : Hi-rx = %d, Hi-tx = %d, Lo-rx = %d, Lo-tx = %d (bt_polut_wl_tx = %d)", in _show_bt_info()
9169 "[trx_req_cnt]", cx->cnt_bt[BTC_BCNT_HIPRI_RX], in _show_bt_info()
9170 cx->cnt_bt[BTC_BCNT_HIPRI_TX], in _show_bt_info()
9171 cx->cnt_bt[BTC_BCNT_LOPRI_RX], in _show_bt_info()
9172 cx->cnt_bt[BTC_BCNT_LOPRI_TX], in _show_bt_info()
9173 cx->cnt_bt[BTC_BCNT_POLUT]); in _show_bt_info()
9175 if (!bt->scan_info_update) { in _show_bt_info()
9177 p += scnprintf(p, end - p, "\n"); in _show_bt_info()
9180 if (ver->fcxbtscan == 1) { in _show_bt_info()
9181 p += scnprintf(p, end - p, in _show_bt_info()
9182 "(INQ:%d-%d/PAGE:%d-%d/LE:%d-%d/INIT:%d-%d)", in _show_bt_info()
9183 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].win), in _show_bt_info()
9184 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].intvl), in _show_bt_info()
9185 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].win), in _show_bt_info()
9186 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].intvl), in _show_bt_info()
9187 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].win), in _show_bt_info()
9188 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].intvl), in _show_bt_info()
9189 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].win), in _show_bt_info()
9190 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].intvl)); in _show_bt_info()
9191 } else if (ver->fcxbtscan == 2) { in _show_bt_info()
9192 p += scnprintf(p, end - p, in _show_bt_info()
9193 "(BG:%d-%d/INIT:%d-%d/LE:%d-%d)", in _show_bt_info()
9194 le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].win), in _show_bt_info()
9195 le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].intvl), in _show_bt_info()
9196 le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].win), in _show_bt_info()
9197 le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].intvl), in _show_bt_info()
9198 le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].win), in _show_bt_info()
9199 le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].intvl)); in _show_bt_info()
9201 p += scnprintf(p, end - p, "\n"); in _show_bt_info()
9204 if (ver_main >= 9 && bt_linfo->profile_cnt.now) in _show_bt_info()
9209 if (cx->cnt_bt[BTC_BCNT_BTTXPWR_UPDATE]) { in _show_bt_info()
9210 p += scnprintf(p, end - p, in _show_bt_info()
9211 " %-15s : br_index:0x%x, le_index:0x%x", in _show_bt_info()
9213 bt->link_info.bt_txpwr_desc.br_gain_index, in _show_bt_info()
9214 bt->link_info.bt_txpwr_desc.le_gain_index); in _show_bt_info()
9215 p += scnprintf(p, end - p, ", br_dbm:%d dBm", br_dbm); in _show_bt_info()
9216 p += scnprintf(p, end - p, ", le_dbm:%d dBm", le_dbm); in _show_bt_info()
9218 p += scnprintf(p, end - p, in _show_bt_info()
9219 " %-15s : br_index:NA, le_index:NA, br_dbm:%d dBm[def], le_dbm:%d dBm[def]", in _show_bt_info()
9221 bt->link_info.bt_txpwr_desc.br_dbm, in _show_bt_info()
9222 bt->link_info.bt_txpwr_desc.le_dbm); in _show_bt_info()
9224 p += scnprintf(p, end - p, "\n"); in _show_bt_info()
9226 if (bt_linfo->profile_cnt.now || bt_linfo->status.map.ble_connect) in _show_bt_info()
9231 if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect) in _show_bt_info()
9236 if (bt_linfo->a2dp_desc.exist && in _show_bt_info()
9237 (bt_linfo->a2dp_desc.flush_time == 0 || in _show_bt_info()
9238 bt_linfo->a2dp_desc.vendor_id == 0 || in _show_bt_info()
9239 bt_linfo->a2dp_desc.play_latency == 1)) in _show_bt_info()
9244 return p - buf; in _show_bt_info()
9547 p += scnprintf(p, end - p, " %-15s : ", prefix); in scnprintf_segment()
9550 p += scnprintf(p, end - p, "-> %-20s", in scnprintf_segment()
9553 p += scnprintf(p, end - p, "-> %-15s", in scnprintf_segment()
9556 p += scnprintf(p, end - p, "-> %-13s", in scnprintf_segment()
9558 if (i == (len - 1) || (i % seg_len) == (seg_len - 1)) in scnprintf_segment()
9559 p += scnprintf(p, end - p, "\n"); in scnprintf_segment()
9562 return p - buf; in scnprintf_segment()
9567 struct rtw89_btc *btc = &rtwdev->btc; in _show_dm_step()
9568 struct rtw89_btc_dm *dm = &btc->dm; in _show_dm_step()
9573 len = dm->dm_step.step_ov ? RTW89_BTC_DM_MAXSTEP : dm->dm_step.step_pos; in _show_dm_step()
9574 start_idx = dm->dm_step.step_ov ? dm->dm_step.step_pos : 0; in _show_dm_step()
9576 p += scnprintf_segment(p, end - p, "[dm_steps]", dm->dm_step.step, len, in _show_dm_step()
9577 6, start_idx, ARRAY_SIZE(dm->dm_step.step)); in _show_dm_step()
9579 return p - buf; in _show_dm_step()
9584 struct rtw89_btc *btc = &rtwdev->btc; in _show_dm_info()
9585 const struct rtw89_btc_ver *ver = btc->ver; in _show_dm_info()
9586 struct rtw89_btc_dm *dm = &btc->dm; in _show_dm_info()
9587 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_dm_info()
9588 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_dm_info()
9592 if (!(dm->coex_info_map & BTC_COEX_INFO_DM)) in _show_dm_info()
9595 p += scnprintf(p, end - p, in _show_dm_info()
9597 (btc->manual_ctrl ? "(Manual)" : "(Auto)")); in _show_dm_info()
9599 p += scnprintf(p, end - p, in _show_dm_info()
9600 " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%s, init_mode:%s, run_cnt:%d\n", in _show_dm_info()
9602 btc->ant_type == BTC_ANT_SHARED ? "shared" : "dedicated", in _show_dm_info()
9603 steps_to_str(dm->run_reason), in _show_dm_info()
9604 steps_to_str(dm->run_action | BTC_ACT_EXT_BIT), in _show_dm_info()
9605 id_to_ant(FIELD_GET(GENMASK(7, 0), dm->set_ant_path)), in _show_dm_info()
9606 id_to_mode(wl->coex_mode), in _show_dm_info()
9607 dm->cnt_dm[BTC_DCNT_RUN]); in _show_dm_info()
9609 p += _show_dm_step(rtwdev, p, end - p); in _show_dm_info()
9611 if (ver->fcxctrl == 7) in _show_dm_info()
9612 igno_bt = btc->ctrl.ctrl_v7.igno_bt; in _show_dm_info()
9614 igno_bt = btc->ctrl.ctrl.igno_bt; in _show_dm_info()
9616 p += scnprintf(p, end - p, in _show_dm_info()
9617 " %-15s : wl_only:%d, bt_only:%d, igno_bt:%d, free_run:%d, wl_ps_ctrl:%d, wl_mimo_ps:%d, ", in _show_dm_info()
9618 "[dm_flag]", dm->wl_only, dm->bt_only, igno_bt, in _show_dm_info()
9619 dm->freerun, btc->lps, dm->wl_mimo_ps); in _show_dm_info()
9621 p += scnprintf(p, end - p, "leak_ap:%d, fw_offload:%s%s\n", in _show_dm_info()
9622 dm->leak_ap, in _show_dm_info()
9624 (dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ? in _show_dm_info()
9627 if (dm->rf_trx_para.wl_tx_power == 0xff) in _show_dm_info()
9628 p += scnprintf(p, end - p, in _show_dm_info()
9629 " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:orig, ", in _show_dm_info()
9630 "[trx_ctrl]", wl->rssi_level, in _show_dm_info()
9631 dm->trx_para_level); in _show_dm_info()
9634 p += scnprintf(p, end - p, in _show_dm_info()
9635 " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:%d, ", in _show_dm_info()
9636 "[trx_ctrl]", wl->rssi_level, in _show_dm_info()
9637 dm->trx_para_level, in _show_dm_info()
9638 dm->rf_trx_para.wl_tx_power); in _show_dm_info()
9640 p += scnprintf(p, end - p, in _show_dm_info()
9641 "wl_rx_lvl:%d, bt_tx_pwr_dec:%d, bt_rx_lna:%d(%s-tbl), wl_btg_rx:%d\n", in _show_dm_info()
9642 dm->rf_trx_para.wl_rx_gain, in _show_dm_info()
9643 dm->rf_trx_para.bt_tx_power, in _show_dm_info()
9644 dm->rf_trx_para.bt_rx_gain, in _show_dm_info()
9645 (bt->hi_lna_rx ? "Hi" : "Ori"), dm->wl_btg_rx); in _show_dm_info()
9647 p += scnprintf(p, end - p, in _show_dm_info()
9648 … " %-15s : wl_tx_limit[en:%d/max_t:%dus/max_retry:%d], bt_slot_reg:%d-TU, bt_scan_rx_low_pri:%d\n", in _show_dm_info()
9649 "[dm_ctrl]", dm->wl_tx_limit.enable, in _show_dm_info()
9650 dm->wl_tx_limit.tx_time, in _show_dm_info()
9651 dm->wl_tx_limit.tx_retry, btc->bt_req_len, in _show_dm_info()
9652 bt->scan_rx_low_pri); in _show_dm_info()
9654 return p - buf; in _show_dm_info()
9659 struct rtw89_btc *btc = &rtwdev->btc; in _show_error()
9660 const struct rtw89_btc_ver *ver = btc->ver; in _show_error()
9661 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_error()
9666 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; in _show_error()
9667 if (ver->fcxcysta == 2) { in _show_error()
9668 pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2; in _show_error()
9669 except_cnt = le32_to_cpu(pcysta->v2.except_cnt); in _show_error()
9670 exception_map = le32_to_cpu(pcysta->v2.exception); in _show_error()
9671 } else if (ver->fcxcysta == 3) { in _show_error()
9672 pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3; in _show_error()
9673 except_cnt = le32_to_cpu(pcysta->v3.except_cnt); in _show_error()
9674 exception_map = le32_to_cpu(pcysta->v3.except_map); in _show_error()
9675 } else if (ver->fcxcysta == 4) { in _show_error()
9676 pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4; in _show_error()
9677 except_cnt = pcysta->v4.except_cnt; in _show_error()
9678 exception_map = le32_to_cpu(pcysta->v4.except_map); in _show_error()
9679 } else if (ver->fcxcysta == 5) { in _show_error()
9680 pcysta->v5 = pfwinfo->rpt_fbtc_cysta.finfo.v5; in _show_error()
9681 except_cnt = pcysta->v5.except_cnt; in _show_error()
9682 exception_map = le32_to_cpu(pcysta->v5.except_map); in _show_error()
9683 } else if (ver->fcxcysta == 7) { in _show_error()
9684 pcysta->v7 = pfwinfo->rpt_fbtc_cysta.finfo.v7; in _show_error()
9685 except_cnt = pcysta->v7.except_cnt; in _show_error()
9686 exception_map = le32_to_cpu(pcysta->v7.except_map); in _show_error()
9691 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW] == 0 && except_cnt == 0 && in _show_error()
9692 !pfwinfo->len_mismch && !pfwinfo->fver_mismch) in _show_error()
9695 p += scnprintf(p, end - p, " %-15s : ", "[error]"); in _show_error()
9697 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]) { in _show_error()
9698 p += scnprintf(p, end - p, in _show_error()
9699 "overflow-cnt: %d, ", in _show_error()
9700 pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]); in _show_error()
9703 if (pfwinfo->len_mismch) { in _show_error()
9704 p += scnprintf(p, end - p, in _show_error()
9705 "len-mismatch: 0x%x, ", in _show_error()
9706 pfwinfo->len_mismch); in _show_error()
9709 if (pfwinfo->fver_mismch) { in _show_error()
9710 p += scnprintf(p, end - p, in _show_error()
9711 "fver-mismatch: 0x%x, ", in _show_error()
9712 pfwinfo->fver_mismch); in _show_error()
9717 p += scnprintf(p, end - p, in _show_error()
9718 "exception-type: 0x%x, exception-cnt = %d", in _show_error()
9721 p += scnprintf(p, end - p, "\n"); in _show_error()
9723 return p - buf; in _show_error()
9728 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_tdma()
9729 const struct rtw89_btc_ver *ver = btc->ver; in _show_fbtc_tdma()
9730 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_tdma()
9735 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo; in _show_fbtc_tdma()
9736 if (!pcinfo->valid) in _show_fbtc_tdma()
9739 if (ver->fcxtdma == 1) in _show_fbtc_tdma()
9740 t = &pfwinfo->rpt_fbtc_tdma.finfo.v1; in _show_fbtc_tdma()
9742 t = &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma; in _show_fbtc_tdma()
9744 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9745 " %-15s : ", "[tdma_policy]"); in _show_fbtc_tdma()
9746 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9748 (u32)t->type, in _show_fbtc_tdma()
9749 t->rxflctrl, t->txpause); in _show_fbtc_tdma()
9751 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9753 t->wtgle_n, t->leak_n, t->ext_ctrl); in _show_fbtc_tdma()
9755 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9757 (u32)btc->policy_type); in _show_fbtc_tdma()
9759 p += scnprintf(p, end - p, "\n"); in _show_fbtc_tdma()
9761 return p - buf; in _show_fbtc_tdma()
9766 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_slots()
9767 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_slots()
9774 if (btc->ver->fcxslots == 1) { in _show_fbtc_slots()
9775 dur = le16_to_cpu(dm->slot_now.v1[i].dur); in _show_fbtc_slots()
9776 tbl = le32_to_cpu(dm->slot_now.v1[i].cxtbl); in _show_fbtc_slots()
9777 cxtype = le16_to_cpu(dm->slot_now.v1[i].cxtype); in _show_fbtc_slots()
9778 } else if (btc->ver->fcxslots == 7) { in _show_fbtc_slots()
9779 dur = le16_to_cpu(dm->slot_now.v7[i].dur); in _show_fbtc_slots()
9780 tbl = le32_to_cpu(dm->slot_now.v7[i].cxtbl); in _show_fbtc_slots()
9781 cxtype = le16_to_cpu(dm->slot_now.v7[i].cxtype); in _show_fbtc_slots()
9787 p += scnprintf(p, end - p, in _show_fbtc_slots()
9788 " %-15s : %5s[%03d/0x%x/%d]", in _show_fbtc_slots()
9793 p += scnprintf(p, end - p, in _show_fbtc_slots()
9799 p += scnprintf(p, end - p, "\n"); in _show_fbtc_slots()
9802 return p - buf; in _show_fbtc_slots()
9807 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v2()
9808 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v2()
9809 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v2()
9810 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v2()
9818 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v2()
9819 if (!pcinfo->valid) in _show_fbtc_cysta_v2()
9822 pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo.v2; in _show_fbtc_cysta_v2()
9823 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9824 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v2()
9826 le16_to_cpu(pcysta_le32->cycles), in _show_fbtc_cysta_v2()
9827 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v2()
9828 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v2()
9829 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v2()
9830 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v2()
9833 if (!le32_to_cpu(pcysta_le32->slot_cnt[i])) in _show_fbtc_cysta_v2()
9835 p += scnprintf(p, end - p, ", %s:%d", id_to_slot((u32)i), in _show_fbtc_cysta_v2()
9836 le32_to_cpu(pcysta_le32->slot_cnt[i])); in _show_fbtc_cysta_v2()
9839 if (dm->tdma_now.rxflctrl) { in _show_fbtc_cysta_v2()
9840 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v2()
9841 le32_to_cpu(pcysta_le32->leakrx_cnt)); in _show_fbtc_cysta_v2()
9844 if (le32_to_cpu(pcysta_le32->collision_cnt)) { in _show_fbtc_cysta_v2()
9845 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v2()
9846 le32_to_cpu(pcysta_le32->collision_cnt)); in _show_fbtc_cysta_v2()
9849 if (le32_to_cpu(pcysta_le32->skip_cnt)) { in _show_fbtc_cysta_v2()
9850 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v2()
9851 le32_to_cpu(pcysta_le32->skip_cnt)); in _show_fbtc_cysta_v2()
9853 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v2()
9855 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v2()
9857 le16_to_cpu(pcysta_le32->tavg_cycle[CXT_WL]), in _show_fbtc_cysta_v2()
9858 le16_to_cpu(pcysta_le32->tavg_cycle[CXT_BT]), in _show_fbtc_cysta_v2()
9859 le16_to_cpu(pcysta_le32->tavg_lk) / 1000, in _show_fbtc_cysta_v2()
9860 le16_to_cpu(pcysta_le32->tavg_lk) % 1000); in _show_fbtc_cysta_v2()
9861 p += scnprintf(p, end - p, ", max_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v2()
9862 le16_to_cpu(pcysta_le32->tmax_cycle[CXT_WL]), in _show_fbtc_cysta_v2()
9863 le16_to_cpu(pcysta_le32->tmax_cycle[CXT_BT]), in _show_fbtc_cysta_v2()
9864 le16_to_cpu(pcysta_le32->tmax_lk) / 1000, in _show_fbtc_cysta_v2()
9865 le16_to_cpu(pcysta_le32->tmax_lk) % 1000); in _show_fbtc_cysta_v2()
9866 p += scnprintf(p, end - p, ", maxdiff_t[wl:%d/bt:%d]\n", in _show_fbtc_cysta_v2()
9867 le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_WL]), in _show_fbtc_cysta_v2()
9868 le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_BT])); in _show_fbtc_cysta_v2()
9870 if (le16_to_cpu(pcysta_le32->cycles) <= 1) in _show_fbtc_cysta_v2()
9873 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v2()
9876 if (le16_to_cpu(pcysta_le32->cycles) <= slot_pair) in _show_fbtc_cysta_v2()
9879 c_begin = le16_to_cpu(pcysta_le32->cycles) - slot_pair + 1; in _show_fbtc_cysta_v2()
9881 c_end = le16_to_cpu(pcysta_le32->cycles); in _show_fbtc_cysta_v2()
9885 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v2()
9888 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9889 " %-15s : ->b%02d->w%02d", in _show_fbtc_cysta_v2()
9891 le16_to_cpu(pcysta_le32->tslot_cycle[store_index]), in _show_fbtc_cysta_v2()
9892 le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1])); in _show_fbtc_cysta_v2()
9894 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9895 "->b%02d->w%02d", in _show_fbtc_cysta_v2()
9896 le16_to_cpu(pcysta_le32->tslot_cycle[store_index]), in _show_fbtc_cysta_v2()
9897 le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1])); in _show_fbtc_cysta_v2()
9899 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v2()
9902 if (a2dp->exist) { in _show_fbtc_cysta_v2()
9903 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9904 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v2()
9906 le16_to_cpu(pcysta_le32->a2dpept), in _show_fbtc_cysta_v2()
9907 le16_to_cpu(pcysta_le32->a2dpeptto)); in _show_fbtc_cysta_v2()
9909 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9911 le16_to_cpu(pcysta_le32->tavg_a2dpept), in _show_fbtc_cysta_v2()
9912 le16_to_cpu(pcysta_le32->tmax_a2dpept)); in _show_fbtc_cysta_v2()
9913 r.val = dm->tdma_now.rxflctrl; in _show_fbtc_cysta_v2()
9916 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9918 le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_ON]), in _show_fbtc_cysta_v2()
9919 le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_OFF])); in _show_fbtc_cysta_v2()
9921 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9923 le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_ON]), in _show_fbtc_cysta_v2()
9924 le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_OFF])); in _show_fbtc_cysta_v2()
9926 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9928 le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_ON]), in _show_fbtc_cysta_v2()
9929 le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_OFF])); in _show_fbtc_cysta_v2()
9931 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v2()
9935 return p - buf; in _show_fbtc_cysta_v2()
9940 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v3()
9941 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v3()
9942 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v3()
9943 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v3()
9951 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v3()
9952 if (!pcinfo->valid) in _show_fbtc_cysta_v3()
9955 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v3; in _show_fbtc_cysta_v3()
9956 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
9957 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v3()
9959 le16_to_cpu(pcysta->cycles), in _show_fbtc_cysta_v3()
9960 le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v3()
9961 le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v3()
9962 le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v3()
9963 le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v3()
9966 if (!le32_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v3()
9969 p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i), in _show_fbtc_cysta_v3()
9970 le32_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v3()
9973 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v3()
9974 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v3()
9975 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v3()
9977 if (le32_to_cpu(pcysta->collision_cnt)) in _show_fbtc_cysta_v3()
9978 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v3()
9979 le32_to_cpu(pcysta->collision_cnt)); in _show_fbtc_cysta_v3()
9981 if (le32_to_cpu(pcysta->skip_cnt)) in _show_fbtc_cysta_v3()
9982 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v3()
9983 le32_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v3()
9985 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v3()
9987 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v3()
9989 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v3()
9990 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v3()
9991 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v3()
9992 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v3()
9993 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
9995 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v3()
9996 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v3()
9997 le16_to_cpu(pcysta->leak_slot.tmax) / 1000, in _show_fbtc_cysta_v3()
9998 le16_to_cpu(pcysta->leak_slot.tmax) % 1000); in _show_fbtc_cysta_v3()
9999 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
10001 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]), in _show_fbtc_cysta_v3()
10002 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT])); in _show_fbtc_cysta_v3()
10004 cycle = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v3()
10008 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v3()
10014 c_begin = cycle - slot_pair + 1; in _show_fbtc_cysta_v3()
10018 if (a2dp->exist) in _show_fbtc_cysta_v3()
10025 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v3()
10028 p += scnprintf(p, end - p, " %-15s : ", in _show_fbtc_cysta_v3()
10031 p += scnprintf(p, end - p, "->b%02d", in _show_fbtc_cysta_v3()
10032 le16_to_cpu(pcysta->slot_step_time[store_index])); in _show_fbtc_cysta_v3()
10033 if (a2dp->exist) { in _show_fbtc_cysta_v3()
10034 a2dp_trx = &pcysta->a2dp_trx[store_index]; in _show_fbtc_cysta_v3()
10035 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v3()
10036 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v3()
10037 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v3()
10038 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v3()
10039 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v3()
10040 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v3()
10041 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v3()
10043 p += scnprintf(p, end - p, "->w%02d", in _show_fbtc_cysta_v3()
10044 le16_to_cpu(pcysta->slot_step_time[store_index + 1])); in _show_fbtc_cysta_v3()
10045 if (a2dp->exist) { in _show_fbtc_cysta_v3()
10046 a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; in _show_fbtc_cysta_v3()
10047 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v3()
10048 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v3()
10049 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v3()
10050 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v3()
10051 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v3()
10052 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v3()
10053 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v3()
10056 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v3()
10059 if (a2dp->exist) { in _show_fbtc_cysta_v3()
10060 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
10061 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v3()
10063 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v3()
10064 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); in _show_fbtc_cysta_v3()
10066 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v3()
10067 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v3()
10068 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v3()
10070 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v3()
10074 return p - buf; in _show_fbtc_cysta_v3()
10079 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v4()
10080 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v4()
10081 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v4()
10082 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v4()
10090 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v4()
10091 if (!pcinfo->valid) in _show_fbtc_cysta_v4()
10094 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v4; in _show_fbtc_cysta_v4()
10095 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
10096 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v4()
10098 le16_to_cpu(pcysta->cycles), in _show_fbtc_cysta_v4()
10099 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v4()
10100 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v4()
10101 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v4()
10102 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v4()
10105 if (!le16_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v4()
10108 p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i), in _show_fbtc_cysta_v4()
10109 le16_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v4()
10112 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v4()
10113 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v4()
10114 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v4()
10116 if (pcysta->collision_cnt) in _show_fbtc_cysta_v4()
10117 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v4()
10118 pcysta->collision_cnt); in _show_fbtc_cysta_v4()
10120 if (le16_to_cpu(pcysta->skip_cnt)) in _show_fbtc_cysta_v4()
10121 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v4()
10122 le16_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v4()
10124 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v4()
10126 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v4()
10128 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v4()
10129 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v4()
10130 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v4()
10131 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v4()
10132 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
10134 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v4()
10135 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v4()
10136 le16_to_cpu(pcysta->leak_slot.tmax) / 1000, in _show_fbtc_cysta_v4()
10137 le16_to_cpu(pcysta->leak_slot.tmax) % 1000); in _show_fbtc_cysta_v4()
10138 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
10140 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]), in _show_fbtc_cysta_v4()
10141 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT])); in _show_fbtc_cysta_v4()
10143 cycle = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v4()
10147 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v4()
10153 c_begin = cycle - slot_pair + 1; in _show_fbtc_cysta_v4()
10157 if (a2dp->exist) in _show_fbtc_cysta_v4()
10164 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v4()
10167 p += scnprintf(p, end - p, " %-15s : ", in _show_fbtc_cysta_v4()
10170 p += scnprintf(p, end - p, "->b%02d", in _show_fbtc_cysta_v4()
10171 le16_to_cpu(pcysta->slot_step_time[store_index])); in _show_fbtc_cysta_v4()
10172 if (a2dp->exist) { in _show_fbtc_cysta_v4()
10173 a2dp_trx = &pcysta->a2dp_trx[store_index]; in _show_fbtc_cysta_v4()
10174 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v4()
10175 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v4()
10176 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v4()
10177 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v4()
10178 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v4()
10179 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v4()
10180 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v4()
10182 p += scnprintf(p, end - p, "->w%02d", in _show_fbtc_cysta_v4()
10183 le16_to_cpu(pcysta->slot_step_time[store_index + 1])); in _show_fbtc_cysta_v4()
10184 if (a2dp->exist) { in _show_fbtc_cysta_v4()
10185 a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; in _show_fbtc_cysta_v4()
10186 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v4()
10187 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v4()
10188 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v4()
10189 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v4()
10190 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v4()
10191 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v4()
10192 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v4()
10195 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v4()
10198 if (a2dp->exist) { in _show_fbtc_cysta_v4()
10199 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
10200 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v4()
10202 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v4()
10203 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); in _show_fbtc_cysta_v4()
10205 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v4()
10206 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v4()
10207 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v4()
10209 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v4()
10213 return p - buf; in _show_fbtc_cysta_v4()
10218 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v5()
10219 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v5()
10220 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v5()
10221 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v5()
10229 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v5()
10230 if (!pcinfo->valid) in _show_fbtc_cysta_v5()
10233 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v5; in _show_fbtc_cysta_v5()
10234 p += scnprintf(p, end - p, in _show_fbtc_cysta_v5()
10235 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v5()
10237 le16_to_cpu(pcysta->cycles), in _show_fbtc_cysta_v5()
10238 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v5()
10239 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v5()
10240 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v5()
10241 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v5()
10244 if (!le16_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v5()
10247 p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i), in _show_fbtc_cysta_v5()
10248 le16_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v5()
10251 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v5()
10252 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v5()
10253 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v5()
10255 if (pcysta->collision_cnt) in _show_fbtc_cysta_v5()
10256 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v5()
10257 pcysta->collision_cnt); in _show_fbtc_cysta_v5()
10259 if (le16_to_cpu(pcysta->skip_cnt)) in _show_fbtc_cysta_v5()
10260 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v5()
10261 le16_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v5()
10263 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v5()
10265 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v5()
10267 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v5()
10268 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v5()
10269 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v5()
10270 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v5()
10271 p += scnprintf(p, end - p, in _show_fbtc_cysta_v5()
10273 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v5()
10274 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v5()
10275 le16_to_cpu(pcysta->leak_slot.tmax) / 1000, in _show_fbtc_cysta_v5()
10276 le16_to_cpu(pcysta->leak_slot.tmax) % 1000); in _show_fbtc_cysta_v5()
10278 cycle = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v5()
10282 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v5()
10288 c_begin = cycle - slot_pair + 1; in _show_fbtc_cysta_v5()
10292 if (a2dp->exist) in _show_fbtc_cysta_v5()
10302 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v5()
10305 p += scnprintf(p, end - p, " %-15s : ", in _show_fbtc_cysta_v5()
10308 p += scnprintf(p, end - p, "->b%02d", in _show_fbtc_cysta_v5()
10309 le16_to_cpu(pcysta->slot_step_time[store_index])); in _show_fbtc_cysta_v5()
10310 if (a2dp->exist) { in _show_fbtc_cysta_v5()
10311 a2dp_trx = &pcysta->a2dp_trx[store_index]; in _show_fbtc_cysta_v5()
10312 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v5()
10313 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v5()
10314 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v5()
10315 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v5()
10316 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v5()
10317 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v5()
10318 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v5()
10320 p += scnprintf(p, end - p, "->w%02d", in _show_fbtc_cysta_v5()
10321 le16_to_cpu(pcysta->slot_step_time[store_index + 1])); in _show_fbtc_cysta_v5()
10322 if (a2dp->exist) { in _show_fbtc_cysta_v5()
10323 a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; in _show_fbtc_cysta_v5()
10324 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v5()
10325 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v5()
10326 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v5()
10327 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v5()
10328 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v5()
10329 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v5()
10330 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v5()
10333 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v5()
10336 if (a2dp->exist) { in _show_fbtc_cysta_v5()
10337 p += scnprintf(p, end - p, in _show_fbtc_cysta_v5()
10338 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v5()
10340 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v5()
10341 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); in _show_fbtc_cysta_v5()
10343 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v5()
10344 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v5()
10345 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v5()
10347 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v5()
10351 return p - buf; in _show_fbtc_cysta_v5()
10356 struct rtw89_btc_bt_info *bt = &rtwdev->btc.cx.bt; in _show_fbtc_cysta_v7()
10357 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt->link_info.a2dp_desc; in _show_fbtc_cysta_v7()
10358 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_fbtc_cysta_v7()
10360 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _show_fbtc_cysta_v7()
10367 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v7()
10368 if (!pcinfo->valid) in _show_fbtc_cysta_v7()
10371 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v7; in _show_fbtc_cysta_v7()
10372 p += scnprintf(p, end - p, "\n %-15s : cycle:%d", "[slot_stat]", in _show_fbtc_cysta_v7()
10373 le16_to_cpu(pcysta->cycles)); in _show_fbtc_cysta_v7()
10376 if (!le16_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v7()
10378 p += scnprintf(p, end - p, ", %s:%d", in _show_fbtc_cysta_v7()
10380 le16_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v7()
10383 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v7()
10384 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v7()
10385 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v7()
10387 if (pcysta->collision_cnt) in _show_fbtc_cysta_v7()
10388 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v7()
10389 pcysta->collision_cnt); in _show_fbtc_cysta_v7()
10391 if (pcysta->skip_cnt) in _show_fbtc_cysta_v7()
10392 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v7()
10393 le16_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v7()
10395 p += scnprintf(p, end - p, in _show_fbtc_cysta_v7()
10396 "\n\r %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v7()
10398 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v7()
10399 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v7()
10400 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v7()
10401 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v7()
10402 p += scnprintf(p, end - p, in _show_fbtc_cysta_v7()
10404 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v7()
10405 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v7()
10406 dm->bt_slot_flood, dm->cnt_dm[BTC_DCNT_BT_SLOT_FLOOD], in _show_fbtc_cysta_v7()
10407 le16_to_cpu(pcysta->leak_slot.tamx) / 1000, in _show_fbtc_cysta_v7()
10408 le16_to_cpu(pcysta->leak_slot.tamx) % 1000); in _show_fbtc_cysta_v7()
10409 p += scnprintf(p, end - p, ", bcn[all:%d/ok:%d/in_bt:%d/in_bt_ok:%d]", in _show_fbtc_cysta_v7()
10410 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v7()
10411 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v7()
10412 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v7()
10413 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v7()
10415 if (a2dp->exist) { in _show_fbtc_cysta_v7()
10416 p += scnprintf(p, end - p, in _show_fbtc_cysta_v7()
10417 "\n\r %-15s : a2dp_ept:%d, a2dp_late:%d(streak 2S:%d/max:%d)", in _show_fbtc_cysta_v7()
10419 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v7()
10420 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout), in _show_fbtc_cysta_v7()
10421 a2dp->no_empty_streak_2s, in _show_fbtc_cysta_v7()
10422 a2dp->no_empty_streak_max); in _show_fbtc_cysta_v7()
10424 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v7()
10425 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v7()
10426 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v7()
10429 if (le16_to_cpu(pcysta->cycles) <= 1) in _show_fbtc_cysta_v7()
10432 /* 1 cycle = 1 wl-slot + 1 bt-slot */ in _show_fbtc_cysta_v7()
10435 if (le16_to_cpu(pcysta->cycles) <= slot_pair) in _show_fbtc_cysta_v7()
10438 c_begin = le16_to_cpu(pcysta->cycles) - slot_pair + 1; in _show_fbtc_cysta_v7()
10440 c_end = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v7()
10442 if (a2dp->exist) in _show_fbtc_cysta_v7()
10452 s_id = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v7()
10455 if (a2dp->exist) in _show_fbtc_cysta_v7()
10456 p += scnprintf(p, end - p, "\n\r %-15s : ", in _show_fbtc_cysta_v7()
10459 p += scnprintf(p, end - p, "\n\r %-15s : ", in _show_fbtc_cysta_v7()
10463 p += scnprintf(p, end - p, "->b%d", in _show_fbtc_cysta_v7()
10464 le16_to_cpu(pcysta->slot_step_time[s_id])); in _show_fbtc_cysta_v7()
10466 if (a2dp->exist) in _show_fbtc_cysta_v7()
10467 p += scnprintf(p, end - p, "(%d/%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v7()
10468 pcysta->wl_rx_err_ratio[s_id], in _show_fbtc_cysta_v7()
10469 pcysta->a2dp_trx[s_id].empty_cnt, in _show_fbtc_cysta_v7()
10470 pcysta->a2dp_trx[s_id].retry_cnt, in _show_fbtc_cysta_v7()
10471 (pcysta->a2dp_trx[s_id].tx_rate ? 3 : 2), in _show_fbtc_cysta_v7()
10472 pcysta->a2dp_trx[s_id].tx_cnt, in _show_fbtc_cysta_v7()
10473 pcysta->a2dp_trx[s_id].ack_cnt, in _show_fbtc_cysta_v7()
10474 pcysta->a2dp_trx[s_id].nack_cnt); in _show_fbtc_cysta_v7()
10476 p += scnprintf(p, end - p, "(%d)", in _show_fbtc_cysta_v7()
10477 pcysta->wl_rx_err_ratio[s_id]); in _show_fbtc_cysta_v7()
10479 p += scnprintf(p, end - p, "->w%d", in _show_fbtc_cysta_v7()
10480 le16_to_cpu(pcysta->slot_step_time[s_id + 1])); in _show_fbtc_cysta_v7()
10482 if (a2dp->exist) in _show_fbtc_cysta_v7()
10483 p += scnprintf(p, end - p, "(%d/%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v7()
10484 pcysta->wl_rx_err_ratio[s_id + 1], in _show_fbtc_cysta_v7()
10485 pcysta->a2dp_trx[s_id + 1].empty_cnt, in _show_fbtc_cysta_v7()
10486 pcysta->a2dp_trx[s_id + 1].retry_cnt, in _show_fbtc_cysta_v7()
10487 (pcysta->a2dp_trx[s_id + 1].tx_rate ? 3 : 2), in _show_fbtc_cysta_v7()
10488 pcysta->a2dp_trx[s_id + 1].tx_cnt, in _show_fbtc_cysta_v7()
10489 pcysta->a2dp_trx[s_id + 1].ack_cnt, in _show_fbtc_cysta_v7()
10490 pcysta->a2dp_trx[s_id + 1].nack_cnt); in _show_fbtc_cysta_v7()
10492 p += scnprintf(p, end - p, "(%d)", in _show_fbtc_cysta_v7()
10493 pcysta->wl_rx_err_ratio[s_id + 1]); in _show_fbtc_cysta_v7()
10497 return p - buf; in _show_fbtc_cysta_v7()
10502 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_nullsta()
10503 const struct rtw89_btc_ver *ver = btc->ver; in _show_fbtc_nullsta()
10504 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_nullsta()
10510 if (!btc->dm.tdma_now.rxflctrl) in _show_fbtc_nullsta()
10513 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo; in _show_fbtc_nullsta()
10514 if (!pcinfo->valid) in _show_fbtc_nullsta()
10517 ns = &pfwinfo->rpt_fbtc_nullsta.finfo; in _show_fbtc_nullsta()
10518 if (ver->fcxnullsta == 1) { in _show_fbtc_nullsta()
10520 p += scnprintf(p, end - p, " %-15s : ", "\n[NULL-STA]"); in _show_fbtc_nullsta()
10521 p += scnprintf(p, end - p, "null-%d", i); in _show_fbtc_nullsta()
10522 p += scnprintf(p, end - p, "[ok:%d/", in _show_fbtc_nullsta()
10523 le32_to_cpu(ns->v1.result[i][1])); in _show_fbtc_nullsta()
10524 p += scnprintf(p, end - p, "fail:%d/", in _show_fbtc_nullsta()
10525 le32_to_cpu(ns->v1.result[i][0])); in _show_fbtc_nullsta()
10526 p += scnprintf(p, end - p, "on_time:%d/", in _show_fbtc_nullsta()
10527 le32_to_cpu(ns->v1.result[i][2])); in _show_fbtc_nullsta()
10528 p += scnprintf(p, end - p, "retry:%d/", in _show_fbtc_nullsta()
10529 le32_to_cpu(ns->v1.result[i][3])); in _show_fbtc_nullsta()
10530 p += scnprintf(p, end - p, "avg_t:%d.%03d/", in _show_fbtc_nullsta()
10531 le32_to_cpu(ns->v1.avg_t[i]) / 1000, in _show_fbtc_nullsta()
10532 le32_to_cpu(ns->v1.avg_t[i]) % 1000); in _show_fbtc_nullsta()
10533 p += scnprintf(p, end - p, "max_t:%d.%03d]", in _show_fbtc_nullsta()
10534 le32_to_cpu(ns->v1.max_t[i]) / 1000, in _show_fbtc_nullsta()
10535 le32_to_cpu(ns->v1.max_t[i]) % 1000); in _show_fbtc_nullsta()
10537 } else if (ver->fcxnullsta == 7) { in _show_fbtc_nullsta()
10539 p += scnprintf(p, end - p, " %-15s : ", "\n[NULL-STA]"); in _show_fbtc_nullsta()
10540 p += scnprintf(p, end - p, "null-%d", i); in _show_fbtc_nullsta()
10541 p += scnprintf(p, end - p, "[Tx:%d/", in _show_fbtc_nullsta()
10542 le32_to_cpu(ns->v7.result[i][4])); in _show_fbtc_nullsta()
10543 p += scnprintf(p, end - p, "[ok:%d/", in _show_fbtc_nullsta()
10544 le32_to_cpu(ns->v7.result[i][1])); in _show_fbtc_nullsta()
10545 p += scnprintf(p, end - p, "fail:%d/", in _show_fbtc_nullsta()
10546 le32_to_cpu(ns->v7.result[i][0])); in _show_fbtc_nullsta()
10547 p += scnprintf(p, end - p, "on_time:%d/", in _show_fbtc_nullsta()
10548 le32_to_cpu(ns->v7.result[i][2])); in _show_fbtc_nullsta()
10549 p += scnprintf(p, end - p, "retry:%d/", in _show_fbtc_nullsta()
10550 le32_to_cpu(ns->v7.result[i][3])); in _show_fbtc_nullsta()
10551 p += scnprintf(p, end - p, "avg_t:%d.%03d/", in _show_fbtc_nullsta()
10552 le32_to_cpu(ns->v7.tavg[i]) / 1000, in _show_fbtc_nullsta()
10553 le32_to_cpu(ns->v7.tavg[i]) % 1000); in _show_fbtc_nullsta()
10554 p += scnprintf(p, end - p, "max_t:%d.%03d]", in _show_fbtc_nullsta()
10555 le32_to_cpu(ns->v7.tmax[i]) / 1000, in _show_fbtc_nullsta()
10556 le32_to_cpu(ns->v7.tmax[i]) % 1000); in _show_fbtc_nullsta()
10560 p += scnprintf(p, end - p, " %-15s : ", "\n[NULL-STA]"); in _show_fbtc_nullsta()
10561 p += scnprintf(p, end - p, "null-%d", i); in _show_fbtc_nullsta()
10562 p += scnprintf(p, end - p, "[Tx:%d/", in _show_fbtc_nullsta()
10563 le32_to_cpu(ns->v2.result[i][4])); in _show_fbtc_nullsta()
10564 p += scnprintf(p, end - p, "[ok:%d/", in _show_fbtc_nullsta()
10565 le32_to_cpu(ns->v2.result[i][1])); in _show_fbtc_nullsta()
10566 p += scnprintf(p, end - p, "fail:%d/", in _show_fbtc_nullsta()
10567 le32_to_cpu(ns->v2.result[i][0])); in _show_fbtc_nullsta()
10568 p += scnprintf(p, end - p, "on_time:%d/", in _show_fbtc_nullsta()
10569 le32_to_cpu(ns->v2.result[i][2])); in _show_fbtc_nullsta()
10570 p += scnprintf(p, end - p, "retry:%d/", in _show_fbtc_nullsta()
10571 le32_to_cpu(ns->v2.result[i][3])); in _show_fbtc_nullsta()
10572 p += scnprintf(p, end - p, "avg_t:%d.%03d/", in _show_fbtc_nullsta()
10573 le32_to_cpu(ns->v2.avg_t[i]) / 1000, in _show_fbtc_nullsta()
10574 le32_to_cpu(ns->v2.avg_t[i]) % 1000); in _show_fbtc_nullsta()
10575 p += scnprintf(p, end - p, "max_t:%d.%03d]", in _show_fbtc_nullsta()
10576 le32_to_cpu(ns->v2.max_t[i]) / 1000, in _show_fbtc_nullsta()
10577 le32_to_cpu(ns->v2.max_t[i]) % 1000); in _show_fbtc_nullsta()
10581 return p - buf; in _show_fbtc_nullsta()
10586 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_step_v2()
10587 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_step_v2()
10590 const struct rtw89_btc_ver *ver = btc->ver; in _show_fbtc_step_v2()
10597 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; in _show_fbtc_step_v2()
10598 if (!pcinfo->valid) in _show_fbtc_step_v2()
10601 pstep = &pfwinfo->rpt_fbtc_step.finfo.v2; in _show_fbtc_step_v2()
10602 pos_old = le16_to_cpu(pstep->pos_old); in _show_fbtc_step_v2()
10603 pos_new = le16_to_cpu(pstep->pos_new); in _show_fbtc_step_v2()
10605 if (pcinfo->req_fver != pstep->fver) in _show_fbtc_step_v2()
10612 if (ver->fcxctrl == 7 || ver->fcxctrl == 1) in _show_fbtc_step_v2()
10615 trace_step = btc->ctrl.ctrl.trace_step; in _show_fbtc_step_v2()
10621 n_stop = trace_step - 1; in _show_fbtc_step_v2()
10627 type = pstep->step[i].type; in _show_fbtc_step_v2()
10628 val = pstep->step[i].val; in _show_fbtc_step_v2()
10629 diff_t = le16_to_cpu(pstep->step[i].difft); in _show_fbtc_step_v2()
10635 p += scnprintf(p, end - p, in _show_fbtc_step_v2()
10636 " %-15s : ", "[steps]"); in _show_fbtc_step_v2()
10638 p += scnprintf(p, end - p, in _show_fbtc_step_v2()
10639 "-> %s(%02d)(%02d)", in _show_fbtc_step_v2()
10641 "EVT"), (u32)val, diff_t); in _show_fbtc_step_v2()
10643 p += scnprintf(p, end - p, "\n"); in _show_fbtc_step_v2()
10661 return p - buf; in _show_fbtc_step_v2()
10666 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_step_v3()
10667 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_step_v3()
10675 if ((pfwinfo->rpt_en_map & in _show_fbtc_step_v3()
10679 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; in _show_fbtc_step_v3()
10680 if (!pcinfo->valid) in _show_fbtc_step_v3()
10683 pstep = &pfwinfo->rpt_fbtc_step.finfo.v3; in _show_fbtc_step_v3()
10684 if (pcinfo->req_fver != pstep->fver) in _show_fbtc_step_v3()
10687 if (le32_to_cpu(pstep->cnt) <= FCXDEF_STEP) in _show_fbtc_step_v3()
10690 n_begin = le32_to_cpu(pstep->cnt) - FCXDEF_STEP + 1; in _show_fbtc_step_v3()
10692 n_end = le32_to_cpu(pstep->cnt); in _show_fbtc_step_v3()
10699 array_idx = (i - 1) % FCXDEF_STEP; in _show_fbtc_step_v3()
10700 type = pstep->step[array_idx].type; in _show_fbtc_step_v3()
10701 val = pstep->step[array_idx].val; in _show_fbtc_step_v3()
10702 diff_t = le16_to_cpu(pstep->step[array_idx].difft); in _show_fbtc_step_v3()
10708 p += scnprintf(p, end - p, " %-15s : ", "[steps]"); in _show_fbtc_step_v3()
10710 p += scnprintf(p, end - p, "-> %s(%02d)", in _show_fbtc_step_v3()
10716 p += scnprintf(p, end - p, "\n"); in _show_fbtc_step_v3()
10721 return p - buf; in _show_fbtc_step_v3()
10726 struct rtw89_btc *btc = &rtwdev->btc; in _show_fw_dm_msg()
10727 const struct rtw89_btc_ver *ver = btc->ver; in _show_fw_dm_msg()
10730 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_DM)) in _show_fw_dm_msg()
10733 p += _show_error(rtwdev, p, end - p); in _show_fw_dm_msg()
10734 p += _show_fbtc_tdma(rtwdev, p, end - p); in _show_fw_dm_msg()
10735 p += _show_fbtc_slots(rtwdev, p, end - p); in _show_fw_dm_msg()
10737 if (ver->fcxcysta == 2) in _show_fw_dm_msg()
10738 p += _show_fbtc_cysta_v2(rtwdev, p, end - p); in _show_fw_dm_msg()
10739 else if (ver->fcxcysta == 3) in _show_fw_dm_msg()
10740 p += _show_fbtc_cysta_v3(rtwdev, p, end - p); in _show_fw_dm_msg()
10741 else if (ver->fcxcysta == 4) in _show_fw_dm_msg()
10742 p += _show_fbtc_cysta_v4(rtwdev, p, end - p); in _show_fw_dm_msg()
10743 else if (ver->fcxcysta == 5) in _show_fw_dm_msg()
10744 p += _show_fbtc_cysta_v5(rtwdev, p, end - p); in _show_fw_dm_msg()
10745 else if (ver->fcxcysta == 7) in _show_fw_dm_msg()
10746 p += _show_fbtc_cysta_v7(rtwdev, p, end - p); in _show_fw_dm_msg()
10748 p += _show_fbtc_nullsta(rtwdev, p, end - p); in _show_fw_dm_msg()
10750 if (ver->fcxstep == 2) in _show_fw_dm_msg()
10751 p += _show_fbtc_step_v2(rtwdev, p, end - p); in _show_fw_dm_msg()
10752 else if (ver->fcxstep == 3) in _show_fw_dm_msg()
10753 p += _show_fbtc_step_v3(rtwdev, p, end - p); in _show_fw_dm_msg()
10756 return p - buf; in _show_fw_dm_msg()
10761 const struct rtw89_chip_info *chip = rtwdev->chip; in _get_gnt()
10765 if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B || in _get_gnt()
10766 chip->chip_id == RTL8851B || chip->chip_id == RTL8852BT) { in _get_gnt()
10770 gnt = &gnt_cfg->band[0]; in _get_gnt()
10771 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SW_CTRL); in _get_gnt()
10772 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0_STA); in _get_gnt()
10773 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SW_CTRL); in _get_gnt()
10774 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0_STA); in _get_gnt()
10776 gnt = &gnt_cfg->band[1]; in _get_gnt()
10777 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SW_CTRL); in _get_gnt()
10778 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1_STA); in _get_gnt()
10779 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SW_CTRL); in _get_gnt()
10780 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1_STA); in _get_gnt()
10781 } else if (chip->chip_id == RTL8852C) { in _get_gnt()
10785 gnt = &gnt_cfg->band[0]; in _get_gnt()
10786 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SWCTRL); in _get_gnt()
10787 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0); in _get_gnt()
10788 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SWCTRL); in _get_gnt()
10789 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0); in _get_gnt()
10791 gnt = &gnt_cfg->band[1]; in _get_gnt()
10792 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SWCTRL); in _get_gnt()
10793 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1); in _get_gnt()
10794 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SWCTRL); in _get_gnt()
10795 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1); in _get_gnt()
10803 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_gpio_dbg()
10804 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in _show_gpio_dbg()
10811 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo; in _show_gpio_dbg()
10812 gdbg = &rtwdev->btc.fwinfo.rpt_fbtc_gpio_dbg.finfo; in _show_gpio_dbg()
10813 if (!pcinfo->valid) { in _show_gpio_dbg()
10820 if (ver->fcxgpiodbg == 7) { in _show_gpio_dbg()
10821 en_map = le32_to_cpu(gdbg->v7.en_map); in _show_gpio_dbg()
10822 gpio_map = gdbg->v7.gpio_map; in _show_gpio_dbg()
10824 en_map = le32_to_cpu(gdbg->v1.en_map); in _show_gpio_dbg()
10825 gpio_map = gdbg->v1.gpio_map; in _show_gpio_dbg()
10831 p += scnprintf(p, end - p, " %-15s : enable_map:0x%08x", in _show_gpio_dbg()
10837 p += scnprintf(p, end - p, ", %s->GPIO%d", id_to_gdbg(i), in _show_gpio_dbg()
10840 p += scnprintf(p, end - p, "\n"); in _show_gpio_dbg()
10843 return p - buf; in _show_gpio_dbg()
10848 const struct rtw89_chip_info *chip = rtwdev->chip; in _show_mreg_v1()
10849 struct rtw89_btc *btc = &rtwdev->btc; in _show_mreg_v1()
10850 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_mreg_v1()
10853 struct rtw89_btc_cx *cx = &btc->cx; in _show_mreg_v1()
10854 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_mreg_v1()
10855 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_mreg_v1()
10862 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG)) in _show_mreg_v1()
10865 p += scnprintf(p, end - p, "========== [HW Status] ==========\n"); in _show_mreg_v1()
10867 p += scnprintf(p, end - p, in _show_mreg_v1()
10868 " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n", in _show_mreg_v1()
10869 "[scoreboard]", wl->scbd, in _show_mreg_v1()
10870 cx->cnt_wl[BTC_WCNT_SCBDUPDATE], in _show_mreg_v1()
10871 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], in _show_mreg_v1()
10872 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); in _show_mreg_v1()
10874 btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); in _show_mreg_v1()
10878 p += scnprintf(p, end - p, in _show_mreg_v1()
10879 " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ", in _show_mreg_v1()
10881 chip->chip_id == RTL8852C ? "HW" : in _show_mreg_v1()
10882 btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", in _show_mreg_v1()
10887 p += scnprintf(p, end - p, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", in _show_mreg_v1()
10893 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _show_mreg_v1()
10894 if (!pcinfo->valid) { in _show_mreg_v1()
10901 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v1; in _show_mreg_v1()
10904 __func__, pmreg->reg_num); in _show_mreg_v1()
10906 for (i = 0; i < pmreg->reg_num; i++) { in _show_mreg_v1()
10907 type = (u8)le16_to_cpu(chip->mon_reg[i].type); in _show_mreg_v1()
10908 offset = le32_to_cpu(chip->mon_reg[i].offset); in _show_mreg_v1()
10909 val = le32_to_cpu(pmreg->mreg_val[i]); in _show_mreg_v1()
10912 p += scnprintf(p, end - p, in _show_mreg_v1()
10913 " %-15s : %d_0x%04x=0x%08x", in _show_mreg_v1()
10916 p += scnprintf(p, end - p, ", %d_0x%04x=0x%08x", in _show_mreg_v1()
10920 p += scnprintf(p, end - p, "\n"); in _show_mreg_v1()
10923 if (i >= pmreg->reg_num) in _show_mreg_v1()
10924 p += scnprintf(p, end - p, "\n"); in _show_mreg_v1()
10928 return p - buf; in _show_mreg_v1()
10933 const struct rtw89_chip_info *chip = rtwdev->chip; in _show_mreg_v2()
10934 struct rtw89_btc *btc = &rtwdev->btc; in _show_mreg_v2()
10935 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_mreg_v2()
10938 struct rtw89_btc_cx *cx = &btc->cx; in _show_mreg_v2()
10939 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_mreg_v2()
10940 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_mreg_v2()
10947 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG)) in _show_mreg_v2()
10950 p += scnprintf(p, end - p, "========== [HW Status] ==========\n"); in _show_mreg_v2()
10952 p += scnprintf(p, end - p, in _show_mreg_v2()
10953 " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n", in _show_mreg_v2()
10954 "[scoreboard]", wl->scbd, in _show_mreg_v2()
10955 cx->cnt_wl[BTC_WCNT_SCBDUPDATE], in _show_mreg_v2()
10956 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], in _show_mreg_v2()
10957 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); in _show_mreg_v2()
10959 btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); in _show_mreg_v2()
10963 p += scnprintf(p, end - p, in _show_mreg_v2()
10964 " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], polut_type:%s", in _show_mreg_v2()
10966 chip->chip_id == RTL8852C ? "HW" : in _show_mreg_v2()
10967 btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", in _show_mreg_v2()
10970 id_to_polut(wl->bt_polut_type[wl->pta_req_mac])); in _show_mreg_v2()
10973 p += scnprintf(p, end - p, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", in _show_mreg_v2()
10979 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _show_mreg_v2()
10980 if (!pcinfo->valid) { in _show_mreg_v2()
10987 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v2; in _show_mreg_v2()
10990 __func__, pmreg->reg_num); in _show_mreg_v2()
10992 for (i = 0; i < pmreg->reg_num; i++) { in _show_mreg_v2()
10993 type = (u8)le16_to_cpu(chip->mon_reg[i].type); in _show_mreg_v2()
10994 offset = le32_to_cpu(chip->mon_reg[i].offset); in _show_mreg_v2()
10995 val = le32_to_cpu(pmreg->mreg_val[i]); in _show_mreg_v2()
10998 p += scnprintf(p, end - p, in _show_mreg_v2()
10999 " %-15s : %d_0x%04x=0x%08x", in _show_mreg_v2()
11002 p += scnprintf(p, end - p, ", %d_0x%04x=0x%08x", in _show_mreg_v2()
11006 p += scnprintf(p, end - p, "\n"); in _show_mreg_v2()
11009 if (i >= pmreg->reg_num) in _show_mreg_v2()
11010 p += scnprintf(p, end - p, "\n"); in _show_mreg_v2()
11014 return p - buf; in _show_mreg_v2()
11019 struct rtw89_btc *btc = &rtwdev->btc; in _show_mreg_v7()
11020 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_mreg_v7()
11023 struct rtw89_btc_cx *cx = &btc->cx; in _show_mreg_v7()
11024 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_mreg_v7()
11025 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_mreg_v7()
11027 struct rtw89_btc_dm *dm = &btc->dm; in _show_mreg_v7()
11032 if (!(dm->coex_info_map & BTC_COEX_INFO_MREG)) in _show_mreg_v7()
11035 p += scnprintf(p, end - p, "\n\r========== [HW Status] =========="); in _show_mreg_v7()
11037 p += scnprintf(p, end - p, in _show_mreg_v7()
11038 "\n\r %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)", in _show_mreg_v7()
11039 "[scoreboard]", wl->scbd, in _show_mreg_v7()
11040 cx->cnt_wl[BTC_WCNT_SCBDUPDATE], in _show_mreg_v7()
11041 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], in _show_mreg_v7()
11042 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); in _show_mreg_v7()
11044 /* To avoid I/O if WL LPS or power-off */ in _show_mreg_v7()
11045 dm->pta_owner = rtw89_mac_get_ctrl_path(rtwdev); in _show_mreg_v7()
11047 p += scnprintf(p, end - p, in _show_mreg_v7()
11048 "\n\r %-15s : pta_owner:%s, pta_req_mac:MAC%d, rf_gnt_source: polut_type:%s", in _show_mreg_v7()
11050 rtwdev->chip->para_ver & BTC_FEAT_PTA_ONOFF_CTRL ? "HW" : in _show_mreg_v7()
11051 dm->pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", in _show_mreg_v7()
11052 wl->pta_req_mac, in _show_mreg_v7()
11053 id_to_polut(wl->bt_polut_type[wl->pta_req_mac])); in _show_mreg_v7()
11055 gnt = &dm->gnt.band[RTW89_PHY_0]; in _show_mreg_v7()
11057 p += scnprintf(p, end - p, ", phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d]", in _show_mreg_v7()
11058 gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl, in _show_mreg_v7()
11059 gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt); in _show_mreg_v7()
11061 if (rtwdev->dbcc_en) { in _show_mreg_v7()
11062 gnt = &dm->gnt.band[RTW89_PHY_1]; in _show_mreg_v7()
11063 p += scnprintf(p, end - p, in _show_mreg_v7()
11064 ", phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]", in _show_mreg_v7()
11065 gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl, in _show_mreg_v7()
11066 gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt); in _show_mreg_v7()
11069 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _show_mreg_v7()
11070 if (!pcinfo->valid) in _show_mreg_v7()
11073 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v7; in _show_mreg_v7()
11075 for (i = 0; i < pmreg->reg_num; i++) { in _show_mreg_v7()
11076 type = (u8)le16_to_cpu(rtwdev->chip->mon_reg[i].type); in _show_mreg_v7()
11077 offset = le32_to_cpu(rtwdev->chip->mon_reg[i].offset); in _show_mreg_v7()
11078 val = le32_to_cpu(pmreg->mreg_val[i]); in _show_mreg_v7()
11081 p += scnprintf(p, end - p, in _show_mreg_v7()
11082 "\n\r %-15s : %s_0x%x=0x%x", "[reg]", in _show_mreg_v7()
11085 p += scnprintf(p, end - p, ", %s_0x%x=0x%x", in _show_mreg_v7()
11091 return p - buf; in _show_mreg_v7()
11096 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v1()
11097 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v1()
11100 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v1()
11101 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v1()
11102 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v1()
11103 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_summary_v1()
11104 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v1()
11108 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v1()
11111 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v1()
11113 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v1()
11114 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v1()
11115 prptctrl = &pfwinfo->rpt_ctrl.finfo.v1; in _show_summary_v1()
11117 p += scnprintf(p, end - p, in _show_summary_v1()
11118 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ", in _show_summary_v1()
11119 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v1()
11120 pfwinfo->cnt_h2c_fail, prptctrl->h2c_cnt, in _show_summary_v1()
11121 pfwinfo->cnt_c2h, prptctrl->c2h_cnt); in _show_summary_v1()
11123 p += scnprintf(p, end - p, in _show_summary_v1()
11125 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v1()
11126 prptctrl->rpt_cnt, in _show_summary_v1()
11127 prptctrl->rpt_enable, dm->error.val); in _show_summary_v1()
11129 if (dm->error.map.wl_fw_hang) in _show_summary_v1()
11130 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v1()
11131 p += scnprintf(p, end - p, "\n"); in _show_summary_v1()
11132 p += scnprintf(p, end - p, in _show_summary_v1()
11133 " %-15s : send_ok:%d, send_fail:%d, recv:%d", in _show_summary_v1()
11134 "[mailbox]", prptctrl->mb_send_ok_cnt, in _show_summary_v1()
11135 prptctrl->mb_send_fail_cnt, in _show_summary_v1()
11136 prptctrl->mb_recv_cnt); in _show_summary_v1()
11138 p += scnprintf(p, end - p, in _show_summary_v1()
11140 prptctrl->mb_a2dp_empty_cnt, in _show_summary_v1()
11141 prptctrl->mb_a2dp_flct_cnt, in _show_summary_v1()
11142 prptctrl->mb_a2dp_full_cnt); in _show_summary_v1()
11144 p += scnprintf(p, end - p, in _show_summary_v1()
11145 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]", in _show_summary_v1()
11146 "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v1()
11147 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v1()
11148 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v1()
11149 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v1()
11151 p += scnprintf(p, end - p, in _show_summary_v1()
11153 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REQ], in _show_summary_v1()
11154 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_GO], in _show_summary_v1()
11155 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REJECT], in _show_summary_v1()
11156 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT], in _show_summary_v1()
11157 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_FAIL]); in _show_summary_v1()
11159 if (prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT] > 0) in _show_summary_v1()
11160 bt->rfk_info.map.timeout = 1; in _show_summary_v1()
11162 bt->rfk_info.map.timeout = 0; in _show_summary_v1()
11164 dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout; in _show_summary_v1()
11166 p += scnprintf(p, end - p, in _show_summary_v1()
11167 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x", in _show_summary_v1()
11168 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v1()
11169 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h, in _show_summary_v1()
11170 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v1()
11171 btc->fwinfo.rpt_en_map); in _show_summary_v1()
11172 p += scnprintf(p, end - p, " (WL FW report invalid!!)\n"); in _show_summary_v1()
11176 cnt_sum += dm->cnt_notify[i]; in _show_summary_v1()
11178 p += scnprintf(p, end - p, in _show_summary_v1()
11179 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v1()
11183 p += scnprintf(p, end - p, in _show_summary_v1()
11189 p += scnprintf(p, end - p, in _show_summary_v1()
11190 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v1()
11195 p += scnprintf(p, end - p, in _show_summary_v1()
11200 return p - buf; in _show_summary_v1()
11205 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v4()
11206 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v4()
11209 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v4()
11210 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v4()
11211 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v4()
11212 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_summary_v4()
11213 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v4()
11217 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v4()
11220 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v4()
11222 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v4()
11223 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v4()
11224 prptctrl = &pfwinfo->rpt_ctrl.finfo.v4; in _show_summary_v4()
11226 p += scnprintf(p, end - p, in _show_summary_v4()
11227 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ", in _show_summary_v4()
11228 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v4()
11229 pfwinfo->cnt_h2c_fail, in _show_summary_v4()
11230 le32_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v4()
11231 pfwinfo->cnt_c2h, in _show_summary_v4()
11232 le32_to_cpu(prptctrl->rpt_info.cnt_c2h)); in _show_summary_v4()
11234 p += scnprintf(p, end - p, in _show_summary_v4()
11236 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v4()
11237 le32_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v4()
11238 le32_to_cpu(prptctrl->rpt_info.en), in _show_summary_v4()
11239 dm->error.val); in _show_summary_v4()
11241 if (dm->error.map.wl_fw_hang) in _show_summary_v4()
11242 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v4()
11243 p += scnprintf(p, end - p, "\n"); in _show_summary_v4()
11244 p += scnprintf(p, end - p, in _show_summary_v4()
11245 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v4()
11247 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v4()
11248 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v4()
11249 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v4()
11251 p += scnprintf(p, end - p, in _show_summary_v4()
11253 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v4()
11254 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v4()
11255 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v4()
11256 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v4()
11257 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v4()
11259 p += scnprintf(p, end - p, in _show_summary_v4()
11260 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]", in _show_summary_v4()
11261 "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v4()
11262 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v4()
11263 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v4()
11264 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v4()
11266 p += scnprintf(p, end - p, in _show_summary_v4()
11268 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]), in _show_summary_v4()
11269 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_GO]), in _show_summary_v4()
11270 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REJECT]), in _show_summary_v4()
11271 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]), in _show_summary_v4()
11272 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_FAIL])); in _show_summary_v4()
11274 if (le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0) in _show_summary_v4()
11275 bt->rfk_info.map.timeout = 1; in _show_summary_v4()
11277 bt->rfk_info.map.timeout = 0; in _show_summary_v4()
11279 dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout; in _show_summary_v4()
11281 p += scnprintf(p, end - p, in _show_summary_v4()
11282 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x", in _show_summary_v4()
11283 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v4()
11284 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h, in _show_summary_v4()
11285 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v4()
11286 btc->fwinfo.rpt_en_map); in _show_summary_v4()
11287 p += scnprintf(p, end - p, " (WL FW report invalid!!)\n"); in _show_summary_v4()
11291 cnt_sum += dm->cnt_notify[i]; in _show_summary_v4()
11293 p += scnprintf(p, end - p, in _show_summary_v4()
11294 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v4()
11298 p += scnprintf(p, end - p, in _show_summary_v4()
11304 p += scnprintf(p, end - p, in _show_summary_v4()
11305 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v4()
11310 p += scnprintf(p, end - p, in _show_summary_v4()
11315 return p - buf; in _show_summary_v4()
11320 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v5()
11321 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v5()
11324 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v5()
11325 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v5()
11326 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v5()
11327 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v5()
11331 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v5()
11334 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v5()
11336 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v5()
11337 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v5()
11338 prptctrl = &pfwinfo->rpt_ctrl.finfo.v5; in _show_summary_v5()
11340 p += scnprintf(p, end - p, in _show_summary_v5()
11341 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ", in _show_summary_v5()
11342 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v5()
11343 pfwinfo->cnt_h2c_fail, in _show_summary_v5()
11344 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v5()
11345 pfwinfo->cnt_c2h, in _show_summary_v5()
11346 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v5()
11347 le16_to_cpu(prptctrl->rpt_info.len_c2h)); in _show_summary_v5()
11349 p += scnprintf(p, end - p, in _show_summary_v5()
11351 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v5()
11352 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v5()
11353 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v5()
11355 if (dm->error.map.wl_fw_hang) in _show_summary_v5()
11356 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v5()
11357 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
11358 p += scnprintf(p, end - p, in _show_summary_v5()
11359 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v5()
11361 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v5()
11362 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v5()
11363 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v5()
11365 p += scnprintf(p, end - p, in _show_summary_v5()
11367 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v5()
11368 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v5()
11369 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v5()
11370 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v5()
11371 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v5()
11373 p += scnprintf(p, end - p, in _show_summary_v5()
11374 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]", in _show_summary_v5()
11375 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v5()
11376 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v5()
11377 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v5()
11378 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v5()
11380 p += scnprintf(p, end - p, in _show_summary_v5()
11382 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v5()
11384 p += scnprintf(p, end - p, in _show_summary_v5()
11386 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v5()
11387 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v5()
11389 p += scnprintf(p, end - p, in _show_summary_v5()
11390 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d", in _show_summary_v5()
11391 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v5()
11392 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h); in _show_summary_v5()
11395 if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch || in _show_summary_v5()
11396 pfwinfo->err[BTFRE_EXCEPTION]) { in _show_summary_v5()
11397 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
11398 p += scnprintf(p, end - p, in _show_summary_v5()
11399 " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:" in _show_summary_v5()
11401 "[ERROR]", pcinfo->valid, pfwinfo->len_mismch, in _show_summary_v5()
11402 pfwinfo->fver_mismch, in _show_summary_v5()
11403 pfwinfo->err[BTFRE_EXCEPTION], in _show_summary_v5()
11404 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v5()
11408 cnt_sum += dm->cnt_notify[i]; in _show_summary_v5()
11410 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
11411 p += scnprintf(p, end - p, in _show_summary_v5()
11412 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v5()
11417 p += scnprintf(p, end - p, in _show_summary_v5()
11423 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
11424 p += scnprintf(p, end - p, in _show_summary_v5()
11425 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v5()
11431 p += scnprintf(p, end - p, in _show_summary_v5()
11436 return p - buf; in _show_summary_v5()
11441 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v105()
11442 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v105()
11445 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v105()
11446 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v105()
11447 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v105()
11448 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v105()
11452 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v105()
11455 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v105()
11457 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v105()
11458 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v105()
11459 prptctrl = &pfwinfo->rpt_ctrl.finfo.v105; in _show_summary_v105()
11461 p += scnprintf(p, end - p, in _show_summary_v105()
11462 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ", in _show_summary_v105()
11463 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v105()
11464 pfwinfo->cnt_h2c_fail, in _show_summary_v105()
11465 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v105()
11466 pfwinfo->cnt_c2h, in _show_summary_v105()
11467 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v105()
11468 le16_to_cpu(prptctrl->rpt_info.len_c2h)); in _show_summary_v105()
11470 p += scnprintf(p, end - p, in _show_summary_v105()
11472 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v105()
11473 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v105()
11474 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v105()
11476 if (dm->error.map.wl_fw_hang) in _show_summary_v105()
11477 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v105()
11478 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
11479 p += scnprintf(p, end - p, in _show_summary_v105()
11480 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v105()
11482 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v105()
11483 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v105()
11484 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v105()
11486 p += scnprintf(p, end - p, in _show_summary_v105()
11488 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v105()
11489 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v105()
11490 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v105()
11491 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v105()
11492 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v105()
11494 p += scnprintf(p, end - p, in _show_summary_v105()
11495 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]", in _show_summary_v105()
11496 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v105()
11497 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v105()
11498 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v105()
11499 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v105()
11501 p += scnprintf(p, end - p, in _show_summary_v105()
11503 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v105()
11505 p += scnprintf(p, end - p, in _show_summary_v105()
11507 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v105()
11508 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v105()
11510 p += scnprintf(p, end - p, in _show_summary_v105()
11511 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d", in _show_summary_v105()
11512 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v105()
11513 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h); in _show_summary_v105()
11516 if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch || in _show_summary_v105()
11517 pfwinfo->err[BTFRE_EXCEPTION]) { in _show_summary_v105()
11518 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
11519 p += scnprintf(p, end - p, in _show_summary_v105()
11520 " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:" in _show_summary_v105()
11522 "[ERROR]", pcinfo->valid, pfwinfo->len_mismch, in _show_summary_v105()
11523 pfwinfo->fver_mismch, in _show_summary_v105()
11524 pfwinfo->err[BTFRE_EXCEPTION], in _show_summary_v105()
11525 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v105()
11529 cnt_sum += dm->cnt_notify[i]; in _show_summary_v105()
11531 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
11532 p += scnprintf(p, end - p, in _show_summary_v105()
11533 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v105()
11538 p += scnprintf(p, end - p, in _show_summary_v105()
11544 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
11545 p += scnprintf(p, end - p, in _show_summary_v105()
11546 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v105()
11552 p += scnprintf(p, end - p, in _show_summary_v105()
11557 return p - buf; in _show_summary_v105()
11562 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_summary_v7()
11565 struct rtw89_btc_cx *cx = &rtwdev->btc.cx; in _show_summary_v7()
11566 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _show_summary_v7()
11567 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v7()
11568 u32 *cnt = rtwdev->btc.dm.cnt_notify; in _show_summary_v7()
11573 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v7()
11576 p += scnprintf(p, end - p, "%s", in _show_summary_v7()
11579 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v7()
11580 if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF && in _show_summary_v7()
11581 !wl->status.map.rf_off) { in _show_summary_v7()
11582 prptctrl = &pfwinfo->rpt_ctrl.finfo.v7; in _show_summary_v7()
11584 p += scnprintf(p, end - p, in _show_summary_v7()
11585 "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d)," in _show_summary_v7()
11587 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v7()
11588 pfwinfo->cnt_h2c_fail, in _show_summary_v7()
11589 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v7()
11590 pfwinfo->cnt_c2h, in _show_summary_v7()
11591 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v7()
11592 le16_to_cpu(prptctrl->rpt_info.len_c2h), in _show_summary_v7()
11593 rtwdev->btc.ver->info_buf); in _show_summary_v7()
11595 p += scnprintf(p, end - p, in _show_summary_v7()
11597 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v7()
11598 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v7()
11599 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v7()
11601 if (dm->error.map.wl_fw_hang) in _show_summary_v7()
11602 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v7()
11604 p += scnprintf(p, end - p, in _show_summary_v7()
11605 "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v7()
11607 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v7()
11608 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v7()
11609 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v7()
11611 p += scnprintf(p, end - p, in _show_summary_v7()
11613 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v7()
11614 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v7()
11615 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v7()
11616 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v7()
11617 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v7()
11619 p += scnprintf(p, end - p, in _show_summary_v7()
11620 "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]", in _show_summary_v7()
11621 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v7()
11622 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v7()
11623 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v7()
11624 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT], in _show_summary_v7()
11625 wl->rfk_info.proc_time); in _show_summary_v7()
11627 p += scnprintf(p, end - p, ", bt_rfk[req:%d]", in _show_summary_v7()
11628 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v7()
11630 p += scnprintf(p, end - p, ", AOAC[RF_on:%d/RF_off:%d]", in _show_summary_v7()
11631 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v7()
11632 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v7()
11634 p += scnprintf(p, end - p, in _show_summary_v7()
11635 "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)", in _show_summary_v7()
11637 pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail, in _show_summary_v7()
11638 pfwinfo->cnt_c2h, in _show_summary_v7()
11639 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v7()
11643 cnt_sum += dm->cnt_notify[i]; in _show_summary_v7()
11645 p += scnprintf(p, end - p, in _show_summary_v7()
11646 "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v7()
11651 p += scnprintf(p, end - p, in _show_summary_v7()
11657 p += scnprintf(p, end - p, in _show_summary_v7()
11658 … "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ", in _show_summary_v7()
11664 p += scnprintf(p, end - p, in _show_summary_v7()
11667 rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW], in _show_summary_v7()
11670 return p - buf; in _show_summary_v7()
11675 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_summary_v8()
11678 struct rtw89_btc_cx *cx = &rtwdev->btc.cx; in _show_summary_v8()
11679 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _show_summary_v8()
11680 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v8()
11681 u32 *cnt = rtwdev->btc.dm.cnt_notify; in _show_summary_v8()
11686 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v8()
11689 p += scnprintf(p, end - p, "%s", in _show_summary_v8()
11692 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v8()
11693 if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF && in _show_summary_v8()
11694 !wl->status.map.rf_off) { in _show_summary_v8()
11695 prptctrl = &pfwinfo->rpt_ctrl.finfo.v8; in _show_summary_v8()
11697 p += scnprintf(p, end - p, in _show_summary_v8()
11698 …"\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d, max:fw-%d/drv-%d), ", in _show_summary_v8()
11699 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v8()
11700 pfwinfo->cnt_h2c_fail, in _show_summary_v8()
11701 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v8()
11702 pfwinfo->cnt_c2h, in _show_summary_v8()
11703 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v8()
11704 le16_to_cpu(prptctrl->rpt_info.len_c2h), in _show_summary_v8()
11705 (prptctrl->rpt_len_max_h << 8) + prptctrl->rpt_len_max_l, in _show_summary_v8()
11706 rtwdev->btc.ver->info_buf); in _show_summary_v8()
11708 p += scnprintf(p, end - p, in _show_summary_v8()
11710 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v8()
11711 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v8()
11712 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v8()
11714 if (dm->error.map.wl_fw_hang) in _show_summary_v8()
11715 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v8()
11717 p += scnprintf(p, end - p, in _show_summary_v8()
11718 "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v8()
11720 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v8()
11721 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v8()
11722 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v8()
11724 p += scnprintf(p, end - p, in _show_summary_v8()
11726 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v8()
11727 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v8()
11728 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v8()
11729 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v8()
11730 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v8()
11732 p += scnprintf(p, end - p, in _show_summary_v8()
11733 "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]", in _show_summary_v8()
11734 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v8()
11735 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v8()
11736 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v8()
11737 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT], in _show_summary_v8()
11738 wl->rfk_info.proc_time); in _show_summary_v8()
11740 p += scnprintf(p, end - p, ", bt_rfk[req:%d]", in _show_summary_v8()
11741 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v8()
11743 p += scnprintf(p, end - p, ", AOAC[RF_on:%d/RF_off:%d]", in _show_summary_v8()
11744 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v8()
11745 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v8()
11747 p += scnprintf(p, end - p, in _show_summary_v8()
11748 "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)", in _show_summary_v8()
11750 pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail, in _show_summary_v8()
11751 pfwinfo->cnt_c2h, in _show_summary_v8()
11752 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v8()
11756 cnt_sum += dm->cnt_notify[i]; in _show_summary_v8()
11758 p += scnprintf(p, end - p, in _show_summary_v8()
11759 "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v8()
11764 p += scnprintf(p, end - p, in _show_summary_v8()
11770 p += scnprintf(p, end - p, in _show_summary_v8()
11771 … "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ", in _show_summary_v8()
11777 p += scnprintf(p, end - p, in _show_summary_v8()
11780 rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW], in _show_summary_v8()
11783 return p - buf; in _show_summary_v8()
11788 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_dump_info()
11789 struct rtw89_btc_ver *fwsubver = &btc->fwinfo.fw_subver; in rtw89_btc_dump_info()
11790 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_dump_info()
11791 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_dump_info()
11794 dm->cnt_notify[BTC_NCNT_SHOW_COEX_INFO]++; in rtw89_btc_dump_info()
11796 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11798 dm->cnt_notify[BTC_NCNT_SHOW_COEX_INFO], in rtw89_btc_dump_info()
11799 dm->cnt_dm[BTC_DCNT_RUN]); in rtw89_btc_dump_info()
11800 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11802 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11803 "\n %-15s : fcxbtcrpt[%d/%d], fcxtdma[%d/%d], fcxslots[%d/%d], fcxcysta[%d/%d]", in rtw89_btc_dump_info()
11804 "[FW/DRV]", fwsubver->fcxbtcrpt, ver->fcxbtcrpt, in rtw89_btc_dump_info()
11805 fwsubver->fcxtdma, ver->fcxtdma, fwsubver->fcxslots, in rtw89_btc_dump_info()
11806 ver->fcxslots, fwsubver->fcxcysta, ver->fcxcysta); in rtw89_btc_dump_info()
11807 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11808 "\n %-15s : fcxstep[%d/%d], fcxnullsta[%d/%d], fcxmreg[%d/%d], fcxgpiodbg[%d/%d]", in rtw89_btc_dump_info()
11809 "[FW/DRV]", fwsubver->fcxstep, ver->fcxstep, in rtw89_btc_dump_info()
11810 fwsubver->fcxnullsta, ver->fcxnullsta, fwsubver->fcxmreg, in rtw89_btc_dump_info()
11811 ver->fcxmreg, fwsubver->fcxgpiodbg, ver->fcxgpiodbg); in rtw89_btc_dump_info()
11812 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11813 "\n %-15s : fcxbtver[%d/%d], fcxbtscan[%d/%d], fcxbtafh[%d/%d], fcxbtdevinfo[%d/%d]", in rtw89_btc_dump_info()
11814 "[FW/DRV]", fwsubver->fcxbtver, ver->fcxbtver, in rtw89_btc_dump_info()
11815 fwsubver->fcxbtscan, ver->fcxbtscan, fwsubver->fcxbtafh, in rtw89_btc_dump_info()
11816 ver->fcxbtafh, fwsubver->fcxbtdevinfo, ver->fcxbtdevinfo); in rtw89_btc_dump_info()
11817 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11818 "\n %-15s : fcxosi[%d/%d], fcxmlo[%d/%d],", in rtw89_btc_dump_info()
11819 "[FW/DRV]", fwsubver->fcxosi, ver->fcxosi, in rtw89_btc_dump_info()
11820 fwsubver->fcxmlo, ver->fcxmlo); in rtw89_btc_dump_info()
11822 p += _show_cx_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11823 p += _show_wl_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11824 p += _show_bt_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11825 p += _show_dm_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11826 p += _show_fw_dm_msg(rtwdev, p, end - p); in rtw89_btc_dump_info()
11828 if (ver->fcxmreg == 1) in rtw89_btc_dump_info()
11829 p += _show_mreg_v1(rtwdev, p, end - p); in rtw89_btc_dump_info()
11830 else if (ver->fcxmreg == 2) in rtw89_btc_dump_info()
11831 p += _show_mreg_v2(rtwdev, p, end - p); in rtw89_btc_dump_info()
11832 else if (ver->fcxmreg == 7) in rtw89_btc_dump_info()
11833 p += _show_mreg_v7(rtwdev, p, end - p); in rtw89_btc_dump_info()
11835 p += _show_gpio_dbg(rtwdev, p, end - p); in rtw89_btc_dump_info()
11837 if (ver->fcxbtcrpt == 1) in rtw89_btc_dump_info()
11838 p += _show_summary_v1(rtwdev, p, end - p); in rtw89_btc_dump_info()
11839 else if (ver->fcxbtcrpt == 4) in rtw89_btc_dump_info()
11840 p += _show_summary_v4(rtwdev, p, end - p); in rtw89_btc_dump_info()
11841 else if (ver->fcxbtcrpt == 5) in rtw89_btc_dump_info()
11842 p += _show_summary_v5(rtwdev, p, end - p); in rtw89_btc_dump_info()
11843 else if (ver->fcxbtcrpt == 105) in rtw89_btc_dump_info()
11844 p += _show_summary_v105(rtwdev, p, end - p); in rtw89_btc_dump_info()
11845 else if (ver->fcxbtcrpt == 7) in rtw89_btc_dump_info()
11846 p += _show_summary_v7(rtwdev, p, end - p); in rtw89_btc_dump_info()
11847 else if (ver->fcxbtcrpt == 8) in rtw89_btc_dump_info()
11848 p += _show_summary_v8(rtwdev, p, end - p); in rtw89_btc_dump_info()
11850 return p - buf; in rtw89_btc_dump_info()
11855 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_coex_recognize_ver()
11856 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_recognize_ver()
11868 if (chip->chip_id != btc_ver_def->chip_id) in rtw89_coex_recognize_ver()
11871 if (suit_ver_code >= btc_ver_def->fw_ver_code) { in rtw89_coex_recognize_ver()
11872 btc->ver = btc_ver_def; in rtw89_coex_recognize_ver()
11877 btc->ver = &rtw89_btc_ver_defs[RTW89_DEFAULT_BTC_VER_IDX]; in rtw89_coex_recognize_ver()
11881 (int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code); in rtw89_coex_recognize_ver()
11886 struct rtw89_btc_bt_link_info *bt_linfo = &rtwdev->btc.cx.bt.link_info; in rtw89_btc_ntfy_preserve_bt_time()
11887 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in rtw89_btc_ntfy_preserve_bt_time()
11889 if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags)) in rtw89_btc_ntfy_preserve_bt_time()
11901 rtwdev->btc.cx.wl.rfk_info.con_rfk = state; in rtw89_btc_ntfy_conn_rfk()