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

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
33 CXTDMA_AUTO = 0x2,
41 CXFLC_QOSNULL = 0x2,
235 #define RTW89_DEFAULT_BTC_VER_IDX (ARRAY_SIZE(rtw89_btc_ver_defs) - 1)
352 CXPOLICY_TYPE = 0x2,
457 /* TDMA off + pri: WL_Hi-Tx > BT_Hi_Rx, BT_Hi > WL > BT_Lo */
460 /* TDMA off + pri: WL_Hi-Tx > BT, BT_Hi > other-WL > BT_Lo */
463 /* TDMA off + pri: WL_Hi-Tx = BT */
466 /* TDMA off + pri: WL > BT, Block-BT*/
469 /* TDMA off+Bcn-Protect + pri: WL_Hi-Tx > BT_Hi_Rx, BT_Hi > WL > BT_Lo*/
472 /* TDMA off + Ext-Ctrl + pri: default */
475 /* TDMA off + Ext-Ctrl + pri: E2G-slot block all BT */
478 /* TDMA off + Ext-Ctrl + pri: default */
481 /* TDMA off + Ext-Ctrl + pri: E2G-slot block all BT */
484 /* TDMA off + Ext-Ctrl + pri: E2G-slot WL > BT */
487 /* TDMA off + Ext-Ctrl + pri: E2G/EBT-slot WL > BT */
490 /* TDMA off + Ext-Ctrl + pri: default */
493 /* TDMA Fix slot-0: W1:B1 = 30:30 */
496 /* TDMA Fix slot-1: W1:B1 = 50:50 */
499 /* TDMA Fix slot-2: W1:B1 = 20:30 */
502 /* TDMA Fix slot-3: W1:B1 = 40:10 */
505 /* TDMA Fix slot-4: W1:B1 = 70:10 */
508 /* TDMA Fix slot-5: W1:B1 = 20:60 */
511 /* TDMA Fix slot-6: W1:B1 = 30:60 */
514 /* TDMA Fix slot-7: W1:B1 = 20:80 */
517 /* TDMA Fix slot-8: W1:B1 = user-define */
520 /* TDMA Fix slot-9: W1:B1 = 40:10 */
523 /* TDMA Fix slot-10: W1:B1 = 40:10 */
526 /* TDMA Fix slot-11: W1:B1 = 40:10 */
529 /* PS-TDMA Fix slot-0: W1:B1 = 30:30 */
532 /* PS-TDMA Fix slot-1: W1:B1 = 50:50 */
535 /* PS-TDMA Fix slot-2: W1:B1 = 20:30 */
538 /* PS-TDMA Fix slot-3: W1:B1 = 20:60 */
541 /* PS-TDMA Fix slot-4: W1:B1 = 30:70 */
544 /* PS-TDMA Fix slot-5: W1:B1 = 20:80 */
547 /* PS-TDMA Fix slot-6: W1:B1 = user-define */
550 /* TDMA Auto slot-0: W1:B1 = 50:200 */
553 /* TDMA Auto slot-1: W1:B1 = 60:200 */
556 /* TDMA Auto slot-2: W1:B1 = 20:200 */
559 /* TDMA Auto slot-3: W1:B1 = user-define */
562 /* PS-TDMA Auto slot-0: W1:B1 = 50:200 */
565 /* PS-TDMA Auto slot-1: W1:B1 = 60:200 */
568 /* PS-TDMA Auto slot-2: W1:B1 = 20:200 */
571 /* PS-TDMA Auto slot-3: W1:B1 = user-define */
574 /* TDMA Auto slot2-0: W1:B4 = 30:50 */
577 /* TDMA Auto slot2-1: W1:B4 = 30:70 */
580 /* TDMA Auto slot2-2: W1:B4 = 50:50 */
583 /* TDMA Auto slot2-3: W1:B4 = 60:60 */
586 /* TDMA Auto slot2-4: W1:B4 = 20:80 */
589 /* TDMA Auto slot2-5: W1:B4 = user-define */
592 /* PS-TDMA Auto slot2-0: W1:B4 = 30:50 */
595 /* PS-TDMA Auto slot2-1: W1:B4 = 30:70 */
598 /* PS-TDMA Auto slot2-2: W1:B4 = 50:50 */
601 /* PS-TDMA Auto slot2-3: W1:B4 = 60:60 */
604 /* PS-TDMA Auto slot2-4: W1:B4 = 20:80 */
607 /* PS-TDMA Auto slot2-5: W1:B4 = user-define */
774 BTC_ACT_NUM = BTC_ACT_LAST - BTC_ACT_NONE,
792 struct rtw89_btc *btc = &rtwdev->btc;
793 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
794 struct rtw89_btc_cx *cx = &btc->cx;
795 struct rtw89_btc_wl_info *wl = &cx->wl;
796 struct rtw89_btc_dm *dm = &btc->dm;
800 btc->fwinfo.cnt_h2c_fail++;
801 dm->error.map.h2c_buffer_over = true;
802 return -EINVAL;
803 } else if (!wl->status.map.init_ok) {
806 pfwinfo->cnt_h2c_fail++;
807 return -EINVAL;
808 } else if ((wl->status.map.rf_off_pre == BTC_LPS_RF_OFF &&
809 wl->status.map.rf_off == BTC_LPS_RF_OFF) ||
810 (wl->status.map.lps_pre == BTC_LPS_RF_OFF &&
811 wl->status.map.lps == BTC_LPS_RF_OFF)) {
814 pfwinfo->cnt_h2c_fail++;
815 return -EINVAL;
821 pfwinfo->cnt_h2c_fail++;
823 pfwinfo->cnt_h2c++;
830 struct rtw89_btc *btc = &rtwdev->btc;
831 const struct rtw89_btc_ver *ver = btc->ver;
832 struct rtw89_btc_cx *cx = &btc->cx;
833 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
834 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
835 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
848 memset(&btc->ctrl, 0, sizeof(btc->ctrl));
849 btc->manual_ctrl = false;
850 if (ver->fcxctrl != 7)
851 btc->ctrl.ctrl.trace_step = FCXDEF_STEP;
856 memset(&btc->dm, 0, sizeof(btc->dm));
857 memset(bt_linfo->rssi_state, 0, sizeof(bt_linfo->rssi_state));
859 if (btc->ver->fwlrole == 8)
860 wl_linfo = &wl->rlink_info[i][0];
862 wl_linfo = &wl->link_info[i];
863 memset(wl_linfo->rssi_state, 0, sizeof(wl_linfo->rssi_state));
867 btc->dm.tdma_now = t_def[CXTD_OFF];
868 btc->dm.tdma = t_def[CXTD_OFF];
869 if (ver->fcxslots >= 7) {
871 btc->dm.slot.v7[i].dur = s_def[i].dur;
872 btc->dm.slot.v7[i].cxtype = s_def[i].cxtype;
873 btc->dm.slot.v7[i].cxtbl = s_def[i].cxtbl;
875 memcpy(&btc->dm.slot_now.v7, &btc->dm.slot.v7,
876 sizeof(btc->dm.slot_now.v7));
878 memcpy(&btc->dm.slot_now.v1, s_def,
879 sizeof(btc->dm.slot_now.v1));
880 memcpy(&btc->dm.slot.v1, s_def,
881 sizeof(btc->dm.slot.v1));
884 btc->policy_len = 0;
885 btc->bt_req_len = 0;
887 btc->dm.coex_info_map = BTC_COEX_INFO_ALL;
888 btc->dm.wl_tx_limit.tx_time = BTC_MAX_TX_TIME_DEF;
889 btc->dm.wl_tx_limit.tx_retry = BTC_MAX_TX_RETRY_DEF;
890 btc->dm.wl_pre_agc_rb = BTC_PREAGC_NOTFOUND;
891 btc->dm.wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_NOTFOUND;
895 memset(&btc->mdinfo, 0, sizeof(btc->mdinfo));
900 const struct rtw89_chip_info *chip = rtwdev->chip;
904 if (le16_to_cpu(chip->mon_reg[i].type) == reg_type &&
905 le32_to_cpu(chip->mon_reg[i].offset) == target) {
913 struct rtw89_btc *btc = &rtwdev->btc;
914 const struct rtw89_btc_ver *ver = btc->ver;
915 union rtw89_btc_module_info *md = &btc->mdinfo;
921 if (ver->fcxinit == 7)
922 switch_type = md->md_v7.switch_type;
924 switch_type = md->md.switch_type;
926 if (btc->btg_pos == RF_PATH_A)
943 if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid)
946 pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo;
947 if (ver->fcxmreg == 1) {
948 idx = _search_reg_index(rtwdev, pmreg->v1.reg_num,
953 reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]);
956 } else if (ver->fcxmreg == 2) {
957 idx = _search_reg_index(rtwdev, pmreg->v2.reg_num,
962 reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]);
973 if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid)
976 pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo;
977 if (ver->fcxmreg == 1) {
978 idx = _search_reg_index(rtwdev, pmreg->v1.reg_num,
983 reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]) &
987 } else if (ver->fcxmreg == 2) {
988 idx = _search_reg_index(rtwdev, pmreg->v2.reg_num,
993 reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]) &
1011 struct rtw89_btc *btc = &rtwdev->btc;
1012 struct rtw89_btc_cx *cx = &btc->cx;
1013 struct rtw89_btc_bt_info *bt = &cx->bt;
1014 struct rtw89_btc_wl_info *wl = &cx->wl;
1015 struct rtw89_btc_dm *dm = &btc->dm;
1023 if ((wl->ver_info.fw_coex & 0xffff0000) !=
1024 rtwdev->chip->wlcx_desired) {
1025 wl->fw_ver_mismatch = true;
1026 dm->error.map.wl_ver_mismatch = true;
1028 wl->fw_ver_mismatch = false;
1029 dm->error.map.wl_ver_mismatch = false;
1033 if (dm->cnt_dm[BTC_DCNT_RPT] == cnt && btc->fwinfo.rpt_en_map)
1034 dm->cnt_dm[BTC_DCNT_RPT_HANG]++;
1036 dm->cnt_dm[BTC_DCNT_RPT_HANG] = 0;
1038 if (dm->cnt_dm[BTC_DCNT_RPT_HANG] >= BTC_CHK_HANG_MAX)
1039 dm->error.map.wl_fw_hang = true;
1041 dm->error.map.wl_fw_hang = false;
1043 dm->cnt_dm[BTC_DCNT_RPT] = cnt;
1046 if (dm->cnt_dm[BTC_DCNT_CYCLE] == cnt &&
1047 (dm->tdma_now.type != CXTDMA_OFF ||
1048 dm->tdma_now.ext_ctrl == CXECTL_EXT))
1049 dm->cnt_dm[BTC_DCNT_CYCLE_HANG]++;
1051 dm->cnt_dm[BTC_DCNT_CYCLE_HANG] = 0;
1053 if (dm->cnt_dm[BTC_DCNT_CYCLE_HANG] >= BTC_CHK_HANG_MAX)
1054 dm->error.map.cycle_hang = true;
1056 dm->error.map.cycle_hang = false;
1058 dm->cnt_dm[BTC_DCNT_CYCLE] = cnt;
1061 if (dm->cnt_dm[BTC_DCNT_W1] == cnt &&
1062 dm->tdma_now.type != CXTDMA_OFF)
1063 dm->cnt_dm[BTC_DCNT_W1_HANG]++;
1065 dm->cnt_dm[BTC_DCNT_W1_HANG] = 0;
1067 if (dm->cnt_dm[BTC_DCNT_W1_HANG] >= BTC_CHK_HANG_MAX)
1068 dm->error.map.w1_hang = true;
1070 dm->error.map.w1_hang = false;
1072 dm->cnt_dm[BTC_DCNT_W1] = cnt;
1075 if (dm->cnt_dm[BTC_DCNT_B1] == cnt &&
1076 dm->tdma_now.type != CXTDMA_OFF)
1077 dm->cnt_dm[BTC_DCNT_B1_HANG]++;
1079 dm->cnt_dm[BTC_DCNT_B1_HANG] = 0;
1081 if (dm->cnt_dm[BTC_DCNT_B1_HANG] >= BTC_CHK_HANG_MAX)
1082 dm->error.map.b1_hang = true;
1084 dm->error.map.b1_hang = false;
1086 dm->cnt_dm[BTC_DCNT_B1] = cnt;
1089 if (dm->cnt_dm[BTC_DCNT_E2G] == cnt &&
1090 dm->tdma_now.ext_ctrl == CXECTL_EXT)
1091 dm->cnt_dm[BTC_DCNT_E2G_HANG]++;
1093 dm->cnt_dm[BTC_DCNT_E2G_HANG] = 0;
1095 if (dm->cnt_dm[BTC_DCNT_E2G_HANG] >= BTC_CHK_HANG_MAX)
1096 dm->error.map.wl_e2g_hang = true;
1098 dm->error.map.wl_e2g_hang = false;
1100 dm->cnt_dm[BTC_DCNT_E2G] = cnt;
1104 dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC]++;
1106 dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC] = 0;
1108 if (dm->cnt_dm[BTC_DCNT_TDMA_NONSYNC] >= BTC_CHK_HANG_MAX)
1109 dm->error.map.tdma_no_sync = true;
1111 dm->error.map.tdma_no_sync = false;
1115 dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC]++;
1117 dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC] = 0;
1119 if (dm->cnt_dm[BTC_DCNT_SLOT_NONSYNC] >= BTC_CHK_HANG_MAX)
1120 dm->error.map.slot_no_sync = true;
1122 dm->error.map.slot_no_sync = false;
1125 cnt = cx->cnt_bt[BTC_BCNT_LOPRI_TX];
1127 if (cnt == 0 && bt->link_info.slave_role)
1128 dm->cnt_dm[BTC_DCNT_BTTX_HANG]++;
1130 dm->cnt_dm[BTC_DCNT_BTTX_HANG] = 0;
1132 if (dm->cnt_dm[BTC_DCNT_BTTX_HANG] >= BTC_CHK_HANG_MAX)
1133 dm->error.map.bt_tx_hang = true;
1135 dm->error.map.bt_tx_hang = false;
1138 cnt = cx->cnt_bt[BTC_BCNT_HIPRI_RX] +
1139 cx->cnt_bt[BTC_BCNT_HIPRI_TX] +
1140 cx->cnt_bt[BTC_BCNT_LOPRI_RX] +
1141 cx->cnt_bt[BTC_BCNT_LOPRI_TX];
1144 dm->cnt_dm[BTC_DCNT_BTCNT_HANG]++;
1146 dm->cnt_dm[BTC_DCNT_BTCNT_HANG] = 0;
1148 if ((dm->cnt_dm[BTC_DCNT_BTCNT_HANG] >= BTC_CHK_HANG_MAX &&
1149 bt->enable.now) || (!dm->cnt_dm[BTC_DCNT_BTCNT_HANG] &&
1150 !bt->enable.now))
1155 dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT]++;
1157 dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT] = 0;
1159 if (dm->cnt_dm[BTC_DCNT_WL_SLOT_DRIFT] >= BTC_CHK_HANG_MAX)
1160 dm->error.map.wl_slot_drift = true;
1162 dm->error.map.wl_slot_drift = false;
1166 dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT]++;
1168 dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT] = 0;
1170 if (dm->cnt_dm[BTC_DCNT_BT_SLOT_DRIFT] >= BTC_CHK_HANG_MAX)
1171 dm->error.map.bt_slot_drift = true;
1173 dm->error.map.bt_slot_drift = false;
1181 struct rtw89_btc *btc = &rtwdev->btc;
1182 const struct rtw89_btc_ver *ver = btc->ver;
1183 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
1184 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
1185 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt_linfo->a2dp_desc;
1186 union rtw89_btc_fbtc_btver *pver = &btc->fwinfo.rpt_fbtc_btver.finfo;
1203 if (ver->fcxbtver == 7) {
1204 pver->v7 = *(struct rtw89_btc_fbtc_btver_v7 *)pfinfo;
1205 bt->ver_info.fw = le32_to_cpu(pver->v7.fw_ver);
1206 bt->ver_info.fw_coex = le32_get_bits(pver->v7.coex_ver,
1208 bt->feature = le32_to_cpu(pver->v7.feature);
1210 pver->v1 = *(struct rtw89_btc_fbtc_btver_v1 *)pfinfo;
1211 bt->ver_info.fw = le32_to_cpu(pver->v1.fw_ver);
1212 bt->ver_info.fw_coex = le32_get_bits(pver->v1.coex_ver,
1214 bt->feature = le32_to_cpu(pver->v1.feature);
1218 if (ver->fcxbtscan == 1) {
1221 bt->scan_info_v1[i] = pscan_v1->scan[i];
1222 if (bt->scan_info_v1[i].win == 0 &&
1223 bt->scan_info_v1[i].intvl == 0)
1226 } else if (ver->fcxbtscan == 2) {
1229 bt->scan_info_v2[i] = pscan_v2->para[i];
1230 if ((pscan_v2->type & BIT(i)) &&
1231 pscan_v2->para[i].win == 0 &&
1232 pscan_v2->para[i].intvl == 0)
1235 } else if (ver->fcxbtscan == 7) {
1238 bt->scan_info_v2[i] = pscan_v7->para[i];
1239 if ((pscan_v7->type & BIT(i)) &&
1240 pscan_v7->para[i].win == 0 &&
1241 pscan_v7->para[i].intvl == 0)
1246 bt->scan_info_update = 1;
1249 if (ver->fcxbtafh == 2) {
1251 if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LEGACY) {
1252 memcpy(&bt_linfo->afh_map[0], pafh_v2->afh_l, 4);
1253 memcpy(&bt_linfo->afh_map[4], pafh_v2->afh_m, 4);
1254 memcpy(&bt_linfo->afh_map[8], pafh_v2->afh_h, 2);
1256 if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LE) {
1257 memcpy(&bt_linfo->afh_map_le[0], pafh_v2->afh_le_a, 4);
1258 memcpy(&bt_linfo->afh_map_le[4], pafh_v2->afh_le_b, 1);
1260 } else if (ver->fcxbtafh == 7) {
1262 if (pafh_v7->map_type & RPT_BT_AFH_SEQ_LEGACY) {
1263 memcpy(&bt_linfo->afh_map[0], pafh_v7->afh_l, 4);
1264 memcpy(&bt_linfo->afh_map[4], pafh_v7->afh_m, 4);
1265 memcpy(&bt_linfo->afh_map[8], pafh_v7->afh_h, 2);
1267 if (pafh_v7->map_type & RPT_BT_AFH_SEQ_LE) {
1268 memcpy(&bt_linfo->afh_map_le[0], pafh_v7->afh_le_a, 4);
1269 memcpy(&bt_linfo->afh_map_le[4], pafh_v7->afh_le_b, 1);
1271 } else if (ver->fcxbtafh == 1) {
1273 memcpy(&bt_linfo->afh_map[0], pafh_v1->afh_l, 4);
1274 memcpy(&bt_linfo->afh_map[4], pafh_v1->afh_m, 4);
1275 memcpy(&bt_linfo->afh_map[8], pafh_v1->afh_h, 2);
1280 a2dp->device_name = le32_to_cpu(pdev->dev_name);
1281 a2dp->vendor_id = le16_to_cpu(pdev->vendor_id);
1282 a2dp->flush_time = le32_to_cpu(pdev->flush_time);
1291 struct rtw89_btc *btc = &rtwdev->btc;
1292 const struct rtw89_btc_ver *ver = btc->ver;
1294 if (ver->fwevntrptl == 1)
1318 struct rtw89_btc *btc = &rtwdev->btc;
1319 const struct rtw89_btc_ver *ver = btc->ver;
1320 struct rtw89_btc_dm *dm = &btc->dm;
1322 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
1323 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
1339 pfwinfo->err[BTFRE_INVALID_INPUT]++;
1344 rpt_type = btc_prpt->type;
1345 rpt_len = le16_to_cpu(btc_prpt->len);
1346 rpt_content = btc_prpt->content;
1356 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
1357 prpt = &pfwinfo->rpt_ctrl.finfo;
1358 if (ver->fcxbtcrpt == 1) {
1359 pfinfo = &pfwinfo->rpt_ctrl.finfo.v1;
1360 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v1);
1361 } else if (ver->fcxbtcrpt == 4) {
1362 pfinfo = &pfwinfo->rpt_ctrl.finfo.v4;
1363 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v4);
1364 } else if (ver->fcxbtcrpt == 5) {
1365 pfinfo = &pfwinfo->rpt_ctrl.finfo.v5;
1366 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v5);
1367 } else if (ver->fcxbtcrpt == 105) {
1368 pfinfo = &pfwinfo->rpt_ctrl.finfo.v105;
1369 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v105);
1370 pcinfo->req_fver = 5;
1372 } else if (ver->fcxbtcrpt == 8) {
1373 pfinfo = &pfwinfo->rpt_ctrl.finfo.v8;
1374 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v8);
1376 } else if (ver->fcxbtcrpt == 7) {
1377 pfinfo = &pfwinfo->rpt_ctrl.finfo.v7;
1378 pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v7);
1383 pcinfo->req_fver = ver->fcxbtcrpt;
1386 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo;
1387 if (ver->fcxtdma == 1) {
1388 pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v1;
1389 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v1);
1390 } else if (ver->fcxtdma == 3 || ver->fcxtdma == 7) {
1391 pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v3;
1392 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v3);
1396 pcinfo->req_fver = ver->fcxtdma;
1399 pcinfo = &pfwinfo->rpt_fbtc_slots.cinfo;
1400 if (ver->fcxslots == 1) {
1401 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo.v1;
1402 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo.v1);
1403 } else if (ver->fcxslots == 7) {
1404 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo.v7;
1405 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo.v7);
1409 pcinfo->req_fver = ver->fcxslots;
1412 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
1413 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo;
1414 if (ver->fcxcysta == 2) {
1415 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v2;
1416 pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2;
1417 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v2);
1418 } else if (ver->fcxcysta == 3) {
1419 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v3;
1420 pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3;
1421 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v3);
1422 } else if (ver->fcxcysta == 4) {
1423 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v4;
1424 pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4;
1425 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v4);
1426 } else if (ver->fcxcysta == 5) {
1427 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v5;
1428 pcysta->v5 = pfwinfo->rpt_fbtc_cysta.finfo.v5;
1429 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v5);
1430 } else if (ver->fcxcysta == 7) {
1431 pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v7;
1432 pcysta->v7 = pfwinfo->rpt_fbtc_cysta.finfo.v7;
1433 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v7);
1437 pcinfo->req_fver = ver->fcxcysta;
1440 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo;
1441 if (ver->fcxctrl != 7)
1442 trace_step = btc->ctrl.ctrl.trace_step;
1444 if (ver->fcxstep == 2) {
1445 pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v2;
1446 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v2.step[0]) *
1449 } else if (ver->fcxstep == 3) {
1450 pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v3;
1451 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v3.step[0]) *
1457 pcinfo->req_fver = ver->fcxstep;
1460 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo;
1461 if (ver->fcxnullsta == 1) {
1462 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v1;
1463 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v1);
1464 } else if (ver->fcxnullsta == 2) {
1465 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v2;
1466 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v2);
1467 } else if (ver->fcxnullsta == 7) {
1468 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v7;
1469 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v7);
1473 pcinfo->req_fver = ver->fcxnullsta;
1476 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
1477 if (ver->fcxmreg == 1) {
1478 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v1;
1479 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v1);
1480 } else if (ver->fcxmreg == 2) {
1481 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v2;
1482 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v2);
1483 } else if (ver->fcxmreg == 7) {
1484 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo.v7;
1485 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo.v7);
1489 pcinfo->req_fver = ver->fcxmreg;
1492 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo;
1493 if (ver->fcxgpiodbg == 7) {
1494 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7;
1495 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo.v7);
1497 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1;
1498 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo.v1);
1500 pcinfo->req_fver = ver->fcxgpiodbg;
1503 pcinfo = &pfwinfo->rpt_fbtc_btver.cinfo;
1504 if (ver->fcxbtver == 1) {
1505 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo.v1;
1506 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo.v1);
1507 } else if (ver->fcxbtver == 7) {
1508 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo.v7;
1509 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo.v7);
1511 pcinfo->req_fver = ver->fcxbtver;
1514 pcinfo = &pfwinfo->rpt_fbtc_btscan.cinfo;
1515 if (ver->fcxbtscan == 1) {
1516 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v1;
1517 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v1);
1518 } else if (ver->fcxbtscan == 2) {
1519 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v2;
1520 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v2);
1521 } else if (ver->fcxbtscan == 7) {
1522 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo.v7;
1523 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo.v7);
1527 pcinfo->req_fver = ver->fcxbtscan;
1530 pcinfo = &pfwinfo->rpt_fbtc_btafh.cinfo;
1531 if (ver->fcxbtafh == 1) {
1532 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v1;
1533 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v1);
1534 } else if (ver->fcxbtafh == 2) {
1535 pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v2;
1536 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v2);
1540 pcinfo->req_fver = ver->fcxbtafh;
1543 pcinfo = &pfwinfo->rpt_fbtc_btdev.cinfo;
1544 pfinfo = &pfwinfo->rpt_fbtc_btdev.finfo;
1545 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btdev.finfo);
1546 pcinfo->req_fver = ver->fcxbtdevinfo;
1549 pfwinfo->err[BTFRE_UNDEF_TYPE]++;
1553 pcinfo->rx_len = rpt_len;
1554 pcinfo->rx_cnt++;
1556 if (rpt_len != pcinfo->req_len) {
1558 pfwinfo->len_mismch |= (0x1 << rpt_type);
1560 pfwinfo->len_mismch |= BIT(31);
1563 __func__, rpt_type, rpt_len, pcinfo->req_len);
1565 pcinfo->valid = 0;
1567 } else if (!pfinfo || !rpt_content || !pcinfo->req_len) {
1568 pfwinfo->err[BTFRE_EXCEPTION]++;
1569 pcinfo->valid = 0;
1573 memcpy(pfinfo, rpt_content, pcinfo->req_len);
1574 pcinfo->valid = 1;
1578 if (ver->fcxbtcrpt == 1) {
1579 prpt->v1 = pfwinfo->rpt_ctrl.finfo.v1;
1580 btc->fwinfo.rpt_en_map = prpt->v1.rpt_enable;
1581 wl->ver_info.fw_coex = prpt->v1.wl_fw_coex_ver;
1582 wl->ver_info.fw = prpt->v1.wl_fw_ver;
1583 dm->wl_fw_cx_offload = !!prpt->v1.wl_fw_cx_offload;
1586 pfwinfo->event[BTF_EVNT_RPT]);
1588 /* To avoid I/O if WL LPS or power-off */
1589 if (wl->status.map.lps != BTC_LPS_RF_OFF &&
1590 !wl->status.map.rf_off) {
1591 rtwdev->chip->ops->btc_update_bt_cnt(rtwdev);
1594 btc->cx.cnt_bt[BTC_BCNT_POLUT] =
1598 } else if (ver->fcxbtcrpt == 4) {
1599 prpt->v4 = pfwinfo->rpt_ctrl.finfo.v4;
1600 btc->fwinfo.rpt_en_map = le32_to_cpu(prpt->v4.rpt_info.en);
1601 wl->ver_info.fw_coex = le32_to_cpu(prpt->v4.wl_fw_info.cx_ver);
1602 wl->ver_info.fw = le32_to_cpu(prpt->v4.wl_fw_info.fw_ver);
1603 dm->wl_fw_cx_offload = !!le32_to_cpu(prpt->v4.wl_fw_info.cx_offload);
1606 memcpy(&dm->gnt.band[i], &prpt->v4.gnt_val[i],
1607 sizeof(dm->gnt.band[i]));
1609 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] =
1610 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_TX]);
1611 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] =
1612 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_RX]);
1613 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] =
1614 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_TX]);
1615 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] =
1616 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_RX]);
1617 btc->cx.cnt_bt[BTC_BCNT_POLUT] =
1618 le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_POLLUTED]);
1622 pfwinfo->event[BTF_EVNT_RPT]);
1624 if (le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0)
1625 bt->rfk_info.map.timeout = 1;
1627 bt->rfk_info.map.timeout = 0;
1629 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout;
1630 } else if (ver->fcxbtcrpt == 5) {
1631 prpt->v5 = pfwinfo->rpt_ctrl.finfo.v5;
1632 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v5.rpt_info.en);
1633 wl->ver_info.fw_coex = le32_to_cpu(prpt->v5.rpt_info.cx_ver);
1634 wl->ver_info.fw = le32_to_cpu(prpt->v5.rpt_info.fw_ver);
1635 dm->wl_fw_cx_offload = 0;
1638 memcpy(&dm->gnt.band[i], &prpt->v5.gnt_val[i][0],
1639 sizeof(dm->gnt.band[i]));
1641 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] =
1642 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_TX]);
1643 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] =
1644 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_RX]);
1645 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] =
1646 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_TX]);
1647 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] =
1648 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_RX]);
1649 btc->cx.cnt_bt[BTC_BCNT_POLUT] =
1650 le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_POLLUTED]);
1654 pfwinfo->event[BTF_EVNT_RPT]);
1656 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout;
1657 } else if (ver->fcxbtcrpt == 105) {
1658 prpt->v105 = pfwinfo->rpt_ctrl.finfo.v105;
1659 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v105.rpt_info.en);
1660 wl->ver_info.fw_coex = le32_to_cpu(prpt->v105.rpt_info.cx_ver);
1661 wl->ver_info.fw = le32_to_cpu(prpt->v105.rpt_info.fw_ver);
1662 dm->wl_fw_cx_offload = 0;
1665 memcpy(&dm->gnt.band[i], &prpt->v105.gnt_val[i][0],
1666 sizeof(dm->gnt.band[i]));
1668 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] =
1669 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_TX_V105]);
1670 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] =
1671 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_RX_V105]);
1672 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] =
1673 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_LO_TX_V105]);
1674 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] =
1675 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_LO_RX_V105]);
1676 btc->cx.cnt_bt[BTC_BCNT_POLUT] =
1677 le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_POLLUTED_V105]);
1681 pfwinfo->event[BTF_EVNT_RPT]);
1683 dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout;
1684 } else if (ver->fcxbtcrpt == 7) {
1685 prpt->v7 = pfwinfo->rpt_ctrl.finfo.v7;
1686 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v7.rpt_info.en);
1687 wl->ver_info.fw_coex = le32_to_cpu(prpt->v7.rpt_info.cx_ver);
1688 wl->ver_info.fw = le32_to_cpu(prpt->v7.rpt_info.fw_ver);
1691 memcpy(&dm->gnt.band[i], &prpt->v7.gnt_val[i][0],
1692 sizeof(dm->gnt.band[i]));
1694 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] =
1695 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_TX_V105]);
1696 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] =
1697 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_RX_V105]);
1698 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] =
1699 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_LO_TX_V105]);
1700 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] =
1701 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_LO_RX_V105]);
1703 val1 = le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_POLLUTED_V105]);
1704 if (val1 > btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW])
1705 val1 -= btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]; /* diff */
1707 btc->cx.cnt_bt[BTC_BCNT_POLUT_DIFF] = val1;
1708 btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW] =
1709 le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_POLLUTED_V105]);
1711 val1 = pfwinfo->event[BTF_EVNT_RPT];
1716 } else if (ver->fcxbtcrpt == 8) {
1717 prpt->v8 = pfwinfo->rpt_ctrl.finfo.v8;
1718 pfwinfo->rpt_en_map = le32_to_cpu(prpt->v8.rpt_info.en);
1719 wl->ver_info.fw_coex = le32_to_cpu(prpt->v8.rpt_info.cx_ver);
1720 wl->ver_info.fw = le32_to_cpu(prpt->v8.rpt_info.fw_ver);
1723 memcpy(&dm->gnt.band[i], &prpt->v8.gnt_val[i][0],
1724 sizeof(dm->gnt.band[i]));
1726 btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] =
1727 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_TX_V105]);
1728 btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] =
1729 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_RX_V105]);
1730 btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] =
1731 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_LO_TX_V105]);
1732 btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] =
1733 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_LO_RX_V105]);
1735 val1 = le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_POLLUTED_V105]);
1736 if (val1 > btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW])
1737 val1 -= btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW]; /* diff */
1739 btc->cx.cnt_bt[BTC_BCNT_POLUT_DIFF] = val1;
1740 btc->cx.cnt_bt[BTC_BCNT_POLUT_NOW] =
1741 le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_POLLUTED_V105]);
1743 val1 = pfwinfo->event[BTF_EVNT_RPT];
1744 if (((prpt->v8.rpt_len_max_h << 8) +
1745 prpt->v8.rpt_len_max_l) != ver->info_buf)
1746 dm->error.map.h2c_c2h_buffer_mismatch = true;
1748 dm->error.map.h2c_c2h_buffer_mismatch = false;
1762 sizeof(dm->tdma_now));
1763 if (ver->fcxtdma == 1)
1765 memcmp(&dm->tdma_now,
1766 &pfwinfo->rpt_fbtc_tdma.finfo.v1,
1767 sizeof(dm->tdma_now)));
1768 else if (ver->fcxtdma == 3 || ver->fcxtdma == 7)
1770 memcmp(&dm->tdma_now,
1771 &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma,
1772 sizeof(dm->tdma_now)));
1777 if (ver->fcxslots == 7) {
1781 sizeof(dm->slot_now.v7));
1783 memcmp(dm->slot_now.v7,
1784 pfwinfo->rpt_fbtc_slots.finfo.v7.slot,
1785 sizeof(dm->slot_now.v7)));
1786 } else if (ver->fcxslots == 1) {
1790 sizeof(dm->slot_now.v1));
1792 memcmp(dm->slot_now.v1,
1793 pfwinfo->rpt_fbtc_slots.finfo.v1.slot,
1794 sizeof(dm->slot_now.v1)));
1798 if (ver->fcxcysta == 2) {
1799 if (le16_to_cpu(pcysta->v2.cycles) < BTC_CYSTA_CHK_PERIOD)
1801 /* Check Leak-AP */
1802 if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) != 0 &&
1803 le32_to_cpu(pcysta->v2.leakrx_cnt) != 0 && dm->tdma_now.rxflctrl) {
1804 if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) <
1805 BTC_LEAK_AP_TH * le32_to_cpu(pcysta->v2.leakrx_cnt))
1806 dm->leak_ap = 1;
1810 if (dm->tdma_now.type == CXTDMA_OFF &&
1811 dm->tdma_now.ext_ctrl == CXECTL_EXT) {
1812 if (ver->fcxslots == 1)
1813 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_E2G].dur);
1814 else if (ver->fcxslots == 7)
1815 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_E2G].dur);
1817 if (ver->fcxslots == 1)
1818 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur);
1819 else if (ver->fcxslots == 7)
1820 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur);
1823 if (le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) > wl_slot_set) {
1824 diff_t = le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) - wl_slot_set;
1830 le32_to_cpu(pcysta->v2.slot_cnt[CXST_W1]));
1832 le32_to_cpu(pcysta->v2.slot_cnt[CXST_B1]));
1834 le16_to_cpu(pcysta->v2.cycles));
1835 } else if (ver->fcxcysta == 3) {
1836 if (le16_to_cpu(pcysta->v3.cycles) < BTC_CYSTA_CHK_PERIOD)
1839 cnt_leak_slot = le32_to_cpu(pcysta->v3.slot_cnt[CXST_LK]);
1840 cnt_rx_imr = le32_to_cpu(pcysta->v3.leak_slot.cnt_rximr);
1842 /* Check Leak-AP */
1844 dm->tdma_now.rxflctrl) {
1846 dm->leak_ap = 1;
1850 if (dm->tdma_now.type == CXTDMA_OFF) {
1851 if (ver->fcxslots == 1)
1852 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur);
1853 else if (ver->fcxslots == 7)
1854 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur);
1855 wl_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_WL]);
1857 diff_t = wl_slot_real - wl_slot_set;
1863 if (dm->tdma_now.type == CXTDMA_OFF &&
1864 dm->tdma_now.ext_ctrl == CXECTL_EXT &&
1865 btc->bt_req_len != 0) {
1866 bt_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_BT]);
1867 if (btc->bt_req_len > bt_slot_real) {
1868 diff_t = btc->bt_req_len - bt_slot_real;
1874 le32_to_cpu(pcysta->v3.slot_cnt[CXST_W1]));
1876 le32_to_cpu(pcysta->v3.slot_cnt[CXST_B1]));
1878 le16_to_cpu(pcysta->v3.cycles));
1879 } else if (ver->fcxcysta == 4) {
1880 if (le16_to_cpu(pcysta->v4.cycles) < BTC_CYSTA_CHK_PERIOD)
1883 cnt_leak_slot = le16_to_cpu(pcysta->v4.slot_cnt[CXST_LK]);
1884 cnt_rx_imr = le32_to_cpu(pcysta->v4.leak_slot.cnt_rximr);
1886 /* Check Leak-AP */
1888 dm->tdma_now.rxflctrl) {
1890 dm->leak_ap = 1;
1894 if (dm->tdma_now.type == CXTDMA_OFF) {
1895 if (ver->fcxslots == 1)
1896 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur);
1897 else if (ver->fcxslots == 7)
1898 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur);
1899 wl_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_WL]);
1901 diff_t = wl_slot_real - wl_slot_set;
1907 if (dm->tdma_now.type == CXTDMA_OFF &&
1908 dm->tdma_now.ext_ctrl == CXECTL_EXT &&
1909 btc->bt_req_len != 0) {
1910 bt_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_BT]);
1912 if (btc->bt_req_len > bt_slot_real) {
1913 diff_t = btc->bt_req_len - bt_slot_real;
1919 le16_to_cpu(pcysta->v4.slot_cnt[CXST_W1]));
1921 le16_to_cpu(pcysta->v4.slot_cnt[CXST_B1]));
1923 le16_to_cpu(pcysta->v4.cycles));
1924 } else if (ver->fcxcysta == 5) {
1925 if (dm->fddt_train == BTC_FDDT_ENABLE)
1927 cnt_leak_slot = le16_to_cpu(pcysta->v5.slot_cnt[CXST_LK]);
1928 cnt_rx_imr = le32_to_cpu(pcysta->v5.leak_slot.cnt_rximr);
1930 /* Check Leak-AP */
1932 dm->tdma_now.rxflctrl) {
1933 if (le16_to_cpu(pcysta->v5.cycles) >= BTC_CYSTA_CHK_PERIOD &&
1935 dm->leak_ap = 1;
1939 if (dm->tdma_now.type == CXTDMA_OFF) {
1940 if (ver->fcxslots == 1)
1941 wl_slot_set = le16_to_cpu(dm->slot_now.v1[CXST_W1].dur);
1942 else if (ver->fcxslots == 7)
1943 wl_slot_set = le16_to_cpu(dm->slot_now.v7[CXST_W1].dur);
1944 wl_slot_real = le16_to_cpu(pcysta->v5.cycle_time.tavg[CXT_WL]);
1947 diff_t = wl_slot_real - wl_slot_set;
1949 diff_t = wl_slot_set - wl_slot_real;
1954 bt_slot_set = btc->bt_req_len;
1955 bt_slot_real = le16_to_cpu(pcysta->v5.cycle_time.tavg[CXT_BT]);
1957 if (dm->tdma_now.type == CXTDMA_OFF &&
1958 dm->tdma_now.ext_ctrl == CXECTL_EXT &&
1961 diff_t = bt_slot_set - bt_slot_real;
1963 diff_t = bt_slot_real - bt_slot_set;
1968 le16_to_cpu(pcysta->v5.slot_cnt[CXST_E2G]));
1970 le16_to_cpu(pcysta->v5.slot_cnt[CXST_W1]));
1972 le16_to_cpu(pcysta->v5.slot_cnt[CXST_B1]));
1974 le16_to_cpu(pcysta->v5.cycles));
1975 } else if (ver->fcxcysta == 7) {
1976 if (dm->fddt_train == BTC_FDDT_ENABLE)
1979 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo;
1981 if (dm->tdma_now.type != CXTDMA_OFF) {
1983 val16 = le16_to_cpu(pcysta->v7.cycle_time.tavg[CXT_WL]);
1986 /* Check Leak-AP */
1987 val1 = le32_to_cpu(pcysta->v7.leak_slot.cnt_rximr) *
1989 val2 = le16_to_cpu(pcysta->v7.slot_cnt[CXST_LK]);
1991 val16 = le16_to_cpu(pcysta->v7.cycles);
1992 if (dm->tdma_now.rxflctrl &&
1994 dm->leak_ap = 1;
1995 } else if (dm->tdma_now.ext_ctrl == CXECTL_EXT) {
1996 val16 = le16_to_cpu(pcysta->v7.cycle_time.tavg[CXT_BT]);
2001 val1 = le16_to_cpu(pcysta->v7.a2dp_ept.cnt_timeout) *
2003 val2 = le16_to_cpu(pcysta->v7.a2dp_ept.cnt);
2005 val16 = le16_to_cpu(pcysta->v7.cycles);
2007 dm->slot_req_more = 1;
2008 else if (bt->link_info.status.map.connect == 0)
2009 dm->slot_req_more = 0;
2013 le16_to_cpu(pcysta->v7.slot_cnt[CXST_E2G]));
2015 le16_to_cpu(pcysta->v7.slot_cnt[CXST_W1]));
2017 le16_to_cpu(pcysta->v7.slot_cnt[CXST_B1]));
2019 /* "BT_SLOT_FLOOD" error-check MUST before "CYCLE_HANG" */
2021 le16_to_cpu(pcysta->v7.cycles));
2023 le16_to_cpu(pcysta->v7.cycles));
2029 if (ver->fcxmreg == 7)
2032 if (dm->wl_btg_rx == BTC_BTGCTRL_BB_GNT_FWCTRL)
2033 dm->wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_FWCTRL;
2035 dm->wl_btg_rx_rb = val;
2038 if (dm->wl_pre_agc == BTC_PREAGC_BB_FWCTRL)
2039 dm->wl_pre_agc_rb = BTC_PREAGC_BB_FWCTRL;
2041 dm->wl_pre_agc_rb = val;
2062 const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
2072 if (index + 2 >= ver->info_buf)
2075 rpt_len = le16_to_cpu(btc_prpt->len);
2091 struct rtw89_btc *btc = &rtwdev->btc;
2092 const struct rtw89_btc_ver *ver = btc->ver;
2093 struct rtw89_btc_dm *dm = &btc->dm;
2098 u16 len = btc->policy_len;
2100 if (!btc->update_policy_force &&
2101 !memcmp(&dm->tdma, &dm->tdma_now, sizeof(dm->tdma))) {
2108 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len];
2109 tlv->type = CXPOLICY_TDMA;
2110 if (ver->fcxtdma == 1) {
2111 v = (struct rtw89_btc_fbtc_tdma *)&tlv->val[0];
2112 tlv->len = sizeof(*v);
2113 *v = dm->tdma;
2114 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v);
2115 } else if (ver->fcxtdma == 7) {
2116 tlv_v7 = (struct rtw89_btc_btf_tlv_v7 *)&btc->policy[len];
2117 tlv_v7->len = sizeof(dm->tdma);
2118 tlv_v7->ver = ver->fcxtdma;
2119 tlv_v7->type = CXPOLICY_TDMA;
2120 memcpy(tlv_v7->val, &dm->tdma, tlv_v7->len);
2121 btc->policy_len += BTC_TLV_HDR_LEN_V7 + tlv_v7->len;
2123 tlv->len = sizeof(*v3);
2124 v3 = (struct rtw89_btc_fbtc_tdma_v3 *)&tlv->val[0];
2125 v3->fver = ver->fcxtdma;
2126 v3->tdma = dm->tdma;
2127 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v3);
2132 __func__, dm->tdma.type, dm->tdma.rxflctrl,
2133 dm->tdma.txpause, dm->tdma.wtgle_n, dm->tdma.leak_n,
2134 dm->tdma.ext_ctrl);
2139 struct rtw89_btc *btc = &rtwdev->btc;
2140 struct rtw89_btc_dm *dm = &btc->dm;
2147 "[BTC], %s(): A:btc->policy_len = %d\n",
2148 __func__, btc->policy_len);
2151 if (!btc->update_policy_force &&
2152 !memcmp(&dm->slot.v1[i], &dm->slot_now.v1[i],
2153 sizeof(dm->slot.v1[i])))
2156 len = btc->policy_len;
2158 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len];
2159 v = (struct btc_fbtc_1slot *)&tlv->val[0];
2160 tlv->type = CXPOLICY_SLOT;
2161 tlv->len = sizeof(*v);
2163 v->fver = btc->ver->fcxslots;
2164 v->sid = i;
2165 v->slot = dm->slot.v1[i];
2168 "[BTC], %s(): slot-%d: dur=%d, table=0x%08x, type=%d\n",
2169 __func__, i, dm->slot.v1[i].dur, dm->slot.v1[i].cxtbl,
2170 dm->slot.v1[i].cxtype);
2173 btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v);
2185 struct rtw89_btc *btc = &rtwdev->btc;
2186 struct rtw89_btc_dm *dm = &btc->dm;
2191 if (!btc->update_policy_force &&
2192 !memcmp(&dm->slot.v7[i], &dm->slot_now.v7[i],
2193 sizeof(dm->slot.v7[i])))
2196 len = btc->policy_len;
2205 tlv = (struct rtw89_btc_btf_tlv_v7 *)&btc->policy[len];
2206 tlv->type = CXPOLICY_SLOT;
2207 tlv->ver = btc->ver->fcxslots;
2208 tlv->len = sizeof(dm->slot.v7[0]) + BTC_TLV_SLOT_ID_LEN_V7;
2212 if ((len + (u16)tlv->len) > RTW89_BTC_POLICY_MAXLEN) {
2218 btc->policy[len] = i; /* slot-id */
2219 memcpy(&btc->policy[len + 1], &dm->slot.v7[i],
2220 sizeof(dm->slot.v7[0]));
2221 len += tlv->len;
2224 "[BTC], %s: policy_len=%d, slot-%d: dur=%d, type=%d, table=0x%08x\n",
2225 __func__, btc->policy_len, i, dm->slot.v7[i].dur,
2226 dm->slot.v7[i].cxtype, dm->slot.v7[i].cxtbl);
2228 btc->policy_len = len; /* update total length */
2234 __func__, cnt, btc->policy_len);
2239 struct rtw89_btc *btc = &rtwdev->btc;
2241 if (btc->ver->fcxslots == 7)
2249 struct rtw89_btc *btc = &rtwdev->btc;
2250 const struct rtw89_btc_ver *ver = btc->ver;
2270 switch (ver->frptmap) {
2284 switch (ver->frptmap) {
2298 switch (ver->frptmap) {
2310 switch (ver->frptmap) {
2326 switch (ver->frptmap) {
2340 switch (ver->frptmap) {
2356 switch (ver->frptmap) {
2372 switch (ver->frptmap) {
2394 struct rtw89_btc *btc = &rtwdev->btc;
2395 const struct rtw89_btc_ver *ver = btc->ver;
2398 struct rtw89_btc_dm *dm = &btc->dm;
2401 if (ver->fcxslots == 7) {
2402 len = sizeof(*tlv_v7) + sizeof(dm->slot.v7);
2407 tlv_v7->type = SET_SLOT_TABLE;
2408 tlv_v7->ver = ver->fcxslots;
2409 tlv_v7->len = ARRAY_SIZE(dm->slot.v7);
2410 memcpy(tlv_v7->val, dm->slot.v7, sizeof(dm->slot.v7));
2421 tbl->fver = BTF_SET_SLOT_TABLE_VER;
2422 tbl->tbl_num = CXST_MAX;
2423 memcpy(tbl->tbls, dm->slot.v1, flex_array_size(tbl, tbls, CXST_MAX));
2434 struct rtw89_btc *btc = &rtwdev->btc;
2435 struct rtw89_btc_wl_smap *wl_smap = &btc->cx.wl.status.map;
2436 struct rtw89_btc_btf_fwinfo *fwinfo = &btc->fwinfo;
2441 if ((wl_smap->rf_off || wl_smap->lps != BTC_LPS_OFF) && rpt_state != 0)
2451 val = fwinfo->rpt_en_map | bit_map;
2453 val = fwinfo->rpt_en_map & ~bit_map;
2455 if (val == fwinfo->rpt_en_map)
2458 if (btc->ver->fcxbtcrpt == 7 || btc->ver->fcxbtcrpt == 8) {
2460 r.v8.fver = btc->ver->fcxbtcrpt;
2466 if (btc->ver->fcxbtcrpt == 105)
2469 r.v1.fver = btc->ver->fcxbtcrpt;
2477 fwinfo->rpt_en_map = val;
2482 const struct rtw89_chip_info *chip = rtwdev->chip;
2483 const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
2489 n = chip->mon_reg_num;
2493 if (ver->fcxmreg == 1)
2507 if (ver->fcxmreg == 7) {
2512 v7->type = RPT_EN_MREG;
2513 v7->fver = ver->fcxmreg;
2514 v7->len = n;
2516 v7->regs[i].type = chip->mon_reg[i].type;
2517 v7->regs[i].bytes = chip->mon_reg[i].bytes;
2518 v7->regs[i].offset = chip->mon_reg[i].offset;
2528 v1->fver = ver->fcxmreg;
2529 v1->reg_num = n;
2530 memcpy(v1->regs, chip->mon_reg, flex_array_size(v1, regs, n));
2546 struct rtw89_btc *btc = &rtwdev->btc;
2547 struct rtw89_btc_dm *dm = &btc->dm;
2549 /* use ring-structure to store dm step */
2550 dm->dm_step.step[dm->dm_step.step_pos] = reason_or_action;
2551 dm->dm_step.step_pos++;
2553 if (dm->dm_step.step_pos >= ARRAY_SIZE(dm->dm_step.step)) {
2554 dm->dm_step.step_pos = 0;
2555 dm->dm_step.step_ov = true;
2562 struct rtw89_btc *btc = &rtwdev->btc;
2563 struct rtw89_btc_dm *dm = &btc->dm;
2566 dm->run_action = action;
2571 btc->policy_len = 0;
2572 btc->policy_type = policy_type;
2577 if (btc->policy_len == 0 || btc->policy_len > RTW89_BTC_POLICY_MAXLEN)
2581 "[BTC], %s(): action = %d -> policy type/len: 0x%04x/%d\n",
2582 __func__, action, policy_type, btc->policy_len);
2584 if (dm->tdma.rxflctrl == CXFLC_NULLP ||
2585 dm->tdma.rxflctrl == CXFLC_QOSNULL)
2586 btc->lps = 1;
2588 btc->lps = 0;
2590 if (btc->lps == 1)
2591 rtw89_set_coex_ctrl_lps(rtwdev, btc->lps);
2594 btc->policy, btc->policy_len);
2596 memcpy(&dm->tdma_now, &dm->tdma, sizeof(dm->tdma_now));
2597 if (btc->ver->fcxslots == 7)
2598 memcpy(&dm->slot_now.v7, &dm->slot.v7, sizeof(dm->slot_now.v7));
2600 memcpy(&dm->slot_now.v1, &dm->slot.v1, sizeof(dm->slot_now.v1));
2603 if (btc->update_policy_force)
2604 btc->update_policy_force = false;
2606 if (btc->lps == 0)
2607 rtw89_set_coex_ctrl_lps(rtwdev, btc->lps);
2612 struct rtw89_btc *btc = &rtwdev->btc;
2613 const struct rtw89_btc_ver *ver = btc->ver;
2614 struct rtw89_btc_dm *dm = &btc->dm;
2615 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
2616 struct rtw89_btc_rf_trx_para rf_para = dm->rf_trx_para;
2620 if (ver->fcxinit == 7)
2626 if (ver->fwlrole == 0)
2628 else if (ver->fwlrole == 1)
2630 else if (ver->fwlrole == 2)
2632 else if (ver->fwlrole == 7)
2634 else if (ver->fwlrole == 8)
2638 if (ver->drvinfo_type == 1)
2641 if (ver->fcxctrl == 7)
2647 if (ver->drvinfo_type == 1)
2650 dm->trx_info.tx_power = u32_get_bits(rf_para.wl_tx_power,
2652 dm->trx_info.rx_gain = u32_get_bits(rf_para.wl_rx_gain,
2654 dm->trx_info.bt_tx_power = u32_get_bits(rf_para.bt_tx_power,
2656 dm->trx_info.bt_rx_gain = u32_get_bits(rf_para.bt_rx_gain,
2658 dm->trx_info.cn = wl->cn_report;
2659 dm->trx_info.nhm = wl->nhm.pwr;
2663 if (ver->drvinfo_type == 1)
2680 struct rtw89_btc *btc = &rtwdev->btc;
2681 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
2701 struct rtw89_btc *btc = &rtwdev->btc;
2702 struct rtw89_btc_dm *dm = &btc->dm;
2703 struct rtw89_mac_ax_gnt *g = dm->gnt.band;
2744 rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt);
2750 struct rtw89_btc *btc = &rtwdev->btc;
2751 struct rtw89_btc_dm *dm = &btc->dm;
2752 struct rtw89_mac_ax_gnt *g = dm->gnt.band;
2753 u8 i, bt_idx = dm->bt_select + 1;
2793 if (rtwdev->chip->para_ver & BTC_FEAT_WLAN_ACT_MUX) {
2800 dm->gnt.bt[i].wlan_act_en = 0;
2801 dm->gnt.bt[i].wlan_act = 0;
2804 dm->gnt.bt[i].wlan_act_en = 1;
2805 dm->gnt.bt[i].wlan_act = 0;
2808 dm->gnt.bt[i].wlan_act_en = 1;
2809 dm->gnt.bt[i].wlan_act = 1;
2814 rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt);
2838 const struct rtw89_chip_info *chip = rtwdev->chip;
2839 struct rtw89_btc *btc = &rtwdev->btc;
2840 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
2843 if (wl->rf_para.tx_pwr_freerun == level)
2846 wl->rf_para.tx_pwr_freerun = level;
2847 btc->dm.rf_trx_para.wl_tx_power = level;
2865 chip->ops->btc_set_wl_txpwr_ctrl(rtwdev, pwr_val);
2870 const struct rtw89_chip_info *chip = rtwdev->chip;
2871 struct rtw89_btc *btc = &rtwdev->btc;
2872 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
2874 if (wl->rf_para.rx_gain_freerun == level)
2877 wl->rf_para.rx_gain_freerun = level;
2878 btc->dm.rf_trx_para.wl_rx_gain = level;
2884 chip->ops->btc_set_wl_rx_gain(rtwdev, level);
2889 struct rtw89_btc *btc = &rtwdev->btc;
2890 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
2894 if (btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE] == 0)
2897 if (bt->rf_para.tx_pwr_freerun == level)
2904 buf = (s8)(-level);
2907 bt->rf_para.tx_pwr_freerun = level;
2908 btc->dm.rf_trx_para.bt_tx_power = level;
2916 struct rtw89_btc *btc = &rtwdev->btc;
2917 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
2919 if (btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE] == 0)
2922 if ((bt->rf_para.rx_gain_freerun == level ||
2924 (!rtwdev->chip->scbd || bt->lna_constrain == level))
2927 bt->rf_para.rx_gain_freerun = level;
2928 btc->dm.rf_trx_para.bt_rx_gain = level;
2944 const struct rtw89_chip_info *chip = rtwdev->chip;
2945 struct rtw89_btc *btc = &rtwdev->btc;
2946 const struct rtw89_btc_ver *ver = btc->ver;
2947 struct rtw89_btc_dm *dm = &btc->dm;
2948 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
2949 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
2950 struct rtw89_btc_bt_link_info *b = &bt->link_info;
2951 struct rtw89_btc_wl_smap *wl_smap = &wl->status.map;
2956 if (ver->fwlrole == 0) {
2957 link_mode = wl->role_info.link_mode;
2959 if (wl->dbcc_info.real_band[i] == RTW89_BAND_2G)
2962 } else if (ver->fwlrole == 1) {
2963 link_mode = wl->role_info_v1.link_mode;
2964 dbcc_2g_phy = wl->role_info_v1.dbcc_2g_phy;
2965 } else if (ver->fwlrole == 2) {
2966 link_mode = wl->role_info_v2.link_mode;
2967 dbcc_2g_phy = wl->role_info_v2.dbcc_2g_phy;
2971 if (btc->ant_type == BTC_ANT_SHARED) {
2973 if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) ||
2974 dm->bt_only == 1)
2975 dm->trx_para_level = 1; /* for better BT ACI issue */
2977 dm->trx_para_level = 0;
2978 } else { /* non-shared antenna */
2979 dm->trx_para_level = 5;
2980 /* modify trx_para if WK 2.4G-STA-DL + bt link */
2981 if (b->profile_cnt.now != 0 &&
2983 wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { /* uplink */
2984 if (wl->rssi_level == 4 && bt->rssi_level > 2)
2985 dm->trx_para_level = 6;
2986 else if (wl->rssi_level == 3 && bt->rssi_level > 3)
2987 dm->trx_para_level = 7;
2991 level_id = dm->trx_para_level;
2992 if (level_id >= chip->rf_para_dlink_num ||
2993 level_id >= chip->rf_para_ulink_num) {
3000 if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL))
3001 para = chip->rf_para_ulink[level_id];
3003 para = chip->rf_para_dlink[level_id];
3005 if (dm->fddt_train) {
3015 if (!bt->enable.now || dm->wl_only || wl_smap->rf_off ||
3016 wl_smap->lps == BTC_LPS_RF_OFF ||
3019 (rtwdev->dbcc_en && dbcc_2g_phy != RTW89_PHY_1))
3024 if (wl_stb_chg != dm->wl_stb_chg) {
3025 dm->wl_stb_chg = wl_stb_chg;
3026 chip->ops->btc_wl_s1_standby(rtwdev, dm->wl_stb_chg);
3032 struct rtw89_btc *btc = &rtwdev->btc;
3033 struct rtw89_btc_cx *cx = &btc->cx;
3034 struct rtw89_btc_wl_info *wl = &cx->wl;
3035 struct rtw89_btc_bt_info *bt = &cx->bt;
3036 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
3038 if (wl->status.map.connecting || wl->status.map._4way ||
3039 wl->status.map.roaming || wl->status.map.dbccing) {
3040 cx->state_map = BTC_WLINKING;
3041 } else if (wl->status.map.scan) { /* wl scan */
3042 if (bt_linfo->status.map.inq_pag)
3043 cx->state_map = BTC_WSCAN_BSCAN;
3045 cx->state_map = BTC_WSCAN_BNOSCAN;
3046 } else if (wl->status.map.busy) { /* only busy */
3047 if (bt_linfo->status.map.inq_pag)
3048 cx->state_map = BTC_WBUSY_BSCAN;
3050 cx->state_map = BTC_WBUSY_BNOSCAN;
3052 cx->state_map = BTC_WIDLE;
3058 const struct rtw89_chip_info *chip = rtwdev->chip;
3059 struct rtw89_btc *btc = &rtwdev->btc;
3060 const struct rtw89_btc_ver *ver = btc->ver;
3061 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
3062 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
3063 struct rtw89_btc_bt_link_info *b = &bt->link_info;
3064 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
3065 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
3066 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
3067 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
3068 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
3074 u8 en = 0, i, ch = 0, bw = 0;
3077 if (btc->manual_ctrl || wl->status.map.scan)
3080 if (ver->fwlrole == 0) {
3081 mode = wl_rinfo->link_mode;
3082 connect_cnt = wl_rinfo->connect_cnt;
3083 } else if (ver->fwlrole == 1) {
3084 mode = wl_rinfo_v1->link_mode;
3085 connect_cnt = wl_rinfo_v1->connect_cnt;
3086 } else if (ver->fwlrole == 2) {
3087 mode = wl_rinfo_v2->link_mode;
3088 connect_cnt = wl_rinfo_v2->connect_cnt;
3089 } else if (ver->fwlrole == 7) {
3090 mode = wl_rinfo_v7->link_mode;
3091 connect_cnt = wl_rinfo_v7->connect_cnt;
3092 } else if (ver->fwlrole == 8) {
3093 mode = wl_rinfo_v8->link_mode;
3094 connect_cnt = wl_rinfo_v8->connect_cnt;
3099 if (wl->status.map.rf_off || bt->whql_test ||
3102 en = false;
3104 en = true;
3107 r = &wl_rinfo->active_role[i];
3108 r1 = &wl_rinfo_v1->active_role_v1[i];
3109 r2 = &wl_rinfo_v2->active_role_v2[i];
3110 r7 = &wl_rinfo_v7->active_role[i];
3111 rlink = &wl_rinfo_v8->rlink[i][0];
3113 if (ver->fwlrole == 0 &&
3114 (r->role == RTW89_WIFI_ROLE_P2P_GO ||
3115 r->role == RTW89_WIFI_ROLE_P2P_CLIENT)) {
3116 ch = r->ch;
3117 bw = r->bw;
3119 } else if (ver->fwlrole == 1 &&
3120 (r1->role == RTW89_WIFI_ROLE_P2P_GO ||
3121 r1->role == RTW89_WIFI_ROLE_P2P_CLIENT)) {
3122 ch = r1->ch;
3123 bw = r1->bw;
3125 } else if (ver->fwlrole == 2 &&
3126 (r2->role == RTW89_WIFI_ROLE_P2P_GO ||
3127 r2->role == RTW89_WIFI_ROLE_P2P_CLIENT)) {
3128 ch = r2->ch;
3129 bw = r2->bw;
3131 } else if (ver->fwlrole == 7 &&
3132 (r7->role == RTW89_WIFI_ROLE_P2P_GO ||
3133 r7->role == RTW89_WIFI_ROLE_P2P_CLIENT)) {
3134 ch = r7->ch;
3135 bw = r7->bw;
3137 } else if (ver->fwlrole == 8 &&
3138 (rlink->role == RTW89_WIFI_ROLE_P2P_GO ||
3139 rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT)) {
3140 ch = rlink->ch;
3141 bw = rlink->bw;
3146 en = true;
3149 r = &wl_rinfo->active_role[i];
3150 r1 = &wl_rinfo_v1->active_role_v1[i];
3151 r2 = &wl_rinfo_v2->active_role_v2[i];
3152 r7 = &wl_rinfo_v7->active_role[i];
3153 rlink = &wl_rinfo_v8->rlink[i][0];
3155 if (ver->fwlrole == 0 &&
3156 r->connected && r->band == RTW89_BAND_2G) {
3157 ch = r->ch;
3158 bw = r->bw;
3160 } else if (ver->fwlrole == 1 &&
3161 r1->connected && r1->band == RTW89_BAND_2G) {
3162 ch = r1->ch;
3163 bw = r1->bw;
3165 } else if (ver->fwlrole == 2 &&
3166 r2->connected && r2->band == RTW89_BAND_2G) {
3167 ch = r2->ch;
3168 bw = r2->bw;
3170 } else if (ver->fwlrole == 7 &&
3171 r7->connected && r7->band == RTW89_BAND_2G) {
3172 ch = r7->ch;
3173 bw = r7->bw;
3175 } else if (ver->fwlrole == 8 &&
3176 rlink->connected && rlink->rf_band == RTW89_BAND_2G) {
3177 ch = rlink->ch;
3178 bw = rlink->bw;
3186 bw = 20 + chip->afh_guard_ch * 2;
3189 bw = 40 + chip->afh_guard_ch * 2;
3192 bw = 5 + chip->afh_guard_ch * 2;
3195 bw = 10 + chip->afh_guard_ch * 2;
3199 en = false; /* turn off AFH info if BW > 40 */
3203 if (wl->afh_info.en == en &&
3204 wl->afh_info.ch == ch &&
3205 wl->afh_info.bw == bw &&
3206 b->profile_cnt.last == b->profile_cnt.now) {
3213 wl->afh_info.en = en;
3214 wl->afh_info.ch = ch;
3215 wl->afh_info.bw = bw;
3217 _send_fw_cmd(rtwdev, BTFC_SET, SET_BT_WL_CH_INFO, &wl->afh_info, 3);
3220 "[BTC], %s(): en=%d, ch=%d, bw=%d\n",
3221 __func__, en, ch, bw);
3222 btc->cx.cnt_wl[BTC_WCNT_CH_UPDATE]++;
3227 struct rtw89_btc *btc = &rtwdev->btc;
3228 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
3229 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
3230 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
3231 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
3232 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
3233 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
3234 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
3235 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
3236 struct rtw89_btc_bt_hid_desc *hid = &bt_linfo->hid_desc;
3237 union rtw89_btc_module_info *md = &btc->mdinfo;
3238 const struct rtw89_btc_ver *ver = btc->ver;
3241 if (ver->fcxinit == 7)
3242 isolation = md->md_v7.ant.isolation;
3244 isolation = md->md.ant.isolation;
3246 if (ver->fwlrole == 0)
3247 connect_cnt = wl_rinfo->connect_cnt;
3248 else if (ver->fwlrole == 1)
3249 connect_cnt = wl_rinfo_v1->connect_cnt;
3250 else if (ver->fwlrole == 2)
3251 connect_cnt = wl_rinfo_v2->connect_cnt;
3252 else if (ver->fwlrole == 7)
3253 connect_cnt = wl_rinfo_v7->connect_cnt;
3254 else if (ver->fwlrole == 8)
3255 connect_cnt = wl_rinfo_v8->connect_cnt;
3257 if (btc->ant_type == BTC_ANT_SHARED) {
3258 btc->dm.trx_para_level = 0;
3264 btc->dm.trx_para_level = 5;
3268 if (bt_linfo->profile_cnt.now == 0) {
3269 btc->dm.trx_para_level = 5;
3273 if (hid->pair_cnt > BTC_TDMA_BTHID_MAX) {
3274 btc->dm.trx_para_level = 5;
3280 btc->dm.trx_para_level = 5;
3284 if (!wl->status.map.busy) {/* wl idle -> freerun */
3285 btc->dm.trx_para_level = 5;
3287 } else if (wl->rssi_level > 1) {/* WL rssi < 50% (-60dBm) */
3288 btc->dm.trx_para_level = 0;
3290 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) {
3291 if (wl->rssi_level == 0 && bt_linfo->rssi > 31) {
3292 btc->dm.trx_para_level = 6;
3294 } else if (wl->rssi_level == 1 && bt_linfo->rssi > 36) {
3295 btc->dm.trx_para_level = 7;
3298 btc->dm.trx_para_level = 0;
3300 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) {
3301 if (bt_linfo->rssi > 28) {
3302 btc->dm.trx_para_level = 6;
3307 btc->dm.trx_para_level = 0;
3311 #define _tdma_set_flctrl(btc, flc) ({(btc)->dm.tdma.rxflctrl = flc; })
3312 #define _tdma_set_flctrl_role(btc, role) ({(btc)->dm.tdma.rxflctrl_role = role; })
3313 #define _tdma_set_tog(btc, wtg) ({(btc)->dm.tdma.wtgle_n = wtg; })
3314 #define _tdma_set_lek(btc, lek) ({(btc)->dm.tdma.leak_n = lek; })
3378 const struct rtw89_chip_info *chip = rtwdev->chip;
3380 chip->ops->btc_set_policy(rtwdev, policy_type);
3387 struct rtw89_btc *btc = &rtwdev->btc;
3388 struct rtw89_btc_dm *dm = &btc->dm;
3389 struct rtw89_btc_fbtc_tdma *t = &dm->tdma;
3390 struct rtw89_btc_fbtc_slot *s = dm->slot.v1;
3394 if (btc->ant_type == BTC_ANT_SHARED) {
3395 if (btc->cx.wl.status.map._4way)
3408 btc->bt_req_en = false;
3415 btc->update_policy_force = true;
3463 btc->bt_req_en = true;
3481 case BTC_CXP_FIX: /* TDMA Fix-Slot */
3529 case BTC_CXP_FIX_TDW1B1: /* W1:B1 = user-define */
3530 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3532 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
3537 case BTC_CXP_PFIX: /* PS-TDMA Fix-Slot */
3540 if (btc->cx.wl.role_info.role_map.role.ap)
3570 case BTC_CXP_AUTO: /* TDMA Auto-Slot */
3586 case BTC_CXP_AUTO_TDW1B1: /* W1:B1 = user-define */
3587 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3589 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
3594 case BTC_CXP_PAUTO: /* PS-TDMA Auto-Slot */
3611 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3613 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
3618 case BTC_CXP_AUTO2: /* TDMA Auto-Slot2 */
3647 case BTC_CXP_AUTO2_TDW1B4: /* W1:B1 = user-define */
3648 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3650 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4],
3655 case BTC_CXP_PAUTO2: /* PS-TDMA Auto-Slot2 */
3684 case BTC_CXP_PAUTO2_TDW1B4: /* W1:B1 = user-define */
3685 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3687 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4],
3698 struct rtw89_btc *btc = &rtwdev->btc;
3699 struct rtw89_btc_dm *dm = &btc->dm;
3700 struct rtw89_btc_fbtc_tdma *t = &dm->tdma;
3701 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &btc->cx.wl.role_info_v1;
3702 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
3703 struct rtw89_btc_bt_hid_desc *hid = &btc->cx.bt.link_info.hid_desc;
3704 struct rtw89_btc_bt_hfp_desc *hfp = &btc->cx.bt.link_info.hfp_desc;
3705 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
3712 if (btc->ant_type == BTC_ANT_SHARED) {
3713 if (btc->cx.wl.status.map._4way)
3715 else if (hid->exist && hid->type == BTC_HID_218)
3716 tbl_w1 = cxtbl[7]; /* Ack/BA no break bt Hi-Pri-rx */
3720 if (dm->leak_ap &&
3724 } else if (hid->exist && hid->type == BTC_HID_218) {
3725 tbl_b1 = cxtbl[4]; /* Ack/BA no break bt Hi-Pri-rx */
3735 if (wl->bg_mode)
3737 else if ((wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) &&
3738 hid->exist)
3746 btc->update_policy_force = true;
3822 /* To avoid wl-s0 tx break by hid/hfp tx */
3823 if (hid->exist || hfp->exist)
3826 dur_2 = dm->e2g_slot_limit;
3829 case BTC_CXP_OFFE_2GBWISOB: /* for normal-case */
3835 case BTC_CXP_OFFE_2GISOB: /* for bt no-link */
3861 if (a2dp->exist)
3868 case BTC_CXP_OFFE_WL: /* for 4-way */
3880 case BTC_CXP_FIX: /* TDMA Fix-Slot */
3929 case BTC_CXP_FIX_TDW1B1: /* W1:B1 = user-define */
3930 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3932 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
3939 case BTC_CXP_PFIX: /* PS-TDMA Fix-Slot */
3968 case BTC_CXP_PFIX_TDW1B1: /* W1:B1 = user-define */
3969 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3971 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
3978 case BTC_CXP_AUTO: /* TDMA Auto-Slot */
3995 case BTC_CXP_AUTO_TDW1B1: /* W1:B1 = user-define */
3996 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
3998 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
4005 case BTC_CXP_PAUTO: /* PS-TDMA Auto-Slot */
4023 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
4025 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
4032 case BTC_CXP_AUTO2: /* TDMA Auto-Slot2 */
4062 case BTC_CXP_AUTO2_TDW1B4: /* W1:B1 = user-define */
4063 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
4065 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
4067 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4],
4074 case BTC_CXP_PAUTO2: /* PS-TDMA Auto-Slot2 */
4104 case BTC_CXP_PAUTO2_TDW1B4: /* W1:B1 = user-define */
4105 _slot_set(btc, CXST_W1, dm->slot_dur[CXST_W1],
4107 _slot_set(btc, CXST_B1, dm->slot_dur[CXST_B1],
4109 _slot_set(btc, CXST_B4, dm->slot_dur[CXST_B4],
4118 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC && dm->tdma.rxflctrl) {
4119 null_role = FIELD_PREP(0x0f, dm->wl_scc.null_role1) |
4120 FIELD_PREP(0xf0, dm->wl_scc.null_role2);
4124 /* enter leak_slot after each null-1 */
4125 if (dm->leak_ap && dm->tdma.leak_n > 1)
4128 if (dm->tdma_instant_excute) {
4129 btc->dm.tdma.option_ctrl |= BIT(0);
4130 btc->update_policy_force = true;
4138 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl;
4144 if (rtwdev->btc.ver->fwlrole == 8) {
4145 plt.band = wl->pta_req_mac;
4146 if (wl->bt_polut_type[plt.band] == tx_val)
4149 wl->bt_polut_type[plt.band] = tx_val;
4157 if (!rtwdev->dbcc_en)
4169 struct rtw89_btc *btc = &rtwdev->btc;
4170 struct rtw89_btc_dm *dm = &btc->dm;
4171 struct rtw89_btc_cx *cx = &btc->cx;
4172 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4173 struct rtw89_btc_bt_info *bt = &cx->bt;
4174 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
4181 if (btc->ver->fwlrole == 1)
4182 dbcc_chg = wl->role_info_v1.dbcc_chg;
4183 else if (btc->ver->fwlrole == 2)
4184 dbcc_chg = wl->role_info_v2.dbcc_chg;
4185 else if (btc->ver->fwlrole == 7)
4186 dbcc_chg = wl->role_info_v7.dbcc_chg;
4187 else if (btc->ver->fwlrole == 8)
4188 dbcc_chg = wl->role_info_v8.dbcc_chg;
4190 if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF ||
4191 btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE ||
4192 btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || dbcc_chg)
4195 if (!force_exec && ant_path_type == dm->set_ant_path) {
4200 } else if (bt->rfk_info.map.run) {
4204 } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK &&
4205 wl->rfk_info.state != BTC_WRFK_STOP) {
4211 dm->set_ant_path = ant_path_type;
4216 __func__, phy_map, dm->set_ant_path & 0xff);
4223 if (bt->enable.now)
4242 if (rtwdev->dbcc_en) {
4244 b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G);
4250 wl_dinfo->real_band[0] == RTW89_BAND_2G &&
4251 wl_dinfo->real_band[1] == RTW89_BAND_5G)
4299 struct rtw89_btc *btc = &rtwdev->btc;
4300 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4301 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
4302 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8;
4304 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
4305 struct rtw89_btc_dm *dm = &btc->dm;
4308 if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF ||
4309 btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE ||
4310 btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || wl_rinfo->dbcc_chg)
4313 if (wl_rinfo->link_mode != BTC_WLINK_25G_MCC &&
4314 btc->dm.wl_btg_rx == 2)
4317 if (!force_exec && ant_path_type == dm->set_ant_path) {
4322 } else if (bt->rfk_info.map.run) {
4326 } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK &&
4327 wl->rfk_info.state != BTC_WRFK_STOP) {
4333 dm->set_ant_path = ant_path_type;
4337 __func__, phy_map, dm->set_ant_path & 0xff);
4342 if (bt->enable.now && bt->run_patch_code)
4359 if (wl_rinfo->dbcc_en) {
4360 if (wl_dinfo->real_band[RTW89_PHY_0] == RTW89_BAND_2G)
4366 if (wl_dinfo->real_band[RTW89_PHY_1] == RTW89_BAND_2G)
4389 BTC_WLACT_SW_HI); /* no BT-Tx */
4401 if (rtwdev->chip->chip_id == RTL8922A)
4423 struct rtw89_btc *btc = &rtwdev->btc;
4424 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4428 if (wl->status.map.rf_off || btc->dm.bt_only) {
4430 } else if (wl->status.map.lps == BTC_LPS_RF_ON) {
4439 } else if (wl->status.map.lps == BTC_LPS_RF_ON) {
4440 if (btc->cx.bt.link_info.a2dp_desc.active)
4451 struct rtw89_btc *btc = &rtwdev->btc;
4458 btc->dm.freerun = true;
4479 struct rtw89_btc *btc = &rtwdev->btc;
4480 struct rtw89_btc_bt_link_info *b = &btc->cx.bt.link_info;
4481 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4485 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
4486 switch (btc->cx.state_map) {
4487 case BTC_WBUSY_BNOSCAN: /*wl-busy + bt idle*/
4488 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-idle */
4489 if (b->status.map.connect)
4491 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL))
4496 case BTC_WBUSY_BSCAN: /*wl-busy + bt-inq */
4500 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq */
4504 case BTC_WLINKING: /* wl-connecting + bt-inq or bt-idle */
4508 case BTC_WIDLE: /* wl-idle + bt-idle */
4512 } else { /* dedicated-antenna */
4519 struct rtw89_btc *btc = &rtwdev->btc;
4520 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4524 if (btc->ant_type == BTC_ANT_SHARED) {
4525 if (btc->cx.wl.status.map._4way) {
4527 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) {
4528 btc->cx.bt.scan_rx_low_pri = true;
4534 if (wl->bg_mode)
4536 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL))
4545 const struct rtw89_chip_info *chip = rtwdev->chip;
4546 struct rtw89_btc *btc = &rtwdev->btc;
4547 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4548 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
4549 struct rtw89_btc_bt_hid_desc *hid = &bt->link_info.hid_desc;
4554 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
4555 if (wl->status.map._4way) {
4557 } else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) {
4558 btc->cx.bt.scan_rx_low_pri = true;
4559 if (hid->type & BTC_HID_BLE)
4563 } else if (hid->type == BTC_HID_218) {
4564 bt->scan_rx_low_pri = true;
4566 } else if (chip->para_ver == 0x1) {
4571 } else { /* dedicated-antenna */
4572 if (wl->bg_mode)
4574 else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL))
4585 struct rtw89_btc *btc = &rtwdev->btc;
4586 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
4587 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
4588 struct rtw89_btc_dm *dm = &btc->dm;
4592 switch (btc->cx.state_map) {
4593 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP */
4594 if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
4595 dm->slot_dur[CXST_W1] = 40;
4596 dm->slot_dur[CXST_B1] = 200;
4604 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP */
4607 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP */
4610 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP */
4611 case BTC_WLINKING: /* wl-connecting + bt-A2DP */
4612 if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
4613 dm->slot_dur[CXST_W1] = 40;
4614 dm->slot_dur[CXST_B1] = 200;
4622 case BTC_WIDLE: /* wl-idle + bt-A2DP */
4630 struct rtw89_btc *btc = &rtwdev->btc;
4634 switch (btc->cx.state_map) {
4635 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2dp_Sink */
4638 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2dp_Sink */
4641 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2dp_Sink */
4644 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2dp_Sink */
4647 case BTC_WLINKING: /* wl-connecting + bt-A2dp_Sink */
4650 case BTC_WIDLE: /* wl-idle + bt-A2dp_Sink */
4658 struct rtw89_btc *btc = &rtwdev->btc;
4659 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
4660 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
4661 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc;
4665 switch (btc->cx.state_map) {
4666 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-PAN */
4668 btc->dm.slot_dur[CXST_W1] = 80;
4669 btc->dm.slot_dur[CXST_B1] = 20;
4675 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-PAN */
4678 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-PAN */
4681 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-PAN */
4684 case BTC_WLINKING: /* wl-connecting + bt-PAN */
4687 case BTC_WIDLE: /* wl-idle + bt-pan */
4695 struct rtw89_btc *btc = &rtwdev->btc;
4696 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
4697 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
4698 struct rtw89_btc_dm *dm = &btc->dm;
4702 switch (btc->cx.state_map) {
4703 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+HID */
4704 case BTC_WIDLE: /* wl-idle + bt-A2DP */
4705 if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
4706 dm->slot_dur[CXST_W1] = 40;
4707 dm->slot_dur[CXST_B1] = 200;
4715 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+HID */
4719 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+HID */
4722 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+HID */
4723 case BTC_WLINKING: /* wl-connecting + bt-A2DP+HID */
4724 if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
4725 dm->slot_dur[CXST_W1] = 40;
4726 dm->slot_dur[CXST_B1] = 200;
4739 struct rtw89_btc *btc = &rtwdev->btc;
4743 switch (btc->cx.state_map) {
4744 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+PAN */
4747 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+PAN */
4750 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+PAN */
4753 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+PAN */
4756 case BTC_WLINKING: /* wl-connecting + bt-A2DP+PAN */
4759 case BTC_WIDLE: /* wl-idle + bt-A2DP+PAN */
4767 struct rtw89_btc *btc = &rtwdev->btc;
4771 switch (btc->cx.state_map) {
4772 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-PAN+HID */
4775 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-PAN+HID */
4778 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-PAN+HID */
4781 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-PAN+HID */
4784 case BTC_WLINKING: /* wl-connecting + bt-PAN+HID */
4787 case BTC_WIDLE: /* wl-idle + bt-PAN+HID */
4795 struct rtw89_btc *btc = &rtwdev->btc;
4799 switch (btc->cx.state_map) {
4800 case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+PAN+HID */
4804 case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+PAN+HID */
4808 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+PAN+HID */
4812 case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+PAN+HID */
4813 case BTC_WLINKING: /* wl-connecting + bt-A2DP+PAN+HID */
4817 case BTC_WIDLE: /* wl-idle + bt-A2DP+PAN+HID */
4832 struct rtw89_btc *btc = &rtwdev->btc;
4836 if (btc->ant_type == BTC_ANT_SHARED)
4850 struct rtw89_btc *btc = &rtwdev->btc;
4851 struct rtw89_btc_wl_rfk_info rfk = btc->cx.wl.rfk_info;
4859 btc->dm.tdma_instant_excute = 1;
4862 btc->ant_type == BTC_ANT_SHARED) {
4873 struct rtw89_btc *btc = &rtwdev->btc;
4874 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4875 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
4876 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
4877 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
4878 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
4879 struct rtw89_btc_wl_role_info *wl_rinfo_v0 = &wl->role_info;
4880 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
4881 const struct rtw89_chip_info *chip = rtwdev->chip;
4882 const struct rtw89_btc_ver *ver = btc->ver;
4883 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
4884 struct rtw89_btc_dm *dm = &btc->dm;
4886 u32 run_reason = btc->dm.run_reason;
4890 if (btc->manual_ctrl)
4893 if (ver->fwlrole == 0)
4894 wl_rinfo.link_mode = wl_rinfo_v0->link_mode;
4895 else if (ver->fwlrole == 1)
4896 wl_rinfo.link_mode = wl_rinfo_v1->link_mode;
4897 else if (ver->fwlrole == 2)
4898 wl_rinfo.link_mode = wl_rinfo_v2->link_mode;
4899 else if (ver->fwlrole == 7)
4900 wl_rinfo.link_mode = wl_rinfo_v7->link_mode;
4901 else if (ver->fwlrole == 8)
4902 wl_rinfo.link_mode = wl_rinfo_v8->link_mode;
4906 if (rtwdev->dbcc_en) {
4907 if (ver->fwlrole == 0) {
4911 if (wl_dinfo->real_band[i] == RTW89_BAND_2G)
4914 } else if (ver->fwlrole == 1) {
4915 wl_rinfo.dbcc_2g_phy = wl_rinfo_v1->dbcc_2g_phy;
4916 } else if (ver->fwlrole == 2) {
4917 wl_rinfo.dbcc_2g_phy = wl_rinfo_v2->dbcc_2g_phy;
4918 } else if (ver->fwlrole == 7) {
4919 wl_rinfo.dbcc_2g_phy = wl_rinfo_v7->dbcc_2g_phy;
4920 } else if (ver->fwlrole == 8) {
4921 wl_rinfo.dbcc_2g_phy = wl_rinfo_v8->dbcc_2g_phy;
4929 else if (!(bt->run_patch_code && bt->enable.now))
4933 else if (dm->freerun)
4935 else if (rtwdev->dbcc_en && wl_rinfo.dbcc_2g_phy != RTW89_PHY_1)
4940 if (dm->wl_btg_rx_rb != dm->wl_btg_rx &&
4941 dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) {
4943 dm->wl_btg_rx_rb = val;
4948 dm->wl_btg_rx_rb != dm->wl_btg_rx ||
4949 is_btg != dm->wl_btg_rx) {
4951 dm->wl_btg_rx = is_btg;
4956 chip->ops->ctrl_btg_bt_rx(rtwdev, is_btg, RTW89_PHY_0);
4962 struct rtw89_btc *btc = &rtwdev->btc;
4963 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
4964 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
4965 struct rtw89_btc_wl_role_info_v2 *rinfo_v2 = &wl->role_info_v2;
4966 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7;
4967 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8;
4968 const struct rtw89_chip_info *chip = rtwdev->chip;
4969 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
4970 struct rtw89_btc_dm *dm = &btc->dm;
4972 u8 role_ver = rtwdev->btc.ver->fwlrole;
4975 if (btc->manual_ctrl)
4979 dbcc_en = rinfo_v2->dbcc_en;
4980 link_mode = rinfo_v2->link_mode;
4981 dbcc_2g_phy = rinfo_v2->dbcc_2g_phy;
4983 dbcc_en = rinfo_v7->dbcc_en;
4984 link_mode = rinfo_v7->link_mode;
4985 dbcc_2g_phy = rinfo_v7->dbcc_2g_phy;
4987 dbcc_en = rinfo_v8->dbcc_en;
4988 link_mode = rinfo_v8->link_mode;
4989 dbcc_2g_phy = rinfo_v7->dbcc_2g_phy;
4996 } else if (!(bt->run_patch_code && bt->enable.now)) {
5001 btc->cx.bt.link_info.profile_cnt.now == 0) {
5003 } else if (dm->tdma_now.type != CXTDMA_OFF &&
5004 !bt_linfo->hfp_desc.exist &&
5005 !bt_linfo->hid_desc.exist &&
5006 dm->fddt_train == BTC_FDDT_DISABLE) {
5010 } else if (btc->ant_type == BTC_ANT_SHARED) {
5016 if (dm->wl_pre_agc_rb != dm->wl_pre_agc &&
5017 dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND) {
5019 dm->wl_pre_agc_rb = val;
5022 if ((wl->coex_mode == BTC_MODE_NORMAL &&
5023 (dm->run_reason == BTC_RSN_NTFY_INIT ||
5024 dm->run_reason == BTC_RSN_NTFY_SWBAND ||
5025 dm->wl_pre_agc_rb != dm->wl_pre_agc)) ||
5026 is_preagc != dm->wl_pre_agc) {
5027 dm->wl_pre_agc = is_preagc;
5031 chip->ops->ctrl_nbtg_bt_tx(rtwdev, dm->wl_pre_agc, RTW89_PHY_0);
5048 struct rtw89_dev *rtwdev = iter_data->rtwdev;
5049 struct rtw89_btc *btc = &rtwdev->btc;
5050 struct rtw89_btc_cx *cx = &btc->cx;
5051 struct rtw89_btc_wl_info *wl = &cx->wl;
5053 u8 port = rtwvif_link->port;
5054 u32 tx_time = iter_data->tx_time;
5055 u8 tx_retry = iter_data->tx_retry;
5056 u16 enable = iter_data->enable;
5057 bool reenable = iter_data->reenable;
5059 if (btc->ver->fwlrole == 8)
5060 plink = &wl->rlink_info[port][0];
5062 plink = &wl->link_info[port];
5067 if (!plink->connected) {
5070 __func__, plink->connected);
5074 /* backup the original tx time before tx-limit on */
5076 rtw89_mac_get_tx_time(rtwdev, rtwsta_link, &plink->tx_time);
5077 rtw89_mac_get_tx_retry_limit(rtwdev, rtwsta_link, &plink->tx_retry);
5080 __func__, plink->tx_time, plink->tx_retry);
5083 /* restore the original tx time if no tx-limit */
5085 rtw89_mac_set_tx_time(rtwdev, rtwsta_link, true, plink->tx_time);
5087 plink->tx_retry);
5090 __func__, plink->tx_time, plink->tx_retry);
5111 rtwvif_link = rtwsta_link->rtwvif_link;
5118 struct rtw89_btc *btc = &rtwdev->btc;
5119 const struct rtw89_btc_ver *ver = btc->ver;
5120 struct rtw89_btc_cx *cx = &btc->cx;
5121 struct rtw89_btc_dm *dm = &btc->dm;
5122 struct rtw89_btc_wl_info *wl = &cx->wl;
5123 struct rtw89_btc_bt_info *bt = &cx->bt;
5124 struct rtw89_btc_bt_link_info *b = &bt->link_info;
5125 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc;
5126 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc;
5127 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
5128 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
5129 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
5130 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
5131 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
5138 if (btc->manual_ctrl)
5141 if (ver->fwlrole == 0)
5142 mode = wl_rinfo->link_mode;
5143 else if (ver->fwlrole == 1)
5144 mode = wl_rinfo_v1->link_mode;
5145 else if (ver->fwlrole == 2)
5146 mode = wl_rinfo_v2->link_mode;
5147 else if (ver->fwlrole == 7)
5148 mode = wl_rinfo_v7->link_mode;
5149 else if (ver->fwlrole == 8)
5150 mode = wl_rinfo_v8->link_mode;
5154 if (ver->fcxctrl == 7)
5155 igno_bt = btc->ctrl.ctrl_v7.igno_bt;
5157 igno_bt = btc->ctrl.ctrl.igno_bt;
5159 if (btc->dm.freerun || igno_bt || b->profile_cnt.now == 0 ||
5164 } else if ((hfp->exist && hid->exist) || hid->pair_cnt > 1) {
5168 } else if (hfp->exist || hid->exist) {
5178 if (dm->wl_tx_limit.enable == enable &&
5179 dm->wl_tx_limit.tx_time == tx_time &&
5180 dm->wl_tx_limit.tx_retry == tx_retry)
5183 if (!dm->wl_tx_limit.enable && enable)
5186 dm->wl_tx_limit.enable = enable;
5187 dm->wl_tx_limit.tx_time = tx_time;
5188 dm->wl_tx_limit.tx_retry = tx_retry;
5195 ieee80211_iterate_stations_atomic(rtwdev->hw,
5202 struct rtw89_btc *btc = &rtwdev->btc;
5203 const struct rtw89_btc_ver *ver = btc->ver;
5204 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5205 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
5206 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
5207 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
5208 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
5209 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
5210 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5214 if (ver->fwlrole == 0)
5215 mode = wl_rinfo->link_mode;
5216 else if (ver->fwlrole == 1)
5217 mode = wl_rinfo_v1->link_mode;
5218 else if (ver->fwlrole == 2)
5219 mode = wl_rinfo_v2->link_mode;
5220 else if (ver->fwlrole == 7)
5221 mode = wl_rinfo_v7->link_mode;
5222 else if (ver->fwlrole == 8)
5223 mode = wl_rinfo_v8->link_mode;
5227 if (mode != BTC_WLINK_NOLINK && btc->dm.wl_btg_rx)
5230 if (bt_hi_lna_rx == bt->hi_lna_rx)
5238 struct rtw89_btc *btc = &rtwdev->btc;
5239 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5241 _write_scbd(rtwdev, BTC_WSCB_RXSCAN_PRI, (bool)(!!bt->scan_rx_low_pri));
5246 struct rtw89_btc *btc = &rtwdev->btc;
5247 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5248 struct rtw89_btc_wl_smap *wl_smap = &wl->status.map;
5249 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5250 struct rtw89_btc_dm *dm = &btc->dm;
5261 bt_rom_code_id = chip_id_to_bt_rom_code_id(rtwdev->btc.ver->chip_id);
5262 bt_fw_ver = bt->ver_info.fw & 0xffff;
5263 if (bt->enable.now &&
5265 (bt_fw_ver == bt_rom_code_id && bt->run_patch_code && rtwdev->chip->scbd)))
5270 if (dm->run_reason == BTC_RSN_NTFY_INIT ||
5271 dm->run_reason == BTC_RSN_NTFY_RADIO_STATE ||
5272 dm->run_reason == BTC_RSN_NTFY_POWEROFF) {
5275 if (wl_smap->rf_off == 1 || wl_smap->lps != BTC_LPS_OFF)
5281 if (wl->scbd_change) {
5282 rtw89_mac_cfg_sb(rtwdev, wl->scbd);
5284 wl->scbd);
5285 wl->scbd_change = false;
5286 btc->cx.cnt_wl[BTC_WCNT_SCBDUPDATE]++;
5288 btc->dm.tdma_instant_excute = 0;
5293 struct rtw89_btc *btc = &rtwdev->btc;
5294 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5295 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
5296 struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc;
5297 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
5298 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc;
5299 struct rtw89_btc_dm *dm = &btc->dm;
5302 if (dm->freerun_chk) {
5307 if (bt_linfo->hfp_desc.exist)
5310 if (bt_linfo->hid_desc.exist)
5313 if (bt_linfo->a2dp_desc.exist)
5316 if (bt_linfo->pan_desc.exist)
5336 else if (bt_linfo->multi_link.now && !hid.pair_cnt)
5383 struct rtw89_btc *btc = &rtwdev->btc;
5386 if (btc->ant_type == BTC_ANT_SHARED) {
5387 if (btc->cx.wl.status.map._4way)
5389 else if (btc->cx.wl.status.val & btc_scanning_map.val)
5391 else if (btc->cx.bt.link_info.status.map.connect == 0)
5395 } else { /* dedicated-antenna */
5399 btc->dm.e2g_slot_limit = BTC_E2G_LIMIT_DEF;
5407 struct rtw89_btc *btc = &rtwdev->btc;
5408 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5409 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
5411 if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
5414 } else if (rtwdev->dbcc_en) {
5415 if (wl_dinfo->real_band[RTW89_PHY_0] != RTW89_BAND_2G &&
5416 wl_dinfo->real_band[RTW89_PHY_1] != RTW89_BAND_2G)
5421 if (wl->scan_info.band[RTW89_PHY_0] != RTW89_BAND_2G)
5429 { struct rtw89_btc *btc = &rtwdev->btc;
5433 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
5434 if (btc->cx.bt.link_info.profile_cnt.now == 0)
5440 } else { /* dedicated-antenna */
5447 struct rtw89_btc *btc = &rtwdev->btc;
5451 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
5452 if (btc->cx.bt.link_info.profile_cnt.now == 0)
5458 } else { /* dedicated-antenna */
5465 struct rtw89_btc *btc = &rtwdev->btc;
5466 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5467 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5468 struct rtw89_btc_dm *dm = &btc->dm;
5469 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &wl->role_info_v1;
5473 if (btc->ant_type == BTC_ANT_DEDICATED) {
5476 /* shared-antenna */
5477 switch (wl_rinfo->mrole_type) {
5479 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION;
5480 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_P2P_CLIENT;
5481 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */
5485 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION;
5486 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_STATION;
5487 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */
5493 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION;
5494 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_NONE;
5495 dur = wl_rinfo->mrole_noa_duration;
5497 if (wl->status.map._4way) {
5498 dm->wl_scc.ebt_null = 0;
5500 } else if (bt->link_info.status.map.connect == 0) {
5501 dm->wl_scc.ebt_null = 0;
5503 } else if (bt->link_info.a2dp_desc.exist &&
5504 dur < btc->bt_req_len) {
5505 dm->wl_scc.ebt_null = 1; /* tx null at EBT */
5507 } else if (bt->link_info.a2dp_desc.exist ||
5508 bt->link_info.pan_desc.exist) {
5509 dm->wl_scc.ebt_null = 1; /* tx null at EBT */
5512 dm->wl_scc.ebt_null = 0;
5527 struct rtw89_btc *btc = &rtwdev->btc;
5528 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5529 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5530 struct rtw89_btc_dm *dm = &btc->dm;
5531 struct rtw89_btc_wl_role_info_v2 *rinfo_v2 = &wl->role_info_v2;
5532 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7;
5536 if (btc->ver->fwlrole == 2) {
5537 mrole_type = rinfo_v2->mrole_type;
5538 mrole_noa_duration = rinfo_v2->mrole_noa_duration;
5539 } else if (btc->ver->fwlrole == 7) {
5540 mrole_type = rinfo_v7->mrole_type;
5541 mrole_noa_duration = rinfo_v7->mrole_noa_duration;
5546 if (btc->ant_type == BTC_ANT_DEDICATED) {
5549 /* shared-antenna */
5552 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION;
5553 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_P2P_CLIENT;
5554 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */
5558 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION;
5559 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_STATION;
5560 dm->wl_scc.ebt_null = 0; /* no ext-slot-control */
5566 dm->wl_scc.null_role1 = RTW89_WIFI_ROLE_STATION;
5567 dm->wl_scc.null_role2 = RTW89_WIFI_ROLE_NONE;
5570 if (wl->status.map._4way) {
5571 dm->wl_scc.ebt_null = 0;
5573 } else if (bt->link_info.status.map.connect == 0) {
5574 dm->wl_scc.ebt_null = 0;
5576 } else if (bt->link_info.a2dp_desc.exist &&
5577 dur < btc->bt_req_len) {
5578 dm->wl_scc.ebt_null = 1; /* tx null at EBT */
5580 } else if (bt->link_info.a2dp_desc.exist ||
5581 bt->link_info.pan_desc.exist) {
5582 dm->wl_scc.ebt_null = 1; /* tx null at EBT */
5585 dm->wl_scc.ebt_null = 0;
5600 struct rtw89_btc *btc = &rtwdev->btc;
5601 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5602 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
5603 struct rtw89_btc_dm *dm = &btc->dm;
5606 if (btc->ant_type == BTC_ANT_SHARED) {
5607 if (wl->status.map._4way)
5609 else if (bt->link_info.status.map.connect == 0)
5617 dm->e2g_slot_limit = BTC_E2G_LIMIT_DEF;
5625 struct rtw89_btc *btc = &rtwdev->btc;
5629 if (btc->ant_type == BTC_ANT_SHARED) {
5630 if (btc->cx.bt.link_info.profile_cnt.now == 0)
5635 } else {/* dedicated-antenna */
5642 struct rtw89_btc *btc = &rtwdev->btc;
5646 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
5647 if (btc->cx.bt.link_info.profile_cnt.now == 0)
5653 } else { /* dedicated-antenna */
5660 struct rtw89_btc *btc = &rtwdev->btc;
5664 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
5666 } else {/* dedicated-antenna */
5673 struct rtw89_btc *btc = &rtwdev->btc;
5677 if (btc->ant_type == BTC_ANT_SHARED) { /* shared-antenna */
5678 if (btc->cx.bt.link_info.profile_cnt.now == 0)
5684 } else { /* dedicated-antenna */
5691 const struct rtw89_chip_info *chip = rtwdev->chip;
5692 struct rtw89_btc *btc = &rtwdev->btc;
5695 if (!chip->scbd)
5702 btc->cx.cnt_bt[BTC_BCNT_SCBDREAD]++;
5708 const struct rtw89_chip_info *chip = rtwdev->chip;
5709 struct rtw89_btc *btc = &rtwdev->btc;
5710 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5714 if (!chip->scbd)
5717 scbd_val = state ? wl->scbd | val : wl->scbd & ~val;
5722 if (scbd_val != wl->scbd || force_exec) {
5723 wl->scbd = scbd_val;
5724 wl->scbd_change = true;
5731 const struct rtw89_chip_info *chip = rtwdev->chip;
5732 u8 next_state, tol = chip->rssi_tol;
5761 struct rtw89_btc *btc = &rtwdev->btc;
5763 btc->cx.wl.dbcc_info.real_band[phy_idx] =
5764 btc->cx.wl.scan_info.phy_map & BIT(phy_idx) ?
5765 btc->cx.wl.dbcc_info.scan_band[phy_idx] :
5766 btc->cx.wl.dbcc_info.op_band[phy_idx];
5771 struct rtw89_btc *btc = &rtwdev->btc;
5772 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5773 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info;
5774 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
5775 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
5789 wl_rinfo->active_role[cnt_active - 1].role = wl_linfo[i].role;
5790 wl_rinfo->active_role[cnt_active - 1].pid = wl_linfo[i].pid;
5791 wl_rinfo->active_role[cnt_active - 1].phy = wl_linfo[i].phy;
5792 wl_rinfo->active_role[cnt_active - 1].band = wl_linfo[i].band;
5793 wl_rinfo->active_role[cnt_active - 1].noa = (u8)wl_linfo[i].noa;
5794 wl_rinfo->active_role[cnt_active - 1].connected = 0;
5796 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid;
5801 if (rtwdev->dbcc_en && phy < RTW89_PHY_MAX) {
5802 wl_dinfo->role[phy] = wl_linfo[i].role;
5803 wl_dinfo->op_band[phy] = wl_linfo[i].band;
5820 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role);
5821 wl_rinfo->active_role[cnt_active - 1].ch = wl_linfo[i].ch;
5822 wl_rinfo->active_role[cnt_active - 1].bw = wl_linfo[i].bw;
5823 wl_rinfo->active_role[cnt_active - 1].connected = 1;
5827 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1)
5832 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1)
5839 wl_rinfo->connect_cnt = cnt_connect;
5843 wl_rinfo->link_mode = BTC_WLINK_NOLINK;
5844 wl_rinfo->role_map.role.none = 1;
5846 wl_rinfo->link_mode = BTC_WLINK_5G;
5847 } else if (wl_rinfo->role_map.role.nan) {
5848 wl_rinfo->link_mode = BTC_WLINK_2G_NAN;
5850 wl_rinfo->link_mode = BTC_WLINK_OTHER;
5852 if (rtwdev->dbcc_en) {
5853 switch (wl_dinfo->role[RTW89_PHY_0]) {
5855 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
5858 wl_rinfo->link_mode = BTC_WLINK_2G_GO;
5861 wl_rinfo->link_mode = BTC_WLINK_2G_GC;
5864 wl_rinfo->link_mode = BTC_WLINK_2G_AP;
5867 wl_rinfo->link_mode = BTC_WLINK_OTHER;
5871 wl_rinfo->link_mode = BTC_WLINK_25G_MCC;
5874 if (wl_rinfo->role_map.role.station &&
5875 (wl_rinfo->role_map.role.p2p_go ||
5876 wl_rinfo->role_map.role.p2p_gc ||
5877 wl_rinfo->role_map.role.ap)) {
5879 wl_rinfo->link_mode = BTC_WLINK_2G_SCC;
5881 wl_rinfo->link_mode = BTC_WLINK_2G_MCC;
5883 wl_rinfo->link_mode = BTC_WLINK_2G_MCC;
5886 if (wl_rinfo->role_map.role.station)
5887 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
5888 else if (wl_rinfo->role_map.role.ap)
5889 wl_rinfo->link_mode = BTC_WLINK_2G_AP;
5890 else if (wl_rinfo->role_map.role.p2p_go)
5891 wl_rinfo->link_mode = BTC_WLINK_2G_GO;
5892 else if (wl_rinfo->role_map.role.p2p_gc)
5893 wl_rinfo->link_mode = BTC_WLINK_2G_GC;
5895 wl_rinfo->link_mode = BTC_WLINK_OTHER;
5898 /* if no client_joined, don't care P2P-GO/AP role */
5899 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) {
5901 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC ||
5902 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) {
5903 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
5904 wl_rinfo->connect_cnt = 1;
5905 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO ||
5906 wl_rinfo->link_mode == BTC_WLINK_2G_AP) {
5907 wl_rinfo->link_mode = BTC_WLINK_NOLINK;
5908 wl_rinfo->connect_cnt = 0;
5915 cnt_connect, cnt_connecting, wl_rinfo->link_mode);
5922 struct rtw89_btc *btc = &rtwdev->btc;
5923 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
5924 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info;
5925 struct rtw89_btc_wl_role_info_v1 *wl_rinfo = &wl->role_info_v1;
5926 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
5940 wl_rinfo->active_role_v1[cnt_active - 1].role = wl_linfo[i].role;
5941 wl_rinfo->active_role_v1[cnt_active - 1].pid = wl_linfo[i].pid;
5942 wl_rinfo->active_role_v1[cnt_active - 1].phy = wl_linfo[i].phy;
5943 wl_rinfo->active_role_v1[cnt_active - 1].band = wl_linfo[i].band;
5944 wl_rinfo->active_role_v1[cnt_active - 1].noa = (u8)wl_linfo[i].noa;
5945 wl_rinfo->active_role_v1[cnt_active - 1].connected = 0;
5947 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid;
5951 if (rtwdev->dbcc_en && phy < RTW89_PHY_MAX) {
5952 wl_dinfo->role[phy] = wl_linfo[i].role;
5953 wl_dinfo->op_band[phy] = wl_linfo[i].band;
5970 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role);
5971 wl_rinfo->active_role_v1[cnt_active - 1].ch = wl_linfo[i].ch;
5972 wl_rinfo->active_role_v1[cnt_active - 1].bw = wl_linfo[i].bw;
5973 wl_rinfo->active_role_v1[cnt_active - 1].connected = 1;
5977 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1)
5982 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1)
5989 wl_rinfo->connect_cnt = cnt_connect;
5993 wl_rinfo->link_mode = BTC_WLINK_NOLINK;
5994 wl_rinfo->role_map.role.none = 1;
5996 wl_rinfo->link_mode = BTC_WLINK_5G;
5997 } else if (wl_rinfo->role_map.role.nan) {
5998 wl_rinfo->link_mode = BTC_WLINK_2G_NAN;
6000 wl_rinfo->link_mode = BTC_WLINK_OTHER;
6002 if (rtwdev->dbcc_en) {
6003 switch (wl_dinfo->role[RTW89_PHY_0]) {
6005 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
6008 wl_rinfo->link_mode = BTC_WLINK_2G_GO;
6011 wl_rinfo->link_mode = BTC_WLINK_2G_GC;
6014 wl_rinfo->link_mode = BTC_WLINK_2G_AP;
6017 wl_rinfo->link_mode = BTC_WLINK_OTHER;
6021 wl_rinfo->link_mode = BTC_WLINK_25G_MCC;
6024 if (wl_rinfo->role_map.role.station &&
6025 (wl_rinfo->role_map.role.p2p_go ||
6026 wl_rinfo->role_map.role.p2p_gc ||
6027 wl_rinfo->role_map.role.ap)) {
6029 wl_rinfo->link_mode = BTC_WLINK_2G_SCC;
6031 wl_rinfo->link_mode = BTC_WLINK_2G_MCC;
6033 wl_rinfo->link_mode = BTC_WLINK_2G_MCC;
6036 if (wl_rinfo->role_map.role.station)
6037 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
6038 else if (wl_rinfo->role_map.role.ap)
6039 wl_rinfo->link_mode = BTC_WLINK_2G_AP;
6040 else if (wl_rinfo->role_map.role.p2p_go)
6041 wl_rinfo->link_mode = BTC_WLINK_2G_GO;
6042 else if (wl_rinfo->role_map.role.p2p_gc)
6043 wl_rinfo->link_mode = BTC_WLINK_2G_GC;
6045 wl_rinfo->link_mode = BTC_WLINK_OTHER;
6048 /* if no client_joined, don't care P2P-GO/AP role */
6049 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) {
6051 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC ||
6052 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) {
6053 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
6054 wl_rinfo->connect_cnt = 1;
6055 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO ||
6056 wl_rinfo->link_mode == BTC_WLINK_2G_AP) {
6057 wl_rinfo->link_mode = BTC_WLINK_NOLINK;
6058 wl_rinfo->connect_cnt = 0;
6065 cnt_connect, cnt_connecting, wl_rinfo->link_mode);
6072 struct rtw89_btc *btc = &rtwdev->btc;
6073 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
6074 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info;
6075 struct rtw89_btc_wl_role_info_v2 *wl_rinfo = &wl->role_info_v2;
6076 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
6090 wl_rinfo->active_role_v2[cnt_active - 1].role = wl_linfo[i].role;
6091 wl_rinfo->active_role_v2[cnt_active - 1].pid = wl_linfo[i].pid;
6092 wl_rinfo->active_role_v2[cnt_active - 1].phy = wl_linfo[i].phy;
6093 wl_rinfo->active_role_v2[cnt_active - 1].band = wl_linfo[i].band;
6094 wl_rinfo->active_role_v2[cnt_active - 1].noa = (u8)wl_linfo[i].noa;
6095 wl_rinfo->active_role_v2[cnt_active - 1].connected = 0;
6097 wl->port_id[wl_linfo[i].role] = wl_linfo[i].pid;
6101 if (rtwdev->dbcc_en && phy < RTW89_PHY_MAX) {
6102 wl_dinfo->role[phy] = wl_linfo[i].role;
6103 wl_dinfo->op_band[phy] = wl_linfo[i].band;
6120 wl_rinfo->role_map.val |= BIT(wl_linfo[i].role);
6121 wl_rinfo->active_role_v2[cnt_active - 1].ch = wl_linfo[i].ch;
6122 wl_rinfo->active_role_v2[cnt_active - 1].bw = wl_linfo[i].bw;
6123 wl_rinfo->active_role_v2[cnt_active - 1].connected = 1;
6127 if (cnt_5g <= ARRAY_SIZE(wl_5g_ch) - 1)
6132 if (cnt_2g <= ARRAY_SIZE(wl_2g_ch) - 1)
6139 wl_rinfo->connect_cnt = cnt_connect;
6143 wl_rinfo->link_mode = BTC_WLINK_NOLINK;
6144 wl_rinfo->role_map.role.none = 1;
6146 wl_rinfo->link_mode = BTC_WLINK_5G;
6147 } else if (wl_rinfo->role_map.role.nan) {
6148 wl_rinfo->link_mode = BTC_WLINK_2G_NAN;
6150 wl_rinfo->link_mode = BTC_WLINK_OTHER;
6152 if (rtwdev->dbcc_en) {
6153 switch (wl_dinfo->role[RTW89_PHY_0]) {
6155 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
6158 wl_rinfo->link_mode = BTC_WLINK_2G_GO;
6161 wl_rinfo->link_mode = BTC_WLINK_2G_GC;
6164 wl_rinfo->link_mode = BTC_WLINK_2G_AP;
6167 wl_rinfo->link_mode = BTC_WLINK_OTHER;
6171 wl_rinfo->link_mode = BTC_WLINK_25G_MCC;
6174 if (wl_rinfo->role_map.role.station &&
6175 (wl_rinfo->role_map.role.p2p_go ||
6176 wl_rinfo->role_map.role.p2p_gc ||
6177 wl_rinfo->role_map.role.ap)) {
6179 wl_rinfo->link_mode = BTC_WLINK_2G_SCC;
6181 wl_rinfo->link_mode = BTC_WLINK_2G_MCC;
6183 wl_rinfo->link_mode = BTC_WLINK_2G_MCC;
6186 if (wl_rinfo->role_map.role.station)
6187 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
6188 else if (wl_rinfo->role_map.role.ap)
6189 wl_rinfo->link_mode = BTC_WLINK_2G_AP;
6190 else if (wl_rinfo->role_map.role.p2p_go)
6191 wl_rinfo->link_mode = BTC_WLINK_2G_GO;
6192 else if (wl_rinfo->role_map.role.p2p_gc)
6193 wl_rinfo->link_mode = BTC_WLINK_2G_GC;
6195 wl_rinfo->link_mode = BTC_WLINK_OTHER;
6198 /* if no client_joined, don't care P2P-GO/AP role */
6199 if (wl_rinfo->role_map.role.p2p_go || wl_rinfo->role_map.role.ap) {
6201 if (wl_rinfo->link_mode == BTC_WLINK_2G_SCC ||
6202 wl_rinfo->link_mode == BTC_WLINK_2G_MCC) {
6203 wl_rinfo->link_mode = BTC_WLINK_2G_STA;
6204 wl_rinfo->connect_cnt = 1;
6205 } else if (wl_rinfo->link_mode == BTC_WLINK_2G_GO ||
6206 wl_rinfo->link_mode == BTC_WLINK_2G_AP) {
6207 wl_rinfo->link_mode = BTC_WLINK_NOLINK;
6208 wl_rinfo->connect_cnt = 0;
6215 cnt_connect, cnt_connecting, wl_rinfo->link_mode);
6242 if (r1->chan != r2->chan) { /* primary ch is different */
6244 } else if (r1->bw == RTW89_CHANNEL_WIDTH_40 &&
6245 r2->bw == RTW89_CHANNEL_WIDTH_40) {
6246 if (r1->offset != r2->offset)
6255 struct rtw89_btc_wl_info *wl = &rtwdev->btc.cx.wl;
6256 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &wl->role_info_v7;
6257 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &wl->role_info_v8;
6261 if (rtwdev->btc.ver->fwlrole == 7)
6262 connect_cnt = rinfo_v7->connect_cnt;
6263 else if (rtwdev->btc.ver->fwlrole == 8)
6264 connect_cnt = rinfo_v8->connect_cnt;
6268 /* find out the 2G-PHY by connect-id ->ch */
6276 /* If no any 2G-port exist, it's impossible because 5G-exclude */
6287 /* find the other-port in the 2G-PHY, ex: PHY-0:6G, PHY1: mcc/scc */
6299 /* Single-role in 2G-PHY */
6303 /* 2-role in 2G-PHY */
6315 struct rtw89_btc_wl_role_info_v8 *rinfo_v8 = &rtwdev->btc.cx.wl.role_info_v8;
6316 struct rtw89_btc_wl_role_info_v7 *rinfo_v7 = &rtwdev->btc.cx.wl.role_info_v7;
6317 u8 role_ver = rtwdev->btc.ver->fwlrole;
6323 wl_role = rinfo_v7->role_map;
6324 link_mode = rinfo_v7->link_mode;
6325 connect_cnt = rinfo_v7->connect_cnt;
6327 wl_role = rinfo_v8->role_map;
6328 link_mode = rinfo_v8->link_mode;
6329 connect_cnt = rinfo_v8->connect_cnt;
6334 /* if no client_joined, don't care P2P-GO/AP role */
6339 rinfo_v7->link_mode = BTC_WLINK_2G_STA;
6340 rinfo_v7->connect_cnt--;
6342 rinfo_v8->link_mode = BTC_WLINK_2G_STA;
6343 rinfo_v8->connect_cnt--;
6348 rinfo_v7->link_mode = BTC_WLINK_NOLINK;
6349 rinfo_v7->connect_cnt--;
6351 rinfo_v8->link_mode = BTC_WLINK_NOLINK;
6352 rinfo_v8->connect_cnt--;
6357 /* Identify 2-Role type */
6375 rinfo_v7->mrole_type = type;
6376 rinfo_v7->mrole_noa_duration = dur;
6378 rinfo_v8->mrole_type = type;
6379 rinfo_v8->mrole_noa_duration = dur;
6386 struct rtw89_btc *btc = &rtwdev->btc;
6387 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
6388 struct rtw89_btc_wl_role_info_v7 *wl_rinfo = &wl->role_info_v7;
6389 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
6390 struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info;
6406 act_role = &wl_rinfo->active_role[i];
6407 act_role->role = wl_linfo[i].role;
6411 act_role->connected = 0;
6418 act_role->connected = 1;
6419 act_role->pid = wl_linfo[i].pid;
6420 act_role->phy = wl_linfo[i].phy;
6421 act_role->band = wl_linfo[i].band;
6422 act_role->ch = wl_linfo[i].ch;
6423 act_role->bw = wl_linfo[i].bw;
6424 act_role->noa = wl_linfo[i].noa;
6425 act_role->noa_dur = wl_linfo[i].noa_duration;
6426 cid_ch[cnt - 1] = wl_linfo[i].chdef;
6427 cid_phy[cnt - 1] = wl_linfo[i].phy;
6428 cid_role[cnt - 1] = wl_linfo[i].role;
6429 wl_rinfo->role_map |= BIT(wl_linfo[i].role);
6432 phy_now = act_role->phy;
6441 act_role->client_cnt = wl_linfo[i].client_cnt;
6443 act_role->client_cnt = 0;
6446 if (act_role->noa && act_role->noa_dur > 0)
6447 noa_duration = act_role->noa_dur;
6449 if (rtwdev->dbcc_en) {
6451 wl_dinfo->role[phy_dbcc] |= BIT(wl_linfo[i].role);
6452 wl_dinfo->op_band[phy_dbcc] = wl_linfo[i].chdef.band;
6463 wl_rinfo->p2p_2g = 1;
6467 wl->bg_mode = 1;
6469 wl->he_mode = true;
6475 if (act_role->band == RTW89_BAND_5G && act_role->ch >= 100)
6476 wl->is_5g_hi_channel = 1;
6478 wl->is_5g_hi_channel = 0;
6481 wl_rinfo->connect_cnt = cnt;
6482 wl->client_cnt_inc_2g = client_inc_2g;
6486 wl_rinfo->role_map = BIT(RTW89_WIFI_ROLE_NONE);
6489 } else if (wl_rinfo->role_map & BIT(RTW89_WIFI_ROLE_NAN)) {
6493 } else if (rtwdev->dbcc_en) {
6496 /* correct 2G-located PHY band for gnt ctrl */
6498 wl_dinfo->op_band[dbcc_2g_phy] = RTW89_BAND_2G;
6502 if (_chk_role_ch_group(&cid_ch[0], &cid_ch[cnt - 1]))
6512 wl_rinfo->link_mode = mode;
6520 if (wl_rinfo->dbcc_en != rtwdev->dbcc_en) {
6521 wl_rinfo->dbcc_chg = 1;
6522 wl_rinfo->dbcc_en = rtwdev->dbcc_en;
6523 btc->cx.cnt_wl[BTC_WCNT_DBCC_CHG]++;
6526 if (rtwdev->dbcc_en) {
6527 wl_rinfo->dbcc_2g_phy = dbcc_2g_phy;
6542 struct rtw89_btc *btc = &rtwdev->btc;
6543 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
6545 struct rtw89_btc_wl_role_info_v8 *wl_rinfo = &wl->role_info_v8;
6546 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
6561 /* Extract wl->link_info[role_id][rlink_id] to wl->role_info
6563 * rlink_id: rlink index (= HW-band index)
6567 wl_linfo = &wl->rlink_info[role_id][rlink_id];
6568 if (wl_linfo->connected == MLME_LINKING)
6571 rlink = &wl_rinfo->rlink[role_id][rlink_id];
6572 rlink->role = wl_linfo->role;
6573 rlink->active = wl_linfo->active; /* Doze or not */
6574 rlink->pid = wl_linfo->pid;
6575 rlink->phy = wl_linfo->phy;
6576 rlink->rf_band = wl_linfo->band;
6577 rlink->ch = wl_linfo->ch;
6578 rlink->bw = wl_linfo->bw;
6579 rlink->noa = wl_linfo->noa;
6580 rlink->noa_dur = wl_linfo->noa_duration / 1000;
6581 rlink->client_cnt = wl_linfo->client_cnt;
6582 rlink->mode = wl_linfo->mode;
6584 switch (wl_linfo->connected) {
6586 rlink->connected = 0;
6587 if (rlink->role == RTW89_WIFI_ROLE_STATION)
6588 btc->dm.leak_ap = 0;
6591 rlink->connected = 1;
6597 wl->is_5g_hi_channel = false;
6598 wl->bg_mode = false;
6599 wl_rinfo->role_map = 0;
6600 wl_rinfo->p2p_2g = 0;
6605 rlink = &wl_rinfo->rlink[i][j];
6607 if (!rlink->active || !rlink->connected)
6611 wl_rinfo->role_map |= BIT(rlink->role);
6613 /* only if client connect for p2p-Go/AP */
6614 if ((rlink->role == RTW89_WIFI_ROLE_P2P_GO ||
6615 rlink->role == RTW89_WIFI_ROLE_AP) &&
6616 rlink->client_cnt > 1)
6619 /* Identufy if P2P-Go (GO/GC/AP) exist at 2G band*/
6620 if (rlink->rf_band == RTW89_BAND_2G &&
6621 (client_joined || rlink->role == RTW89_WIFI_ROLE_P2P_CLIENT))
6622 wl_rinfo->p2p_2g = 1;
6624 /* only one noa-role exist */
6625 if (rlink->noa && rlink->noa_dur > 0)
6626 noa_dur = rlink->noa_dur;
6628 /* for WL 5G-Rx interfered with BT issue */
6629 if (rlink->rf_band == RTW89_BAND_5G && rlink->ch >= 100)
6630 wl->is_5g_hi_channel = 1;
6632 if ((rlink->mode & BIT(BTC_WL_MODE_11B)) ||
6633 (rlink->mode & BIT(BTC_WL_MODE_11G)))
6634 wl->bg_mode = 1;
6636 if (rtwdev->chip->para_ver & BTC_FEAT_MLO_SUPPORT)
6639 cid_ch[cnt - 1] = wl_linfo->chdef;
6640 cid_phy[cnt - 1] = rlink->phy;
6641 cid_role[cnt - 1] = rlink->role;
6643 if (rlink->rf_band != RTW89_BAND_2G) {
6653 if (rtwdev->chip->para_ver & BTC_FEAT_MLO_SUPPORT) {
6658 dbcc_en = rtwdev->dbcc_en;
6665 } else if (wl_rinfo->role_map & BIT(RTW89_WIFI_ROLE_NAN)) {
6675 if (_chk_role_ch_group(&cid_ch[0], &cid_ch[cnt - 1]))
6684 wl_rinfo->link_mode = mode;
6685 wl_rinfo->connect_cnt = cnt;
6686 if (wl_rinfo->connect_cnt == 0)
6687 wl_rinfo->role_map = BIT(RTW89_WIFI_ROLE_NONE);
6690 wl_rinfo->dbcc_2g_phy = dbcc_2g_phy;
6691 if (wl_rinfo->dbcc_en != dbcc_en) {
6692 wl_rinfo->dbcc_en = dbcc_en;
6693 wl_rinfo->dbcc_chg = 1;
6694 btc->cx.cnt_wl[BTC_WCNT_DBCC_CHG]++;
6696 wl_rinfo->dbcc_chg = 0;
6699 if (wl_rinfo->dbcc_en) {
6704 wl_dinfo->op_band[RTW89_PHY_0] = RTW89_BAND_5G;
6705 wl_dinfo->op_band[RTW89_PHY_1] = RTW89_BAND_2G;
6706 } else if (wl_rinfo->dbcc_2g_phy == RTW89_PHY_1) {
6708 wl_dinfo->op_band[RTW89_PHY_0] = RTW89_BAND_5G;
6709 wl_dinfo->op_band[RTW89_PHY_1] = RTW89_BAND_2G;
6712 wl_dinfo->op_band[RTW89_PHY_0] = RTW89_BAND_2G;
6713 wl_dinfo->op_band[RTW89_PHY_1] = RTW89_BAND_5G;
6719 wl_rinfo->pta_req_band = pta_req_band;
6727 struct rtw89_btc *btc = &rtwdev->btc;
6728 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
6729 struct rtw89_btc_cx *cx = &btc->cx;
6730 struct rtw89_btc_wl_info *wl = &cx->wl;
6732 mutex_lock(&rtwdev->mutex);
6734 dm->cnt_notify[BTC_NCNT_TIMER]++;
6735 if (wl->status.map._4way)
6736 wl->status.map._4way = false;
6737 if (wl->status.map.connecting)
6738 wl->status.map.connecting = false;
6741 mutex_unlock(&rtwdev->mutex);
6748 struct rtw89_btc *btc = &rtwdev->btc;
6749 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
6750 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
6752 mutex_lock(&rtwdev->mutex);
6754 dm->cnt_notify[BTC_NCNT_TIMER]++;
6755 a2dp->play_latency = 0;
6757 mutex_unlock(&rtwdev->mutex);
6764 struct rtw89_btc *btc = &rtwdev->btc;
6765 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
6766 struct rtw89_btc_cx *cx = &btc->cx;
6767 struct rtw89_btc_wl_info *wl = &cx->wl;
6769 mutex_lock(&rtwdev->mutex);
6771 dm->cnt_notify[BTC_NCNT_TIMER]++;
6772 if (wl->rfk_info.state != BTC_WRFK_STOP) {
6775 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]++;
6776 dm->error.map.wl_rfk_timeout = true;
6777 wl->rfk_info.state = BTC_WRFK_STOP;
6781 mutex_unlock(&rtwdev->mutex);
6786 const struct rtw89_chip_info *chip = rtwdev->chip;
6787 struct rtw89_btc *btc = &rtwdev->btc;
6788 struct rtw89_btc_cx *cx = &btc->cx;
6789 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
6793 if (!chip->scbd)
6807 bt->enable.now = 0;
6809 bt->enable.now = 1;
6811 if (bt->enable.now != bt->enable.last)
6814 /* reset bt info if bt re-enable */
6815 if (bt->enable.now && !bt->enable.last) {
6817 cx->cnt_bt[BTC_BCNT_REENABLE]++;
6818 bt->enable.now = 1;
6821 bt->enable.last = bt->enable.now;
6822 bt->scbd = val;
6823 bt->mbx_avl = !!(val & BTC_BSCB_ACT);
6825 if (bt->whql_test != !!(val & BTC_BSCB_WHQL))
6828 bt->whql_test = !!(val & BTC_BSCB_WHQL);
6829 bt->btg_type = val & BTC_BSCB_BT_S1 ? BTC_BT_BTG : BTC_BT_ALONE;
6830 bt->link_info.a2dp_desc.exist = !!(val & BTC_BSCB_A2DP_ACT);
6832 bt->lna_constrain = !!(val & BTC_BSCB_BT_LNAB0) +
6835 /* if rfk run 1->0 */
6836 if (bt->rfk_info.map.run && !(val & BTC_BSCB_RFK_RUN))
6839 bt->rfk_info.map.run = !!(val & BTC_BSCB_RFK_RUN);
6840 bt->rfk_info.map.req = !!(val & BTC_BSCB_RFK_REQ);
6841 bt->hi_lna_rx = !!(val & BTC_BSCB_BT_HILNA);
6842 bt->link_info.status.map.connect = !!(val & BTC_BSCB_BT_CONNECT);
6843 bt->run_patch_code = !!(val & BTC_BSCB_PATCH_CODE);
6851 struct rtw89_btc *btc = &rtwdev->btc;
6852 struct rtw89_btc_cx *cx = &btc->cx;
6853 struct rtw89_btc_bt_info *bt = &cx->bt;
6857 cx->cnt_wl[BTC_WCNT_RFK_REQ]++;
6859 if ((bt->rfk_info.map.run || bt->rfk_info.map.req) &&
6860 !bt->rfk_info.map.timeout) {
6861 cx->cnt_wl[BTC_WCNT_RFK_REJECT]++;
6863 cx->cnt_wl[BTC_WCNT_RFK_GO]++;
6872 struct rtw89_btc *btc = &rtwdev->btc;
6873 const struct rtw89_btc_ver *ver = btc->ver;
6874 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
6875 struct rtw89_btc_cx *cx = &btc->cx;
6876 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
6877 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
6878 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
6879 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
6880 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
6881 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
6882 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
6885 lockdep_assert_held(&rtwdev->mutex);
6887 dm->run_reason = reason;
6891 if (ver->fwlrole == 0)
6892 mode = wl_rinfo->link_mode;
6893 else if (ver->fwlrole == 1)
6894 mode = wl_rinfo_v1->link_mode;
6895 else if (ver->fwlrole == 2)
6896 mode = wl_rinfo_v2->link_mode;
6897 else if (ver->fwlrole == 7)
6898 mode = wl_rinfo_v7->link_mode;
6899 else if (ver->fwlrole == 8)
6900 mode = wl_rinfo_v8->link_mode;
6904 if (ver->fcxctrl == 7) {
6905 igno_bt = btc->ctrl.ctrl_v7.igno_bt;
6906 always_freerun = btc->ctrl.ctrl_v7.always_freerun;
6908 igno_bt = btc->ctrl.ctrl.igno_bt;
6909 always_freerun = btc->ctrl.ctrl.always_freerun;
6915 __func__, dm->wl_only, dm->bt_only);
6918 if (btc->manual_ctrl) {
6934 if (!wl->status.map.init_ok) {
6941 if (wl->status.map.rf_off_pre == wl->status.map.rf_off &&
6942 wl->status.map.lps_pre == wl->status.map.lps) {
6950 if (wl->status.map.rf_off == 1 ||
6951 wl->status.map.lps == BTC_LPS_RF_OFF) {
6959 dm->freerun = false;
6960 dm->cnt_dm[BTC_DCNT_RUN]++;
6961 dm->fddt_train = BTC_FDDT_DISABLE;
6962 bt->scan_rx_low_pri = false;
6965 dm->freerun_chk = _check_freerun(rtwdev); /* check if meet freerun */
6973 if (dm->wl_only) {
6979 if (wl->status.map.rf_off || wl->status.map.lps || dm->bt_only) {
6990 if (!cx->bt.enable.now && !cx->other.type) {
6995 if (cx->bt.whql_test) {
7000 if (wl->rfk_info.state != BTC_WRFK_STOP) {
7005 if (wl->status.val & btc_scanning_map.val) {
7007 bt->scan_rx_low_pri = true;
7016 if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL))
7017 bt->scan_rx_low_pri = true;
7021 bt->scan_rx_low_pri = true;
7025 bt->scan_rx_low_pri = true;
7029 bt->scan_rx_low_pri = true;
7033 bt->scan_rx_low_pri = true;
7034 if (ver->fwlrole == 0)
7036 else if (ver->fwlrole == 1)
7038 else if (ver->fwlrole == 2 || ver->fwlrole == 7)
7040 else if (ver->fwlrole == 8)
7044 bt->scan_rx_low_pri = true;
7048 bt->scan_rx_low_pri = true;
7064 if (ver->fcxctrl == 7)
7065 btc->ctrl.ctrl_v7.igno_bt = igno_bt;
7067 btc->ctrl.ctrl.igno_bt = igno_bt;
7073 struct rtw89_btc *btc = &rtwdev->btc;
7076 btc->dm.cnt_notify[BTC_NCNT_POWER_ON]++;
7081 struct rtw89_btc *btc = &rtwdev->btc;
7082 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7085 btc->dm.cnt_notify[BTC_NCNT_POWER_OFF]++;
7087 btc->cx.wl.status.map.rf_off = 1;
7088 btc->cx.wl.status.map.busy = 0;
7089 wl->status.map.lps = BTC_LPS_OFF;
7096 btc->cx.wl.status.map.rf_off_pre = btc->cx.wl.status.map.rf_off;
7101 const struct rtw89_chip_info *chip = rtwdev->chip;
7102 struct rtw89_btc *btc = &rtwdev->btc;
7103 const struct rtw89_btc_ver *ver = btc->ver;
7104 struct rtw89_btc_dm *dm = &btc->dm;
7105 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7107 if (ver->fcxinit == 7) {
7108 dm->init_info.init_v7.wl_only = (u8)dm->wl_only;
7109 dm->init_info.init_v7.bt_only = (u8)dm->bt_only;
7110 dm->init_info.init_v7.wl_init_ok = (u8)wl->status.map.init_ok;
7111 dm->init_info.init_v7.cx_other = btc->cx.other.type;
7112 dm->init_info.init_v7.wl_guard_ch = chip->afh_guard_ch;
7113 dm->init_info.init_v7.module = btc->mdinfo.md_v7;
7115 dm->init_info.init.wl_only = (u8)dm->wl_only;
7116 dm->init_info.init.bt_only = (u8)dm->bt_only;
7117 dm->init_info.init.wl_init_ok = (u8)wl->status.map.init_ok;
7118 dm->init_info.init.dbcc_en = rtwdev->dbcc_en;
7119 dm->init_info.init.cx_other = btc->cx.other.type;
7120 dm->init_info.init.wl_guard_ch = chip->afh_guard_ch;
7121 dm->init_info.init.module = btc->mdinfo.md;
7127 struct rtw89_btc *btc = &rtwdev->btc;
7128 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
7129 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7130 const struct rtw89_chip_info *chip = rtwdev->chip;
7131 const struct rtw89_btc_ver *ver = btc->ver;
7134 btc->dm.run_reason = BTC_RSN_NONE;
7135 btc->dm.run_action = BTC_ACT_NONE;
7136 if (ver->fcxctrl == 7)
7137 btc->ctrl.ctrl_v7.igno_bt = true;
7139 btc->ctrl.ctrl.igno_bt = true;
7144 wl->coex_mode = mode;
7145 dm->cnt_notify[BTC_NCNT_INIT_COEX]++;
7146 dm->wl_only = mode == BTC_MODE_WL ? 1 : 0;
7147 dm->bt_only = mode == BTC_MODE_BT ? 1 : 0;
7148 wl->status.map.rf_off = mode == BTC_MODE_WLOFF ? 1 : 0;
7150 chip->ops->btc_set_rfe(rtwdev);
7151 chip->ops->btc_init_cfg(rtwdev);
7153 if (!wl->status.map.init_ok) {
7157 dm->error.map.init = true;
7168 dm->error.map.pta_owner = true;
7183 struct rtw89_btc *btc = &rtwdev->btc;
7184 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7193 btc->dm.cnt_notify[BTC_NCNT_SCAN_START]++;
7194 wl->status.map.scan = true;
7195 wl->scan_info.band[phy_idx] = band;
7196 wl->scan_info.phy_map |= BIT(phy_idx);
7199 if (rtwdev->dbcc_en) {
7200 wl->dbcc_info.scan_band[phy_idx] = band;
7210 struct rtw89_btc *btc = &rtwdev->btc;
7211 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7215 btc->dm.cnt_notify[BTC_NCNT_SCAN_FINISH]++;
7217 wl->status.map.scan = false;
7218 wl->scan_info.phy_map &= ~BIT(phy_idx);
7221 if (rtwdev->dbcc_en) {
7231 struct rtw89_btc *btc = &rtwdev->btc;
7232 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7241 btc->dm.cnt_notify[BTC_NCNT_SWITCH_BAND]++;
7243 if (rtwdev->dbcc_en) {
7244 wl->dbcc_info.scan_band[phy_idx] = band;
7254 struct rtw89_btc *btc = &rtwdev->btc;
7255 struct rtw89_btc_cx *cx = &btc->cx;
7256 struct rtw89_btc_wl_info *wl = &cx->wl;
7257 struct rtw89_btc_bt_link_info *b = &cx->bt.link_info;
7258 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc;
7259 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc;
7266 cnt = ++cx->cnt_wl[BTC_WCNT_DHCP];
7269 wl->status.map.connecting = true;
7273 cnt = ++cx->cnt_wl[BTC_WCNT_EAPOL];
7276 wl->status.map._4way = true;
7278 if (hfp->exist || hid->exist)
7282 cnt = ++cx->cnt_wl[BTC_WCNT_EAPOL];
7286 wl->status.map._4way = false;
7287 cancel_delayed_work(&rtwdev->coex_act1_work);
7290 cnt = ++cx->cnt_wl[BTC_WCNT_ARP];
7306 cancel_delayed_work(&rtwdev->coex_act1_work);
7307 ieee80211_queue_delayed_work(rtwdev->hw,
7308 &rtwdev->coex_act1_work, delay);
7311 btc->dm.cnt_notify[BTC_NCNT_SPECIAL_PACKET]++;
7320 mutex_lock(&rtwdev->mutex);
7323 mutex_unlock(&rtwdev->mutex);
7331 mutex_lock(&rtwdev->mutex);
7333 mutex_unlock(&rtwdev->mutex);
7341 mutex_lock(&rtwdev->mutex);
7344 mutex_unlock(&rtwdev->mutex);
7352 mutex_lock(&rtwdev->mutex);
7355 mutex_unlock(&rtwdev->mutex);
7360 const struct rtw89_chip_info *chip = rtwdev->chip;
7361 struct rtw89_btc *btc = &rtwdev->btc;
7362 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
7367 * if rssi >= 40% (-60dBm) --> rssi_level = 4
7368 * if 36% <= rssi < 40% --> rssi_level = 3
7369 * if 31% <= rssi < 36% --> rssi_level = 2
7370 * if 28% <= rssi < 31% --> rssi_level = 1
7371 * if rssi < 28% --> rssi_level = 0
7376 rssi_th = chip->bt_rssi_thres[i];
7377 rssi_st = &bt->link_info.rssi_state[i];
7382 rssi_level = BTC_BT_RSSI_THMAX - i;
7391 u8 mode = rtwdev->btc.cx.wl.role_info.link_mode;
7394 if (mode == BTC_WLINK_5G || rtwdev->btc.dm.freerun) {
7409 const struct rtw89_chip_info *chip = rtwdev->chip;
7410 struct rtw89_btc *btc = &rtwdev->btc;
7411 struct rtw89_btc_cx *cx = &btc->cx;
7412 struct rtw89_btc_bt_info *bt = &cx->bt;
7413 struct rtw89_btc_bt_link_info *b = &bt->link_info;
7414 struct rtw89_btc_bt_hfp_desc *hfp = &b->hfp_desc;
7415 struct rtw89_btc_bt_hid_desc *hid = &b->hid_desc;
7416 struct rtw89_btc_bt_a2dp_desc *a2dp = &b->a2dp_desc;
7417 struct rtw89_btc_bt_pan_desc *pan = &b->pan_desc;
7423 if (!memcmp(bt->raw_info, buf, BTC_BTINFO_MAX)) {
7425 "[BTC], %s(): return by bt-info duplicate!!\n",
7427 cx->cnt_bt[BTC_BCNT_INFOSAME]++;
7431 memcpy(bt->raw_info, buf, BTC_BTINFO_MAX);
7435 __func__, bt->raw_info[2]);
7437 b->profile_cnt.last = b->profile_cnt.now;
7438 b->profile_cnt.now = 0;
7439 hid->type = 0;
7441 /* parse raw info low-Byte2 */
7442 btinfo.val = bt->raw_info[BTC_BTINFO_L2];
7443 b->status.map.connect = btinfo.lb2.connect;
7444 b->status.map.sco_busy = btinfo.lb2.sco_busy;
7445 b->status.map.acl_busy = btinfo.lb2.acl_busy;
7446 b->status.map.inq_pag = btinfo.lb2.inq_pag;
7447 bt->inq_pag.now = btinfo.lb2.inq_pag;
7448 cx->cnt_bt[BTC_BCNT_INQPAG] += !!(bt->inq_pag.now && !bt->inq_pag.last);
7450 hfp->exist = btinfo.lb2.hfp;
7451 b->profile_cnt.now += (u8)hfp->exist;
7452 hid->exist = btinfo.lb2.hid;
7453 b->profile_cnt.now += (u8)hid->exist;
7454 a2dp->exist = btinfo.lb2.a2dp;
7455 b->profile_cnt.now += (u8)a2dp->exist;
7456 pan->exist = btinfo.lb2.pan;
7457 b->profile_cnt.now += (u8)pan->exist;
7458 btc->dm.trx_info.bt_profile = u32_get_bits(btinfo.val, BT_PROFILE_PROTOCOL_MASK);
7460 /* parse raw info low-Byte3 */
7461 btinfo.val = bt->raw_info[BTC_BTINFO_L3];
7463 cx->cnt_bt[BTC_BCNT_RETRY]++;
7464 b->cqddr = btinfo.lb3.cqddr;
7465 cx->cnt_bt[BTC_BCNT_INQ] += !!(btinfo.lb3.inq && !bt->inq);
7466 bt->inq = btinfo.lb3.inq;
7467 cx->cnt_bt[BTC_BCNT_PAGE] += !!(btinfo.lb3.pag && !bt->pag);
7468 bt->pag = btinfo.lb3.pag;
7470 b->status.map.mesh_busy = btinfo.lb3.mesh_busy;
7471 /* parse raw info high-Byte0 */
7472 btinfo.val = bt->raw_info[BTC_BTINFO_H0];
7473 /* raw val is dBm unit, translate from -100~ 0dBm to 0~100%*/
7474 b->rssi = chip->ops->btc_get_bt_rssi(rtwdev, btinfo.hb0.rssi);
7475 bt->rssi_level = _update_bt_rssi_level(rtwdev, b->rssi);
7476 btc->dm.trx_info.bt_rssi = bt->rssi_level;
7478 /* parse raw info high-Byte1 */
7479 btinfo.val = bt->raw_info[BTC_BTINFO_H1];
7480 b->status.map.ble_connect = btinfo.hb1.ble_connect;
7482 if (hid->exist)
7483 hid->type |= BTC_HID_BLE;
7485 hid->type |= BTC_HID_RCU_VOICE;
7487 hid->type |= BTC_HID_RCU;
7490 cx->cnt_bt[BTC_BCNT_REINIT] += !!(btinfo.hb1.reinit && !bt->reinit);
7491 bt->reinit = btinfo.hb1.reinit;
7492 cx->cnt_bt[BTC_BCNT_RELINK] += !!(btinfo.hb1.relink && !b->relink.now);
7493 b->relink.now = btinfo.hb1.relink;
7494 cx->cnt_bt[BTC_BCNT_IGNOWL] += !!(btinfo.hb1.igno_wl && !bt->igno_wl);
7495 bt->igno_wl = btinfo.hb1.igno_wl;
7497 if (bt->igno_wl && !cx->wl.status.map.rf_off)
7500 bt->ble_scan_en = btinfo.hb1.ble_scan;
7502 cx->cnt_bt[BTC_BCNT_ROLESW] += !!(btinfo.hb1.role_sw && !b->role_sw);
7503 b->role_sw = btinfo.hb1.role_sw;
7505 b->multi_link.now = btinfo.hb1.multi_link;
7507 /* parse raw info high-Byte2 */
7508 btinfo.val = bt->raw_info[BTC_BTINFO_H2];
7509 pan->active = !!btinfo.hb2.pan_active;
7511 cx->cnt_bt[BTC_BCNT_AFH] += !!(btinfo.hb2.afh_update && !b->afh_update);
7512 b->afh_update = btinfo.hb2.afh_update;
7513 a2dp->active = btinfo.hb2.a2dp_active;
7514 b->slave_role = btinfo.hb2.slave;
7515 hid->slot_info = btinfo.hb2.hid_slot;
7516 hid->pair_cnt = btinfo.hb2.hid_cnt;
7517 if (!b->status.map.ble_connect || hid->pair_cnt > 1)
7518 hid->type |= (hid->slot_info == BTC_HID_218 ?
7520 /* parse raw info high-Byte3 */
7521 btinfo.val = bt->raw_info[BTC_BTINFO_H3];
7522 a2dp->bitpool = btinfo.hb3.a2dp_bitpool;
7524 if (b->tx_3m != (u32)btinfo.hb3.tx_3m)
7525 cx->cnt_bt[BTC_BCNT_RATECHG]++;
7526 b->tx_3m = (u32)btinfo.hb3.tx_3m;
7528 a2dp->sink = btinfo.hb3.a2dp_sink;
7530 if (!a2dp->exist_last && a2dp->exist) {
7531 a2dp->vendor_id = 0;
7532 a2dp->flush_time = 0;
7533 a2dp->play_latency = 1;
7534 ieee80211_queue_delayed_work(rtwdev->hw,
7535 &rtwdev->coex_bt_devinfo_work,
7548 rtwvif_link->chanctx_idx);
7552 struct rtw89_btc *btc = &rtwdev->btc;
7553 const struct rtw89_btc_ver *ver = btc->ver;
7554 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7566 vif->type == NL80211_IFTYPE_STATION);
7567 rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], port=%d\n", rtwvif_link->port);
7569 chan->band_type, chan->channel, chan->band_width);
7574 bss_conf->beacon_int, bss_conf->dtim_period);
7580 rtwsta_link->mac_id);
7584 link_sta->he_cap.has_he,
7585 link_sta->vht_cap.vht_supported,
7586 link_sta->ht_cap.ht_supported);
7587 if (link_sta->he_cap.has_he)
7589 if (link_sta->vht_cap.vht_supported)
7591 if (link_sta->ht_cap.ht_supported)
7597 if (rtwvif_link->wifi_role >= RTW89_WIFI_ROLE_MLME_MAX) {
7603 "[BTC], wifi_role=%d\n", rtwvif_link->wifi_role);
7605 r.role = rtwvif_link->wifi_role;
7606 r.phy = rtwvif_link->phy_idx;
7607 r.pid = rtwvif_link->port;
7610 r.bcn_period = bss_conf->beacon_int;
7611 r.dtim_period = bss_conf->dtim_period;
7612 r.band = chan->band_type;
7613 r.ch = chan->channel;
7614 r.bw = chan->band_width;
7615 r.chdef.band = chan->band_type;
7616 r.chdef.center_ch = chan->channel;
7617 r.chdef.bw = chan->band_width;
7618 r.chdef.chan = chan->primary_channel;
7619 ether_addr_copy(r.mac_addr, rtwvif_link->mac_addr);
7623 if (rtwsta_link && vif->type == NL80211_IFTYPE_STATION)
7624 r.mac_id = rtwsta_link->mac_id;
7626 btc->dm.cnt_notify[BTC_NCNT_ROLE_INFO]++;
7628 wlinfo = &wl->link_info[r.pid];
7631 if (ver->fwlrole == 0) {
7634 } else if (ver->fwlrole == 1) {
7637 } else if (ver->fwlrole == 2) {
7640 } else if (ver->fwlrole == 7) {
7643 } else if (ver->fwlrole == 8) {
7644 wlinfo = &wl->rlink_info[r.pid][rlink_id];
7646 link_mode_ori = wl->role_info_v8.link_mode;
7647 pta_req_mac_ori = wl->pta_req_mac;
7650 if (wl->role_info_v8.link_mode != link_mode_ori) {
7651 wl->role_info_v8.link_mode_chg = 1;
7652 if (ver->fcxinit == 7)
7653 wa_type = btc->mdinfo.md_v7.wa_type;
7655 wa_type = btc->mdinfo.md.wa_type;
7661 if (wl->pta_req_mac != pta_req_mac_ori)
7662 wl->pta_reg_mac_chg = 1;
7665 if (wlinfo->role == RTW89_WIFI_ROLE_STATION &&
7666 wlinfo->connected == MLME_NO_LINK)
7667 btc->dm.leak_ap = 0;
7670 wl->status.map.connecting = 1;
7672 wl->status.map.connecting = 0;
7675 wl->status.map._4way = false;
7682 const struct rtw89_chip_info *chip = rtwdev->chip;
7683 struct rtw89_btc *btc = &rtwdev->btc;
7684 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7689 btc->dm.cnt_notify[BTC_NCNT_RADIO_STATE]++;
7693 wl->status.map.rf_off = 1;
7694 wl->status.map.lps = BTC_LPS_OFF;
7695 wl->status.map.busy = 0;
7698 wl->status.map.rf_off = 0;
7699 wl->status.map.lps = BTC_LPS_RF_OFF;
7700 wl->status.map.busy = 0;
7702 case BTC_RFCTRL_LPS_WL_ON: /* LPS-Protocol (RFon) */
7703 wl->status.map.rf_off = 0;
7704 wl->status.map.lps = BTC_LPS_RF_ON;
7705 wl->status.map.busy = 0;
7709 wl->status.map.rf_off = 0;
7710 wl->status.map.lps = BTC_LPS_OFF;
7719 chip->ops->btc_init_cfg(rtwdev);
7730 wl->status.map.lps_pre != BTC_LPS_OFF)
7734 btc->dm.cnt_dm[BTC_DCNT_BTCNT_HANG] = 0;
7735 btc->dm.tdma_instant_excute = 1;
7738 wl->status.map.rf_off_pre = wl->status.map.rf_off;
7739 wl->status.map.lps_pre = wl->status.map.lps;
7746 struct rtw89_btc *btc = &rtwdev->btc;
7747 struct rtw89_btc_cx *cx = &btc->cx;
7748 struct rtw89_btc_wl_info *wl = &cx->wl;
7751 wl->rfk_info.type = type;
7752 wl->rfk_info.path_map = FIELD_GET(BTC_RFK_PATH_MAP, phy_path);
7753 wl->rfk_info.phy_map = FIELD_GET(BTC_RFK_PHY_MAP, phy_path);
7754 wl->rfk_info.band = FIELD_GET(BTC_RFK_BAND_MAP, phy_path);
7758 __func__, wl->rfk_info.phy_map, wl->rfk_info.path_map,
7764 wl->rfk_info.state = result ? BTC_WRFK_START : BTC_WRFK_STOP;
7768 btc->dm.cnt_notify[BTC_NCNT_WL_RFK]++;
7772 if (wl->rfk_info.state == BTC_WRFK_STOP) {
7776 wl->rfk_info.state = state;
7781 wl->rfk_info.state = BTC_WRFK_STOP;
7784 cancel_delayed_work(&rtwdev->coex_rfk_chk_work);
7793 if (wl->rfk_info.state == BTC_WRFK_START ||
7794 wl->rfk_info.state == BTC_WRFK_STOP)
7797 if (wl->rfk_info.state == BTC_WRFK_START)
7798 ieee80211_queue_delayed_work(rtwdev->hw,
7799 &rtwdev->coex_rfk_chk_work,
7805 __func__, btc->dm.cnt_notify[BTC_NCNT_WL_RFK], result);
7829 state == BTC_WRFK_ONESHOT_START ? "ONE-SHOT_START" :
7830 "ONE-SHOT_STOP");
7832 if (state != BTC_WRFK_START || rtwdev->is_bt_iqk_timeout) {
7841 rtwdev->is_bt_iqk_timeout = true;
7860 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif;
7861 struct rtw89_dev *rtwdev = iter_data->rtwdev;
7862 struct rtw89_btc *btc = &rtwdev->btc;
7863 struct rtw89_btc_dm *dm = &btc->dm;
7864 const struct rtw89_btc_ver *ver = btc->ver;
7865 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
7868 struct rtw89_traffic_stats *stats = &rtwvif->stats;
7869 const struct rtw89_chip_info *chip = rtwdev->chip;
7874 u8 port = rtwvif_link->port;
7882 rssi = ewma_rssi_read(&rtwsta_link->avg_rssi) >> RSSI_FACTOR;
7885 link_info = &wl->link_info[port];
7886 link_info->stat.traffic = *stats;
7887 link_info_t = &link_info->stat.traffic;
7889 if (link_info->connected == MLME_NO_LINK) {
7890 link_info->rx_rate_drop_cnt = 0;
7894 link_info->stat.rssi = rssi;
7896 link_info->rssi_state[i] =
7898 link_info->rssi_state[i],
7899 link_info->stat.rssi,
7900 chip->wl_rssi_thres[i]);
7901 if (BTC_RSSI_LOW(link_info->rssi_state[i]))
7904 if (btc->ant_type == BTC_ANT_DEDICATED &&
7905 BTC_RSSI_CHANGE(link_info->rssi_state[i]))
7908 iter_data->rssi_map_all |= rssi_map;
7910 last_tx_rate = link_info_t->tx_rate;
7911 last_rx_rate = link_info_t->rx_rate;
7912 last_tx_lvl = (u16)link_info_t->tx_tfc_lv;
7913 last_rx_lvl = (u16)link_info_t->rx_tfc_lv;
7915 if (stats->tx_tfc_lv != RTW89_TFC_IDLE ||
7916 stats->rx_tfc_lv != RTW89_TFC_IDLE)
7919 if (stats->tx_tfc_lv > stats->rx_tfc_lv)
7924 link_info = &wl->link_info[port];
7925 if (link_info->busy != busy || link_info->dir != dir) {
7927 link_info->busy = busy;
7928 link_info->dir = dir;
7931 iter_data->busy_all |= busy;
7932 iter_data->dir_all |= BIT(dir);
7934 if (rtwsta_link->rx_hw_rate <= RTW89_HW_RATE_CCK2 &&
7936 link_info_t->rx_tfc_lv > RTW89_TFC_IDLE)
7937 link_info->rx_rate_drop_cnt++;
7939 if (last_tx_rate != rtwsta_link->ra_report.hw_rate ||
7940 last_rx_rate != rtwsta_link->rx_hw_rate ||
7941 last_tx_lvl != link_info_t->tx_tfc_lv ||
7942 last_rx_lvl != link_info_t->rx_tfc_lv)
7945 link_info_t->tx_rate = rtwsta_link->ra_report.hw_rate;
7946 link_info_t->rx_rate = rtwsta_link->rx_hw_rate;
7948 if (link_info->role == RTW89_WIFI_ROLE_STATION ||
7949 link_info->role == RTW89_WIFI_ROLE_P2P_CLIENT) {
7950 dm->trx_info.tx_rate = link_info_t->tx_rate;
7951 dm->trx_info.rx_rate = link_info_t->rx_rate;
7954 if (ver->fwlrole == 0) {
7955 r = &wl->role_info;
7956 r->active_role[port].tx_lvl = stats->tx_tfc_lv;
7957 r->active_role[port].rx_lvl = stats->rx_tfc_lv;
7958 r->active_role[port].tx_rate = rtwsta_link->ra_report.hw_rate;
7959 r->active_role[port].rx_rate = rtwsta_link->rx_hw_rate;
7960 } else if (ver->fwlrole == 1) {
7961 r1 = &wl->role_info_v1;
7962 r1->active_role_v1[port].tx_lvl = stats->tx_tfc_lv;
7963 r1->active_role_v1[port].rx_lvl = stats->rx_tfc_lv;
7964 r1->active_role_v1[port].tx_rate = rtwsta_link->ra_report.hw_rate;
7965 r1->active_role_v1[port].rx_rate = rtwsta_link->rx_hw_rate;
7966 } else if (ver->fwlrole == 2) {
7967 dm->trx_info.tx_lvl = stats->tx_tfc_lv;
7968 dm->trx_info.rx_lvl = stats->rx_tfc_lv;
7969 dm->trx_info.tx_rate = rtwsta_link->ra_report.hw_rate;
7970 dm->trx_info.rx_rate = rtwsta_link->rx_hw_rate;
7973 dm->trx_info.tx_tp = link_info_t->tx_throughput;
7974 dm->trx_info.rx_tp = link_info_t->rx_throughput;
7976 /* Trigger coex-run if 0x10980 reg-value is diff with coex setup */
7977 if ((dm->wl_btg_rx_rb != dm->wl_btg_rx &&
7978 dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) ||
7979 (dm->wl_pre_agc_rb != dm->wl_pre_agc &&
7980 dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND))
7981 iter_data->is_sta_change = true;
7984 iter_data->is_sta_change = true;
7987 iter_data->is_traffic_change = true;
8000 rtwvif_link = rtwsta_link->rtwvif_link;
8009 struct rtw89_btc *btc = &rtwdev->btc;
8010 struct rtw89_btc_dm *dm = &btc->dm;
8011 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
8015 ieee80211_iterate_stations_atomic(rtwdev->hw,
8019 wl->rssi_level = 0;
8020 btc->dm.cnt_notify[BTC_NCNT_WL_STA]++;
8021 for (i = BTC_WL_RSSI_THMAX; i > 0; i--) {
8023 if (data.rssi_map_all & BIT(i - 1)) {
8024 wl->rssi_level = i;
8029 if (dm->trx_info.wl_rssi != wl->rssi_level)
8030 dm->trx_info.wl_rssi = wl->rssi_level;
8033 __func__, !!wl->status.map.busy);
8035 _write_scbd(rtwdev, BTC_WSCB_WLBUSY, (!!wl->status.map.busy));
8040 wl->status.map.busy = data.busy_all;
8041 wl->status.map.traffic_dir = data.dir_all;
8043 } else if (btc->dm.cnt_notify[BTC_NCNT_WL_STA] >=
8044 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] + BTC_NHM_CHK_INTVL) {
8045 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] =
8046 btc->dm.cnt_notify[BTC_NCNT_WL_STA];
8047 } else if (btc->dm.cnt_notify[BTC_NCNT_WL_STA] <
8048 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST]) {
8049 btc->dm.cnt_dm[BTC_DCNT_WL_STA_LAST] =
8050 btc->dm.cnt_notify[BTC_NCNT_WL_STA];
8056 struct rtw89_btc *btc = &rtwdev->btc;
8057 const struct rtw89_btc_ver *ver = btc->ver;
8068 if (ver->fwc2hfunc == 0)
8073 if (ver->fwc2hfunc == 0)
8075 else if (ver->fwc2hfunc == 1)
8077 else if (ver->fwc2hfunc == 2)
8082 if (ver->fwc2hfunc == 0)
8084 else if (ver->fwc2hfunc == 1)
8086 else if (ver->fwc2hfunc == 2)
8091 if (ver->fwc2hfunc == 2)
8104 struct rtw89_btc *btc = &rtwdev->btc;
8105 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
8106 u8 *buf = &skb->data[RTW89_C2H_HEADER_LEN];
8108 len -= RTW89_C2H_HEADER_LEN;
8121 pfwinfo->event[func]++;
8124 pfwinfo->event[func]++;
8131 btc->cx.cnt_bt[BTC_BCNT_INFOUPDATE]++;
8137 btc->cx.cnt_bt[BTC_BCNT_SCBDUPDATE]++;
8143 btc->dbg.rb_done = true;
8144 btc->dbg.rb_val = le32_to_cpu(*((__le32 *)buf));
8148 btc->dbg.rb_done = true;
8149 btc->dbg.rb_val = buf[0];
8152 btc->dm.cnt_dm[BTC_DCNT_CX_RUNINFO]++;
8161 union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo;
8162 const struct rtw89_chip_info *chip = rtwdev->chip;
8163 const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
8164 struct rtw89_hal *hal = &rtwdev->hal;
8165 struct rtw89_btc *btc = &rtwdev->btc;
8166 struct rtw89_btc_dm *dm = &btc->dm;
8167 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
8168 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
8172 if (!(dm->coex_info_map & BTC_COEX_INFO_CX))
8175 dm->cnt_notify[BTC_NCNT_SHOW_COEX_INFO]++;
8178 chip->chip_id);
8184 seq_printf(m, " %-15s : Coex:%d.%d.%d(branch:%d), ",
8187 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw_coex);
8188 ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw_coex);
8189 ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw_coex);
8190 id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw_coex);
8194 ver_main = FIELD_GET(GENMASK(31, 24), chip->wlcx_desired);
8195 ver_sub = FIELD_GET(GENMASK(23, 16), chip->wlcx_desired);
8196 ver_hotfix = FIELD_GET(GENMASK(15, 8), chip->wlcx_desired);
8198 (wl->ver_info.fw_coex >= chip->wlcx_desired ?
8202 bt->ver_info.fw_coex,
8203 (bt->ver_info.fw_coex >= chip->btcx_desired ?
8204 "Match" : "Mismatch"), chip->btcx_desired);
8206 if (bt->enable.now && bt->ver_info.fw == 0)
8211 ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw);
8212 ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw);
8213 ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw);
8214 id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw);
8215 seq_printf(m, " %-15s : WL_FW:%d.%d.%d.%d, BT_FW:0x%x(%s)\n",
8218 bt->ver_info.fw, bt->run_patch_code ? "patch" : "ROM");
8220 if (ver->fcxinit == 7) {
8221 cv = md->md_v7.kt_ver;
8222 rfe = md->md_v7.rfe_type;
8223 iso = md->md_v7.ant.isolation;
8224 ant_num = md->md_v7.ant.num;
8225 ant_single_pos = md->md_v7.ant.single_pos;
8227 cv = md->md.cv;
8228 rfe = md->md.rfe_type;
8229 iso = md->md.ant.isolation;
8230 ant_num = md->md.ant.num;
8231 ant_single_pos = md->md.ant.single_pos;
8234 seq_printf(m, " %-15s : cv:%x, rfe_type:0x%x, ant_iso:%d, ant_pg:%d, %s",
8240 btc->cx.other.type, rtwdev->dbcc_en, hal->tx_nss,
8241 hal->rx_nss);
8246 struct rtw89_btc *btc = &rtwdev->btc;
8248 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
8249 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
8253 if (rtwdev->dbcc_en) {
8255 " %-15s : PHY0_band(op:%d/scan:%d/real:%d), ",
8256 "[dbcc_info]", wl_dinfo->op_band[RTW89_PHY_0],
8257 wl_dinfo->scan_band[RTW89_PHY_0],
8258 wl_dinfo->real_band[RTW89_PHY_0]);
8261 wl_dinfo->op_band[RTW89_PHY_1],
8262 wl_dinfo->scan_band[RTW89_PHY_1],
8263 wl_dinfo->real_band[RTW89_PHY_1]);
8267 if (btc->ver->fwlrole == 8)
8268 plink = &btc->cx.wl.rlink_info[i][0];
8270 plink = &btc->cx.wl.link_info[i];
8272 if (!plink->active)
8276 " [port_%d] : role=%d(phy-%d), connect=%d(client_cnt=%d), mode=%d, center_ch=%d, bw=%d",
8277 plink->pid, (u32)plink->role, plink->phy,
8278 (u32)plink->connected, plink->client_cnt - 1,
8279 (u32)plink->mode, plink->ch, (u32)plink->bw);
8281 if (plink->connected == MLME_NO_LINK)
8286 plink->mac_id, plink->tx_time, plink->tx_retry);
8289 " [port_%d] : rssi=-%ddBm(%d), busy=%d, dir=%s, ",
8290 plink->pid, 110 - plink->stat.rssi,
8291 plink->stat.rssi, plink->busy,
8292 plink->dir == RTW89_TFC_UL ? "UL" : "DL");
8294 t = &plink->stat.traffic;
8298 (u32)t->tx_rate, t->tx_tfc_lv);
8301 (u32)t->rx_rate,
8302 t->rx_tfc_lv, plink->rx_rate_drop_cnt);
8308 struct rtw89_btc *btc = &rtwdev->btc;
8309 const struct rtw89_btc_ver *ver = btc->ver;
8310 struct rtw89_btc_cx *cx = &btc->cx;
8311 struct rtw89_btc_wl_info *wl = &cx->wl;
8312 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
8313 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1;
8314 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
8315 struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
8316 struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
8319 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_WL))
8324 if (ver->fwlrole == 0)
8325 mode = wl_rinfo->link_mode;
8326 else if (ver->fwlrole == 1)
8327 mode = wl_rinfo_v1->link_mode;
8328 else if (ver->fwlrole == 2)
8329 mode = wl_rinfo_v2->link_mode;
8330 else if (ver->fwlrole == 7)
8331 mode = wl_rinfo_v7->link_mode;
8332 else if (ver->fwlrole == 8)
8333 mode = wl_rinfo_v8->link_mode;
8337 seq_printf(m, " %-15s : link_mode:%d, ", "[status]", mode);
8341 wl->status.map.rf_off, wl->status.map.lps,
8342 wl->status.map.scan ? "Y" : "N",
8343 wl->scan_info.band[RTW89_PHY_0], wl->scan_info.phy_map);
8347 wl->status.map.connecting ? "Y" : "N",
8348 wl->status.map.roaming ? "Y" : "N",
8349 wl->status.map._4way ? "Y" : "N",
8350 wl->status.map.init_ok ? "Y" : "N");
8363 struct rtw89_btc *btc = &rtwdev->btc;
8364 struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
8365 struct rtw89_btc_bt_hfp_desc hfp = bt_linfo->hfp_desc;
8366 struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc;
8367 struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
8368 struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc;
8371 seq_printf(m, " %-15s : type:%s, sut_pwr:%d, golden-rx:%d",
8373 bt_linfo->sut_pwr_level[0],
8374 bt_linfo->golden_rx_shift[0]);
8379 "\n\r %-15s : type:%s%s%s%s%s pair-cnt:%d, sut_pwr:%d, golden-rx:%d\n",
8385 hid.type & BTC_HID_RCU_VOICE ? "RCU-Voice," : "",
8386 hid.pair_cnt, bt_linfo->sut_pwr_level[1],
8387 bt_linfo->golden_rx_shift[1]);
8392 " %-15s : type:%s, bit-pool:%d, flush-time:%d, ",
8398 "vid:0x%x, Dev-name:0x%x, sut_pwr:%d, golden-rx:%d\n",
8400 bt_linfo->sut_pwr_level[2],
8401 bt_linfo->golden_rx_shift[2]);
8405 seq_printf(m, " %-15s : sut_pwr:%d, golden-rx:%d\n",
8407 bt_linfo->sut_pwr_level[3],
8408 bt_linfo->golden_rx_shift[3]);
8414 struct rtw89_btc *btc = &rtwdev->btc;
8415 const struct rtw89_btc_ver *ver = btc->ver;
8416 struct rtw89_btc_cx *cx = &btc->cx;
8417 struct rtw89_btc_bt_info *bt = &cx->bt;
8418 struct rtw89_btc_wl_info *wl = &cx->wl;
8419 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
8420 union rtw89_btc_module_info *md = &btc->mdinfo;
8421 u8 *afh = bt_linfo->afh_map;
8422 u8 *afh_le = bt_linfo->afh_map_le;
8425 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_BT))
8428 if (ver->fcxinit == 7)
8429 bt_pos = md->md_v7.bt_pos;
8431 bt_pos = md->md.bt_pos;
8435 seq_printf(m, " %-15s : enable:%s, btg:%s%s, connect:%s, ",
8436 "[status]", bt->enable.now ? "Y" : "N",
8437 bt->btg_type ? "Y" : "N",
8438 (bt->enable.now && (bt->btg_type != bt_pos) ?
8439 "(efuse-mismatch!!)" : ""),
8440 (bt_linfo->status.map.connect ? "Y" : "N"));
8443 bt->igno_wl ? "Y" : "N",
8444 bt->mbx_avl ? "Y" : "N", bt->rfk_info.val);
8446 seq_printf(m, " %-15s : profile:%s%s%s%s%s ",
8448 (bt_linfo->profile_cnt.now == 0) ? "None," : "",
8449 bt_linfo->hfp_desc.exist ? "HFP," : "",
8450 bt_linfo->hid_desc.exist ? "HID," : "",
8451 bt_linfo->a2dp_desc.exist ?
8452 (bt_linfo->a2dp_desc.sink ? "A2DP_sink," : "A2DP,") : "",
8453 bt_linfo->pan_desc.exist ? "PAN," : "");
8456 "multi-link:%s, role:%s, ble-connect:%s, CQDDR:%s, A2DP_active:%s, PAN_active:%s\n",
8457 bt_linfo->multi_link.now ? "Y" : "N",
8458 bt_linfo->slave_role ? "Slave" : "Master",
8459 bt_linfo->status.map.ble_connect ? "Y" : "N",
8460 bt_linfo->cqddr ? "Y" : "N",
8461 bt_linfo->a2dp_desc.active ? "Y" : "N",
8462 bt_linfo->pan_desc.active ? "Y" : "N");
8465 " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s",
8466 "[link]", bt_linfo->rssi - 100,
8467 bt->rssi_level,
8468 bt_linfo->tx_3m ? 3 : 2,
8469 bt_linfo->status.map.inq_pag ? " inq-page!!" : "",
8470 bt_linfo->status.map.acl_busy ? " acl_busy!!" : "",
8471 bt_linfo->status.map.mesh_busy ? " mesh_busy!!" : "");
8475 bt_linfo->relink.now ? " ReLink!!" : "",
8479 if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect)
8485 seq_printf(m, "wl_ch_map[en:%d/ch:%d/bw:%d]\n",
8486 wl->afh_info.en, wl->afh_info.ch, wl->afh_info.bw);
8489 " %-15s : retry:%d, relink:%d, rate_chg:%d, reinit:%d, reenable:%d, ",
8490 "[stat_cnt]", cx->cnt_bt[BTC_BCNT_RETRY],
8491 cx->cnt_bt[BTC_BCNT_RELINK], cx->cnt_bt[BTC_BCNT_RATECHG],
8492 cx->cnt_bt[BTC_BCNT_REINIT], cx->cnt_bt[BTC_BCNT_REENABLE]);
8495 "role-switch:%d, afh:%d, inq_page:%d(inq:%d/page:%d), igno_wl:%d\n",
8496 cx->cnt_bt[BTC_BCNT_ROLESW], cx->cnt_bt[BTC_BCNT_AFH],
8497 cx->cnt_bt[BTC_BCNT_INQPAG], cx->cnt_bt[BTC_BCNT_INQ],
8498 cx->cnt_bt[BTC_BCNT_PAGE], cx->cnt_bt[BTC_BCNT_IGNOWL]);
8503 " %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)\n",
8504 "[bt_info]", bt->raw_info[2], bt->raw_info[3],
8505 bt->raw_info[4], bt->raw_info[5], bt->raw_info[6],
8506 bt->raw_info[7],
8507 bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply",
8508 cx->cnt_bt[BTC_BCNT_INFOUPDATE],
8509 cx->cnt_bt[BTC_BCNT_INFOSAME]);
8512 " %-15s : Hi-rx = %d, Hi-tx = %d, Lo-rx = %d, Lo-tx = %d (bt_polut_wl_tx = %d)",
8513 "[trx_req_cnt]", cx->cnt_bt[BTC_BCNT_HIPRI_RX],
8514 cx->cnt_bt[BTC_BCNT_HIPRI_TX], cx->cnt_bt[BTC_BCNT_LOPRI_RX],
8515 cx->cnt_bt[BTC_BCNT_LOPRI_TX], cx->cnt_bt[BTC_BCNT_POLUT]);
8517 if (!bt->scan_info_update) {
8522 if (ver->fcxbtscan == 1) {
8524 "(INQ:%d-%d/PAGE:%d-%d/LE:%d-%d/INIT:%d-%d)",
8525 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].win),
8526 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].intvl),
8527 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].win),
8528 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].intvl),
8529 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].win),
8530 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].intvl),
8531 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].win),
8532 le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].intvl));
8533 } else if (ver->fcxbtscan == 2) {
8535 "(BG:%d-%d/INIT:%d-%d/LE:%d-%d)",
8536 le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].win),
8537 le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].intvl),
8538 le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].win),
8539 le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].intvl),
8540 le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].win),
8541 le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].intvl));
8546 if (bt_linfo->profile_cnt.now || bt_linfo->status.map.ble_connect)
8551 if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect)
8556 if (bt_linfo->a2dp_desc.exist &&
8557 (bt_linfo->a2dp_desc.flush_time == 0 ||
8558 bt_linfo->a2dp_desc.vendor_id == 0 ||
8559 bt_linfo->a2dp_desc.play_latency == 1))
8864 seq_printf(m, " %-15s : ", prefix);
8867 seq_printf(m, "-> %-20s",
8870 seq_printf(m, "-> %-15s",
8873 seq_printf(m, "-> %-13s",
8875 if (i == (len - 1) || (i % seg_len) == (seg_len - 1))
8882 struct rtw89_btc *btc = &rtwdev->btc;
8883 struct rtw89_btc_dm *dm = &btc->dm;
8887 len = dm->dm_step.step_ov ? RTW89_BTC_DM_MAXSTEP : dm->dm_step.step_pos;
8888 start_idx = dm->dm_step.step_ov ? dm->dm_step.step_pos : 0;
8890 seq_print_segment(m, "[dm_steps]", dm->dm_step.step, len, 6, start_idx,
8891 ARRAY_SIZE(dm->dm_step.step));
8896 struct rtw89_btc *btc = &rtwdev->btc;
8897 const struct rtw89_btc_ver *ver = btc->ver;
8898 struct rtw89_btc_dm *dm = &btc->dm;
8899 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
8900 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
8903 if (!(dm->coex_info_map & BTC_COEX_INFO_DM))
8907 (btc->manual_ctrl ? "(Manual)" : "(Auto)"));
8910 " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%s, init_mode:%s, run_cnt:%d\n",
8912 btc->ant_type == BTC_ANT_SHARED ? "shared" : "dedicated",
8913 steps_to_str(dm->run_reason),
8914 steps_to_str(dm->run_action | BTC_ACT_EXT_BIT),
8915 id_to_ant(FIELD_GET(GENMASK(7, 0), dm->set_ant_path)),
8916 id_to_mode(wl->coex_mode),
8917 dm->cnt_dm[BTC_DCNT_RUN]);
8921 if (ver->fcxctrl == 7)
8922 igno_bt = btc->ctrl.ctrl_v7.igno_bt;
8924 igno_bt = btc->ctrl.ctrl.igno_bt;
8926 seq_printf(m, " %-15s : wl_only:%d, bt_only:%d, igno_bt:%d, free_run:%d, wl_ps_ctrl:%d, wl_mimo_ps:%d, ",
8927 "[dm_flag]", dm->wl_only, dm->bt_only, igno_bt,
8928 dm->freerun, btc->lps, dm->wl_mimo_ps);
8930 seq_printf(m, "leak_ap:%d, fw_offload:%s%s\n", dm->leak_ap,
8932 (dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ?
8935 if (dm->rf_trx_para.wl_tx_power == 0xff)
8937 " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:orig, ",
8938 "[trx_ctrl]", wl->rssi_level, dm->trx_para_level);
8942 " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:%d, ",
8943 "[trx_ctrl]", wl->rssi_level, dm->trx_para_level,
8944 dm->rf_trx_para.wl_tx_power);
8947 "wl_rx_lvl:%d, bt_tx_pwr_dec:%d, bt_rx_lna:%d(%s-tbl), wl_btg_rx:%d\n",
8948 dm->rf_trx_para.wl_rx_gain, dm->rf_trx_para.bt_tx_power,
8949 dm->rf_trx_para.bt_rx_gain,
8950 (bt->hi_lna_rx ? "Hi" : "Ori"), dm->wl_btg_rx);
8953 " %-15s : wl_tx_limit[en:%d/max_t:%dus/max_retry:%d], bt_slot_reg:%d-TU, bt_scan_rx_low_pri:%d\n",
8954 "[dm_ctrl]", dm->wl_tx_limit.enable, dm->wl_tx_limit.tx_time,
8955 dm->wl_tx_limit.tx_retry, btc->bt_req_len, bt->scan_rx_low_pri);
8960 struct rtw89_btc *btc = &rtwdev->btc;
8961 const struct rtw89_btc_ver *ver = btc->ver;
8962 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
8966 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo;
8967 if (ver->fcxcysta == 2) {
8968 pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2;
8969 except_cnt = le32_to_cpu(pcysta->v2.except_cnt);
8970 exception_map = le32_to_cpu(pcysta->v2.exception);
8971 } else if (ver->fcxcysta == 3) {
8972 pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3;
8973 except_cnt = le32_to_cpu(pcysta->v3.except_cnt);
8974 exception_map = le32_to_cpu(pcysta->v3.except_map);
8975 } else if (ver->fcxcysta == 4) {
8976 pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4;
8977 except_cnt = pcysta->v4.except_cnt;
8978 exception_map = le32_to_cpu(pcysta->v4.except_map);
8979 } else if (ver->fcxcysta == 5) {
8980 pcysta->v5 = pfwinfo->rpt_fbtc_cysta.finfo.v5;
8981 except_cnt = pcysta->v5.except_cnt;
8982 exception_map = le32_to_cpu(pcysta->v5.except_map);
8983 } else if (ver->fcxcysta == 7) {
8984 pcysta->v7 = pfwinfo->rpt_fbtc_cysta.finfo.v7;
8985 except_cnt = pcysta->v7.except_cnt;
8986 exception_map = le32_to_cpu(pcysta->v7.except_map);
8991 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW] == 0 && except_cnt == 0 &&
8992 !pfwinfo->len_mismch && !pfwinfo->fver_mismch)
8995 seq_printf(m, " %-15s : ", "[error]");
8997 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]) {
8999 "overflow-cnt: %d, ",
9000 pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]);
9003 if (pfwinfo->len_mismch) {
9005 "len-mismatch: 0x%x, ",
9006 pfwinfo->len_mismch);
9009 if (pfwinfo->fver_mismch) {
9011 "fver-mismatch: 0x%x, ",
9012 pfwinfo->fver_mismch);
9018 "exception-type: 0x%x, exception-cnt = %d",
9026 struct rtw89_btc *btc = &rtwdev->btc;
9027 const struct rtw89_btc_ver *ver = btc->ver;
9028 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9032 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo;
9033 if (!pcinfo->valid)
9036 if (ver->fcxtdma == 1)
9037 t = &pfwinfo->rpt_fbtc_tdma.finfo.v1;
9039 t = &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma;
9042 " %-15s : ", "[tdma_policy]");
9045 (u32)t->type,
9046 t->rxflctrl, t->txpause);
9050 t->wtgle_n, t->leak_n, t->ext_ctrl);
9054 (u32)btc->policy_type);
9061 struct rtw89_btc *btc = &rtwdev->btc;
9062 struct rtw89_btc_dm *dm = &btc->dm;
9068 if (btc->ver->fcxslots == 1) {
9069 dur = le16_to_cpu(dm->slot_now.v1[i].dur);
9070 tbl = le32_to_cpu(dm->slot_now.v1[i].cxtbl);
9071 cxtype = le16_to_cpu(dm->slot_now.v1[i].cxtype);
9072 } else if (btc->ver->fcxslots == 7) {
9073 dur = le16_to_cpu(dm->slot_now.v7[i].dur);
9074 tbl = le32_to_cpu(dm->slot_now.v7[i].cxtbl);
9075 cxtype = le16_to_cpu(dm->slot_now.v7[i].cxtype);
9082 " %-15s : %5s[%03d/0x%x/%d]",
9100 struct rtw89_btc *btc = &rtwdev->btc;
9101 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9102 struct rtw89_btc_dm *dm = &btc->dm;
9103 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
9110 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
9111 if (!pcinfo->valid)
9114 pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo.v2;
9116 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
9118 le16_to_cpu(pcysta_le32->cycles),
9119 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL]),
9120 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL_OK]),
9121 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_SLOT]),
9122 le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_OK]));
9125 if (!le32_to_cpu(pcysta_le32->slot_cnt[i]))
9128 le32_to_cpu(pcysta_le32->slot_cnt[i]));
9131 if (dm->tdma_now.rxflctrl) {
9133 le32_to_cpu(pcysta_le32->leakrx_cnt));
9136 if (le32_to_cpu(pcysta_le32->collision_cnt)) {
9138 le32_to_cpu(pcysta_le32->collision_cnt));
9141 if (le32_to_cpu(pcysta_le32->skip_cnt)) {
9143 le32_to_cpu(pcysta_le32->skip_cnt));
9147 seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
9149 le16_to_cpu(pcysta_le32->tavg_cycle[CXT_WL]),
9150 le16_to_cpu(pcysta_le32->tavg_cycle[CXT_BT]),
9151 le16_to_cpu(pcysta_le32->tavg_lk) / 1000,
9152 le16_to_cpu(pcysta_le32->tavg_lk) % 1000);
9154 le16_to_cpu(pcysta_le32->tmax_cycle[CXT_WL]),
9155 le16_to_cpu(pcysta_le32->tmax_cycle[CXT_BT]),
9156 le16_to_cpu(pcysta_le32->tmax_lk) / 1000,
9157 le16_to_cpu(pcysta_le32->tmax_lk) % 1000);
9159 le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_WL]),
9160 le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_BT]));
9162 if (le16_to_cpu(pcysta_le32->cycles) <= 1)
9165 /* 1 cycle record 1 wl-slot and 1 bt-slot */
9168 if (le16_to_cpu(pcysta_le32->cycles) <= slot_pair)
9171 c_begin = le16_to_cpu(pcysta_le32->cycles) - slot_pair + 1;
9173 c_end = le16_to_cpu(pcysta_le32->cycles);
9177 store_index = ((cycle - 1) % slot_pair) * 2;
9181 " %-15s : ->b%02d->w%02d", "[cycle_step]",
9182 le16_to_cpu(pcysta_le32->tslot_cycle[store_index]),
9183 le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1]));
9186 "->b%02d->w%02d",
9187 le16_to_cpu(pcysta_le32->tslot_cycle[store_index]),
9188 le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1]));
9193 if (a2dp->exist) {
9195 " %-15s : a2dp_ept:%d, a2dp_late:%d",
9197 le16_to_cpu(pcysta_le32->a2dpept),
9198 le16_to_cpu(pcysta_le32->a2dpeptto));
9202 le16_to_cpu(pcysta_le32->tavg_a2dpept),
9203 le16_to_cpu(pcysta_le32->tmax_a2dpept));
9204 r.val = dm->tdma_now.rxflctrl;
9209 le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_ON]),
9210 le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_OFF]));
9214 le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_ON]),
9215 le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_OFF]));
9219 le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_ON]),
9220 le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_OFF]));
9228 struct rtw89_btc *btc = &rtwdev->btc;
9229 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
9230 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9231 struct rtw89_btc_dm *dm = &btc->dm;
9238 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
9239 if (!pcinfo->valid)
9242 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v3;
9244 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
9246 le16_to_cpu(pcysta->cycles),
9247 le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
9248 le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
9249 le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
9250 le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
9253 if (!le32_to_cpu(pcysta->slot_cnt[i]))
9257 le32_to_cpu(pcysta->slot_cnt[i]));
9260 if (dm->tdma_now.rxflctrl)
9261 seq_printf(m, ", leak_rx:%d", le32_to_cpu(pcysta->leak_slot.cnt_rximr));
9263 if (le32_to_cpu(pcysta->collision_cnt))
9264 seq_printf(m, ", collision:%d", le32_to_cpu(pcysta->collision_cnt));
9266 if (le32_to_cpu(pcysta->skip_cnt))
9267 seq_printf(m, ", skip:%d", le32_to_cpu(pcysta->skip_cnt));
9271 seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
9273 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
9274 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
9275 le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
9276 le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
9279 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
9280 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
9281 le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
9282 le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
9285 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]),
9286 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT]));
9288 cycle = le16_to_cpu(pcysta->cycles);
9292 /* 1 cycle record 1 wl-slot and 1 bt-slot */
9298 c_begin = cycle - slot_pair + 1;
9302 if (a2dp->exist)
9309 store_index = ((cycle - 1) % slot_pair) * 2;
9312 seq_printf(m, " %-15s : ", "[cycle_step]");
9314 seq_printf(m, "->b%02d",
9315 le16_to_cpu(pcysta->slot_step_time[store_index]));
9316 if (a2dp->exist) {
9317 a2dp_trx = &pcysta->a2dp_trx[store_index];
9319 a2dp_trx->empty_cnt,
9320 a2dp_trx->retry_cnt,
9321 a2dp_trx->tx_rate ? 3 : 2,
9322 a2dp_trx->tx_cnt,
9323 a2dp_trx->ack_cnt,
9324 a2dp_trx->nack_cnt);
9326 seq_printf(m, "->w%02d",
9327 le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
9328 if (a2dp->exist) {
9329 a2dp_trx = &pcysta->a2dp_trx[store_index + 1];
9331 a2dp_trx->empty_cnt,
9332 a2dp_trx->retry_cnt,
9333 a2dp_trx->tx_rate ? 3 : 2,
9334 a2dp_trx->tx_cnt,
9335 a2dp_trx->ack_cnt,
9336 a2dp_trx->nack_cnt);
9342 if (a2dp->exist) {
9343 seq_printf(m, " %-15s : a2dp_ept:%d, a2dp_late:%d",
9345 le16_to_cpu(pcysta->a2dp_ept.cnt),
9346 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
9349 le16_to_cpu(pcysta->a2dp_ept.tavg),
9350 le16_to_cpu(pcysta->a2dp_ept.tmax));
9358 struct rtw89_btc *btc = &rtwdev->btc;
9359 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
9360 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9361 struct rtw89_btc_dm *dm = &btc->dm;
9368 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
9369 if (!pcinfo->valid)
9372 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v4;
9374 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
9376 le16_to_cpu(pcysta->cycles),
9377 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
9378 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
9379 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
9380 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
9383 if (!le16_to_cpu(pcysta->slot_cnt[i]))
9387 le16_to_cpu(pcysta->slot_cnt[i]));
9390 if (dm->tdma_now.rxflctrl)
9392 le32_to_cpu(pcysta->leak_slot.cnt_rximr));
9394 if (pcysta->collision_cnt)
9395 seq_printf(m, ", collision:%d", pcysta->collision_cnt);
9397 if (le16_to_cpu(pcysta->skip_cnt))
9399 le16_to_cpu(pcysta->skip_cnt));
9403 seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
9405 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
9406 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
9407 le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
9408 le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
9411 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
9412 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
9413 le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
9414 le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
9417 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]),
9418 le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT]));
9420 cycle = le16_to_cpu(pcysta->cycles);
9424 /* 1 cycle record 1 wl-slot and 1 bt-slot */
9430 c_begin = cycle - slot_pair + 1;
9434 if (a2dp->exist)
9441 store_index = ((cycle - 1) % slot_pair) * 2;
9444 seq_printf(m, " %-15s : ", "[cycle_step]");
9446 seq_printf(m, "->b%02d",
9447 le16_to_cpu(pcysta->slot_step_time[store_index]));
9448 if (a2dp->exist) {
9449 a2dp_trx = &pcysta->a2dp_trx[store_index];
9451 a2dp_trx->empty_cnt,
9452 a2dp_trx->retry_cnt,
9453 a2dp_trx->tx_rate ? 3 : 2,
9454 a2dp_trx->tx_cnt,
9455 a2dp_trx->ack_cnt,
9456 a2dp_trx->nack_cnt);
9458 seq_printf(m, "->w%02d",
9459 le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
9460 if (a2dp->exist) {
9461 a2dp_trx = &pcysta->a2dp_trx[store_index + 1];
9463 a2dp_trx->empty_cnt,
9464 a2dp_trx->retry_cnt,
9465 a2dp_trx->tx_rate ? 3 : 2,
9466 a2dp_trx->tx_cnt,
9467 a2dp_trx->ack_cnt,
9468 a2dp_trx->nack_cnt);
9474 if (a2dp->exist) {
9475 seq_printf(m, " %-15s : a2dp_ept:%d, a2dp_late:%d",
9477 le16_to_cpu(pcysta->a2dp_ept.cnt),
9478 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
9481 le16_to_cpu(pcysta->a2dp_ept.tavg),
9482 le16_to_cpu(pcysta->a2dp_ept.tmax));
9490 struct rtw89_btc *btc = &rtwdev->btc;
9491 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
9492 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9493 struct rtw89_btc_dm *dm = &btc->dm;
9500 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
9501 if (!pcinfo->valid)
9504 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v5;
9506 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
9508 le16_to_cpu(pcysta->cycles),
9509 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
9510 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
9511 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
9512 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
9515 if (!le16_to_cpu(pcysta->slot_cnt[i]))
9519 le16_to_cpu(pcysta->slot_cnt[i]));
9522 if (dm->tdma_now.rxflctrl)
9524 le32_to_cpu(pcysta->leak_slot.cnt_rximr));
9526 if (pcysta->collision_cnt)
9527 seq_printf(m, ", collision:%d", pcysta->collision_cnt);
9529 if (le16_to_cpu(pcysta->skip_cnt))
9531 le16_to_cpu(pcysta->skip_cnt));
9535 seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
9537 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
9538 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
9539 le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
9540 le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
9543 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
9544 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
9545 le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
9546 le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
9548 cycle = le16_to_cpu(pcysta->cycles);
9552 /* 1 cycle record 1 wl-slot and 1 bt-slot */
9558 c_begin = cycle - slot_pair + 1;
9562 if (a2dp->exist)
9572 store_index = ((cycle - 1) % slot_pair) * 2;
9575 seq_printf(m, " %-15s : ", "[cycle_step]");
9577 seq_printf(m, "->b%02d",
9578 le16_to_cpu(pcysta->slot_step_time[store_index]));
9579 if (a2dp->exist) {
9580 a2dp_trx = &pcysta->a2dp_trx[store_index];
9582 a2dp_trx->empty_cnt,
9583 a2dp_trx->retry_cnt,
9584 a2dp_trx->tx_rate ? 3 : 2,
9585 a2dp_trx->tx_cnt,
9586 a2dp_trx->ack_cnt,
9587 a2dp_trx->nack_cnt);
9589 seq_printf(m, "->w%02d",
9590 le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
9591 if (a2dp->exist) {
9592 a2dp_trx = &pcysta->a2dp_trx[store_index + 1];
9594 a2dp_trx->empty_cnt,
9595 a2dp_trx->retry_cnt,
9596 a2dp_trx->tx_rate ? 3 : 2,
9597 a2dp_trx->tx_cnt,
9598 a2dp_trx->ack_cnt,
9599 a2dp_trx->nack_cnt);
9605 if (a2dp->exist) {
9606 seq_printf(m, " %-15s : a2dp_ept:%d, a2dp_late:%d",
9608 le16_to_cpu(pcysta->a2dp_ept.cnt),
9609 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
9612 le16_to_cpu(pcysta->a2dp_ept.tavg),
9613 le16_to_cpu(pcysta->a2dp_ept.tmax));
9621 struct rtw89_btc_bt_info *bt = &rtwdev->btc.cx.bt;
9622 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt->link_info.a2dp_desc;
9623 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
9625 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
9631 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
9632 if (!pcinfo->valid)
9635 pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v7;
9636 seq_printf(m, "\n\r %-15s : cycle:%d", "[slot_stat]",
9637 le16_to_cpu(pcysta->cycles));
9640 if (!le16_to_cpu(pcysta->slot_cnt[i]))
9643 id_to_slot(i), le16_to_cpu(pcysta->slot_cnt[i]));
9646 if (dm->tdma_now.rxflctrl)
9648 le32_to_cpu(pcysta->leak_slot.cnt_rximr));
9650 if (pcysta->collision_cnt)
9651 seq_printf(m, ", collision:%d", pcysta->collision_cnt);
9653 if (pcysta->skip_cnt)
9654 seq_printf(m, ", skip:%d", le16_to_cpu(pcysta->skip_cnt));
9656 seq_printf(m, "\n\r %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
9658 le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
9659 le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
9660 le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
9661 le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
9663 le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
9664 le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
9665 dm->bt_slot_flood, dm->cnt_dm[BTC_DCNT_BT_SLOT_FLOOD],
9666 le16_to_cpu(pcysta->leak_slot.tamx) / 1000,
9667 le16_to_cpu(pcysta->leak_slot.tamx) % 1000);
9669 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
9670 le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
9671 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
9672 le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
9674 if (a2dp->exist) {
9676 "\n\r %-15s : a2dp_ept:%d, a2dp_late:%d(streak 2S:%d/max:%d)",
9678 le16_to_cpu(pcysta->a2dp_ept.cnt),
9679 le16_to_cpu(pcysta->a2dp_ept.cnt_timeout),
9680 a2dp->no_empty_streak_2s, a2dp->no_empty_streak_max);
9683 le16_to_cpu(pcysta->a2dp_ept.tavg),
9684 le16_to_cpu(pcysta->a2dp_ept.tmax));
9687 if (le16_to_cpu(pcysta->cycles) <= 1)
9690 /* 1 cycle = 1 wl-slot + 1 bt-slot */
9693 if (le16_to_cpu(pcysta->cycles) <= slot_pair)
9696 c_begin = le16_to_cpu(pcysta->cycles) - slot_pair + 1;
9698 c_end = le16_to_cpu(pcysta->cycles);
9700 if (a2dp->exist)
9710 s_id = ((cycle - 1) % slot_pair) * 2;
9713 if (a2dp->exist)
9714 seq_printf(m, "\n\r %-15s : ", "[slotT_wermtan]");
9716 seq_printf(m, "\n\r %-15s : ", "[slotT_rxerr]");
9719 seq_printf(m, "->b%d", le16_to_cpu(pcysta->slot_step_time[s_id]));
9721 if (a2dp->exist)
9723 pcysta->wl_rx_err_ratio[s_id],
9724 pcysta->a2dp_trx[s_id].empty_cnt,
9725 pcysta->a2dp_trx[s_id].retry_cnt,
9726 (pcysta->a2dp_trx[s_id].tx_rate ? 3 : 2),
9727 pcysta->a2dp_trx[s_id].tx_cnt,
9728 pcysta->a2dp_trx[s_id].ack_cnt,
9729 pcysta->a2dp_trx[s_id].nack_cnt);
9731 seq_printf(m, "(%d)", pcysta->wl_rx_err_ratio[s_id]);
9733 seq_printf(m, "->w%d", le16_to_cpu(pcysta->slot_step_time[s_id + 1]));
9735 if (a2dp->exist)
9737 pcysta->wl_rx_err_ratio[s_id + 1],
9738 pcysta->a2dp_trx[s_id + 1].empty_cnt,
9739 pcysta->a2dp_trx[s_id + 1].retry_cnt,
9740 (pcysta->a2dp_trx[s_id + 1].tx_rate ? 3 : 2),
9741 pcysta->a2dp_trx[s_id + 1].tx_cnt,
9742 pcysta->a2dp_trx[s_id + 1].ack_cnt,
9743 pcysta->a2dp_trx[s_id + 1].nack_cnt);
9745 seq_printf(m, "(%d)", pcysta->wl_rx_err_ratio[s_id + 1]);
9751 struct rtw89_btc *btc = &rtwdev->btc;
9752 const struct rtw89_btc_ver *ver = btc->ver;
9753 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9758 if (!btc->dm.tdma_now.rxflctrl)
9761 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo;
9762 if (!pcinfo->valid)
9765 ns = &pfwinfo->rpt_fbtc_nullsta.finfo;
9766 if (ver->fcxnullsta == 1) {
9768 seq_printf(m, " %-15s : ", "[NULL-STA]");
9769 seq_printf(m, "null-%d", i);
9771 le32_to_cpu(ns->v1.result[i][1]));
9773 le32_to_cpu(ns->v1.result[i][0]));
9775 le32_to_cpu(ns->v1.result[i][2]));
9777 le32_to_cpu(ns->v1.result[i][3]));
9779 le32_to_cpu(ns->v1.avg_t[i]) / 1000,
9780 le32_to_cpu(ns->v1.avg_t[i]) % 1000);
9782 le32_to_cpu(ns->v1.max_t[i]) / 1000,
9783 le32_to_cpu(ns->v1.max_t[i]) % 1000);
9785 } else if (ver->fcxnullsta == 7) {
9787 seq_printf(m, " %-15s : ", "[NULL-STA]");
9788 seq_printf(m, "null-%d", i);
9790 le32_to_cpu(ns->v7.result[i][4]));
9792 le32_to_cpu(ns->v7.result[i][1]));
9794 le32_to_cpu(ns->v7.result[i][0]));
9796 le32_to_cpu(ns->v7.result[i][2]));
9798 le32_to_cpu(ns->v7.result[i][3]));
9800 le32_to_cpu(ns->v7.tavg[i]) / 1000,
9801 le32_to_cpu(ns->v7.tavg[i]) % 1000);
9803 le32_to_cpu(ns->v7.tmax[i]) / 1000,
9804 le32_to_cpu(ns->v7.tmax[i]) % 1000);
9808 seq_printf(m, " %-15s : ", "[NULL-STA]");
9809 seq_printf(m, "null-%d", i);
9811 le32_to_cpu(ns->v2.result[i][4]));
9813 le32_to_cpu(ns->v2.result[i][1]));
9815 le32_to_cpu(ns->v2.result[i][0]));
9817 le32_to_cpu(ns->v2.result[i][2]));
9819 le32_to_cpu(ns->v2.result[i][3]));
9821 le32_to_cpu(ns->v2.avg_t[i]) / 1000,
9822 le32_to_cpu(ns->v2.avg_t[i]) % 1000);
9824 le32_to_cpu(ns->v2.max_t[i]) / 1000,
9825 le32_to_cpu(ns->v2.max_t[i]) % 1000);
9832 struct rtw89_btc *btc = &rtwdev->btc;
9833 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9836 const struct rtw89_btc_ver *ver = btc->ver;
9842 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo;
9843 if (!pcinfo->valid)
9846 pstep = &pfwinfo->rpt_fbtc_step.finfo.v2;
9847 pos_old = le16_to_cpu(pstep->pos_old);
9848 pos_new = le16_to_cpu(pstep->pos_new);
9850 if (pcinfo->req_fver != pstep->fver)
9857 if (ver->fcxctrl == 7 || ver->fcxctrl == 1)
9860 trace_step = btc->ctrl.ctrl.trace_step;
9866 n_stop = trace_step - 1;
9872 type = pstep->step[i].type;
9873 val = pstep->step[i].val;
9874 diff_t = le16_to_cpu(pstep->step[i].difft);
9880 seq_printf(m, " %-15s : ", "[steps]");
9882 seq_printf(m, "-> %s(%02d)(%02d)",
9907 struct rtw89_btc *btc = &rtwdev->btc;
9908 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
9915 if ((pfwinfo->rpt_en_map &
9919 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo;
9920 if (!pcinfo->valid)
9923 pstep = &pfwinfo->rpt_fbtc_step.finfo.v3;
9924 if (pcinfo->req_fver != pstep->fver)
9927 if (le32_to_cpu(pstep->cnt) <= FCXDEF_STEP)
9930 n_begin = le32_to_cpu(pstep->cnt) - FCXDEF_STEP + 1;
9932 n_end = le32_to_cpu(pstep->cnt);
9939 array_idx = (i - 1) % FCXDEF_STEP;
9940 type = pstep->step[array_idx].type;
9941 val = pstep->step[array_idx].val;
9942 diff_t = le16_to_cpu(pstep->step[array_idx].difft);
9948 seq_printf(m, " %-15s : ", "[steps]");
9950 seq_printf(m, "-> %s(%02d)",
9964 struct rtw89_btc *btc = &rtwdev->btc;
9965 const struct rtw89_btc_ver *ver = btc->ver;
9967 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_DM))
9974 if (ver->fcxcysta == 2)
9976 else if (ver->fcxcysta == 3)
9978 else if (ver->fcxcysta == 4)
9980 else if (ver->fcxcysta == 5)
9982 else if (ver->fcxcysta == 7)
9987 if (ver->fcxstep == 2)
9989 else if (ver->fcxstep == 3)
9996 const struct rtw89_chip_info *chip = rtwdev->chip;
10000 if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B ||
10001 chip->chip_id == RTL8851B || chip->chip_id == RTL8852BT) {
10005 gnt = &gnt_cfg->band[0];
10006 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SW_CTRL);
10007 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0_STA);
10008 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SW_CTRL);
10009 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0_STA);
10011 gnt = &gnt_cfg->band[1];
10012 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SW_CTRL);
10013 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1_STA);
10014 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SW_CTRL);
10015 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1_STA);
10016 } else if (chip->chip_id == RTL8852C) {
10020 gnt = &gnt_cfg->band[0];
10021 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S0_SWCTRL);
10022 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S0);
10023 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S0_SWCTRL);
10024 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S0);
10026 gnt = &gnt_cfg->band[1];
10027 gnt->gnt_bt_sw_en = !!(val & B_AX_GNT_BT_RFC_S1_SWCTRL);
10028 gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1);
10029 gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SWCTRL);
10030 gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1);
10038 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
10039 const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
10045 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo;
10046 gdbg = &rtwdev->btc.fwinfo.rpt_fbtc_gpio_dbg.finfo;
10047 if (!pcinfo->valid) {
10055 if (ver->fcxgpiodbg == 7) {
10056 en_map = le32_to_cpu(gdbg->v7.en_map);
10057 gpio_map = gdbg->v7.gpio_map;
10059 en_map = le32_to_cpu(gdbg->v1.en_map);
10060 gpio_map = gdbg->v1.gpio_map;
10066 seq_printf(m, " %-15s : enable_map:0x%08x",
10072 seq_printf(m, ", %s->GPIO%d", id_to_gdbg(i), gpio_map[i]);
10079 const struct rtw89_chip_info *chip = rtwdev->chip;
10080 struct rtw89_btc *btc = &rtwdev->btc;
10081 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10084 struct rtw89_btc_cx *cx = &btc->cx;
10085 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
10086 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
10092 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG))
10098 " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n",
10099 "[scoreboard]", wl->scbd, cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
10100 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
10101 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
10103 btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
10108 " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ",
10110 chip->chip_id == RTL8852C ? "HW" :
10111 btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
10116 seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
10122 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
10123 if (!pcinfo->valid) {
10130 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v1;
10133 __func__, pmreg->reg_num);
10135 for (i = 0; i < pmreg->reg_num; i++) {
10136 type = (u8)le16_to_cpu(chip->mon_reg[i].type);
10137 offset = le32_to_cpu(chip->mon_reg[i].offset);
10138 val = le32_to_cpu(pmreg->mreg_val[i]);
10141 seq_printf(m, " %-15s : %d_0x%04x=0x%08x",
10150 if (i >= pmreg->reg_num)
10157 const struct rtw89_chip_info *chip = rtwdev->chip;
10158 struct rtw89_btc *btc = &rtwdev->btc;
10159 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10162 struct rtw89_btc_cx *cx = &btc->cx;
10163 struct rtw89_btc_wl_info *wl = &btc->cx.wl;
10164 struct rtw89_btc_bt_info *bt = &btc->cx.bt;
10170 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG))
10176 " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n",
10177 "[scoreboard]", wl->scbd, cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
10178 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
10179 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
10181 btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
10186 " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], polut_type:%s",
10188 chip->chip_id == RTL8852C ? "HW" :
10189 btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
10192 id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
10195 seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
10201 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
10202 if (!pcinfo->valid) {
10209 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v2;
10212 __func__, pmreg->reg_num);
10214 for (i = 0; i < pmreg->reg_num; i++) {
10215 type = (u8)le16_to_cpu(chip->mon_reg[i].type);
10216 offset = le32_to_cpu(chip->mon_reg[i].offset);
10217 val = le32_to_cpu(pmreg->mreg_val[i]);
10220 seq_printf(m, " %-15s : %d_0x%04x=0x%08x",
10229 if (i >= pmreg->reg_num)
10236 struct rtw89_btc *btc = &rtwdev->btc;
10237 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10240 struct rtw89_btc_cx *cx = &btc->cx;
10241 struct rtw89_btc_wl_info *wl = &cx->wl;
10242 struct rtw89_btc_bt_info *bt = &cx->bt;
10244 struct rtw89_btc_dm *dm = &btc->dm;
10248 if (!(dm->coex_info_map & BTC_COEX_INFO_MREG))
10254 "\n\r %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)",
10255 "[scoreboard]", wl->scbd, cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
10256 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
10257 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
10259 /* To avoid I/O if WL LPS or power-off */
10260 dm->pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
10263 "\n\r %-15s : pta_owner:%s, pta_req_mac:MAC%d, rf_gnt_source: polut_type:%s",
10265 rtwdev->chip->para_ver & BTC_FEAT_PTA_ONOFF_CTRL ? "HW" :
10266 dm->pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
10267 wl->pta_req_mac, id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
10269 gnt = &dm->gnt.band[RTW89_PHY_0];
10271 seq_printf(m, ", phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d]",
10272 gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
10273 gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
10275 if (rtwdev->dbcc_en) {
10276 gnt = &dm->gnt.band[RTW89_PHY_1];
10277 seq_printf(m, ", phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]",
10278 gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
10279 gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
10282 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
10283 if (!pcinfo->valid)
10286 pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v7;
10288 for (i = 0; i < pmreg->reg_num; i++) {
10289 type = (u8)le16_to_cpu(rtwdev->chip->mon_reg[i].type);
10290 offset = le32_to_cpu(rtwdev->chip->mon_reg[i].offset);
10291 val = le32_to_cpu(pmreg->mreg_val[i]);
10294 seq_printf(m, "\n\r %-15s : %s_0x%x=0x%x", "[reg]",
10306 struct rtw89_btc *btc = &rtwdev->btc;
10307 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10310 struct rtw89_btc_cx *cx = &btc->cx;
10311 struct rtw89_btc_dm *dm = &btc->dm;
10312 struct rtw89_btc_wl_info *wl = &cx->wl;
10313 struct rtw89_btc_bt_info *bt = &cx->bt;
10314 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
10317 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
10322 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
10323 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
10324 prptctrl = &pfwinfo->rpt_ctrl.finfo.v1;
10327 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ",
10328 "[summary]", pfwinfo->cnt_h2c,
10329 pfwinfo->cnt_h2c_fail, prptctrl->h2c_cnt,
10330 pfwinfo->cnt_c2h, prptctrl->c2h_cnt);
10334 pfwinfo->event[BTF_EVNT_RPT], prptctrl->rpt_cnt,
10335 prptctrl->rpt_enable, dm->error.val);
10337 if (dm->error.map.wl_fw_hang)
10341 " %-15s : send_ok:%d, send_fail:%d, recv:%d",
10342 "[mailbox]", prptctrl->mb_send_ok_cnt,
10343 prptctrl->mb_send_fail_cnt, prptctrl->mb_recv_cnt);
10347 prptctrl->mb_a2dp_empty_cnt,
10348 prptctrl->mb_a2dp_flct_cnt,
10349 prptctrl->mb_a2dp_full_cnt);
10352 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]",
10353 "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
10354 cx->cnt_wl[BTC_WCNT_RFK_GO],
10355 cx->cnt_wl[BTC_WCNT_RFK_REJECT],
10356 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
10360 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REQ],
10361 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_GO],
10362 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REJECT],
10363 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT],
10364 prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_FAIL]);
10366 if (prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT] > 0)
10367 bt->rfk_info.map.timeout = 1;
10369 bt->rfk_info.map.timeout = 0;
10371 dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout;
10374 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x",
10375 "[summary]", pfwinfo->cnt_h2c,
10376 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h,
10377 pfwinfo->event[BTF_EVNT_RPT],
10378 btc->fwinfo.rpt_en_map);
10383 cnt_sum += dm->cnt_notify[i];
10386 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
10397 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
10410 struct rtw89_btc *btc = &rtwdev->btc;
10411 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10414 struct rtw89_btc_cx *cx = &btc->cx;
10415 struct rtw89_btc_dm *dm = &btc->dm;
10416 struct rtw89_btc_wl_info *wl = &cx->wl;
10417 struct rtw89_btc_bt_info *bt = &cx->bt;
10418 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
10421 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
10426 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
10427 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
10428 prptctrl = &pfwinfo->rpt_ctrl.finfo.v4;
10431 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ",
10432 "[summary]", pfwinfo->cnt_h2c,
10433 pfwinfo->cnt_h2c_fail,
10434 le32_to_cpu(prptctrl->rpt_info.cnt_h2c),
10435 pfwinfo->cnt_c2h,
10436 le32_to_cpu(prptctrl->rpt_info.cnt_c2h));
10440 pfwinfo->event[BTF_EVNT_RPT],
10441 le32_to_cpu(prptctrl->rpt_info.cnt),
10442 le32_to_cpu(prptctrl->rpt_info.en),
10443 dm->error.val);
10445 if (dm->error.map.wl_fw_hang)
10449 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
10451 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
10452 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
10453 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
10457 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
10458 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
10459 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
10460 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
10461 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
10464 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]",
10465 "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
10466 cx->cnt_wl[BTC_WCNT_RFK_GO],
10467 cx->cnt_wl[BTC_WCNT_RFK_REJECT],
10468 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
10472 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]),
10473 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_GO]),
10474 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REJECT]),
10475 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]),
10476 le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_FAIL]));
10478 if (le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0)
10479 bt->rfk_info.map.timeout = 1;
10481 bt->rfk_info.map.timeout = 0;
10483 dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout;
10486 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x",
10487 "[summary]", pfwinfo->cnt_h2c,
10488 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h,
10489 pfwinfo->event[BTF_EVNT_RPT],
10490 btc->fwinfo.rpt_en_map);
10495 cnt_sum += dm->cnt_notify[i];
10498 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
10509 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
10522 struct rtw89_btc *btc = &rtwdev->btc;
10523 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10526 struct rtw89_btc_cx *cx = &btc->cx;
10527 struct rtw89_btc_dm *dm = &btc->dm;
10528 struct rtw89_btc_wl_info *wl = &cx->wl;
10529 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
10532 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
10537 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
10538 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
10539 prptctrl = &pfwinfo->rpt_ctrl.finfo.v5;
10542 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ",
10543 "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
10544 le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
10545 pfwinfo->cnt_c2h,
10546 le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
10547 le16_to_cpu(prptctrl->rpt_info.len_c2h));
10551 pfwinfo->event[BTF_EVNT_RPT],
10552 le16_to_cpu(prptctrl->rpt_info.cnt),
10553 le32_to_cpu(prptctrl->rpt_info.en));
10555 if (dm->error.map.wl_fw_hang)
10559 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
10561 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
10562 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
10563 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
10567 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
10568 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
10569 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
10570 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
10571 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
10574 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]",
10575 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
10576 cx->cnt_wl[BTC_WCNT_RFK_GO],
10577 cx->cnt_wl[BTC_WCNT_RFK_REJECT],
10578 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
10582 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
10586 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
10587 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
10590 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d",
10591 "[summary]", pfwinfo->cnt_h2c,
10592 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h);
10595 if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch ||
10596 pfwinfo->err[BTFRE_EXCEPTION]) {
10599 " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:"
10601 "[ERROR]", pcinfo->valid, pfwinfo->len_mismch,
10602 pfwinfo->fver_mismch, pfwinfo->err[BTFRE_EXCEPTION],
10603 wl->status.map.lps, wl->status.map.rf_off);
10607 cnt_sum += dm->cnt_notify[i];
10611 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
10624 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
10637 struct rtw89_btc *btc = &rtwdev->btc;
10638 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
10641 struct rtw89_btc_cx *cx = &btc->cx;
10642 struct rtw89_btc_dm *dm = &btc->dm;
10643 struct rtw89_btc_wl_info *wl = &cx->wl;
10644 u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
10647 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
10652 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
10653 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
10654 prptctrl = &pfwinfo->rpt_ctrl.finfo.v105;
10657 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ",
10658 "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
10659 le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
10660 pfwinfo->cnt_c2h,
10661 le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
10662 le16_to_cpu(prptctrl->rpt_info.len_c2h));
10666 pfwinfo->event[BTF_EVNT_RPT],
10667 le16_to_cpu(prptctrl->rpt_info.cnt),
10668 le32_to_cpu(prptctrl->rpt_info.en));
10670 if (dm->error.map.wl_fw_hang)
10674 " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
10676 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
10677 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
10678 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
10682 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
10683 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
10684 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
10685 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
10686 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
10689 " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]",
10690 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
10691 cx->cnt_wl[BTC_WCNT_RFK_GO],
10692 cx->cnt_wl[BTC_WCNT_RFK_REJECT],
10693 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
10697 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
10701 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
10702 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
10705 " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d",
10706 "[summary]", pfwinfo->cnt_h2c,
10707 pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h);
10710 if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch ||
10711 pfwinfo->err[BTFRE_EXCEPTION]) {
10714 " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:"
10716 "[ERROR]", pcinfo->valid, pfwinfo->len_mismch,
10717 pfwinfo->fver_mismch, pfwinfo->err[BTFRE_EXCEPTION],
10718 wl->status.map.lps, wl->status.map.rf_off);
10722 cnt_sum += dm->cnt_notify[i];
10726 " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
10739 " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
10752 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
10755 struct rtw89_btc_cx *cx = &rtwdev->btc.cx;
10756 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
10757 struct rtw89_btc_wl_info *wl = &cx->wl;
10758 u32 *cnt = rtwdev->btc.dm.cnt_notify;
10762 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
10767 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
10768 if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF &&
10769 !wl->status.map.rf_off) {
10770 prptctrl = &pfwinfo->rpt_ctrl.finfo.v7;
10773 "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d),"
10775 "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
10776 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), pfwinfo->cnt_c2h,
10777 le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
10778 le16_to_cpu(prptctrl->rpt_info.len_c2h),
10779 rtwdev->btc.ver->info_buf);
10782 pfwinfo->event[BTF_EVNT_RPT],
10783 le16_to_cpu(prptctrl->rpt_info.cnt),
10784 le32_to_cpu(prptctrl->rpt_info.en));
10786 if (dm->error.map.wl_fw_hang)
10789 seq_printf(m, "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
10790 "[mailbox]", le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
10791 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
10792 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
10795 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
10796 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
10797 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
10798 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
10799 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
10802 "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]",
10803 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
10804 cx->cnt_wl[BTC_WCNT_RFK_GO],
10805 cx->cnt_wl[BTC_WCNT_RFK_REJECT],
10806 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT],
10807 wl->rfk_info.proc_time);
10810 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
10813 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
10814 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
10817 "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)",
10819 pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
10820 pfwinfo->cnt_c2h,
10821 wl->status.map.lps, wl->status.map.rf_off);
10825 cnt_sum += dm->cnt_notify[i];
10828 "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
10840 "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ",
10848 rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW],
10854 struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
10857 struct rtw89_btc_cx *cx = &rtwdev->btc.cx;
10858 struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
10859 struct rtw89_btc_wl_info *wl = &cx->wl;
10860 u32 *cnt = rtwdev->btc.dm.cnt_notify;
10864 if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
10869 pcinfo = &pfwinfo->rpt_ctrl.cinfo;
10870 if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF &&
10871 !wl->status.map.rf_off) {
10872 prptctrl = &pfwinfo->rpt_ctrl.finfo.v8;
10875 "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d, max:fw-%d/drv-%d), ",
10876 "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
10877 le16_to_cpu(prptctrl->rpt_info.cnt_h2c), pfwinfo->cnt_c2h,
10878 le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
10879 le16_to_cpu(prptctrl->rpt_info.len_c2h),
10880 (prptctrl->rpt_len_max_h << 8) + prptctrl->rpt_len_max_l,
10881 rtwdev->btc.ver->info_buf);
10884 pfwinfo->event[BTF_EVNT_RPT],
10885 le16_to_cpu(prptctrl->rpt_info.cnt),
10886 le32_to_cpu(prptctrl->rpt_info.en));
10888 if (dm->error.map.wl_fw_hang)
10891 seq_printf(m, "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
10892 "[mailbox]", le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
10893 le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
10894 le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
10897 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
10898 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
10899 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
10900 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
10901 le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
10904 "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]",
10905 "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
10906 cx->cnt_wl[BTC_WCNT_RFK_GO],
10907 cx->cnt_wl[BTC_WCNT_RFK_REJECT],
10908 cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT],
10909 wl->rfk_info.proc_time);
10912 le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
10915 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
10916 le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
10919 "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)",
10921 pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
10922 pfwinfo->cnt_c2h,
10923 wl->status.map.lps, wl->status.map.rf_off);
10927 cnt_sum += dm->cnt_notify[i];
10930 "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
10942 "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ",
10950 rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW],
10956 struct rtw89_fw_suit *fw_suit = &rtwdev->fw.normal;
10957 struct rtw89_btc *btc = &rtwdev->btc;
10958 const struct rtw89_btc_ver *ver = btc->ver;
10959 struct rtw89_btc_cx *cx = &btc->cx;
10960 struct rtw89_btc_bt_info *bt = &cx->bt;
10964 fw_suit->major_ver, fw_suit->minor_ver,
10965 fw_suit->sub_ver, fw_suit->sub_idex);
10966 seq_printf(m, "manual %d\n", btc->manual_ctrl);
10970 seq_printf(m, "\n\r %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)",
10972 bt->raw_info[2], bt->raw_info[3],
10973 bt->raw_info[4], bt->raw_info[5],
10974 bt->raw_info[6], bt->raw_info[7],
10975 bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply",
10976 cx->cnt_bt[BTC_BCNT_INFOUPDATE],
10977 cx->cnt_bt[BTC_BCNT_INFOSAME]);
10987 if (ver->fcxmreg == 1)
10989 else if (ver->fcxmreg == 2)
10991 else if (ver->fcxmreg == 7)
10996 if (ver->fcxbtcrpt == 1)
10998 else if (ver->fcxbtcrpt == 4)
11000 else if (ver->fcxbtcrpt == 5)
11002 else if (ver->fcxbtcrpt == 105)
11004 else if (ver->fcxbtcrpt == 7)
11006 else if (ver->fcxbtcrpt == 8)
11012 const struct rtw89_chip_info *chip = rtwdev->chip;
11013 struct rtw89_btc *btc = &rtwdev->btc;
11025 if (chip->chip_id != btc_ver_def->chip_id)
11028 if (suit_ver_code >= btc_ver_def->fw_ver_code) {
11029 btc->ver = btc_ver_def;
11034 btc->ver = &rtw89_btc_ver_defs[RTW89_DEFAULT_BTC_VER_IDX];
11038 (int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code);