From: Ping-Ke Shih <pkshih@realtek.com>
To: <linux-wireless@vger.kernel.org>
Cc: <ku920601@realtek.com>
Subject: [PATCH rtw-next 07/11] wifi: rtw89: coex: Refine _reset_btc_var()
Date: Sun, 12 Jul 2026 11:05:02 +0800 [thread overview]
Message-ID: <20260712030506.43438-8-pkshih@realtek.com> (raw)
In-Reply-To: <20260712030506.43438-1-pkshih@realtek.com>
From: Ching-Te Ku <ku920601@realtek.com>
To avoid the default value not match the real using scenario, it should
after assign desired default value after variable reset.
Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/coex.c | 68 ++++++++----
drivers/net/wireless/realtek/rtw89/coex.h | 8 ++
drivers/net/wireless/realtek/rtw89/core.h | 127 ++++++++++++++++++++++
3 files changed, 180 insertions(+), 23 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
index 07d054f59eb5..17290b2cb2c8 100644
--- a/drivers/net/wireless/realtek/rtw89/coex.c
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
@@ -1048,44 +1048,52 @@ static int _send_fw_cmd(struct rtw89_dev *rtwdev, u8 h2c_class, u8 h2c_func,
return ret;
}
-#define BTC_BT_DEF_BR_TX_PWR 4
-#define BTC_BT_DEF_LE_TX_PWR 4
+#define BTC_DEFAULT_SIR_THRES 51 /* dB, BT Pin - This = TDD/FDD swtch thres */
+#define BTC_FDDR_TP_SETUP_TIME 1 /* in second */
+#define BTC_FDDR_TP_HOLD_TIME 3 /* in second */
+#define BTC_FDDR_RX_LOW_RATE_THRES 4 /* low rate for TDD swotch */
static void _reset_btc_var(struct rtw89_dev *rtwdev, u8 type)
{
struct rtw89_btc *btc = &rtwdev->btc;
- const struct rtw89_btc_ver *ver = btc->ver;
struct rtw89_btc_cx *cx = &btc->cx;
- struct rtw89_btc_wl_info *wl = &btc->cx.wl;
- struct rtw89_btc_bt_info *bt = &btc->cx.bt0;
- struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
- struct rtw89_btc_wl_link_info *wl_linfo;
- u8 i, j;
+ const struct rtw89_btc_ver *ver = btc->ver;
+ struct rtw89_btc_bt_info *bt0 = &cx->bt0;
+ struct rtw89_btc_bt_info *bt1 = &cx->bt1;
+ u8 i;
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], %s\n", __func__);
- if (type & BTC_RESET_CX)
+ if (type & BTC_RESET_CX) {
memset(cx, 0, sizeof(*cx));
-
- if (type & BTC_RESET_BTINFO) /* only for BT enable */
- memset(bt, 0, sizeof(*bt));
+ cx->bt_ext.max_tx_pwr = RTW89_BTC_BT_DEF_LE_TX_PWR;
+ cx->bt_ext.ant_iso_to_wl = RTW89_BTC_DEFAULT_ANISO;
+ }
+
+ if (type & BTC_RESET_BTINFO) {/* only for BT enable */
+ memset(bt0, 0, sizeof(*bt0));
+ bt0->link_info.bt_txpwr_desc.br_dbm = RTW89_BTC_BT_DEF_BR_TX_PWR;
+ bt0->link_info_56g.bt_txpwr_desc.br_dbm = RTW89_BTC_BT_DEF_BR_TX_PWR;
+ bt0->link_info.bt_txpwr_desc.le_dbm = RTW89_BTC_BT_DEF_LE_TX_PWR;
+ bt0->link_info_56g.bt_txpwr_desc.le_dbm = RTW89_BTC_BT_DEF_LE_TX_PWR;
+ bt0->ant_iso_to_wl = RTW89_BTC_DEFAULT_ANISO;
+ } else if (type & BTC_RESET_BTINFO2) {
+ memset(bt1, 0, sizeof(*bt1));
+ bt1->link_info.bt_txpwr_desc.br_dbm = RTW89_BTC_BT_DEF_BR_TX_PWR;
+ bt1->link_info_56g.bt_txpwr_desc.br_dbm = RTW89_BTC_BT_DEF_BR_TX_PWR;
+ bt1->link_info.bt_txpwr_desc.le_dbm = RTW89_BTC_BT_DEF_LE_TX_PWR;
+ bt1->link_info_56g.bt_txpwr_desc.le_dbm = RTW89_BTC_BT_DEF_LE_TX_PWR;
+ bt1->ant_iso_to_wl = RTW89_BTC_DEFAULT_ANISO;
+ }
if (type & BTC_RESET_CTRL) {
memset(&btc->ctrl, 0, sizeof(btc->ctrl));
- btc->manual_ctrl = false;
btc->ctrl.trace_step = FCXDEF_STEP;
}
/* Init Coex variables that are not zero */
if (type & BTC_RESET_DM) {
memset(&btc->dm, 0, sizeof(btc->dm));
- memset(bt_linfo->rssi_state, 0, sizeof(bt_linfo->rssi_state));
- for (j = RTW89_MAC_0; j <= RTW89_MAC_1; j++) {
- for (i = 0; i < RTW89_BE_BTC_WL_MAX_ROLE_NUMBER; i++) {
- wl_linfo = &wl->rlink_info[i][j];
- memset(wl_linfo->rssi_state, 0, sizeof(wl_linfo->rssi_state));
- }
- }
/* set the slot_now table to original */
btc->dm.tdma_now = t_def[CXTD_OFF];
@@ -1108,18 +1116,32 @@ static void _reset_btc_var(struct rtw89_dev *rtwdev, u8 type)
btc->policy_len = 0;
btc->bt_req_len[RTW89_PHY_0] = 0;
btc->bt_req_len[RTW89_PHY_1] = 0;
+ btc->hubmsg_cnt = 0;
+
btc->dm.coex_info_map = BTC_COEX_INFO_ALL;
btc->dm.wl_tx_limit.tx_time = BTC_MAX_TX_TIME_DEF;
btc->dm.wl_tx_limit.tx_retry = BTC_MAX_TX_RETRY_DEF;
+ btc->dm.bt_slot_flood = BTC_B1_MAX;
+ btc->dm.sir_thres = BTC_DEFAULT_SIR_THRES;
+ btc->dm.fddr_info.tp_setup_time = BTC_FDDR_TP_SETUP_TIME;
+ btc->dm.fddr_info.tp_hold_time = BTC_FDDR_TP_HOLD_TIME;
+ btc->dm.fddr_info.wl_rx_rate_thres = BTC_FDDR_RX_LOW_RATE_THRES;
+ btc->dm.fddt_info.type = BTC_FDDT_TYPE_AUTO;
+
btc->dm.wl_pre_agc_rb = BTC_PREAGC_NOTFOUND;
btc->dm.wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_NOTFOUND;
}
- if (type & BTC_RESET_MDINFO)
+ if (type & BTC_RESET_MDINFO) {
memset(&btc->mdinfo, 0, sizeof(btc->mdinfo));
- bt->link_info.bt_txpwr_desc.br_dbm = BTC_BT_DEF_BR_TX_PWR;
- bt->link_info.bt_txpwr_desc.le_dbm = BTC_BT_DEF_LE_TX_PWR;
+ if (ver->fcxinit == 10)
+ btc->mdinfo.md_v10.ant.isolation = RTW89_BTC_DEFAULT_ANISO;
+ else if (ver->fcxinit == 7)
+ btc->mdinfo.md_v7.ant.isolation = RTW89_BTC_DEFAULT_ANISO;
+ else
+ btc->mdinfo.md.ant.isolation = RTW89_BTC_DEFAULT_ANISO;
+ }
}
static u8 _search_reg_index(struct rtw89_dev *rtwdev, u8 mreg_num, u16 reg_type, u32 target)
diff --git a/drivers/net/wireless/realtek/rtw89/coex.h b/drivers/net/wireless/realtek/rtw89/coex.h
index c127bd80d31c..fdd63e2c0837 100644
--- a/drivers/net/wireless/realtek/rtw89/coex.h
+++ b/drivers/net/wireless/realtek/rtw89/coex.h
@@ -241,6 +241,14 @@ enum btc_3cx_type {
BTC_3CX_MAX,
};
+enum btc_fddt_type {
+ BTC_FDDT_TYPE_STOP,
+ BTC_FDDT_TYPE_AUTO,
+ BTC_FDDT_TYPE_FIX_TDD,
+ BTC_FDDT_TYPE_FIX_FULL_FDD,
+ BTC_FDDT_MAX,
+};
+
enum btc_chip_feature {
BTC_FEAT_PTA_ONOFF_CTRL = BIT(0), /* on/off ctrl by HW (not 0x73[2]) */
BTC_FEAT_NONBTG_GWL_THRU = BIT(1), /* non-BTG GNT_WL!=0 if GNT_BT = 1 */
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index cb3a740e4719..f784e8437292 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -2462,6 +2462,9 @@ enum rtw89_btc_bt_func_type {
#define RTW89_BTC_BTC_SCAN_V1_FLAG_ENABLE BIT(0)
#define RTW89_BTC_BTC_SCAN_V1_FLAG_INTERLACE BIT(1)
+#define RTW89_BTC_BT_DEF_BR_TX_PWR 4
+#define RTW89_BTC_BT_DEF_LE_TX_PWR 4
+#define RTW89_BTC_DEFAULT_ANISO 10
struct rtw89_btc_bt_scan_info_v1 {
__le16 win;
@@ -2521,6 +2524,7 @@ struct rtw89_btc_bt_info {
u8 func_type;
u8 tx_power_now;
u8 tx_power_now_6g;
+ u8 ant_iso_to_wl; /* ant isolation between BTx and WL */
u8 fw_ver_mismatch: 1;
u8 band_56G_support: 1;
@@ -3474,6 +3478,123 @@ union rtw89_btc_fbtc_slot_u {
struct rtw89_btc_fbtc_slot_v7 v7[CXST_MAX];
};
+struct rtw89_btc_fddr_cell {
+ u8 en;
+ u8 wl_rx_max;
+ u8 wl_rx_min;
+};
+
+struct rtw89_btc_fddr_result {
+ u8 wl_rx_limit;
+ u8 wl_rx_limit_step[6]; /* record search process */
+ u8 search_cnt; /* the rx-limit serach count */
+ u32 wl_tp;
+ u32 wl_tp_step[6]; /* record search process */
+};
+
+struct rtw89_btc_fddr_train_info {
+ u8 rx_limit_pre;
+ u8 rx_limit_now;
+
+ u32 tp_rec_cnt;
+ u32 tp_avg_cnt;
+
+ u32 wl_tp_pre;
+ u32 wl_tp_now;
+};
+
+struct rtw89_btc_fddr_info {
+ u8 state; /* refer to enum btc_fddr_state */
+ u8 cell_now; /* wl rssi_level after filter LNA != 6 */
+ u8 cell_change;
+ u8 wl_low_rate;
+
+ u8 tp_setup_time; /* calculate TP after this value (in second) */
+ u8 tp_hold_time; /* TP calculation period (in second) */
+ u8 wl_rssi_thres[BTC_WL_RSSI_THMAX]; /* index 0 -> Max RSSI */
+
+ u8 search_mode; /* 0: search, 1:look-up */
+ u8 search_dir; /* 0: Max->Min, 1:Min->Max */
+
+ struct rtw89_btc_fddr_train_info tctrl; /* train flag */
+ struct rtw89_btc_fddr_result cell_result[BTC_WL_RSSI_THMAX + 1];
+ struct rtw89_btc_fddr_cell cell[BTC_WL_RSSI_THMAX + 1]; /* parameters */
+
+ u16 wl_rx_rate_thres; /* switch to TDD if rx_rate < this threshold */
+
+ u32 nrsn_map; /* the reason map for no-run fdd-traing */
+ u32 wl_rx_rate_now;
+};
+
+struct rtw89_btc_rpt_ctrl_a2dp_empty {
+ u32 cnt_empty; /* a2dp empty count */
+ u32 cnt_flowctrl; /* a2dp empty flow control counter */
+ u32 cnt_tx;
+ u32 cnt_ack;
+ u32 cnt_nack;
+};
+
+struct rtw89_btc_fddt_bt_stat {
+ struct rtw89_btc_rpt_ctrl_a2dp_empty a2dp_last;
+ u32 retry_last;
+};
+
+struct rtw89_btc_fddt_cell {
+ s8 wl_pwr_min;
+ s8 wl_pwr_max;
+ s8 bt_pwr_dec_max;
+ s8 bt_rx_gain;
+};
+
+struct rtw89_btc_fddt_fail_check { /* for cell stay in training */
+ u8 check_map; /* check pass condition if bit-map = 1 */
+ u8 bt_no_empty_cnt; /* 0-fail if no bt-empty >= th in train_cycle */
+ u8 wl_tp_ratio; /* 1-fail if wl tp rise ratio < th */
+ u8 wl_kpibtr_ratio; /* 2-fail if phase_now_tp < phase_last_tp * kpibtr_ratio */
+};
+
+struct rtw89_btc_fddt_break_check { /* for cell stay in training or train-ok */
+ u8 check_map; /* check break condition if bit-map = 1 */
+ u8 bt_no_empty_cnt; /* 0-break if no empty count >= th */
+ u8 wl_tp_ratio; /* 1-break if wl tp ratio < th (%) */
+ u8 wl_tp_low_bound; /* 2-break if wl tp (in Mbps) < th */
+
+ u8 cn; /* 3-break if (cn >= cn_limit) >= th cycle */
+ u8 cell_chg; /* 4-break if non-matched-RSSI >= th cycle */
+ s8 nhm_limit; /* 5-break if nhm >= th --> ill-condition */
+ u8 cn_limit; /* if condition number >= th --> ill-condition */
+};
+
+struct rtw89_btc_fddt_time_ctrl {
+ /* 1 TDD cycle = w1 + b1, FDD 1cycle = w1fdd-slot + b1fdd-slot */
+ u8 m_cycle; /* KPI Moving-Average-Cycle: 1~32 cycles */
+ u8 w_cycle; /* Start to calcul WKPI after this if train-phase change */
+ u8 k_cycle; /* Total kpi-estimate cycles for each training-step */
+ u8 rsvd;
+};
+
+struct rtw89_btc_fddt_train_info {
+ struct rtw89_btc_fddt_time_ctrl t_ctrl;
+ struct rtw89_btc_fddt_break_check b_chk;
+ struct rtw89_btc_fddt_fail_check f_chk;
+ struct rtw89_btc_fddt_cell cell_ul[5][5];
+ struct rtw89_btc_fddt_cell cell_dl[5][5];
+};
+
+struct rtw89_btc_fddt_info {
+ u8 type; /* refer to enum btc_fddt_type */
+ u8 result; /* fw send fdd-training status by c2h */
+ u8 state; /* refer to enum btc_fddt_state */
+
+ u8 wl_iot[6]; /* wl bssid */
+ u16 bt_iot; /* bt vendor-id */
+
+ u32 nrsn_map; /* the reason map for no-run fdd-traing */
+ struct rtw89_btc_fddt_bt_stat bt_stat; /* bt statistics */
+ struct rtw89_btc_fddt_train_info train;
+ struct rtw89_btc_fddt_train_info train_now;
+};
+
struct rtw89_btc_dm {
struct rtw89_btc_fbtc_outsrc_set_info ost_info_last; /* outsrc API setup info */
struct rtw89_btc_fbtc_outsrc_set_info ost_info; /* outsrc API setup info */
@@ -3493,6 +3614,8 @@ struct rtw89_btc_dm {
union rtw89_btc_dm_error_map error;
struct rtw89_btc_bind_info tdd_bind;
struct rtw89_btc_bind_info fdd_bind;
+ struct rtw89_btc_fddt_info fddt_info;
+ struct rtw89_btc_fddr_info fddr_info;
u32 cnt_dm[BTC_DCNT_NUM];
u32 cnt_notify[BTC_NCNT_NUM];
u8 ant_xmap[BTC_RF_NUM][BTC_ALL_BT_EZL]; /* WL-BT ANT interact-map */
@@ -3506,6 +3629,10 @@ struct rtw89_btc_dm {
u8 sit_xmap_last[BTC_RF_NUM][BTC_ALL_BT_EZL];
u8 fit_xmap_last[RTW89_PHY_NUM][BTC_ALL_BT_EZL];
+ u8 tdd_rssi_thres; /* The FDD/TDD switch RSSI (in %) */
+ u8 sir_thres; /* WL(Signal) to BT(interference Pin) ratio */
+ u8 sir_state[BTC_ALL_BT_EZL]; /* 1: WL RSSI > BTx-interference */
+
u32 update_slot_map;
u32 set_ant_path;
u32 e2g_slot_limit;
--
2.25.1
next prev parent reply other threads:[~2026-07-12 3:06 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-12 3:04 [PATCH rtw-next 00/11] wifi: rtw89: coex: implement coex for RTL8922D Ping-Ke Shih
2026-07-12 3:04 ` [PATCH rtw-next 01/11] wifi: rtw89: coex: Add Wi-Fi role info version 10 Ping-Ke Shih
2026-07-12 3:04 ` [PATCH rtw-next 02/11] wifi: rtw89: coex: Rearrange coexistence control structure Ping-Ke Shih
2026-07-12 3:04 ` [PATCH rtw-next 03/11] wifi: rtw89: coex: Update driver outsource info to firmware version 6 Ping-Ke Shih
2026-07-12 3:04 ` [PATCH rtw-next 04/11] wifi: rtw89: ceox: Update antenna & grant signal setting Ping-Ke Shih
2026-07-12 3:05 ` [PATCH rtw-next 05/11] wifi: rtw89: coex: Rearrange Bluetooth firmware report entry Ping-Ke Shih
2026-07-12 3:05 ` [PATCH rtw-next 06/11] wifi: rtw89: coex: Refine send firmware command function Ping-Ke Shih
2026-07-12 3:05 ` Ping-Ke Shih [this message]
2026-07-12 3:05 ` [PATCH rtw-next 08/11] wifi: rtw89: coex: Correct SET_RFE settings Ping-Ke Shih
2026-07-12 3:05 ` [PATCH rtw-next 09/11] wifi: rtw89: coex: Add firmware report control report v11 Ping-Ke Shih
2026-07-12 3:05 ` [PATCH rtw-next 10/11] wifi: rtw89: coex: update external control length by case Ping-Ke Shih
2026-07-12 3:05 ` [PATCH rtw-next 11/11] wifi: rtw89: coex: Update coexistence version to 9.24.0 Ping-Ke Shih
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260712030506.43438-8-pkshih@realtek.com \
--to=pkshih@realtek.com \
--cc=ku920601@realtek.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox