Lines Matching +full:lo +full:- +full:buff +full:- +full:en

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
243 #define RTW89_DEFAULT_BTC_VER_IDX (ARRAY_SIZE(rtw89_btc_ver_defs) - 1)
465 /* TDMA off + pri: WL_Hi-Tx > BT_Hi_Rx, BT_Hi > WL > BT_Lo */
468 /* TDMA off + pri: WL_Hi-Tx > BT, BT_Hi > other-WL > BT_Lo */
471 /* TDMA off + pri: WL_Hi-Tx = BT */
474 /* TDMA off + pri: WL > BT, Block-BT*/
477 /* TDMA off+Bcn-Protect + pri: WL_Hi-Tx > BT_Hi_Rx, BT_Hi > WL > BT_Lo*/
480 /* TDMA off + Ext-Ctrl + pri: default */
483 /* TDMA off + Ext-Ctrl + pri: E2G-slot block all BT */
486 /* TDMA off + Ext-Ctrl + pri: default */
489 /* TDMA off + Ext-Ctrl + pri: E2G-slot block all BT */
492 /* TDMA off + Ext-Ctrl + pri: E2G-slot WL > BT */
495 /* TDMA off + Ext-Ctrl + pri: E2G/EBT-slot WL > BT */
498 /* TDMA off + Ext-Ctrl + pri: default */
501 /* TDMA Fix slot-0: W1:B1 = 30:30 */
504 /* TDMA Fix slot-1: W1:B1 = 50:50 */
507 /* TDMA Fix slot-2: W1:B1 = 20:30 */
510 /* TDMA Fix slot-3: W1:B1 = 40:10 */
513 /* TDMA Fix slot-4: W1:B1 = 70:10 */
516 /* TDMA Fix slot-5: W1:B1 = 20:60 */
519 /* TDMA Fix slot-6: W1:B1 = 30:60 */
522 /* TDMA Fix slot-7: W1:B1 = 20:80 */
525 /* TDMA Fix slot-8: W1:B1 = user-define */
528 /* TDMA Fix slot-9: W1:B1 = 40:10 */
531 /* TDMA Fix slot-10: W1:B1 = 40:10 */
534 /* TDMA Fix slot-11: W1:B1 = 40:10 */
537 /* PS-TDMA Fix slot-0: W1:B1 = 30:30 */
540 /* PS-TDMA Fix slot-1: W1:B1 = 50:50 */
543 /* PS-TDMA Fix slot-2: W1:B1 = 20:30 */
546 /* PS-TDMA Fix slot-3: W1:B1 = 20:60 */
549 /* PS-TDMA Fix slot-4: W1:B1 = 30:70 */
552 /* PS-TDMA Fix slot-5: W1:B1 = 20:80 */
555 /* PS-TDMA Fix slot-6: W1:B1 = user-define */
558 /* TDMA Auto slot-0: W1:B1 = 50:200 */
561 /* TDMA Auto slot-1: W1:B1 = 60:200 */
564 /* TDMA Auto slot-2: W1:B1 = 20:200 */
567 /* TDMA Auto slot-3: W1:B1 = user-define */
570 /* PS-TDMA Auto slot-0: W1:B1 = 50:200 */
573 /* PS-TDMA Auto slot-1: W1:B1 = 60:200 */
576 /* PS-TDMA Auto slot-2: W1:B1 = 20:200 */
579 /* PS-TDMA Auto slot-3: W1:B1 = user-define */
582 /* TDMA Auto slot2-0: W1:B4 = 30:50 */
585 /* TDMA Auto slot2-1: W1:B4 = 30:70 */
588 /* TDMA Auto slot2-2: W1:B4 = 50:50 */
591 /* TDMA Auto slot2-3: W1:B4 = 60:60 */
594 /* TDMA Auto slot2-4: W1:B4 = 20:80 */
597 /* TDMA Auto slot2-5: W1:B4 = user-define */
600 /* PS-TDMA Auto slot2-0: W1:B4 = 30:50 */
603 /* PS-TDMA Auto slot2-1: W1:B4 = 30:70 */
606 /* PS-TDMA Auto slot2-2: W1:B4 = 50:50 */
609 /* PS-TDMA Auto slot2-3: W1:B4 = 60:60 */
612 /* PS-TDMA Auto slot2-4: W1:B4 = 20:80 */
615 /* PS-TDMA Auto slot2-5: W1:B4 = user-define */
782 BTC_ACT_NUM = BTC_ACT_LAST - BTC_ACT_NONE,
800 struct rtw89_btc *btc = &rtwdev->btc; in _send_fw_cmd()
801 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _send_fw_cmd()
802 struct rtw89_btc_cx *cx = &btc->cx; in _send_fw_cmd()
803 struct rtw89_btc_wl_info *wl = &cx->wl; in _send_fw_cmd()
804 struct rtw89_btc_dm *dm = &btc->dm; in _send_fw_cmd()
808 btc->fwinfo.cnt_h2c_fail++; in _send_fw_cmd()
809 dm->error.map.h2c_buffer_over = true; in _send_fw_cmd()
810 return -EINVAL; in _send_fw_cmd()
811 } else if (!wl->status.map.init_ok) { in _send_fw_cmd()
814 pfwinfo->cnt_h2c_fail++; in _send_fw_cmd()
815 return -EINVAL; in _send_fw_cmd()
816 } else if ((wl->status.map.rf_off_pre == BTC_LPS_RF_OFF && in _send_fw_cmd()
817 wl->status.map.rf_off == BTC_LPS_RF_OFF) || in _send_fw_cmd()
818 (wl->status.map.lps_pre == BTC_LPS_RF_OFF && in _send_fw_cmd()
819 wl->status.map.lps == BTC_LPS_RF_OFF)) { in _send_fw_cmd()
822 pfwinfo->cnt_h2c_fail++; in _send_fw_cmd()
823 return -EINVAL; in _send_fw_cmd()
829 pfwinfo->cnt_h2c_fail++; in _send_fw_cmd()
831 pfwinfo->cnt_h2c++; in _send_fw_cmd()
838 struct rtw89_btc *btc = &rtwdev->btc; in _reset_btc_var()
839 const struct rtw89_btc_ver *ver = btc->ver; in _reset_btc_var()
840 struct rtw89_btc_cx *cx = &btc->cx; in _reset_btc_var()
841 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _reset_btc_var()
842 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _reset_btc_var()
843 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _reset_btc_var()
856 memset(&btc->ctrl, 0, sizeof(btc->ctrl)); in _reset_btc_var()
857 btc->manual_ctrl = false; in _reset_btc_var()
858 if (ver->fcxctrl != 7) in _reset_btc_var()
859 btc->ctrl.ctrl.trace_step = FCXDEF_STEP; in _reset_btc_var()
864 memset(&btc->dm, 0, sizeof(btc->dm)); in _reset_btc_var()
865 memset(bt_linfo->rssi_state, 0, sizeof(bt_linfo->rssi_state)); in _reset_btc_var()
867 if (btc->ver->fwlrole == 8) in _reset_btc_var()
868 wl_linfo = &wl->rlink_info[i][0]; in _reset_btc_var()
870 wl_linfo = &wl->link_info[i]; in _reset_btc_var()
871 memset(wl_linfo->rssi_state, 0, sizeof(wl_linfo->rssi_state)); in _reset_btc_var()
875 btc->dm.tdma_now = t_def[CXTD_OFF]; in _reset_btc_var()
876 btc->dm.tdma = t_def[CXTD_OFF]; in _reset_btc_var()
877 if (ver->fcxslots >= 7) { in _reset_btc_var()
879 btc->dm.slot.v7[i].dur = s_def[i].dur; in _reset_btc_var()
880 btc->dm.slot.v7[i].cxtype = s_def[i].cxtype; in _reset_btc_var()
881 btc->dm.slot.v7[i].cxtbl = s_def[i].cxtbl; in _reset_btc_var()
883 memcpy(&btc->dm.slot_now.v7, &btc->dm.slot.v7, in _reset_btc_var()
884 sizeof(btc->dm.slot_now.v7)); in _reset_btc_var()
886 memcpy(&btc->dm.slot_now.v1, s_def, in _reset_btc_var()
887 sizeof(btc->dm.slot_now.v1)); in _reset_btc_var()
888 memcpy(&btc->dm.slot.v1, s_def, in _reset_btc_var()
889 sizeof(btc->dm.slot.v1)); in _reset_btc_var()
892 btc->policy_len = 0; in _reset_btc_var()
893 btc->bt_req_len = 0; in _reset_btc_var()
895 btc->dm.coex_info_map = BTC_COEX_INFO_ALL; in _reset_btc_var()
896 btc->dm.wl_tx_limit.tx_time = BTC_MAX_TX_TIME_DEF; in _reset_btc_var()
897 btc->dm.wl_tx_limit.tx_retry = BTC_MAX_TX_RETRY_DEF; in _reset_btc_var()
898 btc->dm.wl_pre_agc_rb = BTC_PREAGC_NOTFOUND; in _reset_btc_var()
899 btc->dm.wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_NOTFOUND; in _reset_btc_var()
903 memset(&btc->mdinfo, 0, sizeof(btc->mdinfo)); in _reset_btc_var()
908 const struct rtw89_chip_info *chip = rtwdev->chip; in _search_reg_index()
912 if (le16_to_cpu(chip->mon_reg[i].type) == reg_type && in _search_reg_index()
913 le32_to_cpu(chip->mon_reg[i].offset) == target) { in _search_reg_index()
921 struct rtw89_btc *btc = &rtwdev->btc; in _get_reg_status()
922 const struct rtw89_btc_ver *ver = btc->ver; in _get_reg_status()
923 union rtw89_btc_module_info *md = &btc->mdinfo; in _get_reg_status()
929 if (ver->fcxinit == 7) in _get_reg_status()
930 switch_type = md->md_v7.switch_type; in _get_reg_status()
932 switch_type = md->md.switch_type; in _get_reg_status()
934 if (btc->btg_pos == RF_PATH_A) in _get_reg_status()
951 if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid) in _get_reg_status()
954 pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo; in _get_reg_status()
955 if (ver->fcxmreg == 1) { in _get_reg_status()
956 idx = _search_reg_index(rtwdev, pmreg->v1.reg_num, in _get_reg_status()
961 reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]); in _get_reg_status()
964 } else if (ver->fcxmreg == 2) { in _get_reg_status()
965 idx = _search_reg_index(rtwdev, pmreg->v2.reg_num, in _get_reg_status()
970 reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]); in _get_reg_status()
981 if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid) in _get_reg_status()
984 pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo; in _get_reg_status()
985 if (ver->fcxmreg == 1) { in _get_reg_status()
986 idx = _search_reg_index(rtwdev, pmreg->v1.reg_num, in _get_reg_status()
991 reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]) & in _get_reg_status()
995 } else if (ver->fcxmreg == 2) { in _get_reg_status()
996 idx = _search_reg_index(rtwdev, pmreg->v2.reg_num, in _get_reg_status()
1001 reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]) & in _get_reg_status()
1019 struct rtw89_btc *btc = &rtwdev->btc; in _chk_btc_err()
1020 struct rtw89_btc_cx *cx = &btc->cx; in _chk_btc_err()
1021 struct rtw89_btc_bt_info *bt = &cx->bt; in _chk_btc_err()
1022 struct rtw89_btc_wl_info *wl = &cx->wl; in _chk_btc_err()
1023 struct rtw89_btc_dm *dm = &btc->dm; in _chk_btc_err()
1031 if ((wl->ver_info.fw_coex & 0xffff0000) != in _chk_btc_err()
1032 rtwdev->chip->wlcx_desired) { in _chk_btc_err()
1033 wl->fw_ver_mismatch = true; in _chk_btc_err()
1034 dm->error.map.wl_ver_mismatch = true; in _chk_btc_err()
1036 wl->fw_ver_mismatch = false; in _chk_btc_err()
1037 dm->error.map.wl_ver_mismatch = false; in _chk_btc_err()
1041 if (dm->cnt_dm[BTC_DCNT_RPT] == cnt && btc->fwinfo.rpt_en_map) in _chk_btc_err()
1042 dm->cnt_dm[BTC_DCNT_RPT_HANG]++; in _chk_btc_err()
1044 dm->cnt_dm[BTC_DCNT_RPT_HANG] = 0; in _chk_btc_err()
1046 if (dm->cnt_dm[BTC_DCNT_RPT_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1047 dm->error.map.wl_fw_hang = true; in _chk_btc_err()
1049 dm->error.map.wl_fw_hang = false; in _chk_btc_err()
1051 dm->cnt_dm[BTC_DCNT_RPT] = cnt; in _chk_btc_err()
1054 if (dm->cnt_dm[BTC_DCNT_CYCLE] == cnt && in _chk_btc_err()
1055 (dm->tdma_now.type != CXTDMA_OFF || in _chk_btc_err()
1056 dm->tdma_now.ext_ctrl == CXECTL_EXT)) in _chk_btc_err()
1057 dm->cnt_dm[BTC_DCNT_CYCLE_HANG]++; in _chk_btc_err()
1059 dm->cnt_dm[BTC_DCNT_CYCLE_HANG] = 0; in _chk_btc_err()
1061 if (dm->cnt_dm[BTC_DCNT_CYCLE_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1062 dm->error.map.cycle_hang = true; in _chk_btc_err()
1064 dm->error.map.cycle_hang = false; in _chk_btc_err()
1066 dm->cnt_dm[BTC_DCNT_CYCLE] = cnt; in _chk_btc_err()
1069 if (dm->cnt_dm[BTC_DCNT_W1] == cnt && in _chk_btc_err()
1070 dm->tdma_now.type != CXTDMA_OFF) in _chk_btc_err()
1071 dm->cnt_dm[BTC_DCNT_W1_HANG]++; in _chk_btc_err()
1073 dm->cnt_dm[BTC_DCNT_W1_HANG] = 0; in _chk_btc_err()
1075 if (dm->cnt_dm[BTC_DCNT_W1_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1076 dm->error.map.w1_hang = true; in _chk_btc_err()
1078 dm->error.map.w1_hang = false; in _chk_btc_err()
1080 dm->cnt_dm[BTC_DCNT_W1] = cnt; in _chk_btc_err()
1083 if (dm->cnt_dm[BTC_DCNT_B1] == cnt && in _chk_btc_err()
1084 dm->tdma_now.type != CXTDMA_OFF) in _chk_btc_err()
1085 dm->cnt_dm[BTC_DCNT_B1_HANG]++; in _chk_btc_err()
1087 dm->cnt_dm[BTC_DCNT_B1_HANG] = 0; in _chk_btc_err()
1089 if (dm->cnt_dm[BTC_DCNT_B1_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1090 dm->error.map.b1_hang = true; in _chk_btc_err()
1092 dm->error.map.b1_hang = false; in _chk_btc_err()
1094 dm->cnt_dm[BTC_DCNT_B1] = cnt; in _chk_btc_err()
1097 if (dm->cnt_dm[BTC_DCNT_E2G] == cnt && in _chk_btc_err()
1098 dm->tdma_now.ext_ctrl == CXECTL_EXT) in _chk_btc_err()
1099 dm->cnt_dm[BTC_DCNT_E2G_HANG]++; in _chk_btc_err()
1101 dm->cnt_dm[BTC_DCNT_E2G_HANG] = 0; in _chk_btc_err()
1103 if (dm->cnt_dm[BTC_DCNT_E2G_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1104 dm->error.map.wl_e2g_hang = true; in _chk_btc_err()
1106 dm->error.map.wl_e2g_hang = false; in _chk_btc_err()
1108 dm->cnt_dm[BTC_DCNT_E2G] = cnt; in _chk_btc_err()
1112 dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC]++; in _chk_btc_err()
1114 dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC] = 0; in _chk_btc_err()
1116 if (dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1117 dm->error.map.tdma_no_sync = true; in _chk_btc_err()
1119 dm->error.map.tdma_no_sync = false; in _chk_btc_err()
1123 dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC]++; in _chk_btc_err()
1125 dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC] = 0; in _chk_btc_err()
1127 if (dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1128 dm->error.map.slot_no_sync = true; in _chk_btc_err()
1130 dm->error.map.slot_no_sync = false; in _chk_btc_err()
1133 cnt = cx->cnt_bt[BTC_BCNT_LOPRI_TX]; in _chk_btc_err()
1135 if (cnt == 0 && bt->link_info.slave_role) in _chk_btc_err()
1136 dm->cnt_dm[BTC_DCNT_BTTX_HANG]++; in _chk_btc_err()
1138 dm->cnt_dm[BTC_DCNT_BTTX_HANG] = 0; in _chk_btc_err()
1140 if (dm->cnt_dm[BTC_DCNT_BTTX_HANG] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1141 dm->error.map.bt_tx_hang = true; in _chk_btc_err()
1143 dm->error.map.bt_tx_hang = false; in _chk_btc_err()
1146 cnt = cx->cnt_bt[BTC_BCNT_HIPRI_RX] + in _chk_btc_err()
1147 cx->cnt_bt[BTC_BCNT_HIPRI_TX] + in _chk_btc_err()
1148 cx->cnt_bt[BTC_BCNT_LOPRI_RX] + in _chk_btc_err()
1149 cx->cnt_bt[BTC_BCNT_LOPRI_TX]; in _chk_btc_err()
1152 dm->cnt_dm[BTC_DCNT_BTCNT_HANG]++; in _chk_btc_err()
1154 dm->cnt_dm[BTC_DCNT_BTCNT_HANG] = 0; in _chk_btc_err()
1156 if ((dm->cnt_dm[BTC_DCNT_BTCNT_HANG] >= BTC_CHK_HANG_MAX && in _chk_btc_err()
1157 bt->enable.now) || (!dm->cnt_dm[BTC_DCNT_BTCNT_HANG] && in _chk_btc_err()
1158 !bt->enable.now)) in _chk_btc_err()
1163 dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT]++; in _chk_btc_err()
1165 dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT] = 0; in _chk_btc_err()
1167 if (dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1168 dm->error.map.wl_slot_drift = true; in _chk_btc_err()
1170 dm->error.map.wl_slot_drift = false; in _chk_btc_err()
1174 dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT]++; in _chk_btc_err()
1176 dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT] = 0; in _chk_btc_err()
1178 if (dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT] >= BTC_CHK_HANG_MAX) in _chk_btc_err()
1179 dm->error.map.bt_slot_drift = true; in _chk_btc_err()
1181 dm->error.map.bt_slot_drift = false; in _chk_btc_err()
1189 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_report()
1190 const struct rtw89_btc_ver *ver = btc->ver; in _update_bt_report()
1191 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _update_bt_report()
1192 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _update_bt_report()
1193 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt_linfo->a2dp_desc; in _update_bt_report()
1194 union rtw89_btc_fbtc_btver *pver = &btc->fwinfo.rpt_fbtc_btver.finfo; in _update_bt_report()
1211 if (ver->fcxbtver == 7) { in _update_bt_report()
1212 pver->v7 = *(struct rtw89_btc_fbtc_btver_v7 *)pfinfo; in _update_bt_report()
1213 bt->ver_info.fw = le32_to_cpu(pver->v7.fw_ver); in _update_bt_report()
1214 bt->ver_info.fw_coex = le32_get_bits(pver->v7.coex_ver, in _update_bt_report()
1216 bt->feature = le32_to_cpu(pver->v7.feature); in _update_bt_report()
1218 pver->v1 = *(struct rtw89_btc_fbtc_btver_v1 *)pfinfo; in _update_bt_report()
1219 bt->ver_info.fw = le32_to_cpu(pver->v1.fw_ver); in _update_bt_report()
1220 bt->ver_info.fw_coex = le32_get_bits(pver->v1.coex_ver, in _update_bt_report()
1222 bt->feature = le32_to_cpu(pver->v1.feature); in _update_bt_report()
1226 if (ver->fcxbtscan == 1) { in _update_bt_report()
1229 bt->scan_info_v1[i] = pscan_v1->scan[i]; in _update_bt_report()
1230 if (bt->scan_info_v1[i].win == 0 && in _update_bt_report()
1231 bt->scan_info_v1[i].intvl == 0) in _update_bt_report()
1234 } else if (ver->fcxbtscan == 2) { in _update_bt_report()
1237 bt->scan_info_v2[i] = pscan_v2->para[i]; in _update_bt_report()
1238 if ((pscan_v2->type & BIT(i)) && in _update_bt_report()
1239 pscan_v2->para[i].win == 0 && in _update_bt_report()
1240 pscan_v2->para[i].intvl == 0) in _update_bt_report()
1243 } else if (ver->fcxbtscan == 7) { in _update_bt_report()
1246 bt->scan_info_v2[i] = pscan_v7->para[i]; in _update_bt_report()
1247 if ((pscan_v7->type & BIT(i)) && in _update_bt_report()
1248 pscan_v7->para[i].win == 0 && in _update_bt_report()
1249 pscan_v7->para[i].intvl == 0) in _update_bt_report()
1254 bt->scan_info_update = 1; in _update_bt_report()
1257 if (ver->fcxbtafh == 2) { in _update_bt_report()
1259 if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LEGACY) { in _update_bt_report()
1260 memcpy(&bt_linfo->afh_map[0], pafh_v2->afh_l, 4); in _update_bt_report()
1261 memcpy(&bt_linfo->afh_map[4], pafh_v2->afh_m, 4); in _update_bt_report()
1262 memcpy(&bt_linfo->afh_map[8], pafh_v2->afh_h, 2); in _update_bt_report()
1264 if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LE) { in _update_bt_report()
1265 memcpy(&bt_linfo->afh_map_le[0], pafh_v2->afh_le_a, 4); in _update_bt_report()
1266 memcpy(&bt_linfo->afh_map_le[4], pafh_v2->afh_le_b, 1); in _update_bt_report()
1268 } else if (ver->fcxbtafh == 7) { in _update_bt_report()
1270 if (pafh_v7->map_type & RPT_BT_AFH_SEQ_LEGACY) { in _update_bt_report()
1271 memcpy(&bt_linfo->afh_map[0], pafh_v7->afh_l, 4); in _update_bt_report()
1272 memcpy(&bt_linfo->afh_map[4], pafh_v7->afh_m, 4); in _update_bt_report()
1273 memcpy(&bt_linfo->afh_map[8], pafh_v7->afh_h, 2); in _update_bt_report()
1275 if (pafh_v7->map_type & RPT_BT_AFH_SEQ_LE) { in _update_bt_report()
1276 memcpy(&bt_linfo->afh_map_le[0], pafh_v7->afh_le_a, 4); in _update_bt_report()
1277 memcpy(&bt_linfo->afh_map_le[4], pafh_v7->afh_le_b, 1); in _update_bt_report()
1279 } else if (ver->fcxbtafh == 1) { in _update_bt_report()
1281 memcpy(&bt_linfo->afh_map[0], pafh_v1->afh_l, 4); in _update_bt_report()
1282 memcpy(&bt_linfo->afh_map[4], pafh_v1->afh_m, 4); in _update_bt_report()
1283 memcpy(&bt_linfo->afh_map[8], pafh_v1->afh_h, 2); in _update_bt_report()
1288 a2dp->device_name = le32_to_cpu(pdev->dev_name); in _update_bt_report()
1289 a2dp->vendor_id = le16_to_cpu(pdev->vendor_id); in _update_bt_report()
1290 a2dp->flush_time = le32_to_cpu(pdev->flush_time); in _update_bt_report()
1299 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_rpt_evnt_ver()
1300 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_fw_rpt_evnt_ver()
1302 if (ver->fwevntrptl == 1) in rtw89_btc_fw_rpt_evnt_ver()
1326 struct rtw89_btc *btc = &rtwdev->btc; in _chk_btc_report()
1327 const struct rtw89_btc_ver *ver = btc->ver; in _chk_btc_report()
1328 struct rtw89_btc_dm *dm = &btc->dm; in _chk_btc_report()
1330 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _chk_btc_report()
1331 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _chk_btc_report()
1347 pfwinfo->err[BTFRE_INVALID_INPUT]++; in _chk_btc_report()
1352 rpt_type = btc_prpt->type; in _chk_btc_report()
1353 rpt_len = le16_to_cpu(btc_prpt->len); in _chk_btc_report()
1354 rpt_content = btc_prpt->content; in _chk_btc_report()
1364 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _chk_btc_report()
1365 prpt = &pfwinfo->rpt_ctrl.finfo; in _chk_btc_report()
1366 if (ver->fcxbtcrpt == 1) { in _chk_btc_report()
1367 pfinfo = &pfwinfo->rpt_ctrl.finfo.v1; in _chk_btc_report()
1368 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v1); in _chk_btc_report()
1369 } else if (ver->fcxbtcrpt == 4) { in _chk_btc_report()
1370 pfinfo = &pfwinfo->rpt_ctrl.finfo.v4; in _chk_btc_report()
1371 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v4); in _chk_btc_report()
1372 } else if (ver->fcxbtcrpt == 5) { in _chk_btc_report()
1373 pfinfo = &pfwinfo->rpt_ctrl.finfo.v5; in _chk_btc_report()
1374 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v5); in _chk_btc_report()
1375 } else if (ver->fcxbtcrpt == 105) { in _chk_btc_report()
1376 pfinfo = &pfwinfo->rpt_ctrl.finfo.v105; in _chk_btc_report()
1377 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v105); in _chk_btc_report()
1378 pcinfo->req_fver = 5; in _chk_btc_report()
1380 } else if (ver->fcxbtcrpt == 8) { in _chk_btc_report()
1381 pfinfo = &pfwinfo->rpt_ctrl.finfo.v8; in _chk_btc_report()
1382 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v8); in _chk_btc_report()
1383 } else if (ver->fcxbtcrpt == 7) { in _chk_btc_report()
1384 pfinfo = &pfwinfo->rpt_ctrl.finfo.v7; in _chk_btc_report()
1385 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v7); in _chk_btc_report()
1389 pcinfo->req_fver = ver->fcxbtcrpt; in _chk_btc_report()
1392 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo; in _chk_btc_report()
1393 if (ver->fcxtdma == 1) { in _chk_btc_report()
1394 pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v1; in _chk_btc_report()
1395 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v1); in _chk_btc_report()
1396 } else if (ver->fcxtdma == 3 || ver->fcxtdma == 7) { in _chk_btc_report()
1397 pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v3; in _chk_btc_report()
1398 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v3); in _chk_btc_report()
1402 pcinfo->req_fver = ver->fcxtdma; in _chk_btc_report()
1405 pcinfo = &pfwinfo->rpt_fbtc_slots.cinfo; in _chk_btc_report()
1406 if (ver->fcxslots == 1) { in _chk_btc_report()
1407 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo.v1; in _chk_btc_report()
1408 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo.v1); in _chk_btc_report()
1409 } else if (ver->fcxslots == 7) { in _chk_btc_report()
1410 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo.v7; in _chk_btc_report()
1411 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo.v7); in _chk_btc_report()
1415 pcinfo->req_fver = ver->fcxslots; in _chk_btc_report()
1418 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _chk_btc_report()
1419 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; in _chk_btc_report()
1420 if (ver->fcxcysta == 2) { in _chk_btc_report()
1421 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v2; in _chk_btc_report()
1422 pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2; in _chk_btc_report()
1423 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v2); in _chk_btc_report()
1424 } else if (ver->fcxcysta == 3) { in _chk_btc_report()
1425 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v3; in _chk_btc_report()
1426 pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3; in _chk_btc_report()
1427 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v3); in _chk_btc_report()
1428 } else if (ver->fcxcysta == 4) { in _chk_btc_report()
1429 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v4; in _chk_btc_report()
1430 pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4; in _chk_btc_report()
1431 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v4); in _chk_btc_report()
1432 } else if (ver->fcxcysta == 5) { in _chk_btc_report()
1433 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v5; in _chk_btc_report()
1434 pcysta->v5 = pfwinfo->rpt_fbtc_cysta.finfo.v5; in _chk_btc_report()
1435 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v5); in _chk_btc_report()
1436 } else if (ver->fcxcysta == 7) { in _chk_btc_report()
1437 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v7; in _chk_btc_report()
1438 pcysta->v7 = pfwinfo->rpt_fbtc_cysta.finfo.v7; in _chk_btc_report()
1439 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v7); in _chk_btc_report()
1443 pcinfo->req_fver = ver->fcxcysta; in _chk_btc_report()
1446 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; in _chk_btc_report()
1447 if (ver->fcxctrl != 7) in _chk_btc_report()
1448 trace_step = btc->ctrl.ctrl.trace_step; in _chk_btc_report()
1450 if (ver->fcxstep == 2) { in _chk_btc_report()
1451 pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v2; in _chk_btc_report()
1452 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v2.step[0]) * in _chk_btc_report()
1455 } else if (ver->fcxstep == 3) { in _chk_btc_report()
1456 pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v3; in _chk_btc_report()
1457 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v3.step[0]) * in _chk_btc_report()
1463 pcinfo->req_fver = ver->fcxstep; in _chk_btc_report()
1466 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo; in _chk_btc_report()
1467 if (ver->fcxnullsta == 1) { in _chk_btc_report()
1468 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v1; in _chk_btc_report()
1469 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v1); in _chk_btc_report()
1470 } else if (ver->fcxnullsta == 2) { in _chk_btc_report()
1471 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v2; in _chk_btc_report()
1472 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v2); in _chk_btc_report()
1473 } else if (ver->fcxnullsta == 7) { in _chk_btc_report()
1474 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v7; in _chk_btc_report()
1475 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v7); in _chk_btc_report()
1479 pcinfo->req_fver = ver->fcxnullsta; in _chk_btc_report()
1482 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _chk_btc_report()
1483 if (ver->fcxmreg == 1) { in _chk_btc_report()
1484 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v1; in _chk_btc_report()
1485 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v1); in _chk_btc_report()
1486 } else if (ver->fcxmreg == 2) { in _chk_btc_report()
1487 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v2; in _chk_btc_report()
1488 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v2); in _chk_btc_report()
1489 } else if (ver->fcxmreg == 7) { in _chk_btc_report()
1490 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v7; in _chk_btc_report()
1491 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v7); in _chk_btc_report()
1495 pcinfo->req_fver = ver->fcxmreg; in _chk_btc_report()
1498 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo; in _chk_btc_report()
1499 if (ver->fcxgpiodbg == 7) { in _chk_btc_report()
1500 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7; in _chk_btc_report()
1501 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7); in _chk_btc_report()
1503 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1; in _chk_btc_report()
1504 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1); in _chk_btc_report()
1506 pcinfo->req_fver = ver->fcxgpiodbg; in _chk_btc_report()
1509 pcinfo = &pfwinfo->rpt_fbtc_btver.cinfo; in _chk_btc_report()
1510 if (ver->fcxbtver == 1) { in _chk_btc_report()
1511 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo.v1; in _chk_btc_report()
1512 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo.v1); in _chk_btc_report()
1513 } else if (ver->fcxbtver == 7) { in _chk_btc_report()
1514 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo.v7; in _chk_btc_report()
1515 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo.v7); in _chk_btc_report()
1517 pcinfo->req_fver = ver->fcxbtver; in _chk_btc_report()
1520 pcinfo = &pfwinfo->rpt_fbtc_btscan.cinfo; in _chk_btc_report()
1521 if (ver->fcxbtscan == 1) { in _chk_btc_report()
1522 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v1; in _chk_btc_report()
1523 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v1); in _chk_btc_report()
1524 } else if (ver->fcxbtscan == 2) { in _chk_btc_report()
1525 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v2; in _chk_btc_report()
1526 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v2); in _chk_btc_report()
1527 } else if (ver->fcxbtscan == 7) { in _chk_btc_report()
1528 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v7; in _chk_btc_report()
1529 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v7); in _chk_btc_report()
1533 pcinfo->req_fver = ver->fcxbtscan; in _chk_btc_report()
1536 pcinfo = &pfwinfo->rpt_fbtc_btafh.cinfo; in _chk_btc_report()
1537 if (ver->fcxbtafh == 1) { in _chk_btc_report()
1538 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v1; in _chk_btc_report()
1539 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v1); in _chk_btc_report()
1540 } else if (ver->fcxbtafh == 2) { in _chk_btc_report()
1541 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v2; in _chk_btc_report()
1542 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v2); in _chk_btc_report()
1543 } else if (ver->fcxbtafh == 7) { in _chk_btc_report()
1544 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v7; in _chk_btc_report()
1545 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v7); in _chk_btc_report()
1549 pcinfo->req_fver = ver->fcxbtafh; in _chk_btc_report()
1552 pcinfo = &pfwinfo->rpt_fbtc_btdev.cinfo; in _chk_btc_report()
1553 pfinfo = &pfwinfo->rpt_fbtc_btdev.finfo; in _chk_btc_report()
1554 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btdev.finfo); in _chk_btc_report()
1555 pcinfo->req_fver = ver->fcxbtdevinfo; in _chk_btc_report()
1558 pfwinfo->err[BTFRE_UNDEF_TYPE]++; in _chk_btc_report()
1562 pcinfo->rx_len = rpt_len; in _chk_btc_report()
1563 pcinfo->rx_cnt++; in _chk_btc_report()
1565 if (rpt_len != pcinfo->req_len) { in _chk_btc_report()
1567 pfwinfo->len_mismch |= (0x1 << rpt_type); in _chk_btc_report()
1569 pfwinfo->len_mismch |= BIT(31); in _chk_btc_report()
1572 __func__, rpt_type, rpt_len, pcinfo->req_len); in _chk_btc_report()
1574 pcinfo->valid = 0; in _chk_btc_report()
1576 } else if (!pfinfo || !rpt_content || !pcinfo->req_len) { in _chk_btc_report()
1577 pfwinfo->err[BTFRE_EXCEPTION]++; in _chk_btc_report()
1578 pcinfo->valid = 0; in _chk_btc_report()
1582 memcpy(pfinfo, rpt_content, pcinfo->req_len); in _chk_btc_report()
1583 pcinfo->valid = 1; in _chk_btc_report()
1587 if (ver->fcxbtcrpt == 1) { in _chk_btc_report()
1588 prpt->v1 = pfwinfo->rpt_ctrl.finfo.v1; in _chk_btc_report()
1589 btc->fwinfo.rpt_en_map = prpt->v1.rpt_enable; in _chk_btc_report()
1590 wl->ver_info.fw_coex = prpt->v1.wl_fw_coex_ver; in _chk_btc_report()
1591 wl->ver_info.fw = prpt->v1.wl_fw_ver; in _chk_btc_report()
1592 dm->wl_fw_cx_offload = !!prpt->v1.wl_fw_cx_offload; in _chk_btc_report()
1595 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1597 /* To avoid I/O if WL LPS or power-off */ in _chk_btc_report()
1598 if (wl->status.map.lps != BTC_LPS_RF_OFF && in _chk_btc_report()
1599 !wl->status.map.rf_off) { in _chk_btc_report()
1600 rtwdev->chip->ops->btc_update_bt_cnt(rtwdev); in _chk_btc_report()
1603 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1607 } else if (ver->fcxbtcrpt == 4) { in _chk_btc_report()
1608 prpt->v4 = pfwinfo->rpt_ctrl.finfo.v4; in _chk_btc_report()
1609 btc->fwinfo.rpt_en_map = le32_to_cpu(prpt->v4.rpt_info.en); in _chk_btc_report()
1610 wl->ver_info.fw_coex = le32_to_cpu(prpt->v4.wl_fw_info.cx_ver); in _chk_btc_report()
1611 wl->ver_info.fw = le32_to_cpu(prpt->v4.wl_fw_info.fw_ver); in _chk_btc_report()
1612 dm->wl_fw_cx_offload = !!le32_to_cpu(prpt->v4.wl_fw_info.cx_offload); in _chk_btc_report()
1615 memcpy(&dm->gnt.band[i], &prpt->v4.gnt_val[i], in _chk_btc_report()
1616 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1618 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1619 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_TX]); in _chk_btc_report()
1620 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1621 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_RX]); in _chk_btc_report()
1622 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1623 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_TX]); in _chk_btc_report()
1624 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1625 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_RX]); in _chk_btc_report()
1626 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1627 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_POLLUTED]); in _chk_btc_report()
1631 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1633 if (le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0) in _chk_btc_report()
1634 bt->rfk_info.map.timeout = 1; in _chk_btc_report()
1636 bt->rfk_info.map.timeout = 0; in _chk_btc_report()
1638 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; in _chk_btc_report()
1639 } else if (ver->fcxbtcrpt == 5) { in _chk_btc_report()
1640 prpt->v5 = pfwinfo->rpt_ctrl.finfo.v5; in _chk_btc_report()
1641 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v5.rpt_info.en); in _chk_btc_report()
1642 wl->ver_info.fw_coex = le32_to_cpu(prpt->v5.rpt_info.cx_ver); in _chk_btc_report()
1643 wl->ver_info.fw = le32_to_cpu(prpt->v5.rpt_info.fw_ver); in _chk_btc_report()
1644 dm->wl_fw_cx_offload = 0; in _chk_btc_report()
1647 memcpy(&dm->gnt.band[i], &prpt->v5.gnt_val[i][0], in _chk_btc_report()
1648 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1650 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1651 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_TX]); in _chk_btc_report()
1652 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1653 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_RX]); in _chk_btc_report()
1654 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1655 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_TX]); in _chk_btc_report()
1656 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1657 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_RX]); in _chk_btc_report()
1658 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1659 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_POLLUTED]); in _chk_btc_report()
1663 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1665 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; in _chk_btc_report()
1666 } else if (ver->fcxbtcrpt == 105) { in _chk_btc_report()
1667 prpt->v105 = pfwinfo->rpt_ctrl.finfo.v105; in _chk_btc_report()
1668 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v105.rpt_info.en); in _chk_btc_report()
1669 wl->ver_info.fw_coex = le32_to_cpu(prpt->v105.rpt_info.cx_ver); in _chk_btc_report()
1670 wl->ver_info.fw = le32_to_cpu(prpt->v105.rpt_info.fw_ver); in _chk_btc_report()
1671 dm->wl_fw_cx_offload = 0; in _chk_btc_report()
1674 memcpy(&dm->gnt.band[i], &prpt->v105.gnt_val[i][0], in _chk_btc_report()
1675 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1677 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1678 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_TX_V105]); in _chk_btc_report()
1679 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1680 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_RX_V105]); in _chk_btc_report()
1681 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1682 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_LO_TX_V105]); in _chk_btc_report()
1683 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1684 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_LO_RX_V105]); in _chk_btc_report()
1685 btc->cx.cnt_bt[BTC_BCNT_POLUT] = in _chk_btc_report()
1686 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1690 pfwinfo->event[BTF_EVNT_RPT]); in _chk_btc_report()
1692 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; in _chk_btc_report()
1693 } else if (ver->fcxbtcrpt == 7) { in _chk_btc_report()
1694 prpt->v7 = pfwinfo->rpt_ctrl.finfo.v7; in _chk_btc_report()
1695 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v7.rpt_info.en); in _chk_btc_report()
1696 wl->ver_info.fw_coex = le32_to_cpu(prpt->v7.rpt_info.cx_ver); in _chk_btc_report()
1697 wl->ver_info.fw = le32_to_cpu(prpt->v7.rpt_info.fw_ver); in _chk_btc_report()
1700 memcpy(&dm->gnt.band[i], &prpt->v7.gnt_val[i][0], in _chk_btc_report()
1701 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1703 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1704 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_TX_V105]); in _chk_btc_report()
1705 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1706 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_RX_V105]); in _chk_btc_report()
1707 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1708 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_LO_TX_V105]); in _chk_btc_report()
1709 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1710 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_LO_RX_V105]); in _chk_btc_report()
1712 val1 = le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1713 if (val1 > btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]) in _chk_btc_report()
1714 val1 -= btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]; /* diff */ in _chk_btc_report()
1716 btc->cx.cnt_bt[BTC_BCNT_POLUT_DIFF] = val1; in _chk_btc_report()
1717 btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW] = in _chk_btc_report()
1718 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1720 val1 = pfwinfo->event[BTF_EVNT_RPT]; in _chk_btc_report()
1725 } else if (ver->fcxbtcrpt == 8) { in _chk_btc_report()
1726 prpt->v8 = pfwinfo->rpt_ctrl.finfo.v8; in _chk_btc_report()
1727 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v8.rpt_info.en); in _chk_btc_report()
1728 wl->ver_info.fw_coex = le32_to_cpu(prpt->v8.rpt_info.cx_ver); in _chk_btc_report()
1729 wl->ver_info.fw = le32_to_cpu(prpt->v8.rpt_info.fw_ver); in _chk_btc_report()
1732 memcpy(&dm->gnt.band[i], &prpt->v8.gnt_val[i][0], in _chk_btc_report()
1733 sizeof(dm->gnt.band[i])); in _chk_btc_report()
1735 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = in _chk_btc_report()
1736 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_TX_V105]); in _chk_btc_report()
1737 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = in _chk_btc_report()
1738 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_RX_V105]); in _chk_btc_report()
1739 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = in _chk_btc_report()
1740 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_LO_TX_V105]); in _chk_btc_report()
1741 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = in _chk_btc_report()
1742 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_LO_RX_V105]); in _chk_btc_report()
1744 val1 = le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1745 if (val1 > btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]) in _chk_btc_report()
1746 val1 -= btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]; /* diff */ in _chk_btc_report()
1748 btc->cx.cnt_bt[BTC_BCNT_POLUT_DIFF] = val1; in _chk_btc_report()
1749 btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW] = in _chk_btc_report()
1750 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_POLLUTED_V105]); in _chk_btc_report()
1752 val1 = pfwinfo->event[BTF_EVNT_RPT]; in _chk_btc_report()
1753 if (((prpt->v8.rpt_len_max_h << 8) + in _chk_btc_report()
1754 prpt->v8.rpt_len_max_l) != ver->info_buf) in _chk_btc_report()
1755 dm->error.map.h2c_c2h_buffer_mismatch = true; in _chk_btc_report()
1757 dm->error.map.h2c_c2h_buffer_mismatch = false; in _chk_btc_report()
1771 sizeof(dm->tdma_now)); in _chk_btc_report()
1772 if (ver->fcxtdma == 1) in _chk_btc_report()
1774 memcmp(&dm->tdma_now, in _chk_btc_report()
1775 &pfwinfo->rpt_fbtc_tdma.finfo.v1, in _chk_btc_report()
1776 sizeof(dm->tdma_now))); in _chk_btc_report()
1777 else if (ver->fcxtdma == 3 || ver->fcxtdma == 7) in _chk_btc_report()
1779 memcmp(&dm->tdma_now, in _chk_btc_report()
1780 &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma, in _chk_btc_report()
1781 sizeof(dm->tdma_now))); in _chk_btc_report()
1786 if (ver->fcxslots == 7) { in _chk_btc_report()
1790 sizeof(dm->slot_now.v7)); in _chk_btc_report()
1792 memcmp(dm->slot_now.v7, in _chk_btc_report()
1793 pfwinfo->rpt_fbtc_slots.finfo.v7.slot, in _chk_btc_report()
1794 sizeof(dm->slot_now.v7))); in _chk_btc_report()
1795 } else if (ver->fcxslots == 1) { in _chk_btc_report()
1799 sizeof(dm->slot_now.v1)); in _chk_btc_report()
1801 memcmp(dm->slot_now.v1, in _chk_btc_report()
1802 pfwinfo->rpt_fbtc_slots.finfo.v1.slot, in _chk_btc_report()
1803 sizeof(dm->slot_now.v1))); in _chk_btc_report()
1807 if (ver->fcxcysta == 2) { in _chk_btc_report()
1808 if (le16_to_cpu(pcysta->v2.cycles) < BTC_CYSTA_CHK_PERIOD) in _chk_btc_report()
1810 /* Check Leak-AP */ in _chk_btc_report()
1811 if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) != 0 && in _chk_btc_report()
1812 le32_to_cpu(pcysta->v2.leakrx_cnt) != 0 && dm->tdma_now.rxflctrl) { in _chk_btc_report()
1813 if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) < in _chk_btc_report()
1814 BTC_LEAK_AP_TH * le32_to_cpu(pcysta->v2.leakrx_cnt)) in _chk_btc_report()
1815 dm->leak_ap = 1; in _chk_btc_report()
1819 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
1820 dm->tdma_now.ext_ctrl == CXECTL_EXT) { in _chk_btc_report()
1821 if (ver->fcxslots == 1) in _chk_btc_report()
1822 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_E2G].dur); in _chk_btc_report()
1823 else if (ver->fcxslots == 7) in _chk_btc_report()
1824 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_E2G].dur); in _chk_btc_report()
1826 if (ver->fcxslots == 1) in _chk_btc_report()
1827 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
1828 else if (ver->fcxslots == 7) in _chk_btc_report()
1829 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
1832 if (le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) > wl_slot_set) { in _chk_btc_report()
1833 diff_t = le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) - wl_slot_set; in _chk_btc_report()
1839 le32_to_cpu(pcysta->v2.slot_cnt[CXST_W1])); in _chk_btc_report()
1841 le32_to_cpu(pcysta->v2.slot_cnt[CXST_B1])); in _chk_btc_report()
1843 le16_to_cpu(pcysta->v2.cycles)); in _chk_btc_report()
1844 } else if (ver->fcxcysta == 3) { in _chk_btc_report()
1845 if (le16_to_cpu(pcysta->v3.cycles) < BTC_CYSTA_CHK_PERIOD) in _chk_btc_report()
1848 cnt_leak_slot = le32_to_cpu(pcysta->v3.slot_cnt[CXST_LK]); in _chk_btc_report()
1849 cnt_rx_imr = le32_to_cpu(pcysta->v3.leak_slot.cnt_rximr); in _chk_btc_report()
1851 /* Check Leak-AP */ in _chk_btc_report()
1853 dm->tdma_now.rxflctrl) { in _chk_btc_report()
1855 dm->leak_ap = 1; in _chk_btc_report()
1859 if (dm->tdma_now.type == CXTDMA_OFF) { in _chk_btc_report()
1860 if (ver->fcxslots == 1) in _chk_btc_report()
1861 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
1862 else if (ver->fcxslots == 7) in _chk_btc_report()
1863 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
1864 wl_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
1866 diff_t = wl_slot_real - wl_slot_set; in _chk_btc_report()
1872 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
1873 dm->tdma_now.ext_ctrl == CXECTL_EXT && in _chk_btc_report()
1874 btc->bt_req_len != 0) { in _chk_btc_report()
1875 bt_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
1876 if (btc->bt_req_len > bt_slot_real) { in _chk_btc_report()
1877 diff_t = btc->bt_req_len - bt_slot_real; in _chk_btc_report()
1883 le32_to_cpu(pcysta->v3.slot_cnt[CXST_W1])); in _chk_btc_report()
1885 le32_to_cpu(pcysta->v3.slot_cnt[CXST_B1])); in _chk_btc_report()
1887 le16_to_cpu(pcysta->v3.cycles)); in _chk_btc_report()
1888 } else if (ver->fcxcysta == 4) { in _chk_btc_report()
1889 if (le16_to_cpu(pcysta->v4.cycles) < BTC_CYSTA_CHK_PERIOD) in _chk_btc_report()
1892 cnt_leak_slot = le16_to_cpu(pcysta->v4.slot_cnt[CXST_LK]); in _chk_btc_report()
1893 cnt_rx_imr = le32_to_cpu(pcysta->v4.leak_slot.cnt_rximr); in _chk_btc_report()
1895 /* Check Leak-AP */ in _chk_btc_report()
1897 dm->tdma_now.rxflctrl) { in _chk_btc_report()
1899 dm->leak_ap = 1; in _chk_btc_report()
1903 if (dm->tdma_now.type == CXTDMA_OFF) { in _chk_btc_report()
1904 if (ver->fcxslots == 1) in _chk_btc_report()
1905 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
1906 else if (ver->fcxslots == 7) in _chk_btc_report()
1907 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
1908 wl_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
1910 diff_t = wl_slot_real - wl_slot_set; in _chk_btc_report()
1916 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
1917 dm->tdma_now.ext_ctrl == CXECTL_EXT && in _chk_btc_report()
1918 btc->bt_req_len != 0) { in _chk_btc_report()
1919 bt_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
1921 if (btc->bt_req_len > bt_slot_real) { in _chk_btc_report()
1922 diff_t = btc->bt_req_len - bt_slot_real; in _chk_btc_report()
1928 le16_to_cpu(pcysta->v4.slot_cnt[CXST_W1])); in _chk_btc_report()
1930 le16_to_cpu(pcysta->v4.slot_cnt[CXST_B1])); in _chk_btc_report()
1932 le16_to_cpu(pcysta->v4.cycles)); in _chk_btc_report()
1933 } else if (ver->fcxcysta == 5) { in _chk_btc_report()
1934 if (dm->fddt_train == BTC_FDDT_ENABLE) in _chk_btc_report()
1936 cnt_leak_slot = le16_to_cpu(pcysta->v5.slot_cnt[CXST_LK]); in _chk_btc_report()
1937 cnt_rx_imr = le32_to_cpu(pcysta->v5.leak_slot.cnt_rximr); in _chk_btc_report()
1939 /* Check Leak-AP */ in _chk_btc_report()
1941 dm->tdma_now.rxflctrl) { in _chk_btc_report()
1942 if (le16_to_cpu(pcysta->v5.cycles) >= BTC_CYSTA_CHK_PERIOD && in _chk_btc_report()
1944 dm->leak_ap = 1; in _chk_btc_report()
1948 if (dm->tdma_now.type == CXTDMA_OFF) { in _chk_btc_report()
1949 if (ver->fcxslots == 1) in _chk_btc_report()
1950 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur); in _chk_btc_report()
1951 else if (ver->fcxslots == 7) in _chk_btc_report()
1952 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur); in _chk_btc_report()
1953 wl_slot_real = le16_to_cpu(pcysta->v5.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
1956 diff_t = wl_slot_real - wl_slot_set; in _chk_btc_report()
1958 diff_t = wl_slot_set - wl_slot_real; in _chk_btc_report()
1963 bt_slot_set = btc->bt_req_len; in _chk_btc_report()
1964 bt_slot_real = le16_to_cpu(pcysta->v5.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
1966 if (dm->tdma_now.type == CXTDMA_OFF && in _chk_btc_report()
1967 dm->tdma_now.ext_ctrl == CXECTL_EXT && in _chk_btc_report()
1970 diff_t = bt_slot_set - bt_slot_real; in _chk_btc_report()
1972 diff_t = bt_slot_real - bt_slot_set; in _chk_btc_report()
1977 le16_to_cpu(pcysta->v5.slot_cnt[CXST_E2G])); in _chk_btc_report()
1979 le16_to_cpu(pcysta->v5.slot_cnt[CXST_W1])); in _chk_btc_report()
1981 le16_to_cpu(pcysta->v5.slot_cnt[CXST_B1])); in _chk_btc_report()
1983 le16_to_cpu(pcysta->v5.cycles)); in _chk_btc_report()
1984 } else if (ver->fcxcysta == 7) { in _chk_btc_report()
1985 if (dm->fddt_train == BTC_FDDT_ENABLE) in _chk_btc_report()
1988 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; in _chk_btc_report()
1990 if (dm->tdma_now.type != CXTDMA_OFF) { in _chk_btc_report()
1992 val16 = le16_to_cpu(pcysta->v7.cycle_time.tavg[CXT_WL]); in _chk_btc_report()
1995 /* Check Leak-AP */ in _chk_btc_report()
1996 val1 = le32_to_cpu(pcysta->v7.leak_slot.cnt_rximr) * in _chk_btc_report()
1998 val2 = le16_to_cpu(pcysta->v7.slot_cnt[CXST_LK]); in _chk_btc_report()
2000 val16 = le16_to_cpu(pcysta->v7.cycles); in _chk_btc_report()
2001 if (dm->tdma_now.rxflctrl && in _chk_btc_report()
2003 dm->leak_ap = 1; in _chk_btc_report()
2004 } else if (dm->tdma_now.ext_ctrl == CXECTL_EXT) { in _chk_btc_report()
2005 val16 = le16_to_cpu(pcysta->v7.cycle_time.tavg[CXT_BT]); in _chk_btc_report()
2010 val1 = le16_to_cpu(pcysta->v7.a2dp_ept.cnt_timeout) * in _chk_btc_report()
2012 val2 = le16_to_cpu(pcysta->v7.a2dp_ept.cnt); in _chk_btc_report()
2014 val16 = le16_to_cpu(pcysta->v7.cycles); in _chk_btc_report()
2016 dm->slot_req_more = 1; in _chk_btc_report()
2017 else if (bt->link_info.status.map.connect == 0) in _chk_btc_report()
2018 dm->slot_req_more = 0; in _chk_btc_report()
2022 le16_to_cpu(pcysta->v7.slot_cnt[CXST_E2G])); in _chk_btc_report()
2024 le16_to_cpu(pcysta->v7.slot_cnt[CXST_W1])); in _chk_btc_report()
2026 le16_to_cpu(pcysta->v7.slot_cnt[CXST_B1])); in _chk_btc_report()
2028 /* "BT_SLOT_FLOOD" error-check MUST before "CYCLE_HANG" */ in _chk_btc_report()
2030 le16_to_cpu(pcysta->v7.cycles)); in _chk_btc_report()
2032 le16_to_cpu(pcysta->v7.cycles)); in _chk_btc_report()
2038 if (ver->fcxmreg == 7) in _chk_btc_report()
2041 if (dm->wl_btg_rx == BTC_BTGCTRL_BB_GNT_FWCTRL) in _chk_btc_report()
2042 dm->wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_FWCTRL; in _chk_btc_report()
2044 dm->wl_btg_rx_rb = val; in _chk_btc_report()
2047 if (dm->wl_pre_agc == BTC_PREAGC_BB_FWCTRL) in _chk_btc_report()
2048 dm->wl_pre_agc_rb = BTC_PREAGC_BB_FWCTRL; in _chk_btc_report()
2050 dm->wl_pre_agc_rb = val; in _chk_btc_report()
2071 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in _parse_btc_report()
2081 if (index + 2 >= ver->info_buf) in _parse_btc_report()
2084 rpt_len = le16_to_cpu(btc_prpt->len); in _parse_btc_report()
2100 struct rtw89_btc *btc = &rtwdev->btc; in _append_tdma()
2101 const struct rtw89_btc_ver *ver = btc->ver; in _append_tdma()
2102 struct rtw89_btc_dm *dm = &btc->dm; in _append_tdma()
2107 u16 len = btc->policy_len; in _append_tdma()
2109 if (!btc->update_policy_force && in _append_tdma()
2110 !memcmp(&dm->tdma, &dm->tdma_now, sizeof(dm->tdma))) { in _append_tdma()
2117 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len]; in _append_tdma()
2118 tlv->type = CXPOLICY_TDMA; in _append_tdma()
2119 if (ver->fcxtdma == 1) { in _append_tdma()
2120 v = (struct rtw89_btc_fbtc_tdma *)&tlv->val[0]; in _append_tdma()
2121 tlv->len = sizeof(*v); in _append_tdma()
2122 *v = dm->tdma; in _append_tdma()
2123 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v); in _append_tdma()
2124 } else if (ver->fcxtdma == 7) { in _append_tdma()
2125 tlv_v7 = (struct rtw89_btc_btf_tlv_v7 *)&btc->policy[len]; in _append_tdma()
2126 tlv_v7->len = sizeof(dm->tdma); in _append_tdma()
2127 tlv_v7->ver = ver->fcxtdma; in _append_tdma()
2128 tlv_v7->type = CXPOLICY_TDMA; in _append_tdma()
2129 memcpy(tlv_v7->val, &dm->tdma, tlv_v7->len); in _append_tdma()
2130 btc->policy_len += BTC_TLV_HDR_LEN_V7 + tlv_v7->len; in _append_tdma()
2132 tlv->len = sizeof(*v3); in _append_tdma()
2133 v3 = (struct rtw89_btc_fbtc_tdma_v3 *)&tlv->val[0]; in _append_tdma()
2134 v3->fver = ver->fcxtdma; in _append_tdma()
2135 v3->tdma = dm->tdma; in _append_tdma()
2136 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v3); in _append_tdma()
2141 __func__, dm->tdma.type, dm->tdma.rxflctrl, in _append_tdma()
2142 dm->tdma.txpause, dm->tdma.wtgle_n, dm->tdma.leak_n, in _append_tdma()
2143 dm->tdma.ext_ctrl); in _append_tdma()
2148 struct rtw89_btc *btc = &rtwdev->btc; in _append_slot_v1()
2149 struct rtw89_btc_dm *dm = &btc->dm; in _append_slot_v1()
2156 "[BTC], %s(): A:btc->policy_len = %d\n", in _append_slot_v1()
2157 __func__, btc->policy_len); in _append_slot_v1()
2160 if (!btc->update_policy_force && in _append_slot_v1()
2161 !memcmp(&dm->slot.v1[i], &dm->slot_now.v1[i], in _append_slot_v1()
2162 sizeof(dm->slot.v1[i]))) in _append_slot_v1()
2165 len = btc->policy_len; in _append_slot_v1()
2167 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len]; in _append_slot_v1()
2168 v = (struct btc_fbtc_1slot *)&tlv->val[0]; in _append_slot_v1()
2169 tlv->type = CXPOLICY_SLOT; in _append_slot_v1()
2170 tlv->len = sizeof(*v); in _append_slot_v1()
2172 v->fver = btc->ver->fcxslots; in _append_slot_v1()
2173 v->sid = i; in _append_slot_v1()
2174 v->slot = dm->slot.v1[i]; in _append_slot_v1()
2177 "[BTC], %s(): slot-%d: dur=%d, table=0x%08x, type=%d\n", in _append_slot_v1()
2178 __func__, i, dm->slot.v1[i].dur, dm->slot.v1[i].cxtbl, in _append_slot_v1()
2179 dm->slot.v1[i].cxtype); in _append_slot_v1()
2182 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v); in _append_slot_v1()
2194 struct rtw89_btc *btc = &rtwdev->btc; in _append_slot_v7()
2195 struct rtw89_btc_dm *dm = &btc->dm; in _append_slot_v7()
2200 if (!btc->update_policy_force && in _append_slot_v7()
2201 !memcmp(&dm->slot.v7[i], &dm->slot_now.v7[i], in _append_slot_v7()
2202 sizeof(dm->slot.v7[i]))) in _append_slot_v7()
2205 len = btc->policy_len; in _append_slot_v7()
2210 "[BTC], %s(): buff overflow!\n", __func__); in _append_slot_v7()
2214 tlv = (struct rtw89_btc_btf_tlv_v7 *)&btc->policy[len]; in _append_slot_v7()
2215 tlv->type = CXPOLICY_SLOT; in _append_slot_v7()
2216 tlv->ver = btc->ver->fcxslots; in _append_slot_v7()
2217 tlv->len = sizeof(dm->slot.v7[0]) + BTC_TLV_SLOT_ID_LEN_V7; in _append_slot_v7()
2221 if ((len + (u16)tlv->len) > RTW89_BTC_POLICY_MAXLEN) { in _append_slot_v7()
2223 "[BTC], %s(): buff overflow!\n", __func__); in _append_slot_v7()
2227 btc->policy[len] = i; /* slot-id */ in _append_slot_v7()
2228 memcpy(&btc->policy[len + 1], &dm->slot.v7[i], in _append_slot_v7()
2229 sizeof(dm->slot.v7[0])); in _append_slot_v7()
2230 len += tlv->len; in _append_slot_v7()
2233 "[BTC], %s: policy_len=%d, slot-%d: dur=%d, type=%d, table=0x%08x\n", in _append_slot_v7()
2234 __func__, btc->policy_len, i, dm->slot.v7[i].dur, in _append_slot_v7()
2235 dm->slot.v7[i].cxtype, dm->slot.v7[i].cxtbl); in _append_slot_v7()
2237 btc->policy_len = len; /* update total length */ in _append_slot_v7()
2243 __func__, cnt, btc->policy_len); in _append_slot_v7()
2248 struct rtw89_btc *btc = &rtwdev->btc; in _append_slot()
2250 if (btc->ver->fcxslots == 7) in _append_slot()
2258 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_rpt_ver()
2259 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_fw_rpt_ver()
2279 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2293 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2307 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2319 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2335 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2349 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2365 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2381 switch (ver->frptmap) { in rtw89_btc_fw_rpt_ver()
2403 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_set_slots()
2404 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_fw_set_slots()
2407 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_fw_set_slots()
2410 if (ver->fcxslots == 7) { in rtw89_btc_fw_set_slots()
2411 len = sizeof(*tlv_v7) + sizeof(dm->slot.v7); in rtw89_btc_fw_set_slots()
2416 tlv_v7->type = SET_SLOT_TABLE; in rtw89_btc_fw_set_slots()
2417 tlv_v7->ver = ver->fcxslots; in rtw89_btc_fw_set_slots()
2418 tlv_v7->len = ARRAY_SIZE(dm->slot.v7); in rtw89_btc_fw_set_slots()
2419 memcpy(tlv_v7->val, dm->slot.v7, sizeof(dm->slot.v7)); in rtw89_btc_fw_set_slots()
2430 tbl->fver = BTF_SET_SLOT_TABLE_VER; in rtw89_btc_fw_set_slots()
2431 tbl->tbl_num = CXST_MAX; in rtw89_btc_fw_set_slots()
2432 memcpy(tbl->tbls, dm->slot.v1, flex_array_size(tbl, tbls, CXST_MAX)); in rtw89_btc_fw_set_slots()
2443 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_fw_en_rpt()
2444 struct rtw89_btc_wl_smap *wl_smap = &btc->cx.wl.status.map; in rtw89_btc_fw_en_rpt()
2445 struct rtw89_btc_btf_fwinfo *fwinfo = &btc->fwinfo; in rtw89_btc_fw_en_rpt()
2450 if ((wl_smap->rf_off || wl_smap->lps != BTC_LPS_OFF) && rpt_state != 0) in rtw89_btc_fw_en_rpt()
2460 val = fwinfo->rpt_en_map | bit_map; in rtw89_btc_fw_en_rpt()
2462 val = fwinfo->rpt_en_map & ~bit_map; in rtw89_btc_fw_en_rpt()
2464 if (val == fwinfo->rpt_en_map) in rtw89_btc_fw_en_rpt()
2467 if (btc->ver->fcxbtcrpt == 7 || btc->ver->fcxbtcrpt == 8) { in rtw89_btc_fw_en_rpt()
2469 r.v8.fver = btc->ver->fcxbtcrpt; in rtw89_btc_fw_en_rpt()
2475 if (btc->ver->fcxbtcrpt == 105) in rtw89_btc_fw_en_rpt()
2478 r.v1.fver = btc->ver->fcxbtcrpt; in rtw89_btc_fw_en_rpt()
2486 fwinfo->rpt_en_map = val; in rtw89_btc_fw_en_rpt()
2491 const struct rtw89_chip_info *chip = rtwdev->chip; in btc_fw_set_monreg()
2492 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in btc_fw_set_monreg()
2498 n = chip->mon_reg_num; in btc_fw_set_monreg()
2502 if (ver->fcxmreg == 1) in btc_fw_set_monreg()
2516 if (ver->fcxmreg == 7) { in btc_fw_set_monreg()
2521 v7->type = RPT_EN_MREG; in btc_fw_set_monreg()
2522 v7->fver = ver->fcxmreg; in btc_fw_set_monreg()
2523 v7->len = n; in btc_fw_set_monreg()
2525 v7->regs[i].type = chip->mon_reg[i].type; in btc_fw_set_monreg()
2526 v7->regs[i].bytes = chip->mon_reg[i].bytes; in btc_fw_set_monreg()
2527 v7->regs[i].offset = chip->mon_reg[i].offset; in btc_fw_set_monreg()
2537 v1->fver = ver->fcxmreg; in btc_fw_set_monreg()
2538 v1->reg_num = n; in btc_fw_set_monreg()
2539 memcpy(v1->regs, chip->mon_reg, flex_array_size(v1, regs, n)); in btc_fw_set_monreg()
2555 struct rtw89_btc *btc = &rtwdev->btc; in _update_dm_step()
2556 struct rtw89_btc_dm *dm = &btc->dm; in _update_dm_step()
2558 /* use ring-structure to store dm step */ in _update_dm_step()
2559 dm->dm_step.step[dm->dm_step.step_pos] = reason_or_action; in _update_dm_step()
2560 dm->dm_step.step_pos++; in _update_dm_step()
2562 if (dm->dm_step.step_pos >= ARRAY_SIZE(dm->dm_step.step)) { in _update_dm_step()
2563 dm->dm_step.step_pos = 0; in _update_dm_step()
2564 dm->dm_step.step_ov = true; in _update_dm_step()
2571 struct rtw89_btc *btc = &rtwdev->btc; in _fw_set_policy()
2572 struct rtw89_btc_dm *dm = &btc->dm; in _fw_set_policy()
2575 dm->run_action = action; in _fw_set_policy()
2580 btc->policy_len = 0; in _fw_set_policy()
2581 btc->policy_type = policy_type; in _fw_set_policy()
2586 if (btc->policy_len == 0 || btc->policy_len > RTW89_BTC_POLICY_MAXLEN) in _fw_set_policy()
2590 "[BTC], %s(): action = %d -> policy type/len: 0x%04x/%d\n", in _fw_set_policy()
2591 __func__, action, policy_type, btc->policy_len); in _fw_set_policy()
2593 if (dm->tdma.rxflctrl == CXFLC_NULLP || in _fw_set_policy()
2594 dm->tdma.rxflctrl == CXFLC_QOSNULL) in _fw_set_policy()
2595 btc->lps = 1; in _fw_set_policy()
2597 btc->lps = 0; in _fw_set_policy()
2599 if (btc->lps == 1) in _fw_set_policy()
2600 rtw89_set_coex_ctrl_lps(rtwdev, btc->lps); in _fw_set_policy()
2603 btc->policy, btc->policy_len); in _fw_set_policy()
2605 memcpy(&dm->tdma_now, &dm->tdma, sizeof(dm->tdma_now)); in _fw_set_policy()
2606 if (btc->ver->fcxslots == 7) in _fw_set_policy()
2607 memcpy(&dm->slot_now.v7, &dm->slot.v7, sizeof(dm->slot_now.v7)); in _fw_set_policy()
2609 memcpy(&dm->slot_now.v1, &dm->slot.v1, sizeof(dm->slot_now.v1)); in _fw_set_policy()
2612 if (btc->update_policy_force) in _fw_set_policy()
2613 btc->update_policy_force = false; in _fw_set_policy()
2615 if (btc->lps == 0) in _fw_set_policy()
2616 rtw89_set_coex_ctrl_lps(rtwdev, btc->lps); in _fw_set_policy()
2621 struct rtw89_btc *btc = &rtwdev->btc; in _fw_set_drv_info()
2622 const struct rtw89_btc_ver *ver = btc->ver; in _fw_set_drv_info()
2623 struct rtw89_btc_dm *dm = &btc->dm; in _fw_set_drv_info()
2624 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _fw_set_drv_info()
2625 struct rtw89_btc_rf_trx_para rf_para = dm->rf_trx_para; in _fw_set_drv_info()
2629 if (ver->fcxinit == 7) in _fw_set_drv_info()
2635 if (ver->fwlrole == 0) in _fw_set_drv_info()
2637 else if (ver->fwlrole == 1) in _fw_set_drv_info()
2639 else if (ver->fwlrole == 2) in _fw_set_drv_info()
2641 else if (ver->fwlrole == 7) in _fw_set_drv_info()
2643 else if (ver->fwlrole == 8) in _fw_set_drv_info()
2647 if (ver->drvinfo_type == 1) in _fw_set_drv_info()
2650 if (ver->fcxctrl == 7) in _fw_set_drv_info()
2656 if (ver->drvinfo_type == 1) in _fw_set_drv_info()
2659 dm->trx_info.tx_power = u32_get_bits(rf_para.wl_tx_power, in _fw_set_drv_info()
2661 dm->trx_info.rx_gain = u32_get_bits(rf_para.wl_rx_gain, in _fw_set_drv_info()
2663 dm->trx_info.bt_tx_power = u32_get_bits(rf_para.bt_tx_power, in _fw_set_drv_info()
2665 dm->trx_info.bt_rx_gain = u32_get_bits(rf_para.bt_rx_gain, in _fw_set_drv_info()
2667 dm->trx_info.cn = wl->cn_report; in _fw_set_drv_info()
2668 dm->trx_info.nhm = wl->nhm.pwr; in _fw_set_drv_info()
2672 if (ver->drvinfo_type == 1) in _fw_set_drv_info()
2689 struct rtw89_btc *btc = &rtwdev->btc; in btc_fw_event()
2690 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in btc_fw_event()
2710 struct rtw89_btc *btc = &rtwdev->btc; in _set_gnt()
2711 struct rtw89_btc_dm *dm = &btc->dm; in _set_gnt()
2712 struct rtw89_mac_ax_gnt *g = dm->gnt.band; in _set_gnt()
2753 rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt); in _set_gnt()
2759 struct rtw89_btc *btc = &rtwdev->btc; in _set_gnt_v1()
2760 struct rtw89_btc_dm *dm = &btc->dm; in _set_gnt_v1()
2761 struct rtw89_mac_ax_gnt *g = dm->gnt.band; in _set_gnt_v1()
2762 u8 i, bt_idx = dm->bt_select + 1; in _set_gnt_v1()
2802 if (rtwdev->chip->para_ver & BTC_FEAT_WLAN_ACT_MUX) { in _set_gnt_v1()
2809 dm->gnt.bt[i].wlan_act_en = 0; in _set_gnt_v1()
2810 dm->gnt.bt[i].wlan_act = 0; in _set_gnt_v1()
2813 dm->gnt.bt[i].wlan_act_en = 1; in _set_gnt_v1()
2814 dm->gnt.bt[i].wlan_act = 0; in _set_gnt_v1()
2817 dm->gnt.bt[i].wlan_act_en = 1; in _set_gnt_v1()
2818 dm->gnt.bt[i].wlan_act = 1; in _set_gnt_v1()
2823 rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt); in _set_gnt_v1()
2847 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_wl_tx_power()
2848 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_tx_power()
2849 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_wl_tx_power()
2852 if (wl->rf_para.tx_pwr_freerun == level) in _set_wl_tx_power()
2855 wl->rf_para.tx_pwr_freerun = level; in _set_wl_tx_power()
2856 btc->dm.rf_trx_para.wl_tx_power = level; in _set_wl_tx_power()
2874 chip->ops->btc_set_wl_txpwr_ctrl(rtwdev, pwr_val); in _set_wl_tx_power()
2879 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_wl_rx_gain()
2880 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_rx_gain()
2881 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_wl_rx_gain()
2883 if (wl->rf_para.rx_gain_freerun == level) in _set_wl_rx_gain()
2886 wl->rf_para.rx_gain_freerun = level; in _set_wl_rx_gain()
2887 btc->dm.rf_trx_para.wl_rx_gain = level; in _set_wl_rx_gain()
2893 chip->ops->btc_set_wl_rx_gain(rtwdev, level); in _set_wl_rx_gain()
2898 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_tx_power()
2899 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_tx_power()
2903 if (btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE] == 0) in _set_bt_tx_power()
2906 if (bt->rf_para.tx_pwr_freerun == level) in _set_bt_tx_power()
2913 buf = (s8)(-level); in _set_bt_tx_power()
2916 bt->rf_para.tx_pwr_freerun = level; in _set_bt_tx_power()
2917 btc->dm.rf_trx_para.bt_tx_power = level; in _set_bt_tx_power()
2925 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_rx_gain()
2926 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_rx_gain()
2928 if (btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE] == 0) in _set_bt_rx_gain()
2931 if ((bt->rf_para.rx_gain_freerun == level || in _set_bt_rx_gain()
2933 (!rtwdev->chip->scbd || bt->lna_constrain == level)) in _set_bt_rx_gain()
2936 bt->rf_para.rx_gain_freerun = level; in _set_bt_rx_gain()
2937 btc->dm.rf_trx_para.bt_rx_gain = level; in _set_bt_rx_gain()
2953 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_rf_trx_para()
2954 struct rtw89_btc *btc = &rtwdev->btc; in _set_rf_trx_para()
2955 const struct rtw89_btc_ver *ver = btc->ver; in _set_rf_trx_para()
2956 struct rtw89_btc_dm *dm = &btc->dm; in _set_rf_trx_para()
2957 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_rf_trx_para()
2958 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_rf_trx_para()
2959 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _set_rf_trx_para()
2960 struct rtw89_btc_wl_smap *wl_smap = &wl->status.map; in _set_rf_trx_para()
2965 if (ver->fwlrole == 0) { in _set_rf_trx_para()
2966 link_mode = wl->role_info.link_mode; in _set_rf_trx_para()
2968 if (wl->dbcc_info.real_band[i] == RTW89_BAND_2G) in _set_rf_trx_para()
2971 } else if (ver->fwlrole == 1) { in _set_rf_trx_para()
2972 link_mode = wl->role_info_v1.link_mode; in _set_rf_trx_para()
2973 dbcc_2g_phy = wl->role_info_v1.dbcc_2g_phy; in _set_rf_trx_para()
2974 } else if (ver->fwlrole == 2) { in _set_rf_trx_para()
2975 link_mode = wl->role_info_v2.link_mode; in _set_rf_trx_para()
2976 dbcc_2g_phy = wl->role_info_v2.dbcc_2g_phy; in _set_rf_trx_para()
2980 if (btc->ant_type == BTC_ANT_SHARED) { in _set_rf_trx_para()
2982 if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) || in _set_rf_trx_para()
2983 dm->bt_only == 1) in _set_rf_trx_para()
2984 dm->trx_para_level = 1; /* for better BT ACI issue */ in _set_rf_trx_para()
2986 dm->trx_para_level = 0; in _set_rf_trx_para()
2987 } else { /* non-shared antenna */ in _set_rf_trx_para()
2988 dm->trx_para_level = 5; in _set_rf_trx_para()
2989 /* modify trx_para if WK 2.4G-STA-DL + bt link */ in _set_rf_trx_para()
2990 if (b->profile_cnt.now != 0 && in _set_rf_trx_para()
2992 wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { /* uplink */ in _set_rf_trx_para()
2993 if (wl->rssi_level == 4 && bt->rssi_level > 2) in _set_rf_trx_para()
2994 dm->trx_para_level = 6; in _set_rf_trx_para()
2995 else if (wl->rssi_level == 3 && bt->rssi_level > 3) in _set_rf_trx_para()
2996 dm->trx_para_level = 7; in _set_rf_trx_para()
3000 level_id = dm->trx_para_level; in _set_rf_trx_para()
3001 if (level_id >= chip->rf_para_dlink_num || in _set_rf_trx_para()
3002 level_id >= chip->rf_para_ulink_num) { in _set_rf_trx_para()
3009 if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) in _set_rf_trx_para()
3010 para = chip->rf_para_ulink[level_id]; in _set_rf_trx_para()
3012 para = chip->rf_para_dlink[level_id]; in _set_rf_trx_para()
3014 if (dm->fddt_train) { in _set_rf_trx_para()
3024 if (!bt->enable.now || dm->wl_only || wl_smap->rf_off || in _set_rf_trx_para()
3025 wl_smap->lps == BTC_LPS_RF_OFF || in _set_rf_trx_para()
3028 (rtwdev->dbcc_en && dbcc_2g_phy != RTW89_PHY_1)) in _set_rf_trx_para()
3033 if (wl_stb_chg != dm->wl_stb_chg) { in _set_rf_trx_para()
3034 dm->wl_stb_chg = wl_stb_chg; in _set_rf_trx_para()
3035 chip->ops->btc_wl_s1_standby(rtwdev, dm->wl_stb_chg); in _set_rf_trx_para()
3041 struct rtw89_btc *btc = &rtwdev->btc; in _update_btc_state_map()
3042 struct rtw89_btc_cx *cx = &btc->cx; in _update_btc_state_map()
3043 struct rtw89_btc_wl_info *wl = &cx->wl; in _update_btc_state_map()
3044 struct rtw89_btc_bt_info *bt = &cx->bt; in _update_btc_state_map()
3045 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _update_btc_state_map()
3047 if (wl->status.map.connecting || wl->status.map._4way || in _update_btc_state_map()
3048 wl->status.map.roaming || wl->status.map.dbccing) { in _update_btc_state_map()
3049 cx->state_map = BTC_WLINKING; in _update_btc_state_map()
3050 } else if (wl->status.map.scan) { /* wl scan */ in _update_btc_state_map()
3051 if (bt_linfo->status.map.inq_pag) in _update_btc_state_map()
3052 cx->state_map = BTC_WSCAN_BSCAN; in _update_btc_state_map()
3054 cx->state_map = BTC_WSCAN_BNOSCAN; in _update_btc_state_map()
3055 } else if (wl->status.map.busy) { /* only busy */ in _update_btc_state_map()
3056 if (bt_linfo->status.map.inq_pag) in _update_btc_state_map()
3057 cx->state_map = BTC_WBUSY_BSCAN; in _update_btc_state_map()
3059 cx->state_map = BTC_WBUSY_BNOSCAN; in _update_btc_state_map()
3061 cx->state_map = BTC_WIDLE; in _update_btc_state_map()
3067 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_bt_afh_info()
3068 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_afh_info()
3069 const struct rtw89_btc_ver *ver = btc->ver; in _set_bt_afh_info()
3070 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_bt_afh_info()
3071 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_afh_info()
3072 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _set_bt_afh_info()
3073 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _set_bt_afh_info()
3074 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_bt_afh_info()
3075 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_bt_afh_info()
3076 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_bt_afh_info()
3077 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_bt_afh_info()
3083 u8 en = 0, i, ch = 0, bw = 0; in _set_bt_afh_info() local
3086 if (btc->manual_ctrl || wl->status.map.scan) in _set_bt_afh_info()
3089 if (ver->fwlrole == 0) { in _set_bt_afh_info()
3090 mode = wl_rinfo->link_mode; in _set_bt_afh_info()
3091 connect_cnt = wl_rinfo->connect_cnt; in _set_bt_afh_info()
3092 } else if (ver->fwlrole == 1) { in _set_bt_afh_info()
3093 mode = wl_rinfo_v1->link_mode; in _set_bt_afh_info()
3094 connect_cnt = wl_rinfo_v1->connect_cnt; in _set_bt_afh_info()
3095 } else if (ver->fwlrole == 2) { in _set_bt_afh_info()
3096 mode = wl_rinfo_v2->link_mode; in _set_bt_afh_info()
3097 connect_cnt = wl_rinfo_v2->connect_cnt; in _set_bt_afh_info()
3098 } else if (ver->fwlrole == 7) { in _set_bt_afh_info()
3099 mode = wl_rinfo_v7->link_mode; in _set_bt_afh_info()
3100 connect_cnt = wl_rinfo_v7->connect_cnt; in _set_bt_afh_info()
3101 } else if (ver->fwlrole == 8) { in _set_bt_afh_info()
3102 mode = wl_rinfo_v8->link_mode; in _set_bt_afh_info()
3103 connect_cnt = wl_rinfo_v8->connect_cnt; in _set_bt_afh_info()
3108 if (wl->status.map.rf_off || bt->whql_test || in _set_bt_afh_info()
3111 en = false; in _set_bt_afh_info()
3113 en = true; in _set_bt_afh_info()
3116 r = &wl_rinfo->active_role[i]; in _set_bt_afh_info()
3117 r1 = &wl_rinfo_v1->active_role_v1[i]; in _set_bt_afh_info()
3118 r2 = &wl_rinfo_v2->active_role_v2[i]; in _set_bt_afh_info()
3119 r7 = &wl_rinfo_v7->active_role[i]; in _set_bt_afh_info()
3120 rlink = &wl_rinfo_v8->rlink[i][0]; in _set_bt_afh_info()
3122 if (ver->fwlrole == 0 && in _set_bt_afh_info()
3123 (r->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info()
3124 r->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info()
3125 ch = r->ch; in _set_bt_afh_info()
3126 bw = r->bw; in _set_bt_afh_info()
3128 } else if (ver->fwlrole == 1 && in _set_bt_afh_info()
3129 (r1->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info()
3130 r1->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info()
3131 ch = r1->ch; in _set_bt_afh_info()
3132 bw = r1->bw; in _set_bt_afh_info()
3134 } else if (ver->fwlrole == 2 && in _set_bt_afh_info()
3135 (r2->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info()
3136 r2->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info()
3137 ch = r2->ch; in _set_bt_afh_info()
3138 bw = r2->bw; in _set_bt_afh_info()
3140 } else if (ver->fwlrole == 7 && in _set_bt_afh_info()
3141 (r7->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info()
3142 r7->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info()
3143 ch = r7->ch; in _set_bt_afh_info()
3144 bw = r7->bw; in _set_bt_afh_info()
3146 } else if (ver->fwlrole == 8 && in _set_bt_afh_info()
3147 (rlink->role == RTW89_WIFI_ROLE_P2P_GO || in _set_bt_afh_info()
3148 rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { in _set_bt_afh_info()
3149 ch = rlink->ch; in _set_bt_afh_info()
3150 bw = rlink->bw; in _set_bt_afh_info()
3155 en = true; in _set_bt_afh_info()
3158 r = &wl_rinfo->active_role[i]; in _set_bt_afh_info()
3159 r1 = &wl_rinfo_v1->active_role_v1[i]; in _set_bt_afh_info()
3160 r2 = &wl_rinfo_v2->active_role_v2[i]; in _set_bt_afh_info()
3161 r7 = &wl_rinfo_v7->active_role[i]; in _set_bt_afh_info()
3162 rlink = &wl_rinfo_v8->rlink[i][0]; in _set_bt_afh_info()
3164 if (ver->fwlrole == 0 && in _set_bt_afh_info()
3165 r->connected && r->band == RTW89_BAND_2G) { in _set_bt_afh_info()
3166 ch = r->ch; in _set_bt_afh_info()
3167 bw = r->bw; in _set_bt_afh_info()
3169 } else if (ver->fwlrole == 1 && in _set_bt_afh_info()
3170 r1->connected && r1->band == RTW89_BAND_2G) { in _set_bt_afh_info()
3171 ch = r1->ch; in _set_bt_afh_info()
3172 bw = r1->bw; in _set_bt_afh_info()
3174 } else if (ver->fwlrole == 2 && in _set_bt_afh_info()
3175 r2->connected && r2->band == RTW89_BAND_2G) { in _set_bt_afh_info()
3176 ch = r2->ch; in _set_bt_afh_info()
3177 bw = r2->bw; in _set_bt_afh_info()
3179 } else if (ver->fwlrole == 7 && in _set_bt_afh_info()
3180 r7->connected && r7->band == RTW89_BAND_2G) { in _set_bt_afh_info()
3181 ch = r7->ch; in _set_bt_afh_info()
3182 bw = r7->bw; in _set_bt_afh_info()
3184 } else if (ver->fwlrole == 8 && in _set_bt_afh_info()
3185 rlink->connected && rlink->rf_band == RTW89_BAND_2G) { in _set_bt_afh_info()
3186 ch = rlink->ch; in _set_bt_afh_info()
3187 bw = rlink->bw; in _set_bt_afh_info()
3195 bw = 20 + chip->afh_guard_ch * 2; in _set_bt_afh_info()
3198 bw = 40 + chip->afh_guard_ch * 2; in _set_bt_afh_info()
3201 bw = 5 + chip->afh_guard_ch * 2; in _set_bt_afh_info()
3204 bw = 10 + chip->afh_guard_ch * 2; in _set_bt_afh_info()
3208 en = false; /* turn off AFH info if BW > 40 */ in _set_bt_afh_info()
3212 if (wl->afh_info.en == en && in _set_bt_afh_info()
3213 wl->afh_info.ch == ch && in _set_bt_afh_info()
3214 wl->afh_info.bw == bw && in _set_bt_afh_info()
3215 b->profile_cnt.last == b->profile_cnt.now) { in _set_bt_afh_info()
3222 wl->afh_info.en = en; in _set_bt_afh_info()
3223 wl->afh_info.ch = ch; in _set_bt_afh_info()
3224 wl->afh_info.bw = bw; in _set_bt_afh_info()
3226 _send_fw_cmd(rtwdev, BTFC_SET, SET_BT_WL_CH_INFO, &wl->afh_info, 3); in _set_bt_afh_info()
3229 "[BTC], %s(): en=%d, ch=%d, bw=%d\n", in _set_bt_afh_info()
3230 __func__, en, ch, bw); in _set_bt_afh_info()
3231 btc->cx.cnt_wl[BTC_WCNT_CH_UPDATE]++; in _set_bt_afh_info()
3236 struct rtw89_btc *btc = &rtwdev->btc; in _check_freerun()
3237 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _check_freerun()
3238 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _check_freerun()
3239 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _check_freerun()
3240 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _check_freerun()
3241 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _check_freerun()
3242 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _check_freerun()
3243 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _check_freerun()
3244 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _check_freerun()
3245 struct rtw89_btc_bt_hid_desc *hid = &bt_linfo->hid_desc; in _check_freerun()
3246 union rtw89_btc_module_info *md = &btc->mdinfo; in _check_freerun()
3247 const struct rtw89_btc_ver *ver = btc->ver; in _check_freerun()
3250 if (ver->fcxinit == 7) in _check_freerun()
3251 isolation = md->md_v7.ant.isolation; in _check_freerun()
3253 isolation = md->md.ant.isolation; in _check_freerun()
3255 if (ver->fwlrole == 0) in _check_freerun()
3256 connect_cnt = wl_rinfo->connect_cnt; in _check_freerun()
3257 else if (ver->fwlrole == 1) in _check_freerun()
3258 connect_cnt = wl_rinfo_v1->connect_cnt; in _check_freerun()
3259 else if (ver->fwlrole == 2) in _check_freerun()
3260 connect_cnt = wl_rinfo_v2->connect_cnt; in _check_freerun()
3261 else if (ver->fwlrole == 7) in _check_freerun()
3262 connect_cnt = wl_rinfo_v7->connect_cnt; in _check_freerun()
3263 else if (ver->fwlrole == 8) in _check_freerun()
3264 connect_cnt = wl_rinfo_v8->connect_cnt; in _check_freerun()
3266 if (btc->ant_type == BTC_ANT_SHARED) { in _check_freerun()
3267 btc->dm.trx_para_level = 0; in _check_freerun()
3273 btc->dm.trx_para_level = 5; in _check_freerun()
3277 if (bt_linfo->profile_cnt.now == 0) { in _check_freerun()
3278 btc->dm.trx_para_level = 5; in _check_freerun()
3282 if (hid->pair_cnt > BTC_TDMA_BTHID_MAX) { in _check_freerun()
3283 btc->dm.trx_para_level = 5; in _check_freerun()
3289 btc->dm.trx_para_level = 5; in _check_freerun()
3293 if (!wl->status.map.busy) {/* wl idle -> freerun */ in _check_freerun()
3294 btc->dm.trx_para_level = 5; in _check_freerun()
3296 } else if (wl->rssi_level > 1) {/* WL rssi < 50% (-60dBm) */ in _check_freerun()
3297 btc->dm.trx_para_level = 0; in _check_freerun()
3299 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { in _check_freerun()
3300 if (wl->rssi_level == 0 && bt_linfo->rssi > 31) { in _check_freerun()
3301 btc->dm.trx_para_level = 6; in _check_freerun()
3303 } else if (wl->rssi_level == 1 && bt_linfo->rssi > 36) { in _check_freerun()
3304 btc->dm.trx_para_level = 7; in _check_freerun()
3307 btc->dm.trx_para_level = 0; in _check_freerun()
3309 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) { in _check_freerun()
3310 if (bt_linfo->rssi > 28) { in _check_freerun()
3311 btc->dm.trx_para_level = 6; in _check_freerun()
3316 btc->dm.trx_para_level = 0; in _check_freerun()
3320 #define _tdma_set_flctrl(btc, flc) ({(btc)->dm.tdma.rxflctrl = flc; })
3321 #define _tdma_set_flctrl_role(btc, role) ({(btc)->dm.tdma.rxflctrl_role = role; })
3322 #define _tdma_set_tog(btc, wtg) ({(btc)->dm.tdma.wtgle_n = wtg; })
3323 #define _tdma_set_lek(btc, lek) ({(btc)->dm.tdma.leak_n = lek; })
3387 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_policy()
3389 chip->ops->btc_set_policy(rtwdev, policy_type); in _set_policy()
3396 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_set_policy()
3397 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_set_policy()
3398 struct rtw89_btc_fbtc_tdma *t = &dm->tdma; in rtw89_btc_set_policy()
3399 struct rtw89_btc_fbtc_slot *s = dm->slot.v1; in rtw89_btc_set_policy()
3403 if (btc->ant_type == BTC_ANT_SHARED) { in rtw89_btc_set_policy()
3404 if (btc->cx.wl.status.map._4way) in rtw89_btc_set_policy()
3417 btc->bt_req_en = false; in rtw89_btc_set_policy()
3424 btc->update_policy_force = true; in rtw89_btc_set_policy()
3472 btc->bt_req_en = true; in rtw89_btc_set_policy()
3490 case BTC_CXP_FIX: /* TDMA Fix-Slot */ in rtw89_btc_set_policy()
3538 case BTC_CXP_FIX_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3539 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3541 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy()
3546 case BTC_CXP_PFIX: /* PS-TDMA Fix-Slot */ in rtw89_btc_set_policy()
3549 if (btc->cx.wl.role_info.role_map.role.ap) in rtw89_btc_set_policy()
3579 case BTC_CXP_AUTO: /* TDMA Auto-Slot */ in rtw89_btc_set_policy()
3595 case BTC_CXP_AUTO_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3596 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3598 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy()
3603 case BTC_CXP_PAUTO: /* PS-TDMA Auto-Slot */ in rtw89_btc_set_policy()
3620 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3622 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy()
3627 case BTC_CXP_AUTO2: /* TDMA Auto-Slot2 */ in rtw89_btc_set_policy()
3656 case BTC_CXP_AUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3657 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3659 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy()
3664 case BTC_CXP_PAUTO2: /* PS-TDMA Auto-Slot2 */ in rtw89_btc_set_policy()
3693 case BTC_CXP_PAUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy()
3694 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy()
3696 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy()
3707 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_set_policy_v1()
3708 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_set_policy_v1()
3709 struct rtw89_btc_fbtc_tdma *t = &dm->tdma; in rtw89_btc_set_policy_v1()
3710 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &btc->cx.wl.role_info_v1; in rtw89_btc_set_policy_v1()
3711 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in rtw89_btc_set_policy_v1()
3712 struct rtw89_btc_bt_hid_desc *hid = &btc->cx.bt.link_info.hid_desc; in rtw89_btc_set_policy_v1()
3713 struct rtw89_btc_bt_hfp_desc *hfp = &btc->cx.bt.link_info.hfp_desc; in rtw89_btc_set_policy_v1()
3714 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_set_policy_v1()
3721 if (btc->ant_type == BTC_ANT_SHARED) { in rtw89_btc_set_policy_v1()
3722 if (btc->cx.wl.status.map._4way) in rtw89_btc_set_policy_v1()
3724 else if (hid->exist && hid->type == BTC_HID_218) in rtw89_btc_set_policy_v1()
3725 tbl_w1 = cxtbl[7]; /* Ack/BA no break bt Hi-Pri-rx */ in rtw89_btc_set_policy_v1()
3729 if (dm->leak_ap && in rtw89_btc_set_policy_v1()
3733 } else if (hid->exist && hid->type == BTC_HID_218) { in rtw89_btc_set_policy_v1()
3734 tbl_b1 = cxtbl[4]; /* Ack/BA no break bt Hi-Pri-rx */ in rtw89_btc_set_policy_v1()
3744 if (wl->bg_mode) in rtw89_btc_set_policy_v1()
3746 else if ((wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) && in rtw89_btc_set_policy_v1()
3747 hid->exist) in rtw89_btc_set_policy_v1()
3755 btc->update_policy_force = true; in rtw89_btc_set_policy_v1()
3831 /* To avoid wl-s0 tx break by hid/hfp tx */ in rtw89_btc_set_policy_v1()
3832 if (hid->exist || hfp->exist) in rtw89_btc_set_policy_v1()
3835 dur_2 = dm->e2g_slot_limit; in rtw89_btc_set_policy_v1()
3838 case BTC_CXP_OFFE_2GBWISOB: /* for normal-case */ in rtw89_btc_set_policy_v1()
3844 case BTC_CXP_OFFE_2GISOB: /* for bt no-link */ in rtw89_btc_set_policy_v1()
3870 if (a2dp->exist) in rtw89_btc_set_policy_v1()
3877 case BTC_CXP_OFFE_WL: /* for 4-way */ in rtw89_btc_set_policy_v1()
3889 case BTC_CXP_FIX: /* TDMA Fix-Slot */ in rtw89_btc_set_policy_v1()
3938 case BTC_CXP_FIX_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
3939 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
3941 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
3948 case BTC_CXP_PFIX: /* PS-TDMA Fix-Slot */ in rtw89_btc_set_policy_v1()
3977 case BTC_CXP_PFIX_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
3978 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
3980 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
3987 case BTC_CXP_AUTO: /* TDMA Auto-Slot */ in rtw89_btc_set_policy_v1()
4004 case BTC_CXP_AUTO_TDW1B1: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4005 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4007 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4014 case BTC_CXP_PAUTO: /* PS-TDMA Auto-Slot */ in rtw89_btc_set_policy_v1()
4032 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4034 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4041 case BTC_CXP_AUTO2: /* TDMA Auto-Slot2 */ in rtw89_btc_set_policy_v1()
4071 case BTC_CXP_AUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4072 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4074 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4076 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy_v1()
4083 case BTC_CXP_PAUTO2: /* PS-TDMA Auto-Slot2 */ in rtw89_btc_set_policy_v1()
4113 case BTC_CXP_PAUTO2_TDW1B4: /* W1:B1 = user-define */ in rtw89_btc_set_policy_v1()
4114 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1], in rtw89_btc_set_policy_v1()
4116 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1], in rtw89_btc_set_policy_v1()
4118 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4], in rtw89_btc_set_policy_v1()
4127 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC && dm->tdma.rxflctrl) { in rtw89_btc_set_policy_v1()
4128 null_role = FIELD_PREP(0x0f, dm->wl_scc.null_role1) | in rtw89_btc_set_policy_v1()
4129 FIELD_PREP(0xf0, dm->wl_scc.null_role2); in rtw89_btc_set_policy_v1()
4133 /* enter leak_slot after each null-1 */ in rtw89_btc_set_policy_v1()
4134 if (dm->leak_ap && dm->tdma.leak_n > 1) in rtw89_btc_set_policy_v1()
4137 if (dm->tdma_instant_excute) { in rtw89_btc_set_policy_v1()
4138 btc->dm.tdma.option_ctrl |= BIT(0); in rtw89_btc_set_policy_v1()
4139 btc->update_policy_force = true; in rtw89_btc_set_policy_v1()
4147 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _set_bt_plut()
4153 if (rtwdev->btc.ver->fwlrole == 8) { in _set_bt_plut()
4154 plt.band = wl->pta_req_mac; in _set_bt_plut()
4155 if (wl->bt_polut_type[plt.band] == tx_val) in _set_bt_plut()
4158 wl->bt_polut_type[plt.band] = tx_val; in _set_bt_plut()
4166 if (!rtwdev->dbcc_en) in _set_bt_plut()
4178 struct rtw89_btc *btc = &rtwdev->btc; in _set_ant_v0()
4179 struct rtw89_btc_dm *dm = &btc->dm; in _set_ant_v0()
4180 struct rtw89_btc_cx *cx = &btc->cx; in _set_ant_v0()
4181 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_ant_v0()
4182 struct rtw89_btc_bt_info *bt = &cx->bt; in _set_ant_v0()
4183 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _set_ant_v0()
4190 if (btc->ver->fwlrole == 1) in _set_ant_v0()
4191 dbcc_chg = wl->role_info_v1.dbcc_chg; in _set_ant_v0()
4192 else if (btc->ver->fwlrole == 2) in _set_ant_v0()
4193 dbcc_chg = wl->role_info_v2.dbcc_chg; in _set_ant_v0()
4194 else if (btc->ver->fwlrole == 7) in _set_ant_v0()
4195 dbcc_chg = wl->role_info_v7.dbcc_chg; in _set_ant_v0()
4196 else if (btc->ver->fwlrole == 8) in _set_ant_v0()
4197 dbcc_chg = wl->role_info_v8.dbcc_chg; in _set_ant_v0()
4199 if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF || in _set_ant_v0()
4200 btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE || in _set_ant_v0()
4201 btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || dbcc_chg) in _set_ant_v0()
4204 if (!force_exec && ant_path_type == dm->set_ant_path) { in _set_ant_v0()
4209 } else if (bt->rfk_info.map.run) { in _set_ant_v0()
4213 } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK && in _set_ant_v0()
4214 wl->rfk_info.state != BTC_WRFK_STOP) { in _set_ant_v0()
4220 dm->set_ant_path = ant_path_type; in _set_ant_v0()
4225 __func__, phy_map, dm->set_ant_path & 0xff); in _set_ant_v0()
4232 if (bt->enable.now) in _set_ant_v0()
4251 if (rtwdev->dbcc_en) { in _set_ant_v0()
4253 b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G); in _set_ant_v0()
4259 wl_dinfo->real_band[0] == RTW89_BAND_2G && in _set_ant_v0()
4260 wl_dinfo->real_band[1] == RTW89_BAND_5G) in _set_ant_v0()
4308 struct rtw89_btc *btc = &rtwdev->btc; in _set_ant_v1()
4309 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_ant_v1()
4310 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_ant_v1()
4311 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _set_ant_v1()
4313 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _set_ant_v1()
4314 struct rtw89_btc_dm *dm = &btc->dm; in _set_ant_v1()
4317 if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF || in _set_ant_v1()
4318 btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE || in _set_ant_v1()
4319 btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || wl_rinfo->dbcc_chg) in _set_ant_v1()
4322 if (wl_rinfo->link_mode != BTC_WLINK_25G_MCC && in _set_ant_v1()
4323 btc->dm.wl_btg_rx == 2) in _set_ant_v1()
4326 if (!force_exec && ant_path_type == dm->set_ant_path) { in _set_ant_v1()
4331 } else if (bt->rfk_info.map.run) { in _set_ant_v1()
4335 } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK && in _set_ant_v1()
4336 wl->rfk_info.state != BTC_WRFK_STOP) { in _set_ant_v1()
4342 dm->set_ant_path = ant_path_type; in _set_ant_v1()
4346 __func__, phy_map, dm->set_ant_path & 0xff); in _set_ant_v1()
4351 if (bt->enable.now && bt->run_patch_code) in _set_ant_v1()
4368 if (wl_rinfo->dbcc_en) { in _set_ant_v1()
4369 if (wl_dinfo->real_band[RTW89_PHY_0] == RTW89_BAND_2G) in _set_ant_v1()
4375 if (wl_dinfo->real_band[RTW89_PHY_1] == RTW89_BAND_2G) in _set_ant_v1()
4398 BTC_WLACT_SW_HI); /* no BT-Tx */ in _set_ant_v1()
4410 if (rtwdev->chip->chip_id == RTL8922A) in _set_ant()
4432 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_off()
4433 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_off()
4437 if (wl->status.map.rf_off || btc->dm.bt_only) { in _action_wl_off()
4439 } else if (wl->status.map.lps == BTC_LPS_RF_ON) { in _action_wl_off()
4448 } else if (wl->status.map.lps == BTC_LPS_RF_ON) { in _action_wl_off()
4449 if (btc->cx.bt.link_info.a2dp_desc.active) in _action_wl_off()
4460 struct rtw89_btc *btc = &rtwdev->btc; in _action_freerun()
4467 btc->dm.freerun = true; in _action_freerun()
4488 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_idle()
4489 struct rtw89_btc_bt_link_info *b = &btc->cx.bt.link_info; in _action_bt_idle()
4490 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_bt_idle()
4494 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_bt_idle()
4495 switch (btc->cx.state_map) { in _action_bt_idle()
4496 case BTC_WBUSY_BNOSCAN: /*wl-busy + bt idle*/ in _action_bt_idle()
4497 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-idle */ in _action_bt_idle()
4498 if (b->status.map.connect) in _action_bt_idle()
4500 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) in _action_bt_idle()
4505 case BTC_WBUSY_BSCAN: /*wl-busy + bt-inq */ in _action_bt_idle()
4509 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq */ in _action_bt_idle()
4513 case BTC_WLINKING: /* wl-connecting + bt-inq or bt-idle */ in _action_bt_idle()
4517 case BTC_WIDLE: /* wl-idle + bt-idle */ in _action_bt_idle()
4521 } else { /* dedicated-antenna */ in _action_bt_idle()
4528 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_hfp()
4529 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_bt_hfp()
4533 if (btc->ant_type == BTC_ANT_SHARED) { in _action_bt_hfp()
4534 if (btc->cx.wl.status.map._4way) { in _action_bt_hfp()
4536 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { in _action_bt_hfp()
4537 btc->cx.bt.scan_rx_low_pri = true; in _action_bt_hfp()
4543 if (wl->bg_mode) in _action_bt_hfp()
4545 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) in _action_bt_hfp()
4554 const struct rtw89_chip_info *chip = rtwdev->chip; in _action_bt_hid()
4555 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_hid()
4556 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_bt_hid()
4557 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_bt_hid()
4558 struct rtw89_btc_bt_hid_desc *hid = &bt->link_info.hid_desc; in _action_bt_hid()
4563 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_bt_hid()
4564 if (wl->status.map._4way) { in _action_bt_hid()
4566 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { in _action_bt_hid()
4567 btc->cx.bt.scan_rx_low_pri = true; in _action_bt_hid()
4568 if (hid->type & BTC_HID_BLE) in _action_bt_hid()
4572 } else if (hid->type == BTC_HID_218) { in _action_bt_hid()
4573 bt->scan_rx_low_pri = true; in _action_bt_hid()
4575 } else if (chip->para_ver == 0x1) { in _action_bt_hid()
4580 } else { /* dedicated-antenna */ in _action_bt_hid()
4581 if (wl->bg_mode) in _action_bt_hid()
4583 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) in _action_bt_hid()
4594 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp()
4595 struct rtw89_btc_dm *dm = &btc->dm; in _action_bt_a2dp()
4599 dm->slot_dur[CXST_W1] = 20; in _action_bt_a2dp()
4600 dm->slot_dur[CXST_B1] = BTC_B1_MAX; in _action_bt_a2dp()
4602 switch (btc->cx.state_map) { in _action_bt_a2dp()
4603 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP */ in _action_bt_a2dp()
4606 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP */ in _action_bt_a2dp()
4609 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP */ in _action_bt_a2dp()
4612 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP */ in _action_bt_a2dp()
4613 case BTC_WLINKING: /* wl-connecting + bt-A2DP */ in _action_bt_a2dp()
4614 if (btc->cx.wl.rfk_info.con_rfk) in _action_bt_a2dp()
4619 case BTC_WIDLE: /* wl-idle + bt-A2DP */ in _action_bt_a2dp()
4627 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dpsink()
4631 switch (btc->cx.state_map) { in _action_bt_a2dpsink()
4632 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4635 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4638 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4641 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4644 case BTC_WLINKING: /* wl-connecting + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4645 if (btc->cx.wl.rfk_info.con_rfk) in _action_bt_a2dpsink()
4650 case BTC_WIDLE: /* wl-idle + bt-A2dp_Sink */ in _action_bt_a2dpsink()
4658 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_pan()
4659 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; in _action_bt_pan()
4660 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in _action_bt_pan()
4661 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc; in _action_bt_pan()
4665 switch (btc->cx.state_map) { in _action_bt_pan()
4666 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-PAN */ in _action_bt_pan()
4668 btc->dm.slot_dur[CXST_W1] = 80; in _action_bt_pan()
4669 btc->dm.slot_dur[CXST_B1] = 20; in _action_bt_pan()
4675 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-PAN */ in _action_bt_pan()
4678 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-PAN */ in _action_bt_pan()
4681 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-PAN */ in _action_bt_pan()
4684 case BTC_WLINKING: /* wl-connecting + bt-PAN */ in _action_bt_pan()
4687 case BTC_WIDLE: /* wl-idle + bt-pan */ in _action_bt_pan()
4695 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp_hid()
4696 struct rtw89_btc_dm *dm = &btc->dm; in _action_bt_a2dp_hid()
4700 dm->slot_dur[CXST_W1] = 20; in _action_bt_a2dp_hid()
4701 dm->slot_dur[CXST_B1] = BTC_B1_MAX; in _action_bt_a2dp_hid()
4703 switch (btc->cx.state_map) { in _action_bt_a2dp_hid()
4704 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+HID */ in _action_bt_a2dp_hid()
4705 case BTC_WIDLE: /* wl-idle + bt-A2DP */ in _action_bt_a2dp_hid()
4708 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+HID */ in _action_bt_a2dp_hid()
4712 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+HID */ in _action_bt_a2dp_hid()
4715 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+HID */ in _action_bt_a2dp_hid()
4716 case BTC_WLINKING: /* wl-connecting + bt-A2DP+HID */ in _action_bt_a2dp_hid()
4717 if (btc->cx.wl.rfk_info.con_rfk) in _action_bt_a2dp_hid()
4727 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp_pan()
4731 switch (btc->cx.state_map) { in _action_bt_a2dp_pan()
4732 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
4735 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
4738 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
4741 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
4744 case BTC_WLINKING: /* wl-connecting + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
4747 case BTC_WIDLE: /* wl-idle + bt-A2DP+PAN */ in _action_bt_a2dp_pan()
4755 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_pan_hid()
4759 switch (btc->cx.state_map) { in _action_bt_pan_hid()
4760 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-PAN+HID */ in _action_bt_pan_hid()
4763 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-PAN+HID */ in _action_bt_pan_hid()
4766 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-PAN+HID */ in _action_bt_pan_hid()
4769 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-PAN+HID */ in _action_bt_pan_hid()
4772 case BTC_WLINKING: /* wl-connecting + bt-PAN+HID */ in _action_bt_pan_hid()
4775 case BTC_WIDLE: /* wl-idle + bt-PAN+HID */ in _action_bt_pan_hid()
4783 struct rtw89_btc *btc = &rtwdev->btc; in _action_bt_a2dp_pan_hid()
4787 switch (btc->cx.state_map) { in _action_bt_a2dp_pan_hid()
4788 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
4792 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
4796 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
4800 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
4801 case BTC_WLINKING: /* wl-connecting + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
4805 case BTC_WIDLE: /* wl-idle + bt-A2DP+PAN+HID */ in _action_bt_a2dp_pan_hid()
4820 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_other()
4824 if (btc->ant_type == BTC_ANT_SHARED) in _action_wl_other()
4838 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_rfk()
4839 struct rtw89_btc_wl_rfk_info rfk = btc->cx.wl.rfk_info; in _action_wl_rfk()
4847 btc->dm.tdma_instant_excute = 1; in _action_wl_rfk()
4850 btc->ant_type == BTC_ANT_SHARED) { in _action_wl_rfk()
4861 struct rtw89_btc *btc = &rtwdev->btc; in _set_btg_ctrl()
4862 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_btg_ctrl()
4863 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_btg_ctrl()
4864 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_btg_ctrl()
4865 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_btg_ctrl()
4866 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_btg_ctrl()
4867 struct rtw89_btc_wl_role_info *wl_rinfo_v0 = &wl->role_info; in _set_btg_ctrl()
4868 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _set_btg_ctrl()
4869 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_btg_ctrl()
4870 const struct rtw89_btc_ver *ver = btc->ver; in _set_btg_ctrl()
4871 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_btg_ctrl()
4872 struct rtw89_btc_dm *dm = &btc->dm; in _set_btg_ctrl()
4874 u32 run_reason = btc->dm.run_reason; in _set_btg_ctrl()
4878 if (btc->manual_ctrl) in _set_btg_ctrl()
4881 if (ver->fwlrole == 0) in _set_btg_ctrl()
4882 wl_rinfo.link_mode = wl_rinfo_v0->link_mode; in _set_btg_ctrl()
4883 else if (ver->fwlrole == 1) in _set_btg_ctrl()
4884 wl_rinfo.link_mode = wl_rinfo_v1->link_mode; in _set_btg_ctrl()
4885 else if (ver->fwlrole == 2) in _set_btg_ctrl()
4886 wl_rinfo.link_mode = wl_rinfo_v2->link_mode; in _set_btg_ctrl()
4887 else if (ver->fwlrole == 7) in _set_btg_ctrl()
4888 wl_rinfo.link_mode = wl_rinfo_v7->link_mode; in _set_btg_ctrl()
4889 else if (ver->fwlrole == 8) in _set_btg_ctrl()
4890 wl_rinfo.link_mode = wl_rinfo_v8->link_mode; in _set_btg_ctrl()
4894 if (rtwdev->dbcc_en) { in _set_btg_ctrl()
4895 if (ver->fwlrole == 0) { in _set_btg_ctrl()
4899 if (wl_dinfo->real_band[i] == RTW89_BAND_2G) in _set_btg_ctrl()
4902 } else if (ver->fwlrole == 1) { in _set_btg_ctrl()
4903 wl_rinfo.dbcc_2g_phy = wl_rinfo_v1->dbcc_2g_phy; in _set_btg_ctrl()
4904 } else if (ver->fwlrole == 2) { in _set_btg_ctrl()
4905 wl_rinfo.dbcc_2g_phy = wl_rinfo_v2->dbcc_2g_phy; in _set_btg_ctrl()
4906 } else if (ver->fwlrole == 7) { in _set_btg_ctrl()
4907 wl_rinfo.dbcc_2g_phy = wl_rinfo_v7->dbcc_2g_phy; in _set_btg_ctrl()
4908 } else if (ver->fwlrole == 8) { in _set_btg_ctrl()
4909 wl_rinfo.dbcc_2g_phy = wl_rinfo_v8->dbcc_2g_phy; in _set_btg_ctrl()
4917 else if (!(bt->run_patch_code && bt->enable.now)) in _set_btg_ctrl()
4921 else if (dm->freerun) in _set_btg_ctrl()
4923 else if (rtwdev->dbcc_en && wl_rinfo.dbcc_2g_phy != RTW89_PHY_1) in _set_btg_ctrl()
4928 if (dm->wl_btg_rx_rb != dm->wl_btg_rx && in _set_btg_ctrl()
4929 dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) { in _set_btg_ctrl()
4931 dm->wl_btg_rx_rb = val; in _set_btg_ctrl()
4936 dm->wl_btg_rx_rb != dm->wl_btg_rx || in _set_btg_ctrl()
4937 is_btg != dm->wl_btg_rx) { in _set_btg_ctrl()
4939 dm->wl_btg_rx = is_btg; in _set_btg_ctrl()
4944 chip->ops->ctrl_btg_bt_rx(rtwdev, is_btg, RTW89_PHY_0); in _set_btg_ctrl()
4950 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_preagc_ctrl()
4951 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; in _set_wl_preagc_ctrl()
4952 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_wl_preagc_ctrl()
4953 struct rtw89_btc_wl_role_info_v2 *rinfo_v2 = &wl->role_info_v2; in _set_wl_preagc_ctrl()
4954 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7; in _set_wl_preagc_ctrl()
4955 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8; in _set_wl_preagc_ctrl()
4956 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_wl_preagc_ctrl()
4957 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_wl_preagc_ctrl()
4958 struct rtw89_btc_dm *dm = &btc->dm; in _set_wl_preagc_ctrl()
4960 u8 role_ver = rtwdev->btc.ver->fwlrole; in _set_wl_preagc_ctrl()
4963 if (btc->manual_ctrl) in _set_wl_preagc_ctrl()
4967 dbcc_en = rinfo_v2->dbcc_en; in _set_wl_preagc_ctrl()
4968 link_mode = rinfo_v2->link_mode; in _set_wl_preagc_ctrl()
4969 dbcc_2g_phy = rinfo_v2->dbcc_2g_phy; in _set_wl_preagc_ctrl()
4971 dbcc_en = rinfo_v7->dbcc_en; in _set_wl_preagc_ctrl()
4972 link_mode = rinfo_v7->link_mode; in _set_wl_preagc_ctrl()
4973 dbcc_2g_phy = rinfo_v7->dbcc_2g_phy; in _set_wl_preagc_ctrl()
4975 dbcc_en = rinfo_v8->dbcc_en; in _set_wl_preagc_ctrl()
4976 link_mode = rinfo_v8->link_mode; in _set_wl_preagc_ctrl()
4977 dbcc_2g_phy = rinfo_v7->dbcc_2g_phy; in _set_wl_preagc_ctrl()
4984 } else if (!(bt->run_patch_code && bt->enable.now)) { in _set_wl_preagc_ctrl()
4989 btc->cx.bt.link_info.profile_cnt.now == 0) { in _set_wl_preagc_ctrl()
4991 } else if (dm->tdma_now.type != CXTDMA_OFF && in _set_wl_preagc_ctrl()
4992 !bt_linfo->hfp_desc.exist && in _set_wl_preagc_ctrl()
4993 !bt_linfo->hid_desc.exist && in _set_wl_preagc_ctrl()
4994 dm->fddt_train == BTC_FDDT_DISABLE) { in _set_wl_preagc_ctrl()
4998 } else if (btc->ant_type == BTC_ANT_SHARED) { in _set_wl_preagc_ctrl()
5004 if (dm->wl_pre_agc_rb != dm->wl_pre_agc && in _set_wl_preagc_ctrl()
5005 dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND) { in _set_wl_preagc_ctrl()
5007 dm->wl_pre_agc_rb = val; in _set_wl_preagc_ctrl()
5010 if ((wl->coex_mode == BTC_MODE_NORMAL && in _set_wl_preagc_ctrl()
5011 (dm->run_reason == BTC_RSN_NTFY_INIT || in _set_wl_preagc_ctrl()
5012 dm->run_reason == BTC_RSN_NTFY_SWBAND || in _set_wl_preagc_ctrl()
5013 dm->wl_pre_agc_rb != dm->wl_pre_agc)) || in _set_wl_preagc_ctrl()
5014 is_preagc != dm->wl_pre_agc) { in _set_wl_preagc_ctrl()
5015 dm->wl_pre_agc = is_preagc; in _set_wl_preagc_ctrl()
5019 chip->ops->ctrl_nbtg_bt_tx(rtwdev, dm->wl_pre_agc, RTW89_PHY_0); in _set_wl_preagc_ctrl()
5036 struct rtw89_dev *rtwdev = iter_data->rtwdev; in __rtw89_tx_time_iter()
5037 struct rtw89_btc *btc = &rtwdev->btc; in __rtw89_tx_time_iter()
5038 struct rtw89_btc_cx *cx = &btc->cx; in __rtw89_tx_time_iter()
5039 struct rtw89_btc_wl_info *wl = &cx->wl; in __rtw89_tx_time_iter()
5041 u8 port = rtwvif_link->port; in __rtw89_tx_time_iter()
5042 u32 tx_time = iter_data->tx_time; in __rtw89_tx_time_iter()
5043 u8 tx_retry = iter_data->tx_retry; in __rtw89_tx_time_iter()
5044 u16 enable = iter_data->enable; in __rtw89_tx_time_iter()
5045 bool reenable = iter_data->reenable; in __rtw89_tx_time_iter()
5047 if (btc->ver->fwlrole == 8) in __rtw89_tx_time_iter()
5048 plink = &wl->rlink_info[port][0]; in __rtw89_tx_time_iter()
5050 plink = &wl->link_info[port]; in __rtw89_tx_time_iter()
5055 if (!plink->connected) { in __rtw89_tx_time_iter()
5058 __func__, plink->connected); in __rtw89_tx_time_iter()
5062 /* backup the original tx time before tx-limit on */ in __rtw89_tx_time_iter()
5064 rtw89_mac_get_tx_time(rtwdev, rtwsta_link, &plink->tx_time); in __rtw89_tx_time_iter()
5065 rtw89_mac_get_tx_retry_limit(rtwdev, rtwsta_link, &plink->tx_retry); in __rtw89_tx_time_iter()
5068 __func__, plink->tx_time, plink->tx_retry); in __rtw89_tx_time_iter()
5071 /* restore the original tx time if no tx-limit */ in __rtw89_tx_time_iter()
5073 rtw89_mac_set_tx_time(rtwdev, rtwsta_link, true, plink->tx_time); in __rtw89_tx_time_iter()
5075 plink->tx_retry); in __rtw89_tx_time_iter()
5078 __func__, plink->tx_time, plink->tx_retry); in __rtw89_tx_time_iter()
5099 rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_tx_time_iter()
5106 struct rtw89_btc *btc = &rtwdev->btc; in _set_wl_tx_limit()
5107 const struct rtw89_btc_ver *ver = btc->ver; in _set_wl_tx_limit()
5108 struct rtw89_btc_cx *cx = &btc->cx; in _set_wl_tx_limit()
5109 struct rtw89_btc_dm *dm = &btc->dm; in _set_wl_tx_limit()
5110 struct rtw89_btc_wl_info *wl = &cx->wl; in _set_wl_tx_limit()
5111 struct rtw89_btc_bt_info *bt = &cx->bt; in _set_wl_tx_limit()
5112 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _set_wl_tx_limit()
5113 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc; in _set_wl_tx_limit()
5114 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc; in _set_wl_tx_limit()
5115 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _set_wl_tx_limit()
5116 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_wl_tx_limit()
5117 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_wl_tx_limit()
5118 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_wl_tx_limit()
5119 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_wl_tx_limit()
5126 if (btc->manual_ctrl) in _set_wl_tx_limit()
5129 if (ver->fwlrole == 0) in _set_wl_tx_limit()
5130 mode = wl_rinfo->link_mode; in _set_wl_tx_limit()
5131 else if (ver->fwlrole == 1) in _set_wl_tx_limit()
5132 mode = wl_rinfo_v1->link_mode; in _set_wl_tx_limit()
5133 else if (ver->fwlrole == 2) in _set_wl_tx_limit()
5134 mode = wl_rinfo_v2->link_mode; in _set_wl_tx_limit()
5135 else if (ver->fwlrole == 7) in _set_wl_tx_limit()
5136 mode = wl_rinfo_v7->link_mode; in _set_wl_tx_limit()
5137 else if (ver->fwlrole == 8) in _set_wl_tx_limit()
5138 mode = wl_rinfo_v8->link_mode; in _set_wl_tx_limit()
5142 if (ver->fcxctrl == 7) in _set_wl_tx_limit()
5143 igno_bt = btc->ctrl.ctrl_v7.igno_bt; in _set_wl_tx_limit()
5145 igno_bt = btc->ctrl.ctrl.igno_bt; in _set_wl_tx_limit()
5147 if (btc->dm.freerun || igno_bt || b->profile_cnt.now == 0 || in _set_wl_tx_limit()
5152 } else if ((hfp->exist && hid->exist) || hid->pair_cnt > 1) { in _set_wl_tx_limit()
5156 } else if (hfp->exist || hid->exist) { in _set_wl_tx_limit()
5166 if (dm->wl_tx_limit.enable == enable && in _set_wl_tx_limit()
5167 dm->wl_tx_limit.tx_time == tx_time && in _set_wl_tx_limit()
5168 dm->wl_tx_limit.tx_retry == tx_retry) in _set_wl_tx_limit()
5171 if (!dm->wl_tx_limit.enable && enable) in _set_wl_tx_limit()
5174 dm->wl_tx_limit.enable = enable; in _set_wl_tx_limit()
5175 dm->wl_tx_limit.tx_time = tx_time; in _set_wl_tx_limit()
5176 dm->wl_tx_limit.tx_retry = tx_retry; in _set_wl_tx_limit()
5183 ieee80211_iterate_stations_atomic(rtwdev->hw, in _set_wl_tx_limit()
5190 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_rx_agc()
5191 const struct rtw89_btc_ver *ver = btc->ver; in _set_bt_rx_agc()
5192 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_bt_rx_agc()
5193 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _set_bt_rx_agc()
5194 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _set_bt_rx_agc()
5195 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _set_bt_rx_agc()
5196 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _set_bt_rx_agc()
5197 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _set_bt_rx_agc()
5198 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_rx_agc()
5202 if (ver->fwlrole == 0) in _set_bt_rx_agc()
5203 mode = wl_rinfo->link_mode; in _set_bt_rx_agc()
5204 else if (ver->fwlrole == 1) in _set_bt_rx_agc()
5205 mode = wl_rinfo_v1->link_mode; in _set_bt_rx_agc()
5206 else if (ver->fwlrole == 2) in _set_bt_rx_agc()
5207 mode = wl_rinfo_v2->link_mode; in _set_bt_rx_agc()
5208 else if (ver->fwlrole == 7) in _set_bt_rx_agc()
5209 mode = wl_rinfo_v7->link_mode; in _set_bt_rx_agc()
5210 else if (ver->fwlrole == 8) in _set_bt_rx_agc()
5211 mode = wl_rinfo_v8->link_mode; in _set_bt_rx_agc()
5215 if (mode != BTC_WLINK_NOLINK && btc->dm.wl_btg_rx) in _set_bt_rx_agc()
5218 if (bt_hi_lna_rx == bt->hi_lna_rx) in _set_bt_rx_agc()
5226 struct rtw89_btc *btc = &rtwdev->btc; in _set_bt_rx_scan_pri()
5227 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _set_bt_rx_scan_pri()
5229 _write_scbd(rtwdev, BTC_WSCB_RXSCAN_PRI, (bool)(!!bt->scan_rx_low_pri)); in _set_bt_rx_scan_pri()
5234 struct rtw89_btc *btc = &rtwdev->btc; in _action_common()
5235 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_common()
5236 struct rtw89_btc_wl_smap *wl_smap = &wl->status.map; in _action_common()
5237 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_common()
5238 struct rtw89_btc_dm *dm = &btc->dm; in _action_common()
5249 bt_rom_code_id = chip_id_to_bt_rom_code_id(rtwdev->btc.ver->chip_id); in _action_common()
5250 bt_fw_ver = bt->ver_info.fw & 0xffff; in _action_common()
5251 if (bt->enable.now && in _action_common()
5253 (bt_fw_ver == bt_rom_code_id && bt->run_patch_code && rtwdev->chip->scbd))) in _action_common()
5258 if (dm->run_reason == BTC_RSN_NTFY_INIT || in _action_common()
5259 dm->run_reason == BTC_RSN_NTFY_RADIO_STATE || in _action_common()
5260 dm->run_reason == BTC_RSN_NTFY_POWEROFF) { in _action_common()
5263 if (wl_smap->rf_off == 1 || wl_smap->lps != BTC_LPS_OFF) in _action_common()
5269 if (wl->scbd_change) { in _action_common()
5270 rtw89_mac_cfg_sb(rtwdev, wl->scbd); in _action_common()
5272 wl->scbd); in _action_common()
5273 wl->scbd_change = false; in _action_common()
5274 btc->cx.cnt_wl[BTC_WCNT_SCBDUPDATE]++; in _action_common()
5276 btc->dm.tdma_instant_excute = 0; in _action_common()
5281 struct rtw89_btc *btc = &rtwdev->btc; in _action_by_bt()
5282 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_by_bt()
5283 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _action_by_bt()
5284 struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc; in _action_by_bt()
5285 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in _action_by_bt()
5286 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc; in _action_by_bt()
5287 struct rtw89_btc_dm *dm = &btc->dm; in _action_by_bt()
5290 if (dm->freerun_chk) { in _action_by_bt()
5295 if (bt_linfo->hfp_desc.exist) in _action_by_bt()
5298 if (bt_linfo->hid_desc.exist) in _action_by_bt()
5301 if (bt_linfo->a2dp_desc.exist) in _action_by_bt()
5304 if (bt_linfo->pan_desc.exist) in _action_by_bt()
5324 else if (bt_linfo->multi_link.now && !hid.pair_cnt) in _action_by_bt()
5371 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_25g_mcc()
5374 if (btc->ant_type == BTC_ANT_SHARED) { in _action_wl_25g_mcc()
5375 if (btc->cx.wl.status.map._4way) in _action_wl_25g_mcc()
5377 else if (btc->cx.wl.status.val & btc_scanning_map.val) in _action_wl_25g_mcc()
5379 else if (btc->cx.bt.link_info.status.map.connect == 0) in _action_wl_25g_mcc()
5383 } else { /* dedicated-antenna */ in _action_wl_25g_mcc()
5387 btc->dm.e2g_slot_limit = BTC_E2G_LIMIT_DEF; in _action_wl_25g_mcc()
5395 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_scan()
5396 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_scan()
5397 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _action_wl_scan()
5399 if (btc->cx.state_map != BTC_WLINKING && in _action_wl_scan()
5400 RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) { in _action_wl_scan()
5403 } else if (rtwdev->dbcc_en) { in _action_wl_scan()
5404 if (wl_dinfo->real_band[RTW89_PHY_0] != RTW89_BAND_2G && in _action_wl_scan()
5405 wl_dinfo->real_band[RTW89_PHY_1] != RTW89_BAND_2G) in _action_wl_scan()
5410 if (wl->scan_info.band[RTW89_PHY_0] != RTW89_BAND_2G) in _action_wl_scan()
5418 { struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_mcc()
5422 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_mcc()
5423 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_mcc()
5429 } else { /* dedicated-antenna */ in _action_wl_2g_mcc()
5436 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc()
5440 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_scc()
5441 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_scc()
5447 } else { /* dedicated-antenna */ in _action_wl_2g_scc()
5454 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc_v1()
5455 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_2g_scc_v1()
5456 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_wl_2g_scc_v1()
5457 struct rtw89_btc_dm *dm = &btc->dm; in _action_wl_2g_scc_v1()
5458 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &wl->role_info_v1; in _action_wl_2g_scc_v1()
5462 if (btc->ant_type == BTC_ANT_DEDICATED) { in _action_wl_2g_scc_v1()
5465 /* shared-antenna */ in _action_wl_2g_scc_v1()
5466 switch (wl_rinfo->mrole_type) { in _action_wl_2g_scc_v1()
5468 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5469 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_P2P_CLIENT; in _action_wl_2g_scc_v1()
5470 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v1()
5474 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5475 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5476 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v1()
5482 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v1()
5483 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_NONE; in _action_wl_2g_scc_v1()
5484 dur = wl_rinfo->mrole_noa_duration; in _action_wl_2g_scc_v1()
5486 if (wl->status.map._4way) { in _action_wl_2g_scc_v1()
5487 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v1()
5489 } else if (bt->link_info.status.map.connect == 0) { in _action_wl_2g_scc_v1()
5490 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v1()
5492 } else if (bt->link_info.a2dp_desc.exist && in _action_wl_2g_scc_v1()
5493 dur < btc->bt_req_len) { in _action_wl_2g_scc_v1()
5494 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v1()
5496 } else if (bt->link_info.a2dp_desc.exist || in _action_wl_2g_scc_v1()
5497 bt->link_info.pan_desc.exist) { in _action_wl_2g_scc_v1()
5498 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v1()
5501 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v1()
5516 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc_v2()
5517 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_2g_scc_v2()
5518 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_wl_2g_scc_v2()
5519 struct rtw89_btc_dm *dm = &btc->dm; in _action_wl_2g_scc_v2()
5520 struct rtw89_btc_wl_role_info_v2 *rinfo_v2 = &wl->role_info_v2; in _action_wl_2g_scc_v2()
5521 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7; in _action_wl_2g_scc_v2()
5525 if (btc->ver->fwlrole == 2) { in _action_wl_2g_scc_v2()
5526 mrole_type = rinfo_v2->mrole_type; in _action_wl_2g_scc_v2()
5527 mrole_noa_duration = rinfo_v2->mrole_noa_duration; in _action_wl_2g_scc_v2()
5528 } else if (btc->ver->fwlrole == 7) { in _action_wl_2g_scc_v2()
5529 mrole_type = rinfo_v7->mrole_type; in _action_wl_2g_scc_v2()
5530 mrole_noa_duration = rinfo_v7->mrole_noa_duration; in _action_wl_2g_scc_v2()
5535 if (btc->ant_type == BTC_ANT_DEDICATED) { in _action_wl_2g_scc_v2()
5538 /* shared-antenna */ in _action_wl_2g_scc_v2()
5541 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5542 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_P2P_CLIENT; in _action_wl_2g_scc_v2()
5543 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v2()
5547 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5548 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5549 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */ in _action_wl_2g_scc_v2()
5555 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION; in _action_wl_2g_scc_v2()
5556 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_NONE; in _action_wl_2g_scc_v2()
5559 if (wl->status.map._4way) { in _action_wl_2g_scc_v2()
5560 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v2()
5562 } else if (bt->link_info.status.map.connect == 0) { in _action_wl_2g_scc_v2()
5563 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v2()
5565 } else if (bt->link_info.a2dp_desc.exist && in _action_wl_2g_scc_v2()
5566 dur < btc->bt_req_len) { in _action_wl_2g_scc_v2()
5567 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v2()
5569 } else if (bt->link_info.a2dp_desc.exist || in _action_wl_2g_scc_v2()
5570 bt->link_info.pan_desc.exist) { in _action_wl_2g_scc_v2()
5571 dm->wl_scc.ebt_null = 1; /* tx null at EBT */ in _action_wl_2g_scc_v2()
5574 dm->wl_scc.ebt_null = 0; in _action_wl_2g_scc_v2()
5589 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_scc_v8()
5590 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _action_wl_2g_scc_v8()
5591 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _action_wl_2g_scc_v8()
5592 struct rtw89_btc_dm *dm = &btc->dm; in _action_wl_2g_scc_v8()
5595 if (btc->ant_type == BTC_ANT_SHARED) { in _action_wl_2g_scc_v8()
5596 if (wl->status.map._4way) in _action_wl_2g_scc_v8()
5598 else if (bt->link_info.status.map.connect == 0) in _action_wl_2g_scc_v8()
5606 dm->e2g_slot_limit = BTC_E2G_LIMIT_DEF; in _action_wl_2g_scc_v8()
5614 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_ap()
5618 if (btc->ant_type == BTC_ANT_SHARED) { in _action_wl_2g_ap()
5619 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_ap()
5624 } else {/* dedicated-antenna */ in _action_wl_2g_ap()
5631 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_go()
5635 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_go()
5636 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_go()
5642 } else { /* dedicated-antenna */ in _action_wl_2g_go()
5649 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_gc()
5653 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_gc()
5655 } else {/* dedicated-antenna */ in _action_wl_2g_gc()
5662 struct rtw89_btc *btc = &rtwdev->btc; in _action_wl_2g_nan()
5666 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */ in _action_wl_2g_nan()
5667 if (btc->cx.bt.link_info.profile_cnt.now == 0) in _action_wl_2g_nan()
5673 } else { /* dedicated-antenna */ in _action_wl_2g_nan()
5680 const struct rtw89_chip_info *chip = rtwdev->chip; in _read_scbd()
5681 struct rtw89_btc *btc = &rtwdev->btc; in _read_scbd()
5684 if (!chip->scbd) in _read_scbd()
5691 btc->cx.cnt_bt[BTC_BCNT_SCBDREAD]++; in _read_scbd()
5697 const struct rtw89_chip_info *chip = rtwdev->chip; in _write_scbd()
5698 struct rtw89_btc *btc = &rtwdev->btc; in _write_scbd()
5699 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _write_scbd()
5703 if (!chip->scbd) in _write_scbd()
5706 scbd_val = state ? wl->scbd | val : wl->scbd & ~val; in _write_scbd()
5711 if (scbd_val != wl->scbd || force_exec) { in _write_scbd()
5712 wl->scbd = scbd_val; in _write_scbd()
5713 wl->scbd_change = true; in _write_scbd()
5720 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_rssi_state()
5721 u8 next_state, tol = chip->rssi_tol; in _update_rssi_state()
5750 struct rtw89_btc *btc = &rtwdev->btc; in _update_dbcc_band()
5752 btc->cx.wl.dbcc_info.real_band[phy_idx] = in _update_dbcc_band()
5753 btc->cx.wl.scan_info.phy_map & BIT(phy_idx) ? in _update_dbcc_band()
5754 btc->cx.wl.dbcc_info.scan_band[phy_idx] : in _update_dbcc_band()
5755 btc->cx.wl.dbcc_info.op_band[phy_idx]; in _update_dbcc_band()
5760 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info()
5761 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info()
5762 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info()
5763 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _update_wl_info()
5764 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info()
5778 wl_rinfo->active_role[cnt_active - 1].role = wl_linfo[i].role; in _update_wl_info()
5779 wl_rinfo->active_role[cnt_active - 1].pid = wl_linfo[i].pid; in _update_wl_info()
5780 wl_rinfo->active_role[cnt_active - 1].phy = wl_linfo[i].phy; in _update_wl_info()
5781 wl_rinfo->active_role[cnt_active - 1].band = wl_linfo[i].band; in _update_wl_info()
5782 wl_rinfo->active_role[cnt_active - 1].noa = (u8)wl_linfo[i].noa; in _update_wl_info()
5783 wl_rinfo->active_role[cnt_active - 1].connected = 0; in _update_wl_info()
5785 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid; in _update_wl_info()
5790 if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) { in _update_wl_info()
5791 wl_dinfo->role[phy] = wl_linfo[i].role; in _update_wl_info()
5792 wl_dinfo->op_band[phy] = wl_linfo[i].band; in _update_wl_info()
5809 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role); in _update_wl_info()
5810 wl_rinfo->active_role[cnt_active - 1].ch = wl_linfo[i].ch; in _update_wl_info()
5811 wl_rinfo->active_role[cnt_active - 1].bw = wl_linfo[i].bw; in _update_wl_info()
5812 wl_rinfo->active_role[cnt_active - 1].connected = 1; in _update_wl_info()
5816 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1) in _update_wl_info()
5821 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1) in _update_wl_info()
5828 wl_rinfo->connect_cnt = cnt_connect; in _update_wl_info()
5832 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info()
5833 wl_rinfo->role_map.role.none = 1; in _update_wl_info()
5835 wl_rinfo->link_mode = BTC_WLINK_5G; in _update_wl_info()
5836 } else if (wl_rinfo->role_map.role.nan) { in _update_wl_info()
5837 wl_rinfo->link_mode = BTC_WLINK_2G_NAN; in _update_wl_info()
5839 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info()
5841 if (rtwdev->dbcc_en) { in _update_wl_info()
5842 switch (wl_dinfo->role[RTW89_PHY_0]) { in _update_wl_info()
5844 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info()
5847 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info()
5850 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info()
5853 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info()
5856 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info()
5860 wl_rinfo->link_mode = BTC_WLINK_25G_MCC; in _update_wl_info()
5863 if (wl_rinfo->role_map.role.station && in _update_wl_info()
5864 (wl_rinfo->role_map.role.p2p_go || in _update_wl_info()
5865 wl_rinfo->role_map.role.p2p_gc || in _update_wl_info()
5866 wl_rinfo->role_map.role.ap)) { in _update_wl_info()
5868 wl_rinfo->link_mode = BTC_WLINK_2G_SCC; in _update_wl_info()
5870 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info()
5872 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info()
5875 if (wl_rinfo->role_map.role.station) in _update_wl_info()
5876 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info()
5877 else if (wl_rinfo->role_map.role.ap) in _update_wl_info()
5878 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info()
5879 else if (wl_rinfo->role_map.role.p2p_go) in _update_wl_info()
5880 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info()
5881 else if (wl_rinfo->role_map.role.p2p_gc) in _update_wl_info()
5882 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info()
5884 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info()
5887 /* if no client_joined, don't care P2P-GO/AP role */ in _update_wl_info()
5888 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) { in _update_wl_info()
5890 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC || in _update_wl_info()
5891 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) { in _update_wl_info()
5892 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info()
5893 wl_rinfo->connect_cnt = 1; in _update_wl_info()
5894 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO || in _update_wl_info()
5895 wl_rinfo->link_mode == BTC_WLINK_2G_AP) { in _update_wl_info()
5896 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info()
5897 wl_rinfo->connect_cnt = 0; in _update_wl_info()
5904 cnt_connect, cnt_connecting, wl_rinfo->link_mode); in _update_wl_info()
5911 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v1()
5912 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v1()
5913 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info_v1()
5914 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &wl->role_info_v1; in _update_wl_info_v1()
5915 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v1()
5929 wl_rinfo->active_role_v1[cnt_active - 1].role = wl_linfo[i].role; in _update_wl_info_v1()
5930 wl_rinfo->active_role_v1[cnt_active - 1].pid = wl_linfo[i].pid; in _update_wl_info_v1()
5931 wl_rinfo->active_role_v1[cnt_active - 1].phy = wl_linfo[i].phy; in _update_wl_info_v1()
5932 wl_rinfo->active_role_v1[cnt_active - 1].band = wl_linfo[i].band; in _update_wl_info_v1()
5933 wl_rinfo->active_role_v1[cnt_active - 1].noa = (u8)wl_linfo[i].noa; in _update_wl_info_v1()
5934 wl_rinfo->active_role_v1[cnt_active - 1].connected = 0; in _update_wl_info_v1()
5936 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid; in _update_wl_info_v1()
5940 if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) { in _update_wl_info_v1()
5941 wl_dinfo->role[phy] = wl_linfo[i].role; in _update_wl_info_v1()
5942 wl_dinfo->op_band[phy] = wl_linfo[i].band; in _update_wl_info_v1()
5959 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role); in _update_wl_info_v1()
5960 wl_rinfo->active_role_v1[cnt_active - 1].ch = wl_linfo[i].ch; in _update_wl_info_v1()
5961 wl_rinfo->active_role_v1[cnt_active - 1].bw = wl_linfo[i].bw; in _update_wl_info_v1()
5962 wl_rinfo->active_role_v1[cnt_active - 1].connected = 1; in _update_wl_info_v1()
5966 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1) in _update_wl_info_v1()
5971 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1) in _update_wl_info_v1()
5978 wl_rinfo->connect_cnt = cnt_connect; in _update_wl_info_v1()
5982 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v1()
5983 wl_rinfo->role_map.role.none = 1; in _update_wl_info_v1()
5985 wl_rinfo->link_mode = BTC_WLINK_5G; in _update_wl_info_v1()
5986 } else if (wl_rinfo->role_map.role.nan) { in _update_wl_info_v1()
5987 wl_rinfo->link_mode = BTC_WLINK_2G_NAN; in _update_wl_info_v1()
5989 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v1()
5991 if (rtwdev->dbcc_en) { in _update_wl_info_v1()
5992 switch (wl_dinfo->role[RTW89_PHY_0]) { in _update_wl_info_v1()
5994 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v1()
5997 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v1()
6000 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v1()
6003 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v1()
6006 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v1()
6010 wl_rinfo->link_mode = BTC_WLINK_25G_MCC; in _update_wl_info_v1()
6013 if (wl_rinfo->role_map.role.station && in _update_wl_info_v1()
6014 (wl_rinfo->role_map.role.p2p_go || in _update_wl_info_v1()
6015 wl_rinfo->role_map.role.p2p_gc || in _update_wl_info_v1()
6016 wl_rinfo->role_map.role.ap)) { in _update_wl_info_v1()
6018 wl_rinfo->link_mode = BTC_WLINK_2G_SCC; in _update_wl_info_v1()
6020 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v1()
6022 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v1()
6025 if (wl_rinfo->role_map.role.station) in _update_wl_info_v1()
6026 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v1()
6027 else if (wl_rinfo->role_map.role.ap) in _update_wl_info_v1()
6028 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v1()
6029 else if (wl_rinfo->role_map.role.p2p_go) in _update_wl_info_v1()
6030 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v1()
6031 else if (wl_rinfo->role_map.role.p2p_gc) in _update_wl_info_v1()
6032 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v1()
6034 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v1()
6037 /* if no client_joined, don't care P2P-GO/AP role */ in _update_wl_info_v1()
6038 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) { in _update_wl_info_v1()
6040 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC || in _update_wl_info_v1()
6041 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) { in _update_wl_info_v1()
6042 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v1()
6043 wl_rinfo->connect_cnt = 1; in _update_wl_info_v1()
6044 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO || in _update_wl_info_v1()
6045 wl_rinfo->link_mode == BTC_WLINK_2G_AP) { in _update_wl_info_v1()
6046 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v1()
6047 wl_rinfo->connect_cnt = 0; in _update_wl_info_v1()
6054 cnt_connect, cnt_connecting, wl_rinfo->link_mode); in _update_wl_info_v1()
6061 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v2()
6062 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v2()
6063 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info_v2()
6064 struct rtw89_btc_wl_role_info_v2 *wl_rinfo = &wl->role_info_v2; in _update_wl_info_v2()
6065 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v2()
6079 wl_rinfo->active_role_v2[cnt_active - 1].role = wl_linfo[i].role; in _update_wl_info_v2()
6080 wl_rinfo->active_role_v2[cnt_active - 1].pid = wl_linfo[i].pid; in _update_wl_info_v2()
6081 wl_rinfo->active_role_v2[cnt_active - 1].phy = wl_linfo[i].phy; in _update_wl_info_v2()
6082 wl_rinfo->active_role_v2[cnt_active - 1].band = wl_linfo[i].band; in _update_wl_info_v2()
6083 wl_rinfo->active_role_v2[cnt_active - 1].noa = (u8)wl_linfo[i].noa; in _update_wl_info_v2()
6084 wl_rinfo->active_role_v2[cnt_active - 1].connected = 0; in _update_wl_info_v2()
6086 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid; in _update_wl_info_v2()
6090 if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) { in _update_wl_info_v2()
6091 wl_dinfo->role[phy] = wl_linfo[i].role; in _update_wl_info_v2()
6092 wl_dinfo->op_band[phy] = wl_linfo[i].band; in _update_wl_info_v2()
6109 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role); in _update_wl_info_v2()
6110 wl_rinfo->active_role_v2[cnt_active - 1].ch = wl_linfo[i].ch; in _update_wl_info_v2()
6111 wl_rinfo->active_role_v2[cnt_active - 1].bw = wl_linfo[i].bw; in _update_wl_info_v2()
6112 wl_rinfo->active_role_v2[cnt_active - 1].connected = 1; in _update_wl_info_v2()
6116 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1) in _update_wl_info_v2()
6121 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1) in _update_wl_info_v2()
6128 wl_rinfo->connect_cnt = cnt_connect; in _update_wl_info_v2()
6132 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v2()
6133 wl_rinfo->role_map.role.none = 1; in _update_wl_info_v2()
6135 wl_rinfo->link_mode = BTC_WLINK_5G; in _update_wl_info_v2()
6136 } else if (wl_rinfo->role_map.role.nan) { in _update_wl_info_v2()
6137 wl_rinfo->link_mode = BTC_WLINK_2G_NAN; in _update_wl_info_v2()
6139 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v2()
6141 if (rtwdev->dbcc_en) { in _update_wl_info_v2()
6142 switch (wl_dinfo->role[RTW89_PHY_0]) { in _update_wl_info_v2()
6144 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v2()
6147 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v2()
6150 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v2()
6153 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v2()
6156 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v2()
6160 wl_rinfo->link_mode = BTC_WLINK_25G_MCC; in _update_wl_info_v2()
6163 if (wl_rinfo->role_map.role.station && in _update_wl_info_v2()
6164 (wl_rinfo->role_map.role.p2p_go || in _update_wl_info_v2()
6165 wl_rinfo->role_map.role.p2p_gc || in _update_wl_info_v2()
6166 wl_rinfo->role_map.role.ap)) { in _update_wl_info_v2()
6168 wl_rinfo->link_mode = BTC_WLINK_2G_SCC; in _update_wl_info_v2()
6170 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v2()
6172 wl_rinfo->link_mode = BTC_WLINK_2G_MCC; in _update_wl_info_v2()
6175 if (wl_rinfo->role_map.role.station) in _update_wl_info_v2()
6176 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v2()
6177 else if (wl_rinfo->role_map.role.ap) in _update_wl_info_v2()
6178 wl_rinfo->link_mode = BTC_WLINK_2G_AP; in _update_wl_info_v2()
6179 else if (wl_rinfo->role_map.role.p2p_go) in _update_wl_info_v2()
6180 wl_rinfo->link_mode = BTC_WLINK_2G_GO; in _update_wl_info_v2()
6181 else if (wl_rinfo->role_map.role.p2p_gc) in _update_wl_info_v2()
6182 wl_rinfo->link_mode = BTC_WLINK_2G_GC; in _update_wl_info_v2()
6184 wl_rinfo->link_mode = BTC_WLINK_OTHER; in _update_wl_info_v2()
6187 /* if no client_joined, don't care P2P-GO/AP role */ in _update_wl_info_v2()
6188 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) { in _update_wl_info_v2()
6190 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC || in _update_wl_info_v2()
6191 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) { in _update_wl_info_v2()
6192 wl_rinfo->link_mode = BTC_WLINK_2G_STA; in _update_wl_info_v2()
6193 wl_rinfo->connect_cnt = 1; in _update_wl_info_v2()
6194 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO || in _update_wl_info_v2()
6195 wl_rinfo->link_mode == BTC_WLINK_2G_AP) { in _update_wl_info_v2()
6196 wl_rinfo->link_mode = BTC_WLINK_NOLINK; in _update_wl_info_v2()
6197 wl_rinfo->connect_cnt = 0; in _update_wl_info_v2()
6204 cnt_connect, cnt_connecting, wl_rinfo->link_mode); in _update_wl_info_v2()
6231 if (r1->chan != r2->chan) { /* primary ch is different */ in _chk_role_ch_group()
6233 } else if (r1->bw == RTW89_CHANNEL_WIDTH_40 && in _chk_role_ch_group()
6234 r2->bw == RTW89_CHANNEL_WIDTH_40) { in _chk_role_ch_group()
6235 if (r1->offset != r2->offset) in _chk_role_ch_group()
6244 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl; in _chk_dbcc()
6245 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7; in _chk_dbcc()
6246 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8; in _chk_dbcc()
6250 if (rtwdev->btc.ver->fwlrole == 7) in _chk_dbcc()
6251 connect_cnt = rinfo_v7->connect_cnt; in _chk_dbcc()
6252 else if (rtwdev->btc.ver->fwlrole == 8) in _chk_dbcc()
6253 connect_cnt = rinfo_v8->connect_cnt; in _chk_dbcc()
6257 /* find out the 2G-PHY by connect-id ->ch */ in _chk_dbcc()
6265 /* If no any 2G-port exist, it's impossible because 5G-exclude */ in _chk_dbcc()
6276 /* find the other-port in the 2G-PHY, ex: PHY-0:6G, PHY1: mcc/scc */ in _chk_dbcc()
6288 /* Single-role in 2G-PHY */ in _chk_dbcc()
6292 /* 2-role in 2G-PHY */ in _chk_dbcc()
6304 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &rtwdev->btc.cx.wl.role_info_v8; in _update_role_link_mode()
6305 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &rtwdev->btc.cx.wl.role_info_v7; in _update_role_link_mode()
6306 u8 role_ver = rtwdev->btc.ver->fwlrole; in _update_role_link_mode()
6312 wl_role = rinfo_v7->role_map; in _update_role_link_mode()
6313 link_mode = rinfo_v7->link_mode; in _update_role_link_mode()
6314 connect_cnt = rinfo_v7->connect_cnt; in _update_role_link_mode()
6316 wl_role = rinfo_v8->role_map; in _update_role_link_mode()
6317 link_mode = rinfo_v8->link_mode; in _update_role_link_mode()
6318 connect_cnt = rinfo_v8->connect_cnt; in _update_role_link_mode()
6323 /* if no client_joined, don't care P2P-GO/AP role */ in _update_role_link_mode()
6328 rinfo_v7->link_mode = BTC_WLINK_2G_STA; in _update_role_link_mode()
6329 rinfo_v7->connect_cnt--; in _update_role_link_mode()
6331 rinfo_v8->link_mode = BTC_WLINK_2G_STA; in _update_role_link_mode()
6332 rinfo_v8->connect_cnt--; in _update_role_link_mode()
6337 rinfo_v7->link_mode = BTC_WLINK_NOLINK; in _update_role_link_mode()
6338 rinfo_v7->connect_cnt--; in _update_role_link_mode()
6340 rinfo_v8->link_mode = BTC_WLINK_NOLINK; in _update_role_link_mode()
6341 rinfo_v8->connect_cnt--; in _update_role_link_mode()
6346 /* Identify 2-Role type */ in _update_role_link_mode()
6364 rinfo_v7->mrole_type = type; in _update_role_link_mode()
6365 rinfo_v7->mrole_noa_duration = dur; in _update_role_link_mode()
6367 rinfo_v8->mrole_type = type; in _update_role_link_mode()
6368 rinfo_v8->mrole_noa_duration = dur; in _update_role_link_mode()
6375 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v7()
6376 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v7()
6377 struct rtw89_btc_wl_role_info_v7 *wl_rinfo = &wl->role_info_v7; in _update_wl_info_v7()
6378 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v7()
6379 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info; in _update_wl_info_v7()
6395 act_role = &wl_rinfo->active_role[i]; in _update_wl_info_v7()
6396 act_role->role = wl_linfo[i].role; in _update_wl_info_v7()
6400 act_role->connected = 0; in _update_wl_info_v7()
6407 act_role->connected = 1; in _update_wl_info_v7()
6408 act_role->pid = wl_linfo[i].pid; in _update_wl_info_v7()
6409 act_role->phy = wl_linfo[i].phy; in _update_wl_info_v7()
6410 act_role->band = wl_linfo[i].band; in _update_wl_info_v7()
6411 act_role->ch = wl_linfo[i].ch; in _update_wl_info_v7()
6412 act_role->bw = wl_linfo[i].bw; in _update_wl_info_v7()
6413 act_role->noa = wl_linfo[i].noa; in _update_wl_info_v7()
6414 act_role->noa_dur = wl_linfo[i].noa_duration; in _update_wl_info_v7()
6415 cid_ch[cnt - 1] = wl_linfo[i].chdef; in _update_wl_info_v7()
6416 cid_phy[cnt - 1] = wl_linfo[i].phy; in _update_wl_info_v7()
6417 cid_role[cnt - 1] = wl_linfo[i].role; in _update_wl_info_v7()
6418 wl_rinfo->role_map |= BIT(wl_linfo[i].role); in _update_wl_info_v7()
6421 phy_now = act_role->phy; in _update_wl_info_v7()
6430 act_role->client_cnt = wl_linfo[i].client_cnt; in _update_wl_info_v7()
6432 act_role->client_cnt = 0; in _update_wl_info_v7()
6435 if (act_role->noa && act_role->noa_dur > 0) in _update_wl_info_v7()
6436 noa_duration = act_role->noa_dur; in _update_wl_info_v7()
6438 if (rtwdev->dbcc_en) { in _update_wl_info_v7()
6440 wl_dinfo->role[phy_dbcc] |= BIT(wl_linfo[i].role); in _update_wl_info_v7()
6441 wl_dinfo->op_band[phy_dbcc] = wl_linfo[i].chdef.band; in _update_wl_info_v7()
6452 wl_rinfo->p2p_2g = 1; in _update_wl_info_v7()
6456 wl->bg_mode = 1; in _update_wl_info_v7()
6458 wl->he_mode = true; in _update_wl_info_v7()
6464 if (act_role->band == RTW89_BAND_5G && act_role->ch >= 100) in _update_wl_info_v7()
6465 wl->is_5g_hi_channel = 1; in _update_wl_info_v7()
6467 wl->is_5g_hi_channel = 0; in _update_wl_info_v7()
6470 wl_rinfo->connect_cnt = cnt; in _update_wl_info_v7()
6471 wl->client_cnt_inc_2g = client_inc_2g; in _update_wl_info_v7()
6475 wl_rinfo->role_map = BIT(RTW89_WIFI_ROLE_NONE); in _update_wl_info_v7()
6478 } else if (wl_rinfo->role_map & BIT(RTW89_WIFI_ROLE_NAN)) { in _update_wl_info_v7()
6482 } else if (rtwdev->dbcc_en) { in _update_wl_info_v7()
6485 /* correct 2G-located PHY band for gnt ctrl */ in _update_wl_info_v7()
6487 wl_dinfo->op_band[dbcc_2g_phy] = RTW89_BAND_2G; in _update_wl_info_v7()
6491 if (_chk_role_ch_group(&cid_ch[0], &cid_ch[cnt - 1])) in _update_wl_info_v7()
6501 wl_rinfo->link_mode = mode; in _update_wl_info_v7()
6509 if (wl_rinfo->dbcc_en != rtwdev->dbcc_en) { in _update_wl_info_v7()
6510 wl_rinfo->dbcc_chg = 1; in _update_wl_info_v7()
6511 wl_rinfo->dbcc_en = rtwdev->dbcc_en; in _update_wl_info_v7()
6512 btc->cx.cnt_wl[BTC_WCNT_DBCC_CHG]++; in _update_wl_info_v7()
6515 if (rtwdev->dbcc_en) { in _update_wl_info_v7()
6516 wl_rinfo->dbcc_2g_phy = dbcc_2g_phy; in _update_wl_info_v7()
6531 struct rtw89_btc *btc = &rtwdev->btc; in _update_wl_info_v8()
6532 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _update_wl_info_v8()
6534 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8; in _update_wl_info_v8()
6535 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _update_wl_info_v8()
6550 /* Extract wl->link_info[role_id][rlink_id] to wl->role_info in _update_wl_info_v8()
6552 * rlink_id: rlink index (= HW-band index) in _update_wl_info_v8()
6556 wl_linfo = &wl->rlink_info[role_id][rlink_id]; in _update_wl_info_v8()
6557 if (wl_linfo->connected == MLME_LINKING) in _update_wl_info_v8()
6560 rlink = &wl_rinfo->rlink[role_id][rlink_id]; in _update_wl_info_v8()
6561 rlink->role = wl_linfo->role; in _update_wl_info_v8()
6562 rlink->active = wl_linfo->active; /* Doze or not */ in _update_wl_info_v8()
6563 rlink->pid = wl_linfo->pid; in _update_wl_info_v8()
6564 rlink->phy = wl_linfo->phy; in _update_wl_info_v8()
6565 rlink->rf_band = wl_linfo->band; in _update_wl_info_v8()
6566 rlink->ch = wl_linfo->ch; in _update_wl_info_v8()
6567 rlink->bw = wl_linfo->bw; in _update_wl_info_v8()
6568 rlink->noa = wl_linfo->noa; in _update_wl_info_v8()
6569 rlink->noa_dur = wl_linfo->noa_duration / 1000; in _update_wl_info_v8()
6570 rlink->client_cnt = wl_linfo->client_cnt; in _update_wl_info_v8()
6571 rlink->mode = wl_linfo->mode; in _update_wl_info_v8()
6573 switch (wl_linfo->connected) { in _update_wl_info_v8()
6575 rlink->connected = 0; in _update_wl_info_v8()
6576 if (rlink->role == RTW89_WIFI_ROLE_STATION) in _update_wl_info_v8()
6577 btc->dm.leak_ap = 0; in _update_wl_info_v8()
6580 rlink->connected = 1; in _update_wl_info_v8()
6586 wl->is_5g_hi_channel = false; in _update_wl_info_v8()
6587 wl->bg_mode = false; in _update_wl_info_v8()
6588 wl_rinfo->role_map = 0; in _update_wl_info_v8()
6589 wl_rinfo->p2p_2g = 0; in _update_wl_info_v8()
6594 rlink = &wl_rinfo->rlink[i][j]; in _update_wl_info_v8()
6596 if (!rlink->active || !rlink->connected) in _update_wl_info_v8()
6600 wl_rinfo->role_map |= BIT(rlink->role); in _update_wl_info_v8()
6602 /* only if client connect for p2p-Go/AP */ in _update_wl_info_v8()
6603 if ((rlink->role == RTW89_WIFI_ROLE_P2P_GO || in _update_wl_info_v8()
6604 rlink->role == RTW89_WIFI_ROLE_AP) && in _update_wl_info_v8()
6605 rlink->client_cnt > 1) in _update_wl_info_v8()
6608 /* Identufy if P2P-Go (GO/GC/AP) exist at 2G band*/ in _update_wl_info_v8()
6609 if (rlink->rf_band == RTW89_BAND_2G && in _update_wl_info_v8()
6610 (client_joined || rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT)) in _update_wl_info_v8()
6611 wl_rinfo->p2p_2g = 1; in _update_wl_info_v8()
6613 /* only one noa-role exist */ in _update_wl_info_v8()
6614 if (rlink->noa && rlink->noa_dur > 0) in _update_wl_info_v8()
6615 noa_dur = rlink->noa_dur; in _update_wl_info_v8()
6617 /* for WL 5G-Rx interfered with BT issue */ in _update_wl_info_v8()
6618 if (rlink->rf_band == RTW89_BAND_5G && rlink->ch >= 100) in _update_wl_info_v8()
6619 wl->is_5g_hi_channel = 1; in _update_wl_info_v8()
6621 if ((rlink->mode & BIT(BTC_WL_MODE_11B)) || in _update_wl_info_v8()
6622 (rlink->mode & BIT(BTC_WL_MODE_11G))) in _update_wl_info_v8()
6623 wl->bg_mode = 1; in _update_wl_info_v8()
6625 if (rtwdev->chip->para_ver & BTC_FEAT_MLO_SUPPORT) in _update_wl_info_v8()
6628 cid_ch[cnt - 1] = wl_linfo->chdef; in _update_wl_info_v8()
6629 cid_phy[cnt - 1] = rlink->phy; in _update_wl_info_v8()
6630 cid_role[cnt - 1] = rlink->role; in _update_wl_info_v8()
6632 if (rlink->rf_band != RTW89_BAND_2G) { in _update_wl_info_v8()
6642 if (rtwdev->chip->para_ver & BTC_FEAT_MLO_SUPPORT) { in _update_wl_info_v8()
6647 dbcc_en = rtwdev->dbcc_en; in _update_wl_info_v8()
6654 } else if (wl_rinfo->role_map & BIT(RTW89_WIFI_ROLE_NAN)) { in _update_wl_info_v8()
6664 if (_chk_role_ch_group(&cid_ch[0], &cid_ch[cnt - 1])) in _update_wl_info_v8()
6673 wl_rinfo->link_mode = mode; in _update_wl_info_v8()
6674 wl_rinfo->connect_cnt = cnt; in _update_wl_info_v8()
6675 if (wl_rinfo->connect_cnt == 0) in _update_wl_info_v8()
6676 wl_rinfo->role_map = BIT(RTW89_WIFI_ROLE_NONE); in _update_wl_info_v8()
6679 wl_rinfo->dbcc_2g_phy = dbcc_2g_phy; in _update_wl_info_v8()
6680 if (wl_rinfo->dbcc_en != dbcc_en) { in _update_wl_info_v8()
6681 wl_rinfo->dbcc_en = dbcc_en; in _update_wl_info_v8()
6682 wl_rinfo->dbcc_chg = 1; in _update_wl_info_v8()
6683 btc->cx.cnt_wl[BTC_WCNT_DBCC_CHG]++; in _update_wl_info_v8()
6685 wl_rinfo->dbcc_chg = 0; in _update_wl_info_v8()
6688 if (wl_rinfo->dbcc_en) { in _update_wl_info_v8()
6693 wl_dinfo->op_band[RTW89_PHY_0] = RTW89_BAND_5G; in _update_wl_info_v8()
6694 wl_dinfo->op_band[RTW89_PHY_1] = RTW89_BAND_2G; in _update_wl_info_v8()
6695 } else if (wl_rinfo->dbcc_2g_phy == RTW89_PHY_1) { in _update_wl_info_v8()
6697 wl_dinfo->op_band[RTW89_PHY_0] = RTW89_BAND_5G; in _update_wl_info_v8()
6698 wl_dinfo->op_band[RTW89_PHY_1] = RTW89_BAND_2G; in _update_wl_info_v8()
6701 wl_dinfo->op_band[RTW89_PHY_0] = RTW89_BAND_2G; in _update_wl_info_v8()
6702 wl_dinfo->op_band[RTW89_PHY_1] = RTW89_BAND_5G; in _update_wl_info_v8()
6708 wl_rinfo->pta_req_band = pta_req_band; in _update_wl_info_v8()
6716 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_act1_work()
6717 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_coex_act1_work()
6718 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_coex_act1_work()
6719 struct rtw89_btc_wl_info *wl = &cx->wl; in rtw89_coex_act1_work()
6724 dm->cnt_notify[BTC_NCNT_TIMER]++; in rtw89_coex_act1_work()
6725 if (wl->status.map._4way) in rtw89_coex_act1_work()
6726 wl->status.map._4way = false; in rtw89_coex_act1_work()
6727 if (wl->status.map.connecting) in rtw89_coex_act1_work()
6728 wl->status.map.connecting = false; in rtw89_coex_act1_work()
6737 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_bt_devinfo_work()
6738 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_coex_bt_devinfo_work()
6739 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in rtw89_coex_bt_devinfo_work()
6744 dm->cnt_notify[BTC_NCNT_TIMER]++; in rtw89_coex_bt_devinfo_work()
6745 a2dp->play_latency = 0; in rtw89_coex_bt_devinfo_work()
6753 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_rfk_chk_work()
6754 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_coex_rfk_chk_work()
6755 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_coex_rfk_chk_work()
6756 struct rtw89_btc_wl_info *wl = &cx->wl; in rtw89_coex_rfk_chk_work()
6761 dm->cnt_notify[BTC_NCNT_TIMER]++; in rtw89_coex_rfk_chk_work()
6762 if (wl->rfk_info.state != BTC_WRFK_STOP) { in rtw89_coex_rfk_chk_work()
6765 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]++; in rtw89_coex_rfk_chk_work()
6766 dm->error.map.wl_rfk_timeout = true; in rtw89_coex_rfk_chk_work()
6767 wl->rfk_info.state = BTC_WRFK_STOP; in rtw89_coex_rfk_chk_work()
6775 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_bt_scbd()
6776 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_scbd()
6777 struct rtw89_btc_cx *cx = &btc->cx; in _update_bt_scbd()
6778 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _update_bt_scbd()
6782 if (!chip->scbd) in _update_bt_scbd()
6796 bt->enable.now = 0; in _update_bt_scbd()
6798 bt->enable.now = 1; in _update_bt_scbd()
6800 if (bt->enable.now != bt->enable.last) in _update_bt_scbd()
6803 /* reset bt info if bt re-enable */ in _update_bt_scbd()
6804 if (bt->enable.now && !bt->enable.last) { in _update_bt_scbd()
6806 cx->cnt_bt[BTC_BCNT_REENABLE]++; in _update_bt_scbd()
6807 bt->enable.now = 1; in _update_bt_scbd()
6810 bt->enable.last = bt->enable.now; in _update_bt_scbd()
6811 bt->scbd = val; in _update_bt_scbd()
6812 bt->mbx_avl = !!(val & BTC_BSCB_ACT); in _update_bt_scbd()
6814 if (bt->whql_test != !!(val & BTC_BSCB_WHQL)) in _update_bt_scbd()
6817 bt->whql_test = !!(val & BTC_BSCB_WHQL); in _update_bt_scbd()
6818 bt->btg_type = val & BTC_BSCB_BT_S1 ? BTC_BT_BTG : BTC_BT_ALONE; in _update_bt_scbd()
6819 bt->link_info.a2dp_desc.exist = !!(val & BTC_BSCB_A2DP_ACT); in _update_bt_scbd()
6821 bt->lna_constrain = !!(val & BTC_BSCB_BT_LNAB0) + in _update_bt_scbd()
6824 /* if rfk run 1->0 */ in _update_bt_scbd()
6825 if (bt->rfk_info.map.run && !(val & BTC_BSCB_RFK_RUN)) in _update_bt_scbd()
6828 bt->rfk_info.map.run = !!(val & BTC_BSCB_RFK_RUN); in _update_bt_scbd()
6829 bt->rfk_info.map.req = !!(val & BTC_BSCB_RFK_REQ); in _update_bt_scbd()
6830 bt->hi_lna_rx = !!(val & BTC_BSCB_BT_HILNA); in _update_bt_scbd()
6831 bt->link_info.status.map.connect = !!(val & BTC_BSCB_BT_CONNECT); in _update_bt_scbd()
6832 bt->run_patch_code = !!(val & BTC_BSCB_PATCH_CODE); in _update_bt_scbd()
6840 struct rtw89_btc *btc = &rtwdev->btc; in _chk_wl_rfk_request()
6841 struct rtw89_btc_cx *cx = &btc->cx; in _chk_wl_rfk_request()
6842 struct rtw89_btc_bt_info *bt = &cx->bt; in _chk_wl_rfk_request()
6846 cx->cnt_wl[BTC_WCNT_RFK_REQ]++; in _chk_wl_rfk_request()
6848 if ((bt->rfk_info.map.run || bt->rfk_info.map.req) && in _chk_wl_rfk_request()
6849 !bt->rfk_info.map.timeout) { in _chk_wl_rfk_request()
6850 cx->cnt_wl[BTC_WCNT_RFK_REJECT]++; in _chk_wl_rfk_request()
6852 cx->cnt_wl[BTC_WCNT_RFK_GO]++; in _chk_wl_rfk_request()
6861 struct rtw89_btc *btc = &rtwdev->btc; in _run_coex()
6862 const struct rtw89_btc_ver *ver = btc->ver; in _run_coex()
6863 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _run_coex()
6864 struct rtw89_btc_cx *cx = &btc->cx; in _run_coex()
6865 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _run_coex()
6866 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _run_coex()
6867 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _run_coex()
6868 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _run_coex()
6869 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _run_coex()
6870 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _run_coex()
6871 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _run_coex()
6874 lockdep_assert_wiphy(rtwdev->hw->wiphy); in _run_coex()
6876 dm->run_reason = reason; in _run_coex()
6880 if (ver->fwlrole == 0) in _run_coex()
6881 mode = wl_rinfo->link_mode; in _run_coex()
6882 else if (ver->fwlrole == 1) in _run_coex()
6883 mode = wl_rinfo_v1->link_mode; in _run_coex()
6884 else if (ver->fwlrole == 2) in _run_coex()
6885 mode = wl_rinfo_v2->link_mode; in _run_coex()
6886 else if (ver->fwlrole == 7) in _run_coex()
6887 mode = wl_rinfo_v7->link_mode; in _run_coex()
6888 else if (ver->fwlrole == 8) in _run_coex()
6889 mode = wl_rinfo_v8->link_mode; in _run_coex()
6893 if (ver->fcxctrl == 7) { in _run_coex()
6894 igno_bt = btc->ctrl.ctrl_v7.igno_bt; in _run_coex()
6895 always_freerun = btc->ctrl.ctrl_v7.always_freerun; in _run_coex()
6897 igno_bt = btc->ctrl.ctrl.igno_bt; in _run_coex()
6898 always_freerun = btc->ctrl.ctrl.always_freerun; in _run_coex()
6904 __func__, dm->wl_only, dm->bt_only); in _run_coex()
6907 if (btc->manual_ctrl) { in _run_coex()
6923 if (!wl->status.map.init_ok) { in _run_coex()
6930 if (wl->status.map.rf_off_pre == wl->status.map.rf_off && in _run_coex()
6931 wl->status.map.lps_pre == wl->status.map.lps) { in _run_coex()
6939 if (wl->status.map.rf_off == 1 || in _run_coex()
6940 wl->status.map.lps == BTC_LPS_RF_OFF) { in _run_coex()
6948 dm->freerun = false; in _run_coex()
6949 dm->cnt_dm[BTC_DCNT_RUN]++; in _run_coex()
6950 dm->fddt_train = BTC_FDDT_DISABLE; in _run_coex()
6951 bt->scan_rx_low_pri = false; in _run_coex()
6954 dm->freerun_chk = _check_freerun(rtwdev); /* check if meet freerun */ in _run_coex()
6962 if (dm->wl_only) { in _run_coex()
6968 if (wl->status.map.rf_off || wl->status.map.lps || dm->bt_only) { in _run_coex()
6979 if (!cx->bt.enable.now && !cx->other.type) { in _run_coex()
6984 if (cx->bt.whql_test) { in _run_coex()
6989 if (wl->rfk_info.state != BTC_WRFK_STOP) { in _run_coex()
6994 if (wl->status.val & btc_scanning_map.val && !wl->rfk_info.con_rfk) { in _run_coex()
6996 bt->scan_rx_low_pri = true; in _run_coex()
7005 if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) in _run_coex()
7006 bt->scan_rx_low_pri = true; in _run_coex()
7010 bt->scan_rx_low_pri = true; in _run_coex()
7014 bt->scan_rx_low_pri = true; in _run_coex()
7018 bt->scan_rx_low_pri = true; in _run_coex()
7022 bt->scan_rx_low_pri = true; in _run_coex()
7023 if (ver->fwlrole == 0) in _run_coex()
7025 else if (ver->fwlrole == 1) in _run_coex()
7027 else if (ver->fwlrole == 2 || ver->fwlrole == 7) in _run_coex()
7029 else if (ver->fwlrole == 8) in _run_coex()
7033 bt->scan_rx_low_pri = true; in _run_coex()
7037 bt->scan_rx_low_pri = true; in _run_coex()
7053 if (ver->fcxctrl == 7) in _run_coex()
7054 btc->ctrl.ctrl_v7.igno_bt = igno_bt; in _run_coex()
7056 btc->ctrl.ctrl.igno_bt = igno_bt; in _run_coex()
7062 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_poweron()
7065 btc->dm.cnt_notify[BTC_NCNT_POWER_ON]++; in rtw89_btc_ntfy_poweron()
7070 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_poweroff()
7071 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_poweroff()
7074 btc->dm.cnt_notify[BTC_NCNT_POWER_OFF]++; in rtw89_btc_ntfy_poweroff()
7076 btc->cx.wl.status.map.rf_off = 1; in rtw89_btc_ntfy_poweroff()
7077 btc->cx.wl.status.map.busy = 0; in rtw89_btc_ntfy_poweroff()
7078 wl->status.map.lps = BTC_LPS_OFF; in rtw89_btc_ntfy_poweroff()
7085 btc->cx.wl.status.map.rf_off_pre = btc->cx.wl.status.map.rf_off; in rtw89_btc_ntfy_poweroff()
7090 const struct rtw89_chip_info *chip = rtwdev->chip; in _set_init_info()
7091 struct rtw89_btc *btc = &rtwdev->btc; in _set_init_info()
7092 const struct rtw89_btc_ver *ver = btc->ver; in _set_init_info()
7093 struct rtw89_btc_dm *dm = &btc->dm; in _set_init_info()
7094 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _set_init_info()
7096 if (ver->fcxinit == 7) { in _set_init_info()
7097 dm->init_info.init_v7.wl_only = (u8)dm->wl_only; in _set_init_info()
7098 dm->init_info.init_v7.bt_only = (u8)dm->bt_only; in _set_init_info()
7099 dm->init_info.init_v7.wl_init_ok = (u8)wl->status.map.init_ok; in _set_init_info()
7100 dm->init_info.init_v7.cx_other = btc->cx.other.type; in _set_init_info()
7101 dm->init_info.init_v7.wl_guard_ch = chip->afh_guard_ch; in _set_init_info()
7102 dm->init_info.init_v7.module = btc->mdinfo.md_v7; in _set_init_info()
7104 dm->init_info.init.wl_only = (u8)dm->wl_only; in _set_init_info()
7105 dm->init_info.init.bt_only = (u8)dm->bt_only; in _set_init_info()
7106 dm->init_info.init.wl_init_ok = (u8)wl->status.map.init_ok; in _set_init_info()
7107 dm->init_info.init.dbcc_en = rtwdev->dbcc_en; in _set_init_info()
7108 dm->init_info.init.cx_other = btc->cx.other.type; in _set_init_info()
7109 dm->init_info.init.wl_guard_ch = chip->afh_guard_ch; in _set_init_info()
7110 dm->init_info.init.module = btc->mdinfo.md; in _set_init_info()
7116 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_init()
7117 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in rtw89_btc_ntfy_init()
7118 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_init()
7119 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_btc_ntfy_init()
7120 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_ntfy_init()
7123 btc->dm.run_reason = BTC_RSN_NONE; in rtw89_btc_ntfy_init()
7124 btc->dm.run_action = BTC_ACT_NONE; in rtw89_btc_ntfy_init()
7125 if (ver->fcxctrl == 7) in rtw89_btc_ntfy_init()
7126 btc->ctrl.ctrl_v7.igno_bt = true; in rtw89_btc_ntfy_init()
7128 btc->ctrl.ctrl.igno_bt = true; in rtw89_btc_ntfy_init()
7133 wl->coex_mode = mode; in rtw89_btc_ntfy_init()
7134 dm->cnt_notify[BTC_NCNT_INIT_COEX]++; in rtw89_btc_ntfy_init()
7135 dm->wl_only = mode == BTC_MODE_WL ? 1 : 0; in rtw89_btc_ntfy_init()
7136 dm->bt_only = mode == BTC_MODE_BT ? 1 : 0; in rtw89_btc_ntfy_init()
7137 wl->status.map.rf_off = mode == BTC_MODE_WLOFF ? 1 : 0; in rtw89_btc_ntfy_init()
7139 chip->ops->btc_set_rfe(rtwdev); in rtw89_btc_ntfy_init()
7140 chip->ops->btc_init_cfg(rtwdev); in rtw89_btc_ntfy_init()
7142 if (!wl->status.map.init_ok) { in rtw89_btc_ntfy_init()
7146 dm->error.map.init = true; in rtw89_btc_ntfy_init()
7157 dm->error.map.pta_owner = true; in rtw89_btc_ntfy_init()
7172 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_scan_start()
7173 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_scan_start()
7182 btc->dm.cnt_notify[BTC_NCNT_SCAN_START]++; in rtw89_btc_ntfy_scan_start()
7183 wl->status.map.scan = true; in rtw89_btc_ntfy_scan_start()
7184 wl->scan_info.band[phy_idx] = band; in rtw89_btc_ntfy_scan_start()
7185 wl->scan_info.phy_map |= BIT(phy_idx); in rtw89_btc_ntfy_scan_start()
7188 if (rtwdev->dbcc_en) { in rtw89_btc_ntfy_scan_start()
7189 wl->dbcc_info.scan_band[phy_idx] = band; in rtw89_btc_ntfy_scan_start()
7199 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_scan_finish()
7200 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_scan_finish()
7204 btc->dm.cnt_notify[BTC_NCNT_SCAN_FINISH]++; in rtw89_btc_ntfy_scan_finish()
7206 wl->status.map.scan = false; in rtw89_btc_ntfy_scan_finish()
7207 wl->scan_info.phy_map &= ~BIT(phy_idx); in rtw89_btc_ntfy_scan_finish()
7210 if (rtwdev->dbcc_en) { in rtw89_btc_ntfy_scan_finish()
7215 btc->dm.tdma_instant_excute = 1; in rtw89_btc_ntfy_scan_finish()
7222 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_switch_band()
7223 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_switch_band()
7232 btc->dm.cnt_notify[BTC_NCNT_SWITCH_BAND]++; in rtw89_btc_ntfy_switch_band()
7234 if (rtwdev->dbcc_en) { in rtw89_btc_ntfy_switch_band()
7235 wl->dbcc_info.scan_band[phy_idx] = band; in rtw89_btc_ntfy_switch_band()
7245 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_specific_packet()
7246 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_btc_ntfy_specific_packet()
7247 struct rtw89_btc_wl_info *wl = &cx->wl; in rtw89_btc_ntfy_specific_packet()
7248 struct rtw89_btc_bt_link_info *b = &cx->bt.link_info; in rtw89_btc_ntfy_specific_packet()
7249 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc; in rtw89_btc_ntfy_specific_packet()
7250 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc; in rtw89_btc_ntfy_specific_packet()
7257 cnt = ++cx->cnt_wl[BTC_WCNT_DHCP]; in rtw89_btc_ntfy_specific_packet()
7260 wl->status.map.connecting = true; in rtw89_btc_ntfy_specific_packet()
7264 cnt = ++cx->cnt_wl[BTC_WCNT_EAPOL]; in rtw89_btc_ntfy_specific_packet()
7267 wl->status.map._4way = true; in rtw89_btc_ntfy_specific_packet()
7269 if (hfp->exist || hid->exist) in rtw89_btc_ntfy_specific_packet()
7273 cnt = ++cx->cnt_wl[BTC_WCNT_EAPOL]; in rtw89_btc_ntfy_specific_packet()
7277 wl->status.map._4way = false; in rtw89_btc_ntfy_specific_packet()
7278 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work); in rtw89_btc_ntfy_specific_packet()
7281 cnt = ++cx->cnt_wl[BTC_WCNT_ARP]; in rtw89_btc_ntfy_specific_packet()
7297 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work); in rtw89_btc_ntfy_specific_packet()
7298 wiphy_delayed_work_queue(rtwdev->hw->wiphy, in rtw89_btc_ntfy_specific_packet()
7299 &rtwdev->coex_act1_work, delay); in rtw89_btc_ntfy_specific_packet()
7302 btc->dm.cnt_notify[BTC_NCNT_SPECIAL_PACKET]++; in rtw89_btc_ntfy_specific_packet()
7351 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_bt_rssi_level()
7352 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_rssi_level()
7353 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _update_bt_rssi_level()
7358 * if rssi >= 40% (-60dBm) --> rssi_level = 4 in _update_bt_rssi_level()
7359 * if 36% <= rssi < 40% --> rssi_level = 3 in _update_bt_rssi_level()
7360 * if 31% <= rssi < 36% --> rssi_level = 2 in _update_bt_rssi_level()
7361 * if 28% <= rssi < 31% --> rssi_level = 1 in _update_bt_rssi_level()
7362 * if rssi < 28% --> rssi_level = 0 in _update_bt_rssi_level()
7367 rssi_th = chip->bt_rssi_thres[i]; in _update_bt_rssi_level()
7368 rssi_st = &bt->link_info.rssi_state[i]; in _update_bt_rssi_level()
7373 rssi_level = BTC_BT_RSSI_THMAX - i; in _update_bt_rssi_level()
7382 u8 mode = rtwdev->btc.cx.wl.role_info.link_mode; in _update_zb_coex_tbl()
7385 if (mode == BTC_WLINK_5G || rtwdev->btc.dm.freerun) { in _update_zb_coex_tbl()
7400 const struct rtw89_chip_info *chip = rtwdev->chip; in _update_bt_info()
7401 struct rtw89_btc *btc = &rtwdev->btc; in _update_bt_info()
7402 struct rtw89_btc_cx *cx = &btc->cx; in _update_bt_info()
7403 struct rtw89_btc_bt_info *bt = &cx->bt; in _update_bt_info()
7404 struct rtw89_btc_bt_link_info *b = &bt->link_info; in _update_bt_info()
7405 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc; in _update_bt_info()
7406 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc; in _update_bt_info()
7407 struct rtw89_btc_bt_a2dp_desc *a2dp = &b->a2dp_desc; in _update_bt_info()
7408 struct rtw89_btc_bt_pan_desc *pan = &b->pan_desc; in _update_bt_info()
7414 if (!memcmp(bt->raw_info, buf, BTC_BTINFO_MAX)) { in _update_bt_info()
7416 "[BTC], %s(): return by bt-info duplicate!!\n", in _update_bt_info()
7418 cx->cnt_bt[BTC_BCNT_INFOSAME]++; in _update_bt_info()
7422 memcpy(bt->raw_info, buf, BTC_BTINFO_MAX); in _update_bt_info()
7426 __func__, bt->raw_info[2]); in _update_bt_info()
7428 b->profile_cnt.last = b->profile_cnt.now; in _update_bt_info()
7429 b->profile_cnt.now = 0; in _update_bt_info()
7430 hid->type = 0; in _update_bt_info()
7432 /* parse raw info low-Byte2 */ in _update_bt_info()
7433 btinfo.val = bt->raw_info[BTC_BTINFO_L2]; in _update_bt_info()
7434 b->status.map.connect = btinfo.lb2.connect; in _update_bt_info()
7435 b->status.map.sco_busy = btinfo.lb2.sco_busy; in _update_bt_info()
7436 b->status.map.acl_busy = btinfo.lb2.acl_busy; in _update_bt_info()
7437 b->status.map.inq_pag = btinfo.lb2.inq_pag; in _update_bt_info()
7438 bt->inq_pag.now = btinfo.lb2.inq_pag; in _update_bt_info()
7439 cx->cnt_bt[BTC_BCNT_INQPAG] += !!(bt->inq_pag.now && !bt->inq_pag.last); in _update_bt_info()
7441 hfp->exist = btinfo.lb2.hfp; in _update_bt_info()
7442 b->profile_cnt.now += (u8)hfp->exist; in _update_bt_info()
7443 hid->exist = btinfo.lb2.hid; in _update_bt_info()
7444 b->profile_cnt.now += (u8)hid->exist; in _update_bt_info()
7445 a2dp->exist = btinfo.lb2.a2dp; in _update_bt_info()
7446 b->profile_cnt.now += (u8)a2dp->exist; in _update_bt_info()
7447 pan->exist = btinfo.lb2.pan; in _update_bt_info()
7448 b->profile_cnt.now += (u8)pan->exist; in _update_bt_info()
7449 btc->dm.trx_info.bt_profile = u32_get_bits(btinfo.val, BT_PROFILE_PROTOCOL_MASK); in _update_bt_info()
7451 /* parse raw info low-Byte3 */ in _update_bt_info()
7452 btinfo.val = bt->raw_info[BTC_BTINFO_L3]; in _update_bt_info()
7454 cx->cnt_bt[BTC_BCNT_RETRY]++; in _update_bt_info()
7455 b->cqddr = btinfo.lb3.cqddr; in _update_bt_info()
7456 cx->cnt_bt[BTC_BCNT_INQ] += !!(btinfo.lb3.inq && !bt->inq); in _update_bt_info()
7457 bt->inq = btinfo.lb3.inq; in _update_bt_info()
7458 cx->cnt_bt[BTC_BCNT_PAGE] += !!(btinfo.lb3.pag && !bt->pag); in _update_bt_info()
7459 bt->pag = btinfo.lb3.pag; in _update_bt_info()
7461 b->status.map.mesh_busy = btinfo.lb3.mesh_busy; in _update_bt_info()
7462 /* parse raw info high-Byte0 */ in _update_bt_info()
7463 btinfo.val = bt->raw_info[BTC_BTINFO_H0]; in _update_bt_info()
7464 /* raw val is dBm unit, translate from -100~ 0dBm to 0~100%*/ in _update_bt_info()
7465 b->rssi = chip->ops->btc_get_bt_rssi(rtwdev, btinfo.hb0.rssi); in _update_bt_info()
7466 bt->rssi_level = _update_bt_rssi_level(rtwdev, b->rssi); in _update_bt_info()
7467 btc->dm.trx_info.bt_rssi = bt->rssi_level; in _update_bt_info()
7469 /* parse raw info high-Byte1 */ in _update_bt_info()
7470 btinfo.val = bt->raw_info[BTC_BTINFO_H1]; in _update_bt_info()
7471 b->status.map.ble_connect = btinfo.hb1.ble_connect; in _update_bt_info()
7473 if (hid->exist) in _update_bt_info()
7474 hid->type |= BTC_HID_BLE; in _update_bt_info()
7476 hid->type |= BTC_HID_RCU_VOICE; in _update_bt_info()
7478 hid->type |= BTC_HID_RCU; in _update_bt_info()
7481 cx->cnt_bt[BTC_BCNT_REINIT] += !!(btinfo.hb1.reinit && !bt->reinit); in _update_bt_info()
7482 bt->reinit = btinfo.hb1.reinit; in _update_bt_info()
7483 cx->cnt_bt[BTC_BCNT_RELINK] += !!(btinfo.hb1.relink && !b->relink.now); in _update_bt_info()
7484 b->relink.now = btinfo.hb1.relink; in _update_bt_info()
7485 cx->cnt_bt[BTC_BCNT_IGNOWL] += !!(btinfo.hb1.igno_wl && !bt->igno_wl); in _update_bt_info()
7486 bt->igno_wl = btinfo.hb1.igno_wl; in _update_bt_info()
7488 if (bt->igno_wl && !cx->wl.status.map.rf_off) in _update_bt_info()
7491 bt->ble_scan_en = btinfo.hb1.ble_scan; in _update_bt_info()
7493 cx->cnt_bt[BTC_BCNT_ROLESW] += !!(btinfo.hb1.role_sw && !b->role_sw); in _update_bt_info()
7494 b->role_sw = btinfo.hb1.role_sw; in _update_bt_info()
7496 b->multi_link.now = btinfo.hb1.multi_link; in _update_bt_info()
7498 /* parse raw info high-Byte2 */ in _update_bt_info()
7499 btinfo.val = bt->raw_info[BTC_BTINFO_H2]; in _update_bt_info()
7500 pan->active = !!btinfo.hb2.pan_active; in _update_bt_info()
7502 cx->cnt_bt[BTC_BCNT_AFH] += !!(btinfo.hb2.afh_update && !b->afh_update); in _update_bt_info()
7503 b->afh_update = btinfo.hb2.afh_update; in _update_bt_info()
7504 a2dp->active = btinfo.hb2.a2dp_active; in _update_bt_info()
7505 b->slave_role = btinfo.hb2.slave; in _update_bt_info()
7506 hid->slot_info = btinfo.hb2.hid_slot; in _update_bt_info()
7507 hid->pair_cnt = btinfo.hb2.hid_cnt; in _update_bt_info()
7508 if (!b->status.map.ble_connect || hid->pair_cnt > 1) in _update_bt_info()
7509 hid->type |= (hid->slot_info == BTC_HID_218 ? in _update_bt_info()
7511 /* parse raw info high-Byte3 */ in _update_bt_info()
7512 btinfo.val = bt->raw_info[BTC_BTINFO_H3]; in _update_bt_info()
7513 a2dp->bitpool = btinfo.hb3.a2dp_bitpool; in _update_bt_info()
7515 if (b->tx_3m != (u32)btinfo.hb3.tx_3m) in _update_bt_info()
7516 cx->cnt_bt[BTC_BCNT_RATECHG]++; in _update_bt_info()
7517 b->tx_3m = (u32)btinfo.hb3.tx_3m; in _update_bt_info()
7519 a2dp->sink = btinfo.hb3.a2dp_sink; in _update_bt_info()
7521 if (!a2dp->exist_last && a2dp->exist) { in _update_bt_info()
7522 a2dp->vendor_id = 0; in _update_bt_info()
7523 a2dp->flush_time = 0; in _update_bt_info()
7524 a2dp->play_latency = 1; in _update_bt_info()
7525 wiphy_delayed_work_queue(rtwdev->hw->wiphy, in _update_bt_info()
7526 &rtwdev->coex_bt_devinfo_work, in _update_bt_info()
7539 rtwvif_link->chanctx_idx); in rtw89_btc_ntfy_role_info()
7543 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_role_info()
7544 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_ntfy_role_info()
7545 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_role_info()
7557 vif->type == NL80211_IFTYPE_STATION); in rtw89_btc_ntfy_role_info()
7558 rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], port=%d\n", rtwvif_link->port); in rtw89_btc_ntfy_role_info()
7560 chan->band_type, chan->channel, chan->band_width); in rtw89_btc_ntfy_role_info()
7565 bss_conf->beacon_int, bss_conf->dtim_period); in rtw89_btc_ntfy_role_info()
7571 rtwsta_link->mac_id); in rtw89_btc_ntfy_role_info()
7575 link_sta->he_cap.has_he, in rtw89_btc_ntfy_role_info()
7576 link_sta->vht_cap.vht_supported, in rtw89_btc_ntfy_role_info()
7577 link_sta->ht_cap.ht_supported); in rtw89_btc_ntfy_role_info()
7578 if (link_sta->he_cap.has_he) in rtw89_btc_ntfy_role_info()
7580 if (link_sta->vht_cap.vht_supported) in rtw89_btc_ntfy_role_info()
7582 if (link_sta->ht_cap.ht_supported) in rtw89_btc_ntfy_role_info()
7588 if (rtwvif_link->wifi_role >= RTW89_WIFI_ROLE_MLME_MAX) { in rtw89_btc_ntfy_role_info()
7594 "[BTC], wifi_role=%d\n", rtwvif_link->wifi_role); in rtw89_btc_ntfy_role_info()
7596 r.role = rtwvif_link->wifi_role; in rtw89_btc_ntfy_role_info()
7597 r.phy = rtwvif_link->phy_idx; in rtw89_btc_ntfy_role_info()
7598 r.pid = rtwvif_link->port; in rtw89_btc_ntfy_role_info()
7601 r.bcn_period = bss_conf->beacon_int; in rtw89_btc_ntfy_role_info()
7602 r.dtim_period = bss_conf->dtim_period; in rtw89_btc_ntfy_role_info()
7603 r.band = chan->band_type; in rtw89_btc_ntfy_role_info()
7604 r.ch = chan->channel; in rtw89_btc_ntfy_role_info()
7605 r.bw = chan->band_width; in rtw89_btc_ntfy_role_info()
7606 r.chdef.band = chan->band_type; in rtw89_btc_ntfy_role_info()
7607 r.chdef.center_ch = chan->channel; in rtw89_btc_ntfy_role_info()
7608 r.chdef.bw = chan->band_width; in rtw89_btc_ntfy_role_info()
7609 r.chdef.chan = chan->primary_channel; in rtw89_btc_ntfy_role_info()
7610 ether_addr_copy(r.mac_addr, rtwvif_link->mac_addr); in rtw89_btc_ntfy_role_info()
7614 if (rtwsta_link && vif->type == NL80211_IFTYPE_STATION) in rtw89_btc_ntfy_role_info()
7615 r.mac_id = rtwsta_link->mac_id; in rtw89_btc_ntfy_role_info()
7617 btc->dm.cnt_notify[BTC_NCNT_ROLE_INFO]++; in rtw89_btc_ntfy_role_info()
7619 wlinfo = &wl->link_info[r.pid]; in rtw89_btc_ntfy_role_info()
7622 if (ver->fwlrole == 0) { in rtw89_btc_ntfy_role_info()
7625 } else if (ver->fwlrole == 1) { in rtw89_btc_ntfy_role_info()
7628 } else if (ver->fwlrole == 2) { in rtw89_btc_ntfy_role_info()
7631 } else if (ver->fwlrole == 7) { in rtw89_btc_ntfy_role_info()
7634 } else if (ver->fwlrole == 8) { in rtw89_btc_ntfy_role_info()
7635 wlinfo = &wl->rlink_info[r.pid][rlink_id]; in rtw89_btc_ntfy_role_info()
7637 link_mode_ori = wl->role_info_v8.link_mode; in rtw89_btc_ntfy_role_info()
7638 pta_req_mac_ori = wl->pta_req_mac; in rtw89_btc_ntfy_role_info()
7641 if (wl->role_info_v8.link_mode != link_mode_ori) { in rtw89_btc_ntfy_role_info()
7642 wl->role_info_v8.link_mode_chg = 1; in rtw89_btc_ntfy_role_info()
7643 if (ver->fcxinit == 7) in rtw89_btc_ntfy_role_info()
7644 wa_type = btc->mdinfo.md_v7.wa_type; in rtw89_btc_ntfy_role_info()
7646 wa_type = btc->mdinfo.md.wa_type; in rtw89_btc_ntfy_role_info()
7652 if (wl->pta_req_mac != pta_req_mac_ori) in rtw89_btc_ntfy_role_info()
7653 wl->pta_reg_mac_chg = 1; in rtw89_btc_ntfy_role_info()
7656 if (wlinfo->role == RTW89_WIFI_ROLE_STATION && in rtw89_btc_ntfy_role_info()
7657 wlinfo->connected == MLME_NO_LINK) in rtw89_btc_ntfy_role_info()
7658 btc->dm.leak_ap = 0; in rtw89_btc_ntfy_role_info()
7661 wl->status.map.connecting = 1; in rtw89_btc_ntfy_role_info()
7663 wl->status.map.connecting = 0; in rtw89_btc_ntfy_role_info()
7667 wl->status.map._4way = false; in rtw89_btc_ntfy_role_info()
7674 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_btc_ntfy_radio_state()
7675 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_radio_state()
7676 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_radio_state()
7681 btc->dm.cnt_notify[BTC_NCNT_RADIO_STATE]++; in rtw89_btc_ntfy_radio_state()
7685 wl->status.map.rf_off = 1; in rtw89_btc_ntfy_radio_state()
7686 wl->status.map.lps = BTC_LPS_OFF; in rtw89_btc_ntfy_radio_state()
7687 wl->status.map.busy = 0; in rtw89_btc_ntfy_radio_state()
7690 wl->status.map.rf_off = 0; in rtw89_btc_ntfy_radio_state()
7691 wl->status.map.lps = BTC_LPS_RF_OFF; in rtw89_btc_ntfy_radio_state()
7692 wl->status.map.busy = 0; in rtw89_btc_ntfy_radio_state()
7694 case BTC_RFCTRL_LPS_WL_ON: /* LPS-Protocol (RFon) */ in rtw89_btc_ntfy_radio_state()
7695 wl->status.map.rf_off = 0; in rtw89_btc_ntfy_radio_state()
7696 wl->status.map.lps = BTC_LPS_RF_ON; in rtw89_btc_ntfy_radio_state()
7697 wl->status.map.busy = 0; in rtw89_btc_ntfy_radio_state()
7701 wl->status.map.rf_off = 0; in rtw89_btc_ntfy_radio_state()
7702 wl->status.map.lps = BTC_LPS_OFF; in rtw89_btc_ntfy_radio_state()
7711 chip->ops->btc_init_cfg(rtwdev); in rtw89_btc_ntfy_radio_state()
7722 wl->status.map.lps_pre != BTC_LPS_OFF) in rtw89_btc_ntfy_radio_state()
7726 btc->dm.cnt_dm[BTC_DCNT_BTCNT_HANG] = 0; in rtw89_btc_ntfy_radio_state()
7727 btc->dm.tdma_instant_excute = 1; in rtw89_btc_ntfy_radio_state()
7730 wl->status.map.rf_off_pre = wl->status.map.rf_off; in rtw89_btc_ntfy_radio_state()
7731 wl->status.map.lps_pre = wl->status.map.lps; in rtw89_btc_ntfy_radio_state()
7738 struct rtw89_btc *btc = &rtwdev->btc; in _ntfy_wl_rfk()
7739 struct rtw89_btc_cx *cx = &btc->cx; in _ntfy_wl_rfk()
7740 struct rtw89_btc_wl_info *wl = &cx->wl; in _ntfy_wl_rfk()
7743 wl->rfk_info.type = type; in _ntfy_wl_rfk()
7744 wl->rfk_info.path_map = FIELD_GET(BTC_RFK_PATH_MAP, phy_path); in _ntfy_wl_rfk()
7745 wl->rfk_info.phy_map = FIELD_GET(BTC_RFK_PHY_MAP, phy_path); in _ntfy_wl_rfk()
7746 wl->rfk_info.band = FIELD_GET(BTC_RFK_BAND_MAP, phy_path); in _ntfy_wl_rfk()
7750 __func__, wl->rfk_info.phy_map, wl->rfk_info.path_map, in _ntfy_wl_rfk()
7756 wl->rfk_info.state = result ? BTC_WRFK_START : BTC_WRFK_STOP; in _ntfy_wl_rfk()
7760 btc->dm.cnt_notify[BTC_NCNT_WL_RFK]++; in _ntfy_wl_rfk()
7764 if (wl->rfk_info.state == BTC_WRFK_STOP) { in _ntfy_wl_rfk()
7768 wl->rfk_info.state = state; in _ntfy_wl_rfk()
7773 wl->rfk_info.state = BTC_WRFK_STOP; in _ntfy_wl_rfk()
7776 wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_rfk_chk_work); in _ntfy_wl_rfk()
7785 if (wl->rfk_info.state == BTC_WRFK_START || in _ntfy_wl_rfk()
7786 wl->rfk_info.state == BTC_WRFK_STOP) in _ntfy_wl_rfk()
7789 if (wl->rfk_info.state == BTC_WRFK_START) in _ntfy_wl_rfk()
7790 wiphy_delayed_work_queue(rtwdev->hw->wiphy, in _ntfy_wl_rfk()
7791 &rtwdev->coex_rfk_chk_work, in _ntfy_wl_rfk()
7797 __func__, btc->dm.cnt_notify[BTC_NCNT_WL_RFK], result); in _ntfy_wl_rfk()
7810 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_btc_ntfy_wl_rfk()
7823 state == BTC_WRFK_ONESHOT_START ? "ONE-SHOT_START" : in rtw89_btc_ntfy_wl_rfk()
7824 "ONE-SHOT_STOP"); in rtw89_btc_ntfy_wl_rfk()
7826 if (state != BTC_WRFK_START || rtwdev->is_bt_iqk_timeout) { in rtw89_btc_ntfy_wl_rfk()
7835 rtwdev->is_bt_iqk_timeout = true; in rtw89_btc_ntfy_wl_rfk()
7854 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in __rtw89_btc_ntfy_wl_sta_iter()
7855 struct rtw89_dev *rtwdev = iter_data->rtwdev; in __rtw89_btc_ntfy_wl_sta_iter()
7856 struct rtw89_btc *btc = &rtwdev->btc; in __rtw89_btc_ntfy_wl_sta_iter()
7857 struct rtw89_btc_dm *dm = &btc->dm; in __rtw89_btc_ntfy_wl_sta_iter()
7858 const struct rtw89_btc_ver *ver = btc->ver; in __rtw89_btc_ntfy_wl_sta_iter()
7859 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in __rtw89_btc_ntfy_wl_sta_iter()
7862 struct rtw89_traffic_stats *stats = &rtwvif->stats; in __rtw89_btc_ntfy_wl_sta_iter()
7863 const struct rtw89_chip_info *chip = rtwdev->chip; in __rtw89_btc_ntfy_wl_sta_iter()
7868 u8 port = rtwvif_link->port; in __rtw89_btc_ntfy_wl_sta_iter()
7876 rssi = ewma_rssi_read(&rtwsta_link->avg_rssi) >> RSSI_FACTOR; in __rtw89_btc_ntfy_wl_sta_iter()
7879 link_info = &wl->link_info[port]; in __rtw89_btc_ntfy_wl_sta_iter()
7880 link_info->stat.traffic = *stats; in __rtw89_btc_ntfy_wl_sta_iter()
7881 link_info_t = &link_info->stat.traffic; in __rtw89_btc_ntfy_wl_sta_iter()
7883 if (link_info->connected == MLME_NO_LINK) { in __rtw89_btc_ntfy_wl_sta_iter()
7884 link_info->rx_rate_drop_cnt = 0; in __rtw89_btc_ntfy_wl_sta_iter()
7888 link_info->stat.rssi = rssi; in __rtw89_btc_ntfy_wl_sta_iter()
7890 link_info->rssi_state[i] = in __rtw89_btc_ntfy_wl_sta_iter()
7892 link_info->rssi_state[i], in __rtw89_btc_ntfy_wl_sta_iter()
7893 link_info->stat.rssi, in __rtw89_btc_ntfy_wl_sta_iter()
7894 chip->wl_rssi_thres[i]); in __rtw89_btc_ntfy_wl_sta_iter()
7895 if (BTC_RSSI_LOW(link_info->rssi_state[i])) in __rtw89_btc_ntfy_wl_sta_iter()
7898 if (btc->ant_type == BTC_ANT_DEDICATED && in __rtw89_btc_ntfy_wl_sta_iter()
7899 BTC_RSSI_CHANGE(link_info->rssi_state[i])) in __rtw89_btc_ntfy_wl_sta_iter()
7902 iter_data->rssi_map_all |= rssi_map; in __rtw89_btc_ntfy_wl_sta_iter()
7904 last_tx_rate = link_info_t->tx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7905 last_rx_rate = link_info_t->rx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7906 last_tx_lvl = (u16)link_info_t->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7907 last_rx_lvl = (u16)link_info_t->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7909 if (stats->tx_tfc_lv != RTW89_TFC_IDLE || in __rtw89_btc_ntfy_wl_sta_iter()
7910 stats->rx_tfc_lv != RTW89_TFC_IDLE) in __rtw89_btc_ntfy_wl_sta_iter()
7913 if (stats->tx_tfc_lv > stats->rx_tfc_lv) in __rtw89_btc_ntfy_wl_sta_iter()
7918 link_info = &wl->link_info[port]; in __rtw89_btc_ntfy_wl_sta_iter()
7919 if (link_info->busy != busy || link_info->dir != dir) { in __rtw89_btc_ntfy_wl_sta_iter()
7921 link_info->busy = busy; in __rtw89_btc_ntfy_wl_sta_iter()
7922 link_info->dir = dir; in __rtw89_btc_ntfy_wl_sta_iter()
7925 iter_data->busy_all |= busy; in __rtw89_btc_ntfy_wl_sta_iter()
7926 iter_data->dir_all |= BIT(dir); in __rtw89_btc_ntfy_wl_sta_iter()
7928 if (rtwsta_link->rx_hw_rate <= RTW89_HW_RATE_CCK2 && in __rtw89_btc_ntfy_wl_sta_iter()
7930 link_info_t->rx_tfc_lv > RTW89_TFC_IDLE) in __rtw89_btc_ntfy_wl_sta_iter()
7931 link_info->rx_rate_drop_cnt++; in __rtw89_btc_ntfy_wl_sta_iter()
7933 if (last_tx_rate != rtwsta_link->ra_report.hw_rate || in __rtw89_btc_ntfy_wl_sta_iter()
7934 last_rx_rate != rtwsta_link->rx_hw_rate || in __rtw89_btc_ntfy_wl_sta_iter()
7935 last_tx_lvl != link_info_t->tx_tfc_lv || in __rtw89_btc_ntfy_wl_sta_iter()
7936 last_rx_lvl != link_info_t->rx_tfc_lv) in __rtw89_btc_ntfy_wl_sta_iter()
7939 link_info_t->tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7940 link_info_t->rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7942 if (link_info->role == RTW89_WIFI_ROLE_STATION || in __rtw89_btc_ntfy_wl_sta_iter()
7943 link_info->role == RTW89_WIFI_ROLE_P2P_CLIENT) { in __rtw89_btc_ntfy_wl_sta_iter()
7944 dm->trx_info.tx_rate = link_info_t->tx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7945 dm->trx_info.rx_rate = link_info_t->rx_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7948 if (ver->fwlrole == 0) { in __rtw89_btc_ntfy_wl_sta_iter()
7949 r = &wl->role_info; in __rtw89_btc_ntfy_wl_sta_iter()
7950 r->active_role[port].tx_lvl = stats->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7951 r->active_role[port].rx_lvl = stats->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7952 r->active_role[port].tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7953 r->active_role[port].rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7954 } else if (ver->fwlrole == 1) { in __rtw89_btc_ntfy_wl_sta_iter()
7955 r1 = &wl->role_info_v1; in __rtw89_btc_ntfy_wl_sta_iter()
7956 r1->active_role_v1[port].tx_lvl = stats->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7957 r1->active_role_v1[port].rx_lvl = stats->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7958 r1->active_role_v1[port].tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7959 r1->active_role_v1[port].rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7960 } else if (ver->fwlrole == 2) { in __rtw89_btc_ntfy_wl_sta_iter()
7961 dm->trx_info.tx_lvl = stats->tx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7962 dm->trx_info.rx_lvl = stats->rx_tfc_lv; in __rtw89_btc_ntfy_wl_sta_iter()
7963 dm->trx_info.tx_rate = rtwsta_link->ra_report.hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7964 dm->trx_info.rx_rate = rtwsta_link->rx_hw_rate; in __rtw89_btc_ntfy_wl_sta_iter()
7967 dm->trx_info.tx_tp = link_info_t->tx_throughput; in __rtw89_btc_ntfy_wl_sta_iter()
7968 dm->trx_info.rx_tp = link_info_t->rx_throughput; in __rtw89_btc_ntfy_wl_sta_iter()
7970 /* Trigger coex-run if 0x10980 reg-value is diff with coex setup */ in __rtw89_btc_ntfy_wl_sta_iter()
7971 if ((dm->wl_btg_rx_rb != dm->wl_btg_rx && in __rtw89_btc_ntfy_wl_sta_iter()
7972 dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) || in __rtw89_btc_ntfy_wl_sta_iter()
7973 (dm->wl_pre_agc_rb != dm->wl_pre_agc && in __rtw89_btc_ntfy_wl_sta_iter()
7974 dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND)) in __rtw89_btc_ntfy_wl_sta_iter()
7975 iter_data->is_sta_change = true; in __rtw89_btc_ntfy_wl_sta_iter()
7978 iter_data->is_sta_change = true; in __rtw89_btc_ntfy_wl_sta_iter()
7981 iter_data->is_traffic_change = true; in __rtw89_btc_ntfy_wl_sta_iter()
7994 rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_btc_ntfy_wl_sta_iter()
8003 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_ntfy_wl_sta()
8004 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_btc_ntfy_wl_sta()
8005 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_btc_ntfy_wl_sta()
8009 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_btc_ntfy_wl_sta()
8013 wl->rssi_level = 0; in rtw89_btc_ntfy_wl_sta()
8014 btc->dm.cnt_notify[BTC_NCNT_WL_STA]++; in rtw89_btc_ntfy_wl_sta()
8015 for (i = BTC_WL_RSSI_THMAX; i > 0; i--) { in rtw89_btc_ntfy_wl_sta()
8017 if (data.rssi_map_all & BIT(i - 1)) { in rtw89_btc_ntfy_wl_sta()
8018 wl->rssi_level = i; in rtw89_btc_ntfy_wl_sta()
8023 if (dm->trx_info.wl_rssi != wl->rssi_level) in rtw89_btc_ntfy_wl_sta()
8024 dm->trx_info.wl_rssi = wl->rssi_level; in rtw89_btc_ntfy_wl_sta()
8027 __func__, !!wl->status.map.busy); in rtw89_btc_ntfy_wl_sta()
8029 _write_scbd(rtwdev, BTC_WSCB_WLBUSY, (!!wl->status.map.busy)); in rtw89_btc_ntfy_wl_sta()
8034 wl->status.map.busy = data.busy_all; in rtw89_btc_ntfy_wl_sta()
8035 wl->status.map.traffic_dir = data.dir_all; in rtw89_btc_ntfy_wl_sta()
8037 } else if (btc->dm.cnt_notify[BTC_NCNT_WL_STA] >= in rtw89_btc_ntfy_wl_sta()
8038 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] + BTC_NHM_CHK_INTVL) { in rtw89_btc_ntfy_wl_sta()
8039 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] = in rtw89_btc_ntfy_wl_sta()
8040 btc->dm.cnt_notify[BTC_NCNT_WL_STA]; in rtw89_btc_ntfy_wl_sta()
8041 } else if (btc->dm.cnt_notify[BTC_NCNT_WL_STA] < in rtw89_btc_ntfy_wl_sta()
8042 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST]) { in rtw89_btc_ntfy_wl_sta()
8043 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] = in rtw89_btc_ntfy_wl_sta()
8044 btc->dm.cnt_notify[BTC_NCNT_WL_STA]; in rtw89_btc_ntfy_wl_sta()
8050 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_c2h_get_index_by_ver()
8051 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_c2h_get_index_by_ver()
8062 if (ver->fwc2hfunc == 0) in rtw89_btc_c2h_get_index_by_ver()
8067 if (ver->fwc2hfunc == 0) in rtw89_btc_c2h_get_index_by_ver()
8069 else if (ver->fwc2hfunc == 1) in rtw89_btc_c2h_get_index_by_ver()
8071 else if (ver->fwc2hfunc == 2) in rtw89_btc_c2h_get_index_by_ver()
8076 if (ver->fwc2hfunc == 0) in rtw89_btc_c2h_get_index_by_ver()
8078 else if (ver->fwc2hfunc == 1) in rtw89_btc_c2h_get_index_by_ver()
8080 else if (ver->fwc2hfunc == 2) in rtw89_btc_c2h_get_index_by_ver()
8085 if (ver->fwc2hfunc == 2) in rtw89_btc_c2h_get_index_by_ver()
8098 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_c2h_handle()
8099 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in rtw89_btc_c2h_handle()
8100 u8 *buf = &skb->data[RTW89_C2H_HEADER_LEN]; in rtw89_btc_c2h_handle()
8102 len -= RTW89_C2H_HEADER_LEN; in rtw89_btc_c2h_handle()
8112 pfwinfo->cnt_c2h++; in rtw89_btc_c2h_handle()
8116 pfwinfo->event[func]++; in rtw89_btc_c2h_handle()
8119 pfwinfo->event[func]++; in rtw89_btc_c2h_handle()
8126 btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE]++; in rtw89_btc_c2h_handle()
8132 btc->cx.cnt_bt[BTC_BCNT_SCBDUPDATE]++; in rtw89_btc_c2h_handle()
8138 btc->dbg.rb_done = true; in rtw89_btc_c2h_handle()
8139 btc->dbg.rb_val = le32_to_cpu(*((__le32 *)buf)); in rtw89_btc_c2h_handle()
8143 btc->dbg.rb_done = true; in rtw89_btc_c2h_handle()
8144 btc->dbg.rb_val = buf[0]; in rtw89_btc_c2h_handle()
8147 btc->dm.cnt_dm[BTC_DCNT_CX_RUNINFO]++; in rtw89_btc_c2h_handle()
8156 union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; in _show_cx_info()
8157 const struct rtw89_chip_info *chip = rtwdev->chip; in _show_cx_info()
8158 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in _show_cx_info()
8159 struct rtw89_hal *hal = &rtwdev->hal; in _show_cx_info()
8160 struct rtw89_btc *btc = &rtwdev->btc; in _show_cx_info()
8161 struct rtw89_btc_dm *dm = &btc->dm; in _show_cx_info()
8162 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_cx_info()
8163 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_cx_info()
8168 if (!(dm->coex_info_map & BTC_COEX_INFO_CX)) in _show_cx_info()
8171 dm->cnt_notify[BTC_NCNT_SHOW_COEX_INFO]++; in _show_cx_info()
8173 p += scnprintf(p, end - p, in _show_cx_info()
8175 chip->chip_id); in _show_cx_info()
8181 p += scnprintf(p, end - p, " %-15s : Coex:%d.%d.%d(branch:%d), ", in _show_cx_info()
8185 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw_coex); in _show_cx_info()
8186 ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw_coex); in _show_cx_info()
8187 ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw_coex); in _show_cx_info()
8188 id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw_coex); in _show_cx_info()
8189 p += scnprintf(p, end - p, "WL_FW_coex:%d.%d.%d(branch:%d)", in _show_cx_info()
8192 ver_main = FIELD_GET(GENMASK(31, 24), chip->wlcx_desired); in _show_cx_info()
8193 ver_sub = FIELD_GET(GENMASK(23, 16), chip->wlcx_desired); in _show_cx_info()
8194 ver_hotfix = FIELD_GET(GENMASK(15, 8), chip->wlcx_desired); in _show_cx_info()
8195 p += scnprintf(p, end - p, "(%s, desired:%d.%d.%d), ", in _show_cx_info()
8196 (wl->ver_info.fw_coex >= chip->wlcx_desired ? in _show_cx_info()
8199 p += scnprintf(p, end - p, "BT_FW_coex:%d(%s, desired:%d)\n", in _show_cx_info()
8200 bt->ver_info.fw_coex, in _show_cx_info()
8201 (bt->ver_info.fw_coex >= chip->btcx_desired ? in _show_cx_info()
8202 "Match" : "Mismatch"), chip->btcx_desired); in _show_cx_info()
8204 if (bt->enable.now && bt->ver_info.fw == 0) in _show_cx_info()
8209 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw); in _show_cx_info()
8210 ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw); in _show_cx_info()
8211 ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw); in _show_cx_info()
8212 id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw); in _show_cx_info()
8213 p += scnprintf(p, end - p, in _show_cx_info()
8214 " %-15s : WL_FW:%d.%d.%d.%d, BT_FW:0x%x(%s)\n", in _show_cx_info()
8217 bt->ver_info.fw, bt->run_patch_code ? "patch" : "ROM"); in _show_cx_info()
8219 if (ver->fcxinit == 7) { in _show_cx_info()
8220 cv = md->md_v7.kt_ver; in _show_cx_info()
8221 rfe = md->md_v7.rfe_type; in _show_cx_info()
8222 iso = md->md_v7.ant.isolation; in _show_cx_info()
8223 ant_num = md->md_v7.ant.num; in _show_cx_info()
8224 ant_single_pos = md->md_v7.ant.single_pos; in _show_cx_info()
8226 cv = md->md.cv; in _show_cx_info()
8227 rfe = md->md.rfe_type; in _show_cx_info()
8228 iso = md->md.ant.isolation; in _show_cx_info()
8229 ant_num = md->md.ant.num; in _show_cx_info()
8230 ant_single_pos = md->md.ant.single_pos; in _show_cx_info()
8233 p += scnprintf(p, end - p, in _show_cx_info()
8234 " %-15s : cv:%x, rfe_type:0x%x, ant_iso:%d, ant_pg:%d, %s", in _show_cx_info()
8239 p += scnprintf(p, end - p, in _show_cx_info()
8241 btc->cx.other.type, rtwdev->dbcc_en, hal->tx_nss, in _show_cx_info()
8242 hal->rx_nss); in _show_cx_info()
8244 return p - buf; in _show_cx_info()
8249 struct rtw89_btc *btc = &rtwdev->btc; in _show_wl_role_info()
8251 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_wl_role_info()
8252 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; in _show_wl_role_info()
8257 if (rtwdev->dbcc_en) { in _show_wl_role_info()
8258 p += scnprintf(p, end - p, in _show_wl_role_info()
8259 " %-15s : PHY0_band(op:%d/scan:%d/real:%d), ", in _show_wl_role_info()
8260 "[dbcc_info]", wl_dinfo->op_band[RTW89_PHY_0], in _show_wl_role_info()
8261 wl_dinfo->scan_band[RTW89_PHY_0], in _show_wl_role_info()
8262 wl_dinfo->real_band[RTW89_PHY_0]); in _show_wl_role_info()
8263 p += scnprintf(p, end - p, in _show_wl_role_info()
8265 wl_dinfo->op_band[RTW89_PHY_1], in _show_wl_role_info()
8266 wl_dinfo->scan_band[RTW89_PHY_1], in _show_wl_role_info()
8267 wl_dinfo->real_band[RTW89_PHY_1]); in _show_wl_role_info()
8271 if (btc->ver->fwlrole == 8) in _show_wl_role_info()
8272 plink = &btc->cx.wl.rlink_info[i][0]; in _show_wl_role_info()
8274 plink = &btc->cx.wl.link_info[i]; in _show_wl_role_info()
8276 if (!plink->active) in _show_wl_role_info()
8279 p += scnprintf(p, end - p, in _show_wl_role_info()
8280 … " [port_%d] : role=%d(phy-%d), connect=%d(client_cnt=%d), mode=%d, center_ch=%d, bw=%d", in _show_wl_role_info()
8281 plink->pid, (u32)plink->role, plink->phy, in _show_wl_role_info()
8282 (u32)plink->connected, plink->client_cnt - 1, in _show_wl_role_info()
8283 (u32)plink->mode, plink->ch, (u32)plink->bw); in _show_wl_role_info()
8285 if (plink->connected == MLME_NO_LINK) in _show_wl_role_info()
8288 p += scnprintf(p, end - p, in _show_wl_role_info()
8290 plink->mac_id, plink->tx_time, plink->tx_retry); in _show_wl_role_info()
8292 p += scnprintf(p, end - p, in _show_wl_role_info()
8293 " [port_%d] : rssi=-%ddBm(%d), busy=%d, dir=%s, ", in _show_wl_role_info()
8294 plink->pid, 110 - plink->stat.rssi, in _show_wl_role_info()
8295 plink->stat.rssi, plink->busy, in _show_wl_role_info()
8296 plink->dir == RTW89_TFC_UL ? "UL" : "DL"); in _show_wl_role_info()
8298 t = &plink->stat.traffic; in _show_wl_role_info()
8300 p += scnprintf(p, end - p, in _show_wl_role_info()
8302 (u32)t->tx_rate, t->tx_tfc_lv); in _show_wl_role_info()
8304 p += scnprintf(p, end - p, in _show_wl_role_info()
8306 (u32)t->rx_rate, in _show_wl_role_info()
8307 t->rx_tfc_lv, plink->rx_rate_drop_cnt); in _show_wl_role_info()
8310 return p - buf; in _show_wl_role_info()
8315 struct rtw89_btc *btc = &rtwdev->btc; in _show_wl_info()
8316 const struct rtw89_btc_ver *ver = btc->ver; in _show_wl_info()
8317 struct rtw89_btc_cx *cx = &btc->cx; in _show_wl_info()
8318 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_wl_info()
8319 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; in _show_wl_info()
8320 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; in _show_wl_info()
8321 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; in _show_wl_info()
8322 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7; in _show_wl_info()
8323 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8; in _show_wl_info()
8327 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_WL)) in _show_wl_info()
8330 p += scnprintf(p, end - p, "========== [WL Status] ==========\n"); in _show_wl_info()
8332 if (ver->fwlrole == 0) in _show_wl_info()
8333 mode = wl_rinfo->link_mode; in _show_wl_info()
8334 else if (ver->fwlrole == 1) in _show_wl_info()
8335 mode = wl_rinfo_v1->link_mode; in _show_wl_info()
8336 else if (ver->fwlrole == 2) in _show_wl_info()
8337 mode = wl_rinfo_v2->link_mode; in _show_wl_info()
8338 else if (ver->fwlrole == 7) in _show_wl_info()
8339 mode = wl_rinfo_v7->link_mode; in _show_wl_info()
8340 else if (ver->fwlrole == 8) in _show_wl_info()
8341 mode = wl_rinfo_v8->link_mode; in _show_wl_info()
8345 p += scnprintf(p, end - p, " %-15s : link_mode:%d, ", "[status]", in _show_wl_info()
8348 p += scnprintf(p, end - p, in _show_wl_info()
8350 wl->status.map.rf_off, wl->status.map.lps, in _show_wl_info()
8351 wl->status.map.scan ? "Y" : "N", in _show_wl_info()
8352 wl->scan_info.band[RTW89_PHY_0], wl->scan_info.phy_map); in _show_wl_info()
8354 p += scnprintf(p, end - p, in _show_wl_info()
8356 wl->status.map.connecting ? "Y" : "N", in _show_wl_info()
8357 wl->status.map.roaming ? "Y" : "N", in _show_wl_info()
8358 wl->status.map._4way ? "Y" : "N", in _show_wl_info()
8359 wl->status.map.init_ok ? "Y" : "N"); in _show_wl_info()
8361 p += _show_wl_role_info(rtwdev, p, end - p); in _show_wl_info()
8364 return p - buf; in _show_wl_info()
8375 struct rtw89_btc *btc = &rtwdev->btc; in _show_bt_profile_info()
8376 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; in _show_bt_profile_info()
8377 struct rtw89_btc_bt_hfp_desc hfp = bt_linfo->hfp_desc; in _show_bt_profile_info()
8378 struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc; in _show_bt_profile_info()
8379 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in _show_bt_profile_info()
8380 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc; in _show_bt_profile_info()
8384 p += scnprintf(p, end - p, in _show_bt_profile_info()
8385 " %-15s : type:%s, sut_pwr:%d, golden-rx:%d", in _show_bt_profile_info()
8387 bt_linfo->sut_pwr_level[0], in _show_bt_profile_info()
8388 bt_linfo->golden_rx_shift[0]); in _show_bt_profile_info()
8392 p += scnprintf(p, end - p, in _show_bt_profile_info()
8393 "\n\r %-15s : type:%s%s%s%s%s pair-cnt:%d, sut_pwr:%d, golden-rx:%d\n", in _show_bt_profile_info()
8399 hid.type & BTC_HID_RCU_VOICE ? "RCU-Voice," : "", in _show_bt_profile_info()
8400 hid.pair_cnt, bt_linfo->sut_pwr_level[1], in _show_bt_profile_info()
8401 bt_linfo->golden_rx_shift[1]); in _show_bt_profile_info()
8405 p += scnprintf(p, end - p, in _show_bt_profile_info()
8406 " %-15s : type:%s, bit-pool:%d, flush-time:%d, ", in _show_bt_profile_info()
8411 p += scnprintf(p, end - p, in _show_bt_profile_info()
8412 "vid:0x%x, Dev-name:0x%x, sut_pwr:%d, golden-rx:%d\n", in _show_bt_profile_info()
8414 bt_linfo->sut_pwr_level[2], in _show_bt_profile_info()
8415 bt_linfo->golden_rx_shift[2]); in _show_bt_profile_info()
8419 p += scnprintf(p, end - p, in _show_bt_profile_info()
8420 " %-15s : sut_pwr:%d, golden-rx:%d\n", in _show_bt_profile_info()
8422 bt_linfo->sut_pwr_level[3], in _show_bt_profile_info()
8423 bt_linfo->golden_rx_shift[3]); in _show_bt_profile_info()
8426 return p - buf; in _show_bt_profile_info()
8431 struct rtw89_btc *btc = &rtwdev->btc; in _show_bt_info()
8432 const struct rtw89_btc_ver *ver = btc->ver; in _show_bt_info()
8433 struct rtw89_btc_cx *cx = &btc->cx; in _show_bt_info()
8434 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_bt_info()
8435 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_bt_info()
8436 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; in _show_bt_info()
8437 union rtw89_btc_module_info *md = &btc->mdinfo; in _show_bt_info()
8439 u8 *afh = bt_linfo->afh_map; in _show_bt_info()
8440 u8 *afh_le = bt_linfo->afh_map_le; in _show_bt_info()
8443 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_BT)) in _show_bt_info()
8446 if (ver->fcxinit == 7) in _show_bt_info()
8447 bt_pos = md->md_v7.bt_pos; in _show_bt_info()
8449 bt_pos = md->md.bt_pos; in _show_bt_info()
8451 p += scnprintf(p, end - p, "========== [BT Status] ==========\n"); in _show_bt_info()
8453 p += scnprintf(p, end - p, in _show_bt_info()
8454 " %-15s : enable:%s, btg:%s%s, connect:%s, ", in _show_bt_info()
8455 "[status]", bt->enable.now ? "Y" : "N", in _show_bt_info()
8456 bt->btg_type ? "Y" : "N", in _show_bt_info()
8457 (bt->enable.now && (bt->btg_type != bt_pos) ? in _show_bt_info()
8458 "(efuse-mismatch!!)" : ""), in _show_bt_info()
8459 (bt_linfo->status.map.connect ? "Y" : "N")); in _show_bt_info()
8461 p += scnprintf(p, end - p, in _show_bt_info()
8463 bt->igno_wl ? "Y" : "N", in _show_bt_info()
8464 bt->mbx_avl ? "Y" : "N", bt->rfk_info.val); in _show_bt_info()
8466 p += scnprintf(p, end - p, " %-15s : profile:%s%s%s%s%s ", in _show_bt_info()
8468 (bt_linfo->profile_cnt.now == 0) ? "None," : "", in _show_bt_info()
8469 bt_linfo->hfp_desc.exist ? "HFP," : "", in _show_bt_info()
8470 bt_linfo->hid_desc.exist ? "HID," : "", in _show_bt_info()
8471 bt_linfo->a2dp_desc.exist ? in _show_bt_info()
8472 (bt_linfo->a2dp_desc.sink ? "A2DP_sink," : "A2DP,") : "", in _show_bt_info()
8473 bt_linfo->pan_desc.exist ? "PAN," : ""); in _show_bt_info()
8475 p += scnprintf(p, end - p, in _show_bt_info()
8476 "multi-link:%s, role:%s, ble-connect:%s, CQDDR:%s, A2DP_active:%s, PAN_active:%s\n", in _show_bt_info()
8477 bt_linfo->multi_link.now ? "Y" : "N", in _show_bt_info()
8478 bt_linfo->slave_role ? "Slave" : "Master", in _show_bt_info()
8479 bt_linfo->status.map.ble_connect ? "Y" : "N", in _show_bt_info()
8480 bt_linfo->cqddr ? "Y" : "N", in _show_bt_info()
8481 bt_linfo->a2dp_desc.active ? "Y" : "N", in _show_bt_info()
8482 bt_linfo->pan_desc.active ? "Y" : "N"); in _show_bt_info()
8484 p += scnprintf(p, end - p, in _show_bt_info()
8485 " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s", in _show_bt_info()
8486 "[link]", bt_linfo->rssi - 100, in _show_bt_info()
8487 bt->rssi_level, in _show_bt_info()
8488 bt_linfo->tx_3m ? 3 : 2, in _show_bt_info()
8489 bt_linfo->status.map.inq_pag ? " inq-page!!" : "", in _show_bt_info()
8490 bt_linfo->status.map.acl_busy ? " acl_busy!!" : "", in _show_bt_info()
8491 bt_linfo->status.map.mesh_busy ? " mesh_busy!!" : ""); in _show_bt_info()
8493 p += scnprintf(p, end - p, in _show_bt_info()
8495 bt_linfo->relink.now ? " ReLink!!" : "", in _show_bt_info()
8499 if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect) in _show_bt_info()
8500 p += scnprintf(p, end - p, in _show_bt_info()
8505 p += scnprintf(p, end - p, "wl_ch_map[en:%d/ch:%d/bw:%d]\n", in _show_bt_info()
8506 wl->afh_info.en, wl->afh_info.ch, wl->afh_info.bw); in _show_bt_info()
8508 p += scnprintf(p, end - p, in _show_bt_info()
8509 " %-15s : retry:%d, relink:%d, rate_chg:%d, reinit:%d, reenable:%d, ", in _show_bt_info()
8510 "[stat_cnt]", cx->cnt_bt[BTC_BCNT_RETRY], in _show_bt_info()
8511 cx->cnt_bt[BTC_BCNT_RELINK], in _show_bt_info()
8512 cx->cnt_bt[BTC_BCNT_RATECHG], in _show_bt_info()
8513 cx->cnt_bt[BTC_BCNT_REINIT], in _show_bt_info()
8514 cx->cnt_bt[BTC_BCNT_REENABLE]); in _show_bt_info()
8516 p += scnprintf(p, end - p, in _show_bt_info()
8517 "role-switch:%d, afh:%d, inq_page:%d(inq:%d/page:%d), igno_wl:%d\n", in _show_bt_info()
8518 cx->cnt_bt[BTC_BCNT_ROLESW], cx->cnt_bt[BTC_BCNT_AFH], in _show_bt_info()
8519 cx->cnt_bt[BTC_BCNT_INQPAG], cx->cnt_bt[BTC_BCNT_INQ], in _show_bt_info()
8520 cx->cnt_bt[BTC_BCNT_PAGE], cx->cnt_bt[BTC_BCNT_IGNOWL]); in _show_bt_info()
8522 p += _show_bt_profile_info(rtwdev, p, end - p); in _show_bt_info()
8524 p += scnprintf(p, end - p, in _show_bt_info()
8525 " %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)\n", in _show_bt_info()
8526 "[bt_info]", bt->raw_info[2], bt->raw_info[3], in _show_bt_info()
8527 bt->raw_info[4], bt->raw_info[5], bt->raw_info[6], in _show_bt_info()
8528 bt->raw_info[7], in _show_bt_info()
8529 bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply", in _show_bt_info()
8530 cx->cnt_bt[BTC_BCNT_INFOUPDATE], in _show_bt_info()
8531 cx->cnt_bt[BTC_BCNT_INFOSAME]); in _show_bt_info()
8533 p += scnprintf(p, end - p, in _show_bt_info()
8534 " %-15s : Hi-rx = %d, Hi-tx = %d, Lo-rx = %d, Lo-tx = %d (bt_polut_wl_tx = %d)", in _show_bt_info()
8535 "[trx_req_cnt]", cx->cnt_bt[BTC_BCNT_HIPRI_RX], in _show_bt_info()
8536 cx->cnt_bt[BTC_BCNT_HIPRI_TX], in _show_bt_info()
8537 cx->cnt_bt[BTC_BCNT_LOPRI_RX], in _show_bt_info()
8538 cx->cnt_bt[BTC_BCNT_LOPRI_TX], in _show_bt_info()
8539 cx->cnt_bt[BTC_BCNT_POLUT]); in _show_bt_info()
8541 if (!bt->scan_info_update) { in _show_bt_info()
8543 p += scnprintf(p, end - p, "\n"); in _show_bt_info()
8546 if (ver->fcxbtscan == 1) { in _show_bt_info()
8547 p += scnprintf(p, end - p, in _show_bt_info()
8548 "(INQ:%d-%d/PAGE:%d-%d/LE:%d-%d/INIT:%d-%d)", in _show_bt_info()
8549 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].win), in _show_bt_info()
8550 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].intvl), in _show_bt_info()
8551 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].win), in _show_bt_info()
8552 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].intvl), in _show_bt_info()
8553 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].win), in _show_bt_info()
8554 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].intvl), in _show_bt_info()
8555 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].win), in _show_bt_info()
8556 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].intvl)); in _show_bt_info()
8557 } else if (ver->fcxbtscan == 2) { in _show_bt_info()
8558 p += scnprintf(p, end - p, in _show_bt_info()
8559 "(BG:%d-%d/INIT:%d-%d/LE:%d-%d)", in _show_bt_info()
8560 le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].win), in _show_bt_info()
8561 le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].intvl), in _show_bt_info()
8562 le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].win), in _show_bt_info()
8563 le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].intvl), in _show_bt_info()
8564 le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].win), in _show_bt_info()
8565 le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].intvl)); in _show_bt_info()
8567 p += scnprintf(p, end - p, "\n"); in _show_bt_info()
8570 if (bt_linfo->profile_cnt.now || bt_linfo->status.map.ble_connect) in _show_bt_info()
8575 if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect) in _show_bt_info()
8580 if (bt_linfo->a2dp_desc.exist && in _show_bt_info()
8581 (bt_linfo->a2dp_desc.flush_time == 0 || in _show_bt_info()
8582 bt_linfo->a2dp_desc.vendor_id == 0 || in _show_bt_info()
8583 bt_linfo->a2dp_desc.play_latency == 1)) in _show_bt_info()
8588 return p - buf; in _show_bt_info()
8891 p += scnprintf(p, end - p, " %-15s : ", prefix); in scnprintf_segment()
8894 p += scnprintf(p, end - p, "-> %-20s", in scnprintf_segment()
8897 p += scnprintf(p, end - p, "-> %-15s", in scnprintf_segment()
8900 p += scnprintf(p, end - p, "-> %-13s", in scnprintf_segment()
8902 if (i == (len - 1) || (i % seg_len) == (seg_len - 1)) in scnprintf_segment()
8903 p += scnprintf(p, end - p, "\n"); in scnprintf_segment()
8906 return p - buf; in scnprintf_segment()
8911 struct rtw89_btc *btc = &rtwdev->btc; in _show_dm_step()
8912 struct rtw89_btc_dm *dm = &btc->dm; in _show_dm_step()
8917 len = dm->dm_step.step_ov ? RTW89_BTC_DM_MAXSTEP : dm->dm_step.step_pos; in _show_dm_step()
8918 start_idx = dm->dm_step.step_ov ? dm->dm_step.step_pos : 0; in _show_dm_step()
8920 p += scnprintf_segment(p, end - p, "[dm_steps]", dm->dm_step.step, len, in _show_dm_step()
8921 6, start_idx, ARRAY_SIZE(dm->dm_step.step)); in _show_dm_step()
8923 return p - buf; in _show_dm_step()
8928 struct rtw89_btc *btc = &rtwdev->btc; in _show_dm_info()
8929 const struct rtw89_btc_ver *ver = btc->ver; in _show_dm_info()
8930 struct rtw89_btc_dm *dm = &btc->dm; in _show_dm_info()
8931 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_dm_info()
8932 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_dm_info()
8936 if (!(dm->coex_info_map & BTC_COEX_INFO_DM)) in _show_dm_info()
8939 p += scnprintf(p, end - p, in _show_dm_info()
8941 (btc->manual_ctrl ? "(Manual)" : "(Auto)")); in _show_dm_info()
8943 p += scnprintf(p, end - p, in _show_dm_info()
8944 " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%s, init_mode:%s, run_cnt:%d\n", in _show_dm_info()
8946 btc->ant_type == BTC_ANT_SHARED ? "shared" : "dedicated", in _show_dm_info()
8947 steps_to_str(dm->run_reason), in _show_dm_info()
8948 steps_to_str(dm->run_action | BTC_ACT_EXT_BIT), in _show_dm_info()
8949 id_to_ant(FIELD_GET(GENMASK(7, 0), dm->set_ant_path)), in _show_dm_info()
8950 id_to_mode(wl->coex_mode), in _show_dm_info()
8951 dm->cnt_dm[BTC_DCNT_RUN]); in _show_dm_info()
8953 p += _show_dm_step(rtwdev, p, end - p); in _show_dm_info()
8955 if (ver->fcxctrl == 7) in _show_dm_info()
8956 igno_bt = btc->ctrl.ctrl_v7.igno_bt; in _show_dm_info()
8958 igno_bt = btc->ctrl.ctrl.igno_bt; in _show_dm_info()
8960 p += scnprintf(p, end - p, in _show_dm_info()
8961 " %-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()
8962 "[dm_flag]", dm->wl_only, dm->bt_only, igno_bt, in _show_dm_info()
8963 dm->freerun, btc->lps, dm->wl_mimo_ps); in _show_dm_info()
8965 p += scnprintf(p, end - p, "leak_ap:%d, fw_offload:%s%s\n", in _show_dm_info()
8966 dm->leak_ap, in _show_dm_info()
8968 (dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ? in _show_dm_info()
8971 if (dm->rf_trx_para.wl_tx_power == 0xff) in _show_dm_info()
8972 p += scnprintf(p, end - p, in _show_dm_info()
8973 " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:orig, ", in _show_dm_info()
8974 "[trx_ctrl]", wl->rssi_level, in _show_dm_info()
8975 dm->trx_para_level); in _show_dm_info()
8978 p += scnprintf(p, end - p, in _show_dm_info()
8979 " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:%d, ", in _show_dm_info()
8980 "[trx_ctrl]", wl->rssi_level, in _show_dm_info()
8981 dm->trx_para_level, in _show_dm_info()
8982 dm->rf_trx_para.wl_tx_power); in _show_dm_info()
8984 p += scnprintf(p, end - p, in _show_dm_info()
8985 "wl_rx_lvl:%d, bt_tx_pwr_dec:%d, bt_rx_lna:%d(%s-tbl), wl_btg_rx:%d\n", in _show_dm_info()
8986 dm->rf_trx_para.wl_rx_gain, in _show_dm_info()
8987 dm->rf_trx_para.bt_tx_power, in _show_dm_info()
8988 dm->rf_trx_para.bt_rx_gain, in _show_dm_info()
8989 (bt->hi_lna_rx ? "Hi" : "Ori"), dm->wl_btg_rx); in _show_dm_info()
8991 p += scnprintf(p, end - p, in _show_dm_info()
8992 … " %-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()
8993 "[dm_ctrl]", dm->wl_tx_limit.enable, in _show_dm_info()
8994 dm->wl_tx_limit.tx_time, in _show_dm_info()
8995 dm->wl_tx_limit.tx_retry, btc->bt_req_len, in _show_dm_info()
8996 bt->scan_rx_low_pri); in _show_dm_info()
8998 return p - buf; in _show_dm_info()
9003 struct rtw89_btc *btc = &rtwdev->btc; in _show_error()
9004 const struct rtw89_btc_ver *ver = btc->ver; in _show_error()
9005 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_error()
9010 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; in _show_error()
9011 if (ver->fcxcysta == 2) { in _show_error()
9012 pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2; in _show_error()
9013 except_cnt = le32_to_cpu(pcysta->v2.except_cnt); in _show_error()
9014 exception_map = le32_to_cpu(pcysta->v2.exception); in _show_error()
9015 } else if (ver->fcxcysta == 3) { in _show_error()
9016 pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3; in _show_error()
9017 except_cnt = le32_to_cpu(pcysta->v3.except_cnt); in _show_error()
9018 exception_map = le32_to_cpu(pcysta->v3.except_map); in _show_error()
9019 } else if (ver->fcxcysta == 4) { in _show_error()
9020 pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4; in _show_error()
9021 except_cnt = pcysta->v4.except_cnt; in _show_error()
9022 exception_map = le32_to_cpu(pcysta->v4.except_map); in _show_error()
9023 } else if (ver->fcxcysta == 5) { in _show_error()
9024 pcysta->v5 = pfwinfo->rpt_fbtc_cysta.finfo.v5; in _show_error()
9025 except_cnt = pcysta->v5.except_cnt; in _show_error()
9026 exception_map = le32_to_cpu(pcysta->v5.except_map); in _show_error()
9027 } else if (ver->fcxcysta == 7) { in _show_error()
9028 pcysta->v7 = pfwinfo->rpt_fbtc_cysta.finfo.v7; in _show_error()
9029 except_cnt = pcysta->v7.except_cnt; in _show_error()
9030 exception_map = le32_to_cpu(pcysta->v7.except_map); in _show_error()
9035 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW] == 0 && except_cnt == 0 && in _show_error()
9036 !pfwinfo->len_mismch && !pfwinfo->fver_mismch) in _show_error()
9039 p += scnprintf(p, end - p, " %-15s : ", "[error]"); in _show_error()
9041 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]) { in _show_error()
9042 p += scnprintf(p, end - p, in _show_error()
9043 "overflow-cnt: %d, ", in _show_error()
9044 pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]); in _show_error()
9047 if (pfwinfo->len_mismch) { in _show_error()
9048 p += scnprintf(p, end - p, in _show_error()
9049 "len-mismatch: 0x%x, ", in _show_error()
9050 pfwinfo->len_mismch); in _show_error()
9053 if (pfwinfo->fver_mismch) { in _show_error()
9054 p += scnprintf(p, end - p, in _show_error()
9055 "fver-mismatch: 0x%x, ", in _show_error()
9056 pfwinfo->fver_mismch); in _show_error()
9061 p += scnprintf(p, end - p, in _show_error()
9062 "exception-type: 0x%x, exception-cnt = %d", in _show_error()
9065 p += scnprintf(p, end - p, "\n"); in _show_error()
9067 return p - buf; in _show_error()
9072 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_tdma()
9073 const struct rtw89_btc_ver *ver = btc->ver; in _show_fbtc_tdma()
9074 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_tdma()
9079 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo; in _show_fbtc_tdma()
9080 if (!pcinfo->valid) in _show_fbtc_tdma()
9083 if (ver->fcxtdma == 1) in _show_fbtc_tdma()
9084 t = &pfwinfo->rpt_fbtc_tdma.finfo.v1; in _show_fbtc_tdma()
9086 t = &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma; in _show_fbtc_tdma()
9088 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9089 " %-15s : ", "[tdma_policy]"); in _show_fbtc_tdma()
9090 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9092 (u32)t->type, in _show_fbtc_tdma()
9093 t->rxflctrl, t->txpause); in _show_fbtc_tdma()
9095 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9097 t->wtgle_n, t->leak_n, t->ext_ctrl); in _show_fbtc_tdma()
9099 p += scnprintf(p, end - p, in _show_fbtc_tdma()
9101 (u32)btc->policy_type); in _show_fbtc_tdma()
9103 p += scnprintf(p, end - p, "\n"); in _show_fbtc_tdma()
9105 return p - buf; in _show_fbtc_tdma()
9110 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_slots()
9111 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_slots()
9118 if (btc->ver->fcxslots == 1) { in _show_fbtc_slots()
9119 dur = le16_to_cpu(dm->slot_now.v1[i].dur); in _show_fbtc_slots()
9120 tbl = le32_to_cpu(dm->slot_now.v1[i].cxtbl); in _show_fbtc_slots()
9121 cxtype = le16_to_cpu(dm->slot_now.v1[i].cxtype); in _show_fbtc_slots()
9122 } else if (btc->ver->fcxslots == 7) { in _show_fbtc_slots()
9123 dur = le16_to_cpu(dm->slot_now.v7[i].dur); in _show_fbtc_slots()
9124 tbl = le32_to_cpu(dm->slot_now.v7[i].cxtbl); in _show_fbtc_slots()
9125 cxtype = le16_to_cpu(dm->slot_now.v7[i].cxtype); in _show_fbtc_slots()
9131 p += scnprintf(p, end - p, in _show_fbtc_slots()
9132 " %-15s : %5s[%03d/0x%x/%d]", in _show_fbtc_slots()
9137 p += scnprintf(p, end - p, in _show_fbtc_slots()
9143 p += scnprintf(p, end - p, "\n"); in _show_fbtc_slots()
9145 p += scnprintf(p, end - p, "\n"); in _show_fbtc_slots()
9147 return p - buf; in _show_fbtc_slots()
9152 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v2()
9153 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v2()
9154 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v2()
9155 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v2()
9163 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v2()
9164 if (!pcinfo->valid) in _show_fbtc_cysta_v2()
9167 pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo.v2; in _show_fbtc_cysta_v2()
9168 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9169 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v2()
9171 le16_to_cpu(pcysta_le32->cycles), in _show_fbtc_cysta_v2()
9172 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v2()
9173 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v2()
9174 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v2()
9175 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v2()
9178 if (!le32_to_cpu(pcysta_le32->slot_cnt[i])) in _show_fbtc_cysta_v2()
9180 p += scnprintf(p, end - p, ", %s:%d", id_to_slot((u32)i), in _show_fbtc_cysta_v2()
9181 le32_to_cpu(pcysta_le32->slot_cnt[i])); in _show_fbtc_cysta_v2()
9184 if (dm->tdma_now.rxflctrl) { in _show_fbtc_cysta_v2()
9185 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v2()
9186 le32_to_cpu(pcysta_le32->leakrx_cnt)); in _show_fbtc_cysta_v2()
9189 if (le32_to_cpu(pcysta_le32->collision_cnt)) { in _show_fbtc_cysta_v2()
9190 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v2()
9191 le32_to_cpu(pcysta_le32->collision_cnt)); in _show_fbtc_cysta_v2()
9194 if (le32_to_cpu(pcysta_le32->skip_cnt)) { in _show_fbtc_cysta_v2()
9195 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v2()
9196 le32_to_cpu(pcysta_le32->skip_cnt)); in _show_fbtc_cysta_v2()
9198 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v2()
9200 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v2()
9202 le16_to_cpu(pcysta_le32->tavg_cycle[CXT_WL]), in _show_fbtc_cysta_v2()
9203 le16_to_cpu(pcysta_le32->tavg_cycle[CXT_BT]), in _show_fbtc_cysta_v2()
9204 le16_to_cpu(pcysta_le32->tavg_lk) / 1000, in _show_fbtc_cysta_v2()
9205 le16_to_cpu(pcysta_le32->tavg_lk) % 1000); in _show_fbtc_cysta_v2()
9206 p += scnprintf(p, end - p, ", max_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v2()
9207 le16_to_cpu(pcysta_le32->tmax_cycle[CXT_WL]), in _show_fbtc_cysta_v2()
9208 le16_to_cpu(pcysta_le32->tmax_cycle[CXT_BT]), in _show_fbtc_cysta_v2()
9209 le16_to_cpu(pcysta_le32->tmax_lk) / 1000, in _show_fbtc_cysta_v2()
9210 le16_to_cpu(pcysta_le32->tmax_lk) % 1000); in _show_fbtc_cysta_v2()
9211 p += scnprintf(p, end - p, ", maxdiff_t[wl:%d/bt:%d]\n", in _show_fbtc_cysta_v2()
9212 le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_WL]), in _show_fbtc_cysta_v2()
9213 le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_BT])); in _show_fbtc_cysta_v2()
9215 if (le16_to_cpu(pcysta_le32->cycles) <= 1) in _show_fbtc_cysta_v2()
9218 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v2()
9221 if (le16_to_cpu(pcysta_le32->cycles) <= slot_pair) in _show_fbtc_cysta_v2()
9224 c_begin = le16_to_cpu(pcysta_le32->cycles) - slot_pair + 1; in _show_fbtc_cysta_v2()
9226 c_end = le16_to_cpu(pcysta_le32->cycles); in _show_fbtc_cysta_v2()
9230 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v2()
9233 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9234 " %-15s : ->b%02d->w%02d", in _show_fbtc_cysta_v2()
9236 le16_to_cpu(pcysta_le32->tslot_cycle[store_index]), in _show_fbtc_cysta_v2()
9237 le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1])); in _show_fbtc_cysta_v2()
9239 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9240 "->b%02d->w%02d", in _show_fbtc_cysta_v2()
9241 le16_to_cpu(pcysta_le32->tslot_cycle[store_index]), in _show_fbtc_cysta_v2()
9242 le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1])); in _show_fbtc_cysta_v2()
9244 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v2()
9247 if (a2dp->exist) { in _show_fbtc_cysta_v2()
9248 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9249 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v2()
9251 le16_to_cpu(pcysta_le32->a2dpept), in _show_fbtc_cysta_v2()
9252 le16_to_cpu(pcysta_le32->a2dpeptto)); in _show_fbtc_cysta_v2()
9254 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9256 le16_to_cpu(pcysta_le32->tavg_a2dpept), in _show_fbtc_cysta_v2()
9257 le16_to_cpu(pcysta_le32->tmax_a2dpept)); in _show_fbtc_cysta_v2()
9258 r.val = dm->tdma_now.rxflctrl; in _show_fbtc_cysta_v2()
9261 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9263 le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_ON]), in _show_fbtc_cysta_v2()
9264 le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_OFF])); in _show_fbtc_cysta_v2()
9266 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9268 le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_ON]), in _show_fbtc_cysta_v2()
9269 le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_OFF])); in _show_fbtc_cysta_v2()
9271 p += scnprintf(p, end - p, in _show_fbtc_cysta_v2()
9273 le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_ON]), in _show_fbtc_cysta_v2()
9274 le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_OFF])); in _show_fbtc_cysta_v2()
9276 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v2()
9280 return p - buf; in _show_fbtc_cysta_v2()
9285 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v3()
9286 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v3()
9287 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v3()
9288 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v3()
9296 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v3()
9297 if (!pcinfo->valid) in _show_fbtc_cysta_v3()
9300 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v3; in _show_fbtc_cysta_v3()
9301 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
9302 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v3()
9304 le16_to_cpu(pcysta->cycles), in _show_fbtc_cysta_v3()
9305 le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v3()
9306 le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v3()
9307 le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v3()
9308 le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v3()
9311 if (!le32_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v3()
9314 p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i), in _show_fbtc_cysta_v3()
9315 le32_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v3()
9318 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v3()
9319 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v3()
9320 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v3()
9322 if (le32_to_cpu(pcysta->collision_cnt)) in _show_fbtc_cysta_v3()
9323 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v3()
9324 le32_to_cpu(pcysta->collision_cnt)); in _show_fbtc_cysta_v3()
9326 if (le32_to_cpu(pcysta->skip_cnt)) in _show_fbtc_cysta_v3()
9327 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v3()
9328 le32_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v3()
9330 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v3()
9332 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v3()
9334 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v3()
9335 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v3()
9336 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v3()
9337 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v3()
9338 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
9340 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v3()
9341 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v3()
9342 le16_to_cpu(pcysta->leak_slot.tmax) / 1000, in _show_fbtc_cysta_v3()
9343 le16_to_cpu(pcysta->leak_slot.tmax) % 1000); in _show_fbtc_cysta_v3()
9344 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
9346 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]), in _show_fbtc_cysta_v3()
9347 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT])); in _show_fbtc_cysta_v3()
9349 cycle = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v3()
9353 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v3()
9359 c_begin = cycle - slot_pair + 1; in _show_fbtc_cysta_v3()
9363 if (a2dp->exist) in _show_fbtc_cysta_v3()
9370 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v3()
9373 p += scnprintf(p, end - p, " %-15s : ", in _show_fbtc_cysta_v3()
9376 p += scnprintf(p, end - p, "->b%02d", in _show_fbtc_cysta_v3()
9377 le16_to_cpu(pcysta->slot_step_time[store_index])); in _show_fbtc_cysta_v3()
9378 if (a2dp->exist) { in _show_fbtc_cysta_v3()
9379 a2dp_trx = &pcysta->a2dp_trx[store_index]; in _show_fbtc_cysta_v3()
9380 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v3()
9381 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v3()
9382 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v3()
9383 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v3()
9384 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v3()
9385 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v3()
9386 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v3()
9388 p += scnprintf(p, end - p, "->w%02d", in _show_fbtc_cysta_v3()
9389 le16_to_cpu(pcysta->slot_step_time[store_index + 1])); in _show_fbtc_cysta_v3()
9390 if (a2dp->exist) { in _show_fbtc_cysta_v3()
9391 a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; in _show_fbtc_cysta_v3()
9392 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v3()
9393 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v3()
9394 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v3()
9395 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v3()
9396 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v3()
9397 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v3()
9398 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v3()
9401 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v3()
9404 if (a2dp->exist) { in _show_fbtc_cysta_v3()
9405 p += scnprintf(p, end - p, in _show_fbtc_cysta_v3()
9406 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v3()
9408 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v3()
9409 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); in _show_fbtc_cysta_v3()
9411 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v3()
9412 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v3()
9413 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v3()
9415 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v3()
9419 return p - buf; in _show_fbtc_cysta_v3()
9424 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v4()
9425 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v4()
9426 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v4()
9427 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v4()
9435 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v4()
9436 if (!pcinfo->valid) in _show_fbtc_cysta_v4()
9439 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v4; in _show_fbtc_cysta_v4()
9440 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
9441 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v4()
9443 le16_to_cpu(pcysta->cycles), in _show_fbtc_cysta_v4()
9444 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v4()
9445 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v4()
9446 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v4()
9447 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v4()
9450 if (!le16_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v4()
9453 p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i), in _show_fbtc_cysta_v4()
9454 le16_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v4()
9457 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v4()
9458 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v4()
9459 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v4()
9461 if (pcysta->collision_cnt) in _show_fbtc_cysta_v4()
9462 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v4()
9463 pcysta->collision_cnt); in _show_fbtc_cysta_v4()
9465 if (le16_to_cpu(pcysta->skip_cnt)) in _show_fbtc_cysta_v4()
9466 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v4()
9467 le16_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v4()
9469 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v4()
9471 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v4()
9473 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v4()
9474 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v4()
9475 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v4()
9476 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v4()
9477 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
9479 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v4()
9480 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v4()
9481 le16_to_cpu(pcysta->leak_slot.tmax) / 1000, in _show_fbtc_cysta_v4()
9482 le16_to_cpu(pcysta->leak_slot.tmax) % 1000); in _show_fbtc_cysta_v4()
9483 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
9485 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]), in _show_fbtc_cysta_v4()
9486 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT])); in _show_fbtc_cysta_v4()
9488 cycle = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v4()
9492 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v4()
9498 c_begin = cycle - slot_pair + 1; in _show_fbtc_cysta_v4()
9502 if (a2dp->exist) in _show_fbtc_cysta_v4()
9509 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v4()
9512 p += scnprintf(p, end - p, " %-15s : ", in _show_fbtc_cysta_v4()
9515 p += scnprintf(p, end - p, "->b%02d", in _show_fbtc_cysta_v4()
9516 le16_to_cpu(pcysta->slot_step_time[store_index])); in _show_fbtc_cysta_v4()
9517 if (a2dp->exist) { in _show_fbtc_cysta_v4()
9518 a2dp_trx = &pcysta->a2dp_trx[store_index]; in _show_fbtc_cysta_v4()
9519 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v4()
9520 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v4()
9521 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v4()
9522 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v4()
9523 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v4()
9524 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v4()
9525 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v4()
9527 p += scnprintf(p, end - p, "->w%02d", in _show_fbtc_cysta_v4()
9528 le16_to_cpu(pcysta->slot_step_time[store_index + 1])); in _show_fbtc_cysta_v4()
9529 if (a2dp->exist) { in _show_fbtc_cysta_v4()
9530 a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; in _show_fbtc_cysta_v4()
9531 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v4()
9532 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v4()
9533 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v4()
9534 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v4()
9535 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v4()
9536 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v4()
9537 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v4()
9540 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v4()
9543 if (a2dp->exist) { in _show_fbtc_cysta_v4()
9544 p += scnprintf(p, end - p, in _show_fbtc_cysta_v4()
9545 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v4()
9547 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v4()
9548 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); in _show_fbtc_cysta_v4()
9550 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v4()
9551 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v4()
9552 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v4()
9554 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v4()
9558 return p - buf; in _show_fbtc_cysta_v4()
9563 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_cysta_v5()
9564 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; in _show_fbtc_cysta_v5()
9565 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_cysta_v5()
9566 struct rtw89_btc_dm *dm = &btc->dm; in _show_fbtc_cysta_v5()
9574 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v5()
9575 if (!pcinfo->valid) in _show_fbtc_cysta_v5()
9578 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v5; in _show_fbtc_cysta_v5()
9579 p += scnprintf(p, end - p, in _show_fbtc_cysta_v5()
9580 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", in _show_fbtc_cysta_v5()
9582 le16_to_cpu(pcysta->cycles), in _show_fbtc_cysta_v5()
9583 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v5()
9584 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v5()
9585 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v5()
9586 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v5()
9589 if (!le16_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v5()
9592 p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i), in _show_fbtc_cysta_v5()
9593 le16_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v5()
9596 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v5()
9597 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v5()
9598 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v5()
9600 if (pcysta->collision_cnt) in _show_fbtc_cysta_v5()
9601 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v5()
9602 pcysta->collision_cnt); in _show_fbtc_cysta_v5()
9604 if (le16_to_cpu(pcysta->skip_cnt)) in _show_fbtc_cysta_v5()
9605 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v5()
9606 le16_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v5()
9608 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v5()
9610 p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v5()
9612 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v5()
9613 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v5()
9614 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v5()
9615 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v5()
9616 p += scnprintf(p, end - p, in _show_fbtc_cysta_v5()
9618 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v5()
9619 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v5()
9620 le16_to_cpu(pcysta->leak_slot.tmax) / 1000, in _show_fbtc_cysta_v5()
9621 le16_to_cpu(pcysta->leak_slot.tmax) % 1000); in _show_fbtc_cysta_v5()
9623 cycle = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v5()
9627 /* 1 cycle record 1 wl-slot and 1 bt-slot */ in _show_fbtc_cysta_v5()
9633 c_begin = cycle - slot_pair + 1; in _show_fbtc_cysta_v5()
9637 if (a2dp->exist) in _show_fbtc_cysta_v5()
9647 store_index = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v5()
9650 p += scnprintf(p, end - p, " %-15s : ", in _show_fbtc_cysta_v5()
9653 p += scnprintf(p, end - p, "->b%02d", in _show_fbtc_cysta_v5()
9654 le16_to_cpu(pcysta->slot_step_time[store_index])); in _show_fbtc_cysta_v5()
9655 if (a2dp->exist) { in _show_fbtc_cysta_v5()
9656 a2dp_trx = &pcysta->a2dp_trx[store_index]; in _show_fbtc_cysta_v5()
9657 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v5()
9658 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v5()
9659 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v5()
9660 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v5()
9661 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v5()
9662 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v5()
9663 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v5()
9665 p += scnprintf(p, end - p, "->w%02d", in _show_fbtc_cysta_v5()
9666 le16_to_cpu(pcysta->slot_step_time[store_index + 1])); in _show_fbtc_cysta_v5()
9667 if (a2dp->exist) { in _show_fbtc_cysta_v5()
9668 a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; in _show_fbtc_cysta_v5()
9669 p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v5()
9670 a2dp_trx->empty_cnt, in _show_fbtc_cysta_v5()
9671 a2dp_trx->retry_cnt, in _show_fbtc_cysta_v5()
9672 a2dp_trx->tx_rate ? 3 : 2, in _show_fbtc_cysta_v5()
9673 a2dp_trx->tx_cnt, in _show_fbtc_cysta_v5()
9674 a2dp_trx->ack_cnt, in _show_fbtc_cysta_v5()
9675 a2dp_trx->nack_cnt); in _show_fbtc_cysta_v5()
9678 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v5()
9681 if (a2dp->exist) { in _show_fbtc_cysta_v5()
9682 p += scnprintf(p, end - p, in _show_fbtc_cysta_v5()
9683 " %-15s : a2dp_ept:%d, a2dp_late:%d", in _show_fbtc_cysta_v5()
9685 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v5()
9686 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); in _show_fbtc_cysta_v5()
9688 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v5()
9689 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v5()
9690 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v5()
9692 p += scnprintf(p, end - p, "\n"); in _show_fbtc_cysta_v5()
9696 return p - buf; in _show_fbtc_cysta_v5()
9701 struct rtw89_btc_bt_info *bt = &rtwdev->btc.cx.bt; in _show_fbtc_cysta_v7()
9702 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt->link_info.a2dp_desc; in _show_fbtc_cysta_v7()
9703 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_fbtc_cysta_v7()
9705 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _show_fbtc_cysta_v7()
9712 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; in _show_fbtc_cysta_v7()
9713 if (!pcinfo->valid) in _show_fbtc_cysta_v7()
9716 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v7; in _show_fbtc_cysta_v7()
9717 p += scnprintf(p, end - p, "\n\r %-15s : cycle:%d", "[slot_stat]", in _show_fbtc_cysta_v7()
9718 le16_to_cpu(pcysta->cycles)); in _show_fbtc_cysta_v7()
9721 if (!le16_to_cpu(pcysta->slot_cnt[i])) in _show_fbtc_cysta_v7()
9723 p += scnprintf(p, end - p, ", %s:%d", in _show_fbtc_cysta_v7()
9725 le16_to_cpu(pcysta->slot_cnt[i])); in _show_fbtc_cysta_v7()
9728 if (dm->tdma_now.rxflctrl) in _show_fbtc_cysta_v7()
9729 p += scnprintf(p, end - p, ", leak_rx:%d", in _show_fbtc_cysta_v7()
9730 le32_to_cpu(pcysta->leak_slot.cnt_rximr)); in _show_fbtc_cysta_v7()
9732 if (pcysta->collision_cnt) in _show_fbtc_cysta_v7()
9733 p += scnprintf(p, end - p, ", collision:%d", in _show_fbtc_cysta_v7()
9734 pcysta->collision_cnt); in _show_fbtc_cysta_v7()
9736 if (pcysta->skip_cnt) in _show_fbtc_cysta_v7()
9737 p += scnprintf(p, end - p, ", skip:%d", in _show_fbtc_cysta_v7()
9738 le16_to_cpu(pcysta->skip_cnt)); in _show_fbtc_cysta_v7()
9740 p += scnprintf(p, end - p, in _show_fbtc_cysta_v7()
9741 "\n\r %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", in _show_fbtc_cysta_v7()
9743 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), in _show_fbtc_cysta_v7()
9744 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), in _show_fbtc_cysta_v7()
9745 le16_to_cpu(pcysta->leak_slot.tavg) / 1000, in _show_fbtc_cysta_v7()
9746 le16_to_cpu(pcysta->leak_slot.tavg) % 1000); in _show_fbtc_cysta_v7()
9747 p += scnprintf(p, end - p, in _show_fbtc_cysta_v7()
9749 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), in _show_fbtc_cysta_v7()
9750 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), in _show_fbtc_cysta_v7()
9751 dm->bt_slot_flood, dm->cnt_dm[BTC_DCNT_BT_SLOT_FLOOD], in _show_fbtc_cysta_v7()
9752 le16_to_cpu(pcysta->leak_slot.tamx) / 1000, in _show_fbtc_cysta_v7()
9753 le16_to_cpu(pcysta->leak_slot.tamx) % 1000); in _show_fbtc_cysta_v7()
9754 p += scnprintf(p, end - p, ", bcn[all:%d/ok:%d/in_bt:%d/in_bt_ok:%d]", in _show_fbtc_cysta_v7()
9755 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), in _show_fbtc_cysta_v7()
9756 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), in _show_fbtc_cysta_v7()
9757 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), in _show_fbtc_cysta_v7()
9758 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); in _show_fbtc_cysta_v7()
9760 if (a2dp->exist) { in _show_fbtc_cysta_v7()
9761 p += scnprintf(p, end - p, in _show_fbtc_cysta_v7()
9762 "\n\r %-15s : a2dp_ept:%d, a2dp_late:%d(streak 2S:%d/max:%d)", in _show_fbtc_cysta_v7()
9764 le16_to_cpu(pcysta->a2dp_ept.cnt), in _show_fbtc_cysta_v7()
9765 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout), in _show_fbtc_cysta_v7()
9766 a2dp->no_empty_streak_2s, in _show_fbtc_cysta_v7()
9767 a2dp->no_empty_streak_max); in _show_fbtc_cysta_v7()
9769 p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d", in _show_fbtc_cysta_v7()
9770 le16_to_cpu(pcysta->a2dp_ept.tavg), in _show_fbtc_cysta_v7()
9771 le16_to_cpu(pcysta->a2dp_ept.tmax)); in _show_fbtc_cysta_v7()
9774 if (le16_to_cpu(pcysta->cycles) <= 1) in _show_fbtc_cysta_v7()
9777 /* 1 cycle = 1 wl-slot + 1 bt-slot */ in _show_fbtc_cysta_v7()
9780 if (le16_to_cpu(pcysta->cycles) <= slot_pair) in _show_fbtc_cysta_v7()
9783 c_begin = le16_to_cpu(pcysta->cycles) - slot_pair + 1; in _show_fbtc_cysta_v7()
9785 c_end = le16_to_cpu(pcysta->cycles); in _show_fbtc_cysta_v7()
9787 if (a2dp->exist) in _show_fbtc_cysta_v7()
9797 s_id = ((cycle - 1) % slot_pair) * 2; in _show_fbtc_cysta_v7()
9800 if (a2dp->exist) in _show_fbtc_cysta_v7()
9801 p += scnprintf(p, end - p, "\n\r %-15s : ", in _show_fbtc_cysta_v7()
9804 p += scnprintf(p, end - p, "\n\r %-15s : ", in _show_fbtc_cysta_v7()
9808 p += scnprintf(p, end - p, "->b%d", in _show_fbtc_cysta_v7()
9809 le16_to_cpu(pcysta->slot_step_time[s_id])); in _show_fbtc_cysta_v7()
9811 if (a2dp->exist) in _show_fbtc_cysta_v7()
9812 p += scnprintf(p, end - p, "(%d/%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v7()
9813 pcysta->wl_rx_err_ratio[s_id], in _show_fbtc_cysta_v7()
9814 pcysta->a2dp_trx[s_id].empty_cnt, in _show_fbtc_cysta_v7()
9815 pcysta->a2dp_trx[s_id].retry_cnt, in _show_fbtc_cysta_v7()
9816 (pcysta->a2dp_trx[s_id].tx_rate ? 3 : 2), in _show_fbtc_cysta_v7()
9817 pcysta->a2dp_trx[s_id].tx_cnt, in _show_fbtc_cysta_v7()
9818 pcysta->a2dp_trx[s_id].ack_cnt, in _show_fbtc_cysta_v7()
9819 pcysta->a2dp_trx[s_id].nack_cnt); in _show_fbtc_cysta_v7()
9821 p += scnprintf(p, end - p, "(%d)", in _show_fbtc_cysta_v7()
9822 pcysta->wl_rx_err_ratio[s_id]); in _show_fbtc_cysta_v7()
9824 p += scnprintf(p, end - p, "->w%d", in _show_fbtc_cysta_v7()
9825 le16_to_cpu(pcysta->slot_step_time[s_id + 1])); in _show_fbtc_cysta_v7()
9827 if (a2dp->exist) in _show_fbtc_cysta_v7()
9828 p += scnprintf(p, end - p, "(%d/%d/%d/%dM/%d/%d/%d)", in _show_fbtc_cysta_v7()
9829 pcysta->wl_rx_err_ratio[s_id + 1], in _show_fbtc_cysta_v7()
9830 pcysta->a2dp_trx[s_id + 1].empty_cnt, in _show_fbtc_cysta_v7()
9831 pcysta->a2dp_trx[s_id + 1].retry_cnt, in _show_fbtc_cysta_v7()
9832 (pcysta->a2dp_trx[s_id + 1].tx_rate ? 3 : 2), in _show_fbtc_cysta_v7()
9833 pcysta->a2dp_trx[s_id + 1].tx_cnt, in _show_fbtc_cysta_v7()
9834 pcysta->a2dp_trx[s_id + 1].ack_cnt, in _show_fbtc_cysta_v7()
9835 pcysta->a2dp_trx[s_id + 1].nack_cnt); in _show_fbtc_cysta_v7()
9837 p += scnprintf(p, end - p, "(%d)", in _show_fbtc_cysta_v7()
9838 pcysta->wl_rx_err_ratio[s_id + 1]); in _show_fbtc_cysta_v7()
9842 return p - buf; in _show_fbtc_cysta_v7()
9847 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_nullsta()
9848 const struct rtw89_btc_ver *ver = btc->ver; in _show_fbtc_nullsta()
9849 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_nullsta()
9855 if (!btc->dm.tdma_now.rxflctrl) in _show_fbtc_nullsta()
9858 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo; in _show_fbtc_nullsta()
9859 if (!pcinfo->valid) in _show_fbtc_nullsta()
9862 ns = &pfwinfo->rpt_fbtc_nullsta.finfo; in _show_fbtc_nullsta()
9863 if (ver->fcxnullsta == 1) { in _show_fbtc_nullsta()
9865 p += scnprintf(p, end - p, " %-15s : ", "[NULL-STA]"); in _show_fbtc_nullsta()
9866 p += scnprintf(p, end - p, "null-%d", i); in _show_fbtc_nullsta()
9867 p += scnprintf(p, end - p, "[ok:%d/", in _show_fbtc_nullsta()
9868 le32_to_cpu(ns->v1.result[i][1])); in _show_fbtc_nullsta()
9869 p += scnprintf(p, end - p, "fail:%d/", in _show_fbtc_nullsta()
9870 le32_to_cpu(ns->v1.result[i][0])); in _show_fbtc_nullsta()
9871 p += scnprintf(p, end - p, "on_time:%d/", in _show_fbtc_nullsta()
9872 le32_to_cpu(ns->v1.result[i][2])); in _show_fbtc_nullsta()
9873 p += scnprintf(p, end - p, "retry:%d/", in _show_fbtc_nullsta()
9874 le32_to_cpu(ns->v1.result[i][3])); in _show_fbtc_nullsta()
9875 p += scnprintf(p, end - p, "avg_t:%d.%03d/", in _show_fbtc_nullsta()
9876 le32_to_cpu(ns->v1.avg_t[i]) / 1000, in _show_fbtc_nullsta()
9877 le32_to_cpu(ns->v1.avg_t[i]) % 1000); in _show_fbtc_nullsta()
9878 p += scnprintf(p, end - p, "max_t:%d.%03d]\n", in _show_fbtc_nullsta()
9879 le32_to_cpu(ns->v1.max_t[i]) / 1000, in _show_fbtc_nullsta()
9880 le32_to_cpu(ns->v1.max_t[i]) % 1000); in _show_fbtc_nullsta()
9882 } else if (ver->fcxnullsta == 7) { in _show_fbtc_nullsta()
9884 p += scnprintf(p, end - p, " %-15s : ", "[NULL-STA]"); in _show_fbtc_nullsta()
9885 p += scnprintf(p, end - p, "null-%d", i); in _show_fbtc_nullsta()
9886 p += scnprintf(p, end - p, "[Tx:%d/", in _show_fbtc_nullsta()
9887 le32_to_cpu(ns->v7.result[i][4])); in _show_fbtc_nullsta()
9888 p += scnprintf(p, end - p, "[ok:%d/", in _show_fbtc_nullsta()
9889 le32_to_cpu(ns->v7.result[i][1])); in _show_fbtc_nullsta()
9890 p += scnprintf(p, end - p, "fail:%d/", in _show_fbtc_nullsta()
9891 le32_to_cpu(ns->v7.result[i][0])); in _show_fbtc_nullsta()
9892 p += scnprintf(p, end - p, "on_time:%d/", in _show_fbtc_nullsta()
9893 le32_to_cpu(ns->v7.result[i][2])); in _show_fbtc_nullsta()
9894 p += scnprintf(p, end - p, "retry:%d/", in _show_fbtc_nullsta()
9895 le32_to_cpu(ns->v7.result[i][3])); in _show_fbtc_nullsta()
9896 p += scnprintf(p, end - p, "avg_t:%d.%03d/", in _show_fbtc_nullsta()
9897 le32_to_cpu(ns->v7.tavg[i]) / 1000, in _show_fbtc_nullsta()
9898 le32_to_cpu(ns->v7.tavg[i]) % 1000); in _show_fbtc_nullsta()
9899 p += scnprintf(p, end - p, "max_t:%d.%03d]\n", in _show_fbtc_nullsta()
9900 le32_to_cpu(ns->v7.tmax[i]) / 1000, in _show_fbtc_nullsta()
9901 le32_to_cpu(ns->v7.tmax[i]) % 1000); in _show_fbtc_nullsta()
9905 p += scnprintf(p, end - p, " %-15s : ", "[NULL-STA]"); in _show_fbtc_nullsta()
9906 p += scnprintf(p, end - p, "null-%d", i); in _show_fbtc_nullsta()
9907 p += scnprintf(p, end - p, "[Tx:%d/", in _show_fbtc_nullsta()
9908 le32_to_cpu(ns->v2.result[i][4])); in _show_fbtc_nullsta()
9909 p += scnprintf(p, end - p, "[ok:%d/", in _show_fbtc_nullsta()
9910 le32_to_cpu(ns->v2.result[i][1])); in _show_fbtc_nullsta()
9911 p += scnprintf(p, end - p, "fail:%d/", in _show_fbtc_nullsta()
9912 le32_to_cpu(ns->v2.result[i][0])); in _show_fbtc_nullsta()
9913 p += scnprintf(p, end - p, "on_time:%d/", in _show_fbtc_nullsta()
9914 le32_to_cpu(ns->v2.result[i][2])); in _show_fbtc_nullsta()
9915 p += scnprintf(p, end - p, "retry:%d/", in _show_fbtc_nullsta()
9916 le32_to_cpu(ns->v2.result[i][3])); in _show_fbtc_nullsta()
9917 p += scnprintf(p, end - p, "avg_t:%d.%03d/", in _show_fbtc_nullsta()
9918 le32_to_cpu(ns->v2.avg_t[i]) / 1000, in _show_fbtc_nullsta()
9919 le32_to_cpu(ns->v2.avg_t[i]) % 1000); in _show_fbtc_nullsta()
9920 p += scnprintf(p, end - p, "max_t:%d.%03d]\n", in _show_fbtc_nullsta()
9921 le32_to_cpu(ns->v2.max_t[i]) / 1000, in _show_fbtc_nullsta()
9922 le32_to_cpu(ns->v2.max_t[i]) % 1000); in _show_fbtc_nullsta()
9926 return p - buf; in _show_fbtc_nullsta()
9931 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_step_v2()
9932 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_step_v2()
9935 const struct rtw89_btc_ver *ver = btc->ver; in _show_fbtc_step_v2()
9942 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; in _show_fbtc_step_v2()
9943 if (!pcinfo->valid) in _show_fbtc_step_v2()
9946 pstep = &pfwinfo->rpt_fbtc_step.finfo.v2; in _show_fbtc_step_v2()
9947 pos_old = le16_to_cpu(pstep->pos_old); in _show_fbtc_step_v2()
9948 pos_new = le16_to_cpu(pstep->pos_new); in _show_fbtc_step_v2()
9950 if (pcinfo->req_fver != pstep->fver) in _show_fbtc_step_v2()
9957 if (ver->fcxctrl == 7 || ver->fcxctrl == 1) in _show_fbtc_step_v2()
9960 trace_step = btc->ctrl.ctrl.trace_step; in _show_fbtc_step_v2()
9966 n_stop = trace_step - 1; in _show_fbtc_step_v2()
9972 type = pstep->step[i].type; in _show_fbtc_step_v2()
9973 val = pstep->step[i].val; in _show_fbtc_step_v2()
9974 diff_t = le16_to_cpu(pstep->step[i].difft); in _show_fbtc_step_v2()
9980 p += scnprintf(p, end - p, in _show_fbtc_step_v2()
9981 " %-15s : ", "[steps]"); in _show_fbtc_step_v2()
9983 p += scnprintf(p, end - p, in _show_fbtc_step_v2()
9984 "-> %s(%02d)(%02d)", in _show_fbtc_step_v2()
9988 p += scnprintf(p, end - p, "\n"); in _show_fbtc_step_v2()
10006 return p - buf; in _show_fbtc_step_v2()
10011 struct rtw89_btc *btc = &rtwdev->btc; in _show_fbtc_step_v3()
10012 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_fbtc_step_v3()
10020 if ((pfwinfo->rpt_en_map & in _show_fbtc_step_v3()
10024 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; in _show_fbtc_step_v3()
10025 if (!pcinfo->valid) in _show_fbtc_step_v3()
10028 pstep = &pfwinfo->rpt_fbtc_step.finfo.v3; in _show_fbtc_step_v3()
10029 if (pcinfo->req_fver != pstep->fver) in _show_fbtc_step_v3()
10032 if (le32_to_cpu(pstep->cnt) <= FCXDEF_STEP) in _show_fbtc_step_v3()
10035 n_begin = le32_to_cpu(pstep->cnt) - FCXDEF_STEP + 1; in _show_fbtc_step_v3()
10037 n_end = le32_to_cpu(pstep->cnt); in _show_fbtc_step_v3()
10044 array_idx = (i - 1) % FCXDEF_STEP; in _show_fbtc_step_v3()
10045 type = pstep->step[array_idx].type; in _show_fbtc_step_v3()
10046 val = pstep->step[array_idx].val; in _show_fbtc_step_v3()
10047 diff_t = le16_to_cpu(pstep->step[array_idx].difft); in _show_fbtc_step_v3()
10053 p += scnprintf(p, end - p, " %-15s : ", "[steps]"); in _show_fbtc_step_v3()
10055 p += scnprintf(p, end - p, "-> %s(%02d)", in _show_fbtc_step_v3()
10061 p += scnprintf(p, end - p, "\n"); in _show_fbtc_step_v3()
10066 return p - buf; in _show_fbtc_step_v3()
10071 struct rtw89_btc *btc = &rtwdev->btc; in _show_fw_dm_msg()
10072 const struct rtw89_btc_ver *ver = btc->ver; in _show_fw_dm_msg()
10075 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_DM)) in _show_fw_dm_msg()
10078 p += _show_error(rtwdev, p, end - p); in _show_fw_dm_msg()
10079 p += _show_fbtc_tdma(rtwdev, p, end - p); in _show_fw_dm_msg()
10080 p += _show_fbtc_slots(rtwdev, p, end - p); in _show_fw_dm_msg()
10082 if (ver->fcxcysta == 2) in _show_fw_dm_msg()
10083 p += _show_fbtc_cysta_v2(rtwdev, p, end - p); in _show_fw_dm_msg()
10084 else if (ver->fcxcysta == 3) in _show_fw_dm_msg()
10085 p += _show_fbtc_cysta_v3(rtwdev, p, end - p); in _show_fw_dm_msg()
10086 else if (ver->fcxcysta == 4) in _show_fw_dm_msg()
10087 p += _show_fbtc_cysta_v4(rtwdev, p, end - p); in _show_fw_dm_msg()
10088 else if (ver->fcxcysta == 5) in _show_fw_dm_msg()
10089 p += _show_fbtc_cysta_v5(rtwdev, p, end - p); in _show_fw_dm_msg()
10090 else if (ver->fcxcysta == 7) in _show_fw_dm_msg()
10091 p += _show_fbtc_cysta_v7(rtwdev, p, end - p); in _show_fw_dm_msg()
10093 p += _show_fbtc_nullsta(rtwdev, p, end - p); in _show_fw_dm_msg()
10095 if (ver->fcxstep == 2) in _show_fw_dm_msg()
10096 p += _show_fbtc_step_v2(rtwdev, p, end - p); in _show_fw_dm_msg()
10097 else if (ver->fcxstep == 3) in _show_fw_dm_msg()
10098 p += _show_fbtc_step_v3(rtwdev, p, end - p); in _show_fw_dm_msg()
10101 return p - buf; in _show_fw_dm_msg()
10106 const struct rtw89_chip_info *chip = rtwdev->chip; in _get_gnt()
10110 if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B || in _get_gnt()
10111 chip->chip_id == RTL8851B || chip->chip_id == RTL8852BT) { in _get_gnt()
10115 gnt = &gnt_cfg->band[0]; in _get_gnt()
10116 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SW_CTRL); in _get_gnt()
10117 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0_STA); in _get_gnt()
10118 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SW_CTRL); in _get_gnt()
10119 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0_STA); in _get_gnt()
10121 gnt = &gnt_cfg->band[1]; in _get_gnt()
10122 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SW_CTRL); in _get_gnt()
10123 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1_STA); in _get_gnt()
10124 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SW_CTRL); in _get_gnt()
10125 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1_STA); in _get_gnt()
10126 } else if (chip->chip_id == RTL8852C) { in _get_gnt()
10130 gnt = &gnt_cfg->band[0]; in _get_gnt()
10131 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SWCTRL); in _get_gnt()
10132 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0); in _get_gnt()
10133 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SWCTRL); in _get_gnt()
10134 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0); in _get_gnt()
10136 gnt = &gnt_cfg->band[1]; in _get_gnt()
10137 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SWCTRL); in _get_gnt()
10138 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1); in _get_gnt()
10139 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SWCTRL); in _get_gnt()
10140 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1); in _get_gnt()
10148 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_gpio_dbg()
10149 const struct rtw89_btc_ver *ver = rtwdev->btc.ver; in _show_gpio_dbg()
10156 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo; in _show_gpio_dbg()
10157 gdbg = &rtwdev->btc.fwinfo.rpt_fbtc_gpio_dbg.finfo; in _show_gpio_dbg()
10158 if (!pcinfo->valid) { in _show_gpio_dbg()
10162 p += scnprintf(p, end - p, "\n"); in _show_gpio_dbg()
10166 if (ver->fcxgpiodbg == 7) { in _show_gpio_dbg()
10167 en_map = le32_to_cpu(gdbg->v7.en_map); in _show_gpio_dbg()
10168 gpio_map = gdbg->v7.gpio_map; in _show_gpio_dbg()
10170 en_map = le32_to_cpu(gdbg->v1.en_map); in _show_gpio_dbg()
10171 gpio_map = gdbg->v1.gpio_map; in _show_gpio_dbg()
10177 p += scnprintf(p, end - p, " %-15s : enable_map:0x%08x", in _show_gpio_dbg()
10183 p += scnprintf(p, end - p, ", %s->GPIO%d", id_to_gdbg(i), in _show_gpio_dbg()
10186 p += scnprintf(p, end - p, "\n"); in _show_gpio_dbg()
10189 return p - buf; in _show_gpio_dbg()
10194 const struct rtw89_chip_info *chip = rtwdev->chip; in _show_mreg_v1()
10195 struct rtw89_btc *btc = &rtwdev->btc; in _show_mreg_v1()
10196 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_mreg_v1()
10199 struct rtw89_btc_cx *cx = &btc->cx; in _show_mreg_v1()
10200 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_mreg_v1()
10201 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_mreg_v1()
10208 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG)) in _show_mreg_v1()
10211 p += scnprintf(p, end - p, "========== [HW Status] ==========\n"); in _show_mreg_v1()
10213 p += scnprintf(p, end - p, in _show_mreg_v1()
10214 " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n", in _show_mreg_v1()
10215 "[scoreboard]", wl->scbd, in _show_mreg_v1()
10216 cx->cnt_wl[BTC_WCNT_SCBDUPDATE], in _show_mreg_v1()
10217 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], in _show_mreg_v1()
10218 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); in _show_mreg_v1()
10220 btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); in _show_mreg_v1()
10224 p += scnprintf(p, end - p, in _show_mreg_v1()
10225 " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ", in _show_mreg_v1()
10227 chip->chip_id == RTL8852C ? "HW" : in _show_mreg_v1()
10228 btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", in _show_mreg_v1()
10233 p += scnprintf(p, end - p, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", in _show_mreg_v1()
10239 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _show_mreg_v1()
10240 if (!pcinfo->valid) { in _show_mreg_v1()
10247 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v1; in _show_mreg_v1()
10250 __func__, pmreg->reg_num); in _show_mreg_v1()
10252 for (i = 0; i < pmreg->reg_num; i++) { in _show_mreg_v1()
10253 type = (u8)le16_to_cpu(chip->mon_reg[i].type); in _show_mreg_v1()
10254 offset = le32_to_cpu(chip->mon_reg[i].offset); in _show_mreg_v1()
10255 val = le32_to_cpu(pmreg->mreg_val[i]); in _show_mreg_v1()
10258 p += scnprintf(p, end - p, in _show_mreg_v1()
10259 " %-15s : %d_0x%04x=0x%08x", in _show_mreg_v1()
10262 p += scnprintf(p, end - p, ", %d_0x%04x=0x%08x", in _show_mreg_v1()
10266 p += scnprintf(p, end - p, "\n"); in _show_mreg_v1()
10269 if (i >= pmreg->reg_num) in _show_mreg_v1()
10270 p += scnprintf(p, end - p, "\n"); in _show_mreg_v1()
10274 return p - buf; in _show_mreg_v1()
10279 const struct rtw89_chip_info *chip = rtwdev->chip; in _show_mreg_v2()
10280 struct rtw89_btc *btc = &rtwdev->btc; in _show_mreg_v2()
10281 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_mreg_v2()
10284 struct rtw89_btc_cx *cx = &btc->cx; in _show_mreg_v2()
10285 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in _show_mreg_v2()
10286 struct rtw89_btc_bt_info *bt = &btc->cx.bt; in _show_mreg_v2()
10293 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG)) in _show_mreg_v2()
10296 p += scnprintf(p, end - p, "========== [HW Status] ==========\n"); in _show_mreg_v2()
10298 p += scnprintf(p, end - p, in _show_mreg_v2()
10299 " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n", in _show_mreg_v2()
10300 "[scoreboard]", wl->scbd, in _show_mreg_v2()
10301 cx->cnt_wl[BTC_WCNT_SCBDUPDATE], in _show_mreg_v2()
10302 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], in _show_mreg_v2()
10303 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); in _show_mreg_v2()
10305 btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); in _show_mreg_v2()
10309 p += scnprintf(p, end - p, in _show_mreg_v2()
10310 " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], polut_type:%s", in _show_mreg_v2()
10312 chip->chip_id == RTL8852C ? "HW" : in _show_mreg_v2()
10313 btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", in _show_mreg_v2()
10316 id_to_polut(wl->bt_polut_type[wl->pta_req_mac])); in _show_mreg_v2()
10319 p += scnprintf(p, end - p, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", in _show_mreg_v2()
10325 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _show_mreg_v2()
10326 if (!pcinfo->valid) { in _show_mreg_v2()
10333 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v2; in _show_mreg_v2()
10336 __func__, pmreg->reg_num); in _show_mreg_v2()
10338 for (i = 0; i < pmreg->reg_num; i++) { in _show_mreg_v2()
10339 type = (u8)le16_to_cpu(chip->mon_reg[i].type); in _show_mreg_v2()
10340 offset = le32_to_cpu(chip->mon_reg[i].offset); in _show_mreg_v2()
10341 val = le32_to_cpu(pmreg->mreg_val[i]); in _show_mreg_v2()
10344 p += scnprintf(p, end - p, in _show_mreg_v2()
10345 " %-15s : %d_0x%04x=0x%08x", in _show_mreg_v2()
10348 p += scnprintf(p, end - p, ", %d_0x%04x=0x%08x", in _show_mreg_v2()
10352 p += scnprintf(p, end - p, "\n"); in _show_mreg_v2()
10355 if (i >= pmreg->reg_num) in _show_mreg_v2()
10356 p += scnprintf(p, end - p, "\n"); in _show_mreg_v2()
10360 return p - buf; in _show_mreg_v2()
10365 struct rtw89_btc *btc = &rtwdev->btc; in _show_mreg_v7()
10366 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_mreg_v7()
10369 struct rtw89_btc_cx *cx = &btc->cx; in _show_mreg_v7()
10370 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_mreg_v7()
10371 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_mreg_v7()
10373 struct rtw89_btc_dm *dm = &btc->dm; in _show_mreg_v7()
10378 if (!(dm->coex_info_map & BTC_COEX_INFO_MREG)) in _show_mreg_v7()
10381 p += scnprintf(p, end - p, "\n\r========== [HW Status] =========="); in _show_mreg_v7()
10383 p += scnprintf(p, end - p, in _show_mreg_v7()
10384 "\n\r %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)", in _show_mreg_v7()
10385 "[scoreboard]", wl->scbd, in _show_mreg_v7()
10386 cx->cnt_wl[BTC_WCNT_SCBDUPDATE], in _show_mreg_v7()
10387 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], in _show_mreg_v7()
10388 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); in _show_mreg_v7()
10390 /* To avoid I/O if WL LPS or power-off */ in _show_mreg_v7()
10391 dm->pta_owner = rtw89_mac_get_ctrl_path(rtwdev); in _show_mreg_v7()
10393 p += scnprintf(p, end - p, in _show_mreg_v7()
10394 "\n\r %-15s : pta_owner:%s, pta_req_mac:MAC%d, rf_gnt_source: polut_type:%s", in _show_mreg_v7()
10396 rtwdev->chip->para_ver & BTC_FEAT_PTA_ONOFF_CTRL ? "HW" : in _show_mreg_v7()
10397 dm->pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", in _show_mreg_v7()
10398 wl->pta_req_mac, in _show_mreg_v7()
10399 id_to_polut(wl->bt_polut_type[wl->pta_req_mac])); in _show_mreg_v7()
10401 gnt = &dm->gnt.band[RTW89_PHY_0]; in _show_mreg_v7()
10403 p += scnprintf(p, end - p, ", phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d]", in _show_mreg_v7()
10404 gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl, in _show_mreg_v7()
10405 gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt); in _show_mreg_v7()
10407 if (rtwdev->dbcc_en) { in _show_mreg_v7()
10408 gnt = &dm->gnt.band[RTW89_PHY_1]; in _show_mreg_v7()
10409 p += scnprintf(p, end - p, in _show_mreg_v7()
10410 ", phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]", in _show_mreg_v7()
10411 gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl, in _show_mreg_v7()
10412 gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt); in _show_mreg_v7()
10415 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; in _show_mreg_v7()
10416 if (!pcinfo->valid) in _show_mreg_v7()
10419 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v7; in _show_mreg_v7()
10421 for (i = 0; i < pmreg->reg_num; i++) { in _show_mreg_v7()
10422 type = (u8)le16_to_cpu(rtwdev->chip->mon_reg[i].type); in _show_mreg_v7()
10423 offset = le32_to_cpu(rtwdev->chip->mon_reg[i].offset); in _show_mreg_v7()
10424 val = le32_to_cpu(pmreg->mreg_val[i]); in _show_mreg_v7()
10427 p += scnprintf(p, end - p, in _show_mreg_v7()
10428 "\n\r %-15s : %s_0x%x=0x%x", "[reg]", in _show_mreg_v7()
10431 p += scnprintf(p, end - p, ", %s_0x%x=0x%x", in _show_mreg_v7()
10435 p += scnprintf(p, end - p, "\n"); in _show_mreg_v7()
10438 return p - buf; in _show_mreg_v7()
10443 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v1()
10444 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v1()
10447 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v1()
10448 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v1()
10449 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v1()
10450 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_summary_v1()
10451 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v1()
10455 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v1()
10458 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v1()
10460 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v1()
10461 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v1()
10462 prptctrl = &pfwinfo->rpt_ctrl.finfo.v1; in _show_summary_v1()
10464 p += scnprintf(p, end - p, in _show_summary_v1()
10465 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ", in _show_summary_v1()
10466 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v1()
10467 pfwinfo->cnt_h2c_fail, prptctrl->h2c_cnt, in _show_summary_v1()
10468 pfwinfo->cnt_c2h, prptctrl->c2h_cnt); in _show_summary_v1()
10470 p += scnprintf(p, end - p, in _show_summary_v1()
10472 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v1()
10473 prptctrl->rpt_cnt, in _show_summary_v1()
10474 prptctrl->rpt_enable, dm->error.val); in _show_summary_v1()
10476 if (dm->error.map.wl_fw_hang) in _show_summary_v1()
10477 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v1()
10478 p += scnprintf(p, end - p, "\n"); in _show_summary_v1()
10479 p += scnprintf(p, end - p, in _show_summary_v1()
10480 " %-15s : send_ok:%d, send_fail:%d, recv:%d", in _show_summary_v1()
10481 "[mailbox]", prptctrl->mb_send_ok_cnt, in _show_summary_v1()
10482 prptctrl->mb_send_fail_cnt, in _show_summary_v1()
10483 prptctrl->mb_recv_cnt); in _show_summary_v1()
10485 p += scnprintf(p, end - p, in _show_summary_v1()
10487 prptctrl->mb_a2dp_empty_cnt, in _show_summary_v1()
10488 prptctrl->mb_a2dp_flct_cnt, in _show_summary_v1()
10489 prptctrl->mb_a2dp_full_cnt); in _show_summary_v1()
10491 p += scnprintf(p, end - p, in _show_summary_v1()
10492 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]", in _show_summary_v1()
10493 "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v1()
10494 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v1()
10495 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v1()
10496 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v1()
10498 p += scnprintf(p, end - p, in _show_summary_v1()
10500 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REQ], in _show_summary_v1()
10501 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_GO], in _show_summary_v1()
10502 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REJECT], in _show_summary_v1()
10503 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT], in _show_summary_v1()
10504 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_FAIL]); in _show_summary_v1()
10506 if (prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT] > 0) in _show_summary_v1()
10507 bt->rfk_info.map.timeout = 1; in _show_summary_v1()
10509 bt->rfk_info.map.timeout = 0; in _show_summary_v1()
10511 dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout; in _show_summary_v1()
10513 p += scnprintf(p, end - p, in _show_summary_v1()
10514 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x", in _show_summary_v1()
10515 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v1()
10516 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h, in _show_summary_v1()
10517 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v1()
10518 btc->fwinfo.rpt_en_map); in _show_summary_v1()
10519 p += scnprintf(p, end - p, " (WL FW report invalid!!)\n"); in _show_summary_v1()
10523 cnt_sum += dm->cnt_notify[i]; in _show_summary_v1()
10525 p += scnprintf(p, end - p, in _show_summary_v1()
10526 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v1()
10530 p += scnprintf(p, end - p, in _show_summary_v1()
10536 p += scnprintf(p, end - p, in _show_summary_v1()
10537 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v1()
10542 p += scnprintf(p, end - p, in _show_summary_v1()
10547 return p - buf; in _show_summary_v1()
10552 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v4()
10553 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v4()
10556 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v4()
10557 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v4()
10558 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v4()
10559 struct rtw89_btc_bt_info *bt = &cx->bt; in _show_summary_v4()
10560 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v4()
10564 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v4()
10567 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v4()
10569 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v4()
10570 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v4()
10571 prptctrl = &pfwinfo->rpt_ctrl.finfo.v4; in _show_summary_v4()
10573 p += scnprintf(p, end - p, in _show_summary_v4()
10574 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ", in _show_summary_v4()
10575 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v4()
10576 pfwinfo->cnt_h2c_fail, in _show_summary_v4()
10577 le32_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v4()
10578 pfwinfo->cnt_c2h, in _show_summary_v4()
10579 le32_to_cpu(prptctrl->rpt_info.cnt_c2h)); in _show_summary_v4()
10581 p += scnprintf(p, end - p, in _show_summary_v4()
10583 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v4()
10584 le32_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v4()
10585 le32_to_cpu(prptctrl->rpt_info.en), in _show_summary_v4()
10586 dm->error.val); in _show_summary_v4()
10588 if (dm->error.map.wl_fw_hang) in _show_summary_v4()
10589 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v4()
10590 p += scnprintf(p, end - p, "\n"); in _show_summary_v4()
10591 p += scnprintf(p, end - p, in _show_summary_v4()
10592 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v4()
10594 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v4()
10595 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v4()
10596 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v4()
10598 p += scnprintf(p, end - p, in _show_summary_v4()
10600 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v4()
10601 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v4()
10602 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v4()
10603 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v4()
10604 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v4()
10606 p += scnprintf(p, end - p, in _show_summary_v4()
10607 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]", in _show_summary_v4()
10608 "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v4()
10609 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v4()
10610 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v4()
10611 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v4()
10613 p += scnprintf(p, end - p, in _show_summary_v4()
10615 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]), in _show_summary_v4()
10616 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_GO]), in _show_summary_v4()
10617 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REJECT]), in _show_summary_v4()
10618 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]), in _show_summary_v4()
10619 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_FAIL])); in _show_summary_v4()
10621 if (le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0) in _show_summary_v4()
10622 bt->rfk_info.map.timeout = 1; in _show_summary_v4()
10624 bt->rfk_info.map.timeout = 0; in _show_summary_v4()
10626 dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout; in _show_summary_v4()
10628 p += scnprintf(p, end - p, in _show_summary_v4()
10629 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x", in _show_summary_v4()
10630 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v4()
10631 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h, in _show_summary_v4()
10632 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v4()
10633 btc->fwinfo.rpt_en_map); in _show_summary_v4()
10634 p += scnprintf(p, end - p, " (WL FW report invalid!!)\n"); in _show_summary_v4()
10638 cnt_sum += dm->cnt_notify[i]; in _show_summary_v4()
10640 p += scnprintf(p, end - p, in _show_summary_v4()
10641 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v4()
10645 p += scnprintf(p, end - p, in _show_summary_v4()
10651 p += scnprintf(p, end - p, in _show_summary_v4()
10652 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v4()
10657 p += scnprintf(p, end - p, in _show_summary_v4()
10662 return p - buf; in _show_summary_v4()
10667 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v5()
10668 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v5()
10671 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v5()
10672 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v5()
10673 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v5()
10674 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v5()
10678 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v5()
10681 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v5()
10683 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v5()
10684 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v5()
10685 prptctrl = &pfwinfo->rpt_ctrl.finfo.v5; in _show_summary_v5()
10687 p += scnprintf(p, end - p, in _show_summary_v5()
10688 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ", in _show_summary_v5()
10689 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v5()
10690 pfwinfo->cnt_h2c_fail, in _show_summary_v5()
10691 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v5()
10692 pfwinfo->cnt_c2h, in _show_summary_v5()
10693 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v5()
10694 le16_to_cpu(prptctrl->rpt_info.len_c2h)); in _show_summary_v5()
10696 p += scnprintf(p, end - p, in _show_summary_v5()
10698 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v5()
10699 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v5()
10700 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v5()
10702 if (dm->error.map.wl_fw_hang) in _show_summary_v5()
10703 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v5()
10704 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
10705 p += scnprintf(p, end - p, in _show_summary_v5()
10706 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v5()
10708 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v5()
10709 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v5()
10710 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v5()
10712 p += scnprintf(p, end - p, in _show_summary_v5()
10714 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v5()
10715 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v5()
10716 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v5()
10717 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v5()
10718 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v5()
10720 p += scnprintf(p, end - p, in _show_summary_v5()
10721 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]", in _show_summary_v5()
10722 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v5()
10723 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v5()
10724 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v5()
10725 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v5()
10727 p += scnprintf(p, end - p, in _show_summary_v5()
10729 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v5()
10731 p += scnprintf(p, end - p, in _show_summary_v5()
10733 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v5()
10734 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v5()
10736 p += scnprintf(p, end - p, in _show_summary_v5()
10737 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d", in _show_summary_v5()
10738 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v5()
10739 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h); in _show_summary_v5()
10742 if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch || in _show_summary_v5()
10743 pfwinfo->err[BTFRE_EXCEPTION]) { in _show_summary_v5()
10744 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
10745 p += scnprintf(p, end - p, in _show_summary_v5()
10746 " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:" in _show_summary_v5()
10748 "[ERROR]", pcinfo->valid, pfwinfo->len_mismch, in _show_summary_v5()
10749 pfwinfo->fver_mismch, in _show_summary_v5()
10750 pfwinfo->err[BTFRE_EXCEPTION], in _show_summary_v5()
10751 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v5()
10755 cnt_sum += dm->cnt_notify[i]; in _show_summary_v5()
10757 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
10758 p += scnprintf(p, end - p, in _show_summary_v5()
10759 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v5()
10764 p += scnprintf(p, end - p, in _show_summary_v5()
10770 p += scnprintf(p, end - p, "\n"); in _show_summary_v5()
10771 p += scnprintf(p, end - p, in _show_summary_v5()
10772 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v5()
10778 p += scnprintf(p, end - p, in _show_summary_v5()
10783 return p - buf; in _show_summary_v5()
10788 struct rtw89_btc *btc = &rtwdev->btc; in _show_summary_v105()
10789 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; in _show_summary_v105()
10792 struct rtw89_btc_cx *cx = &btc->cx; in _show_summary_v105()
10793 struct rtw89_btc_dm *dm = &btc->dm; in _show_summary_v105()
10794 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v105()
10795 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; in _show_summary_v105()
10799 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v105()
10802 p += scnprintf(p, end - p, "========== [Statistics] ==========\n"); in _show_summary_v105()
10804 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v105()
10805 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { in _show_summary_v105()
10806 prptctrl = &pfwinfo->rpt_ctrl.finfo.v105; in _show_summary_v105()
10808 p += scnprintf(p, end - p, in _show_summary_v105()
10809 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ", in _show_summary_v105()
10810 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v105()
10811 pfwinfo->cnt_h2c_fail, in _show_summary_v105()
10812 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v105()
10813 pfwinfo->cnt_c2h, in _show_summary_v105()
10814 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v105()
10815 le16_to_cpu(prptctrl->rpt_info.len_c2h)); in _show_summary_v105()
10817 p += scnprintf(p, end - p, in _show_summary_v105()
10819 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v105()
10820 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v105()
10821 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v105()
10823 if (dm->error.map.wl_fw_hang) in _show_summary_v105()
10824 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v105()
10825 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
10826 p += scnprintf(p, end - p, in _show_summary_v105()
10827 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v105()
10829 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v105()
10830 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v105()
10831 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v105()
10833 p += scnprintf(p, end - p, in _show_summary_v105()
10835 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v105()
10836 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v105()
10837 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v105()
10838 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v105()
10839 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v105()
10841 p += scnprintf(p, end - p, in _show_summary_v105()
10842 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]", in _show_summary_v105()
10843 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v105()
10844 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v105()
10845 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v105()
10846 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); in _show_summary_v105()
10848 p += scnprintf(p, end - p, in _show_summary_v105()
10850 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v105()
10852 p += scnprintf(p, end - p, in _show_summary_v105()
10854 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v105()
10855 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v105()
10857 p += scnprintf(p, end - p, in _show_summary_v105()
10858 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d", in _show_summary_v105()
10859 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v105()
10860 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h); in _show_summary_v105()
10863 if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch || in _show_summary_v105()
10864 pfwinfo->err[BTFRE_EXCEPTION]) { in _show_summary_v105()
10865 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
10866 p += scnprintf(p, end - p, in _show_summary_v105()
10867 " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:" in _show_summary_v105()
10869 "[ERROR]", pcinfo->valid, pfwinfo->len_mismch, in _show_summary_v105()
10870 pfwinfo->fver_mismch, in _show_summary_v105()
10871 pfwinfo->err[BTFRE_EXCEPTION], in _show_summary_v105()
10872 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v105()
10876 cnt_sum += dm->cnt_notify[i]; in _show_summary_v105()
10878 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
10879 p += scnprintf(p, end - p, in _show_summary_v105()
10880 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v105()
10885 p += scnprintf(p, end - p, in _show_summary_v105()
10891 p += scnprintf(p, end - p, "\n"); in _show_summary_v105()
10892 p += scnprintf(p, end - p, in _show_summary_v105()
10893 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", in _show_summary_v105()
10899 p += scnprintf(p, end - p, in _show_summary_v105()
10904 return p - buf; in _show_summary_v105()
10909 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_summary_v7()
10912 struct rtw89_btc_cx *cx = &rtwdev->btc.cx; in _show_summary_v7()
10913 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _show_summary_v7()
10914 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v7()
10915 u32 *cnt = rtwdev->btc.dm.cnt_notify; in _show_summary_v7()
10920 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v7()
10923 p += scnprintf(p, end - p, "%s", in _show_summary_v7()
10926 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v7()
10927 if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF && in _show_summary_v7()
10928 !wl->status.map.rf_off) { in _show_summary_v7()
10929 prptctrl = &pfwinfo->rpt_ctrl.finfo.v7; in _show_summary_v7()
10931 p += scnprintf(p, end - p, in _show_summary_v7()
10932 "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d)," in _show_summary_v7()
10934 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v7()
10935 pfwinfo->cnt_h2c_fail, in _show_summary_v7()
10936 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v7()
10937 pfwinfo->cnt_c2h, in _show_summary_v7()
10938 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v7()
10939 le16_to_cpu(prptctrl->rpt_info.len_c2h), in _show_summary_v7()
10940 rtwdev->btc.ver->info_buf); in _show_summary_v7()
10942 p += scnprintf(p, end - p, in _show_summary_v7()
10944 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v7()
10945 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v7()
10946 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v7()
10948 if (dm->error.map.wl_fw_hang) in _show_summary_v7()
10949 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v7()
10951 p += scnprintf(p, end - p, in _show_summary_v7()
10952 "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v7()
10954 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v7()
10955 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v7()
10956 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v7()
10958 p += scnprintf(p, end - p, in _show_summary_v7()
10960 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v7()
10961 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v7()
10962 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v7()
10963 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v7()
10964 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v7()
10966 p += scnprintf(p, end - p, in _show_summary_v7()
10967 "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]", in _show_summary_v7()
10968 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v7()
10969 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v7()
10970 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v7()
10971 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT], in _show_summary_v7()
10972 wl->rfk_info.proc_time); in _show_summary_v7()
10974 p += scnprintf(p, end - p, ", bt_rfk[req:%d]", in _show_summary_v7()
10975 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v7()
10977 p += scnprintf(p, end - p, ", AOAC[RF_on:%d/RF_off:%d]", in _show_summary_v7()
10978 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v7()
10979 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v7()
10981 p += scnprintf(p, end - p, in _show_summary_v7()
10982 "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)", in _show_summary_v7()
10984 pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail, in _show_summary_v7()
10985 pfwinfo->cnt_c2h, in _show_summary_v7()
10986 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v7()
10990 cnt_sum += dm->cnt_notify[i]; in _show_summary_v7()
10992 p += scnprintf(p, end - p, in _show_summary_v7()
10993 "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v7()
10998 p += scnprintf(p, end - p, in _show_summary_v7()
11004 p += scnprintf(p, end - p, in _show_summary_v7()
11005 … "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ", in _show_summary_v7()
11011 p += scnprintf(p, end - p, in _show_summary_v7()
11014 rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW], in _show_summary_v7()
11017 return p - buf; in _show_summary_v7()
11022 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo; in _show_summary_v8()
11025 struct rtw89_btc_cx *cx = &rtwdev->btc.cx; in _show_summary_v8()
11026 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; in _show_summary_v8()
11027 struct rtw89_btc_wl_info *wl = &cx->wl; in _show_summary_v8()
11028 u32 *cnt = rtwdev->btc.dm.cnt_notify; in _show_summary_v8()
11033 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) in _show_summary_v8()
11036 p += scnprintf(p, end - p, "%s", in _show_summary_v8()
11039 pcinfo = &pfwinfo->rpt_ctrl.cinfo; in _show_summary_v8()
11040 if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF && in _show_summary_v8()
11041 !wl->status.map.rf_off) { in _show_summary_v8()
11042 prptctrl = &pfwinfo->rpt_ctrl.finfo.v8; in _show_summary_v8()
11044 p += scnprintf(p, end - p, in _show_summary_v8()
11045 …"\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()
11046 "[summary]", pfwinfo->cnt_h2c, in _show_summary_v8()
11047 pfwinfo->cnt_h2c_fail, in _show_summary_v8()
11048 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), in _show_summary_v8()
11049 pfwinfo->cnt_c2h, in _show_summary_v8()
11050 le16_to_cpu(prptctrl->rpt_info.cnt_c2h), in _show_summary_v8()
11051 le16_to_cpu(prptctrl->rpt_info.len_c2h), in _show_summary_v8()
11052 (prptctrl->rpt_len_max_h << 8) + prptctrl->rpt_len_max_l, in _show_summary_v8()
11053 rtwdev->btc.ver->info_buf); in _show_summary_v8()
11055 p += scnprintf(p, end - p, in _show_summary_v8()
11057 pfwinfo->event[BTF_EVNT_RPT], in _show_summary_v8()
11058 le16_to_cpu(prptctrl->rpt_info.cnt), in _show_summary_v8()
11059 le32_to_cpu(prptctrl->rpt_info.en)); in _show_summary_v8()
11061 if (dm->error.map.wl_fw_hang) in _show_summary_v8()
11062 p += scnprintf(p, end - p, " (WL FW Hang!!)"); in _show_summary_v8()
11064 p += scnprintf(p, end - p, in _show_summary_v8()
11065 "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ", in _show_summary_v8()
11067 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), in _show_summary_v8()
11068 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), in _show_summary_v8()
11069 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); in _show_summary_v8()
11071 p += scnprintf(p, end - p, in _show_summary_v8()
11073 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), in _show_summary_v8()
11074 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), in _show_summary_v8()
11075 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), in _show_summary_v8()
11076 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), in _show_summary_v8()
11077 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); in _show_summary_v8()
11079 p += scnprintf(p, end - p, in _show_summary_v8()
11080 "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]", in _show_summary_v8()
11081 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], in _show_summary_v8()
11082 cx->cnt_wl[BTC_WCNT_RFK_GO], in _show_summary_v8()
11083 cx->cnt_wl[BTC_WCNT_RFK_REJECT], in _show_summary_v8()
11084 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT], in _show_summary_v8()
11085 wl->rfk_info.proc_time); in _show_summary_v8()
11087 p += scnprintf(p, end - p, ", bt_rfk[req:%d]", in _show_summary_v8()
11088 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); in _show_summary_v8()
11090 p += scnprintf(p, end - p, ", AOAC[RF_on:%d/RF_off:%d]", in _show_summary_v8()
11091 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), in _show_summary_v8()
11092 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); in _show_summary_v8()
11094 p += scnprintf(p, end - p, in _show_summary_v8()
11095 "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)", in _show_summary_v8()
11097 pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail, in _show_summary_v8()
11098 pfwinfo->cnt_c2h, in _show_summary_v8()
11099 wl->status.map.lps, wl->status.map.rf_off); in _show_summary_v8()
11103 cnt_sum += dm->cnt_notify[i]; in _show_summary_v8()
11105 p += scnprintf(p, end - p, in _show_summary_v8()
11106 "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", in _show_summary_v8()
11111 p += scnprintf(p, end - p, in _show_summary_v8()
11117 p += scnprintf(p, end - p, in _show_summary_v8()
11118 … "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ", in _show_summary_v8()
11124 p += scnprintf(p, end - p, in _show_summary_v8()
11127 rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW], in _show_summary_v8()
11130 return p - buf; in _show_summary_v8()
11135 struct rtw89_fw_suit *fw_suit = &rtwdev->fw.normal; in rtw89_btc_dump_info()
11136 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_btc_dump_info()
11137 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_btc_dump_info()
11138 struct rtw89_btc_cx *cx = &btc->cx; in rtw89_btc_dump_info()
11139 struct rtw89_btc_bt_info *bt = &cx->bt; in rtw89_btc_dump_info()
11142 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11144 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11146 fw_suit->major_ver, fw_suit->minor_ver, in rtw89_btc_dump_info()
11147 fw_suit->sub_ver, fw_suit->sub_idex); in rtw89_btc_dump_info()
11148 p += scnprintf(p, end - p, "manual %d\n", in rtw89_btc_dump_info()
11149 btc->manual_ctrl); in rtw89_btc_dump_info()
11151 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11154 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11155 "\n\r %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)", in rtw89_btc_dump_info()
11157 bt->raw_info[2], bt->raw_info[3], in rtw89_btc_dump_info()
11158 bt->raw_info[4], bt->raw_info[5], in rtw89_btc_dump_info()
11159 bt->raw_info[6], bt->raw_info[7], in rtw89_btc_dump_info()
11160 bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply", in rtw89_btc_dump_info()
11161 cx->cnt_bt[BTC_BCNT_INFOUPDATE], in rtw89_btc_dump_info()
11162 cx->cnt_bt[BTC_BCNT_INFOSAME]); in rtw89_btc_dump_info()
11164 p += scnprintf(p, end - p, in rtw89_btc_dump_info()
11167 p += _show_cx_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11168 p += _show_wl_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11169 p += _show_bt_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11170 p += _show_dm_info(rtwdev, p, end - p); in rtw89_btc_dump_info()
11171 p += _show_fw_dm_msg(rtwdev, p, end - p); in rtw89_btc_dump_info()
11173 if (ver->fcxmreg == 1) in rtw89_btc_dump_info()
11174 p += _show_mreg_v1(rtwdev, p, end - p); in rtw89_btc_dump_info()
11175 else if (ver->fcxmreg == 2) in rtw89_btc_dump_info()
11176 p += _show_mreg_v2(rtwdev, p, end - p); in rtw89_btc_dump_info()
11177 else if (ver->fcxmreg == 7) in rtw89_btc_dump_info()
11178 p += _show_mreg_v7(rtwdev, p, end - p); in rtw89_btc_dump_info()
11180 p += _show_gpio_dbg(rtwdev, p, end - p); in rtw89_btc_dump_info()
11182 if (ver->fcxbtcrpt == 1) in rtw89_btc_dump_info()
11183 p += _show_summary_v1(rtwdev, p, end - p); in rtw89_btc_dump_info()
11184 else if (ver->fcxbtcrpt == 4) in rtw89_btc_dump_info()
11185 p += _show_summary_v4(rtwdev, p, end - p); in rtw89_btc_dump_info()
11186 else if (ver->fcxbtcrpt == 5) in rtw89_btc_dump_info()
11187 p += _show_summary_v5(rtwdev, p, end - p); in rtw89_btc_dump_info()
11188 else if (ver->fcxbtcrpt == 105) in rtw89_btc_dump_info()
11189 p += _show_summary_v105(rtwdev, p, end - p); in rtw89_btc_dump_info()
11190 else if (ver->fcxbtcrpt == 7) in rtw89_btc_dump_info()
11191 p += _show_summary_v7(rtwdev, p, end - p); in rtw89_btc_dump_info()
11192 else if (ver->fcxbtcrpt == 8) in rtw89_btc_dump_info()
11193 p += _show_summary_v8(rtwdev, p, end - p); in rtw89_btc_dump_info()
11195 return p - buf; in rtw89_btc_dump_info()
11200 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_coex_recognize_ver()
11201 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_coex_recognize_ver()
11213 if (chip->chip_id != btc_ver_def->chip_id) in rtw89_coex_recognize_ver()
11216 if (suit_ver_code >= btc_ver_def->fw_ver_code) { in rtw89_coex_recognize_ver()
11217 btc->ver = btc_ver_def; in rtw89_coex_recognize_ver()
11222 btc->ver = &rtw89_btc_ver_defs[RTW89_DEFAULT_BTC_VER_IDX]; in rtw89_coex_recognize_ver()
11226 (int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code); in rtw89_coex_recognize_ver()
11231 struct rtw89_btc_bt_link_info *bt_linfo = &rtwdev->btc.cx.bt.link_info; in rtw89_btc_ntfy_preserve_bt_time()
11232 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc; in rtw89_btc_ntfy_preserve_bt_time()
11234 if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags)) in rtw89_btc_ntfy_preserve_bt_time()
11246 rtwdev->btc.cx.wl.rfk_info.con_rfk = state; in rtw89_btc_ntfy_conn_rfk()