From: Ping-Ke Shih <pkshih@realtek.com>
To: <linux-wireless@vger.kernel.org>
Cc: <ku920601@realtek.com>
Subject: [PATCH rtw-next 07/10] wifi: rtw89: coex: Add TX/RX RF parameter format version 9
Date: Wed, 24 Jun 2026 11:39:38 +0800 [thread overview]
Message-ID: <20260624033941.45918-8-pkshih@realtek.com> (raw)
In-Reply-To: <20260624033941.45918-1-pkshih@realtek.com>
From: Ching-Te Ku <ku920601@realtek.com>
In order to support external Zigbee/Thread/Bluetooth etc module,
the version 8 add the parameter for the case. And also update the
related configuration function.
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 | 226 ++++++++++------
drivers/net/wireless/realtek/rtw89/core.h | 40 +--
drivers/net/wireless/realtek/rtw89/fw.c | 252 ++++++++++++++++--
drivers/net/wireless/realtek/rtw89/fw.h | 160 +++++------
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 12 +-
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 12 +-
drivers/net/wireless/realtek/rtw89/rtw8852b.c | 12 +-
.../net/wireless/realtek/rtw89/rtw8852bt.c | 12 +-
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 12 +-
drivers/net/wireless/realtek/rtw89/rtw8922a.c | 12 +-
drivers/net/wireless/realtek/rtw89/rtw8922d.c | 4 +
11 files changed, 511 insertions(+), 243 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
index 5159338960f3..dd9d6cbc2943 100644
--- a/drivers/net/wireless/realtek/rtw89/coex.c
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
@@ -140,6 +140,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 7, .frptmap = 3, .fcxctrl = 7, .fcxinit = 7,
.fwevntrptl = 1, .fwc2hfunc = 2, .drvinfo_type = 1, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 8,
+ .fcxtrx = 0,
},
{RTL8852BT, RTW89_FW_VER_CODE(0, 29, 90, 0),
.fcxbtcrpt = 7, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
@@ -148,6 +149,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 7, .frptmap = 3, .fcxctrl = 7, .fcxinit = 7,
.fwevntrptl = 1, .fwc2hfunc = 2, .drvinfo_type = 1, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 8,
+ .fcxtrx = 0,
},
{RTL8922A, RTW89_FW_VER_CODE(0, 35, 71, 0),
.fcxbtcrpt = 8, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
@@ -156,6 +158,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 8, .frptmap = 4, .fcxctrl = 7, .fcxinit = 7,
.fwevntrptl = 1, .fwc2hfunc = 3, .drvinfo_type = 2, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 1, .fcxmlo = 1, .bt_desired = 9,
+ .fcxtrx = 7,
},
{RTL8922A, RTW89_FW_VER_CODE(0, 35, 63, 0),
.fcxbtcrpt = 8, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
@@ -164,6 +167,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 8, .frptmap = 4, .fcxctrl = 7, .fcxinit = 7,
.fwevntrptl = 1, .fwc2hfunc = 3, .drvinfo_type = 2, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 1, .fcxmlo = 1, .bt_desired = 9,
+ .fcxtrx = 0,
},
{RTL8922A, RTW89_FW_VER_CODE(0, 35, 8, 0),
.fcxbtcrpt = 8, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
@@ -172,6 +176,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 8, .frptmap = 3, .fcxctrl = 7, .fcxinit = 7,
.fwevntrptl = 1, .fwc2hfunc = 1, .drvinfo_type = 1, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8851B, RTW89_FW_VER_CODE(0, 29, 29, 0),
.fcxbtcrpt = 105, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 5,
@@ -180,6 +185,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 2, .frptmap = 3, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852C, RTW89_FW_VER_CODE(0, 27, 57, 0),
.fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
@@ -188,6 +194,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 1, .frptmap = 3, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1280,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852C, RTW89_FW_VER_CODE(0, 27, 42, 0),
.fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
@@ -196,6 +203,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 1, .frptmap = 2, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1280,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852C, RTW89_FW_VER_CODE(0, 27, 0, 0),
.fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
@@ -204,6 +212,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 1, .frptmap = 2, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1280,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852B, RTW89_FW_VER_CODE(0, 29, 122, 0),
.fcxbtcrpt = 8, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
@@ -212,6 +221,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 7, .frptmap = 3, .fcxctrl = 7, .fcxinit = 7,
.fwevntrptl = 1, .fwc2hfunc = 2, .drvinfo_type = 1, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 8,
+ .fcxtrx = 0,
},
{RTL8852B, RTW89_FW_VER_CODE(0, 29, 29, 0),
.fcxbtcrpt = 105, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 5,
@@ -220,6 +230,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 2, .frptmap = 3, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852B, RTW89_FW_VER_CODE(0, 29, 14, 0),
.fcxbtcrpt = 5, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 4,
@@ -228,6 +239,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 1, .frptmap = 3, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1800,
.max_role_num = 6, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852B, RTW89_FW_VER_CODE(0, 27, 0, 0),
.fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
@@ -236,6 +248,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 1, .frptmap = 1, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1280,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852A, RTW89_FW_VER_CODE(0, 13, 37, 0),
.fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
@@ -244,6 +257,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 1, .frptmap = 3, .fcxctrl = 1, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 0, .drvinfo_type = 0, .info_buf = 1280,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
{RTL8852A, RTW89_FW_VER_CODE(0, 13, 0, 0),
.fcxbtcrpt = 1, .fcxtdma = 1, .fcxslots = 1, .fcxcysta = 2,
@@ -252,6 +266,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 0, .frptmap = 0, .fcxctrl = 0, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 0, .drvinfo_type = 0, .info_buf = 1024,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
/* keep it to be the last as default entry */
@@ -262,6 +277,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
.fwlrole = 0, .frptmap = 0, .fcxctrl = 0, .fcxinit = 0,
.fwevntrptl = 0, .fwc2hfunc = 1, .drvinfo_type = 0, .info_buf = 1024,
.max_role_num = 5, .fcxosi = 0, .fcxmlo = 0, .bt_desired = 7,
+ .fcxtrx = 0,
},
};
@@ -2777,9 +2793,6 @@ static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 type)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
- struct rtw89_btc_dm *dm = &btc->dm;
- struct rtw89_btc_wl_info *wl = &btc->cx.wl;
- struct rtw89_btc_rf_trx_para rf_para = dm->rf_trx_para;
switch (type) {
case CXDRVINFO_INIT:
@@ -2813,17 +2826,10 @@ static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 type)
if (ver->drvinfo_type == 1)
type = 3;
- dm->trx_info.tx_power = u32_get_bits(rf_para.wl_tx_power,
- RTW89_BTC_WL_DEF_TX_PWR);
- dm->trx_info.rx_gain = u32_get_bits(rf_para.wl_rx_gain,
- RTW89_BTC_WL_DEF_TX_PWR);
- dm->trx_info.bt_tx_power = u32_get_bits(rf_para.bt_tx_power,
- RTW89_BTC_WL_DEF_TX_PWR);
- dm->trx_info.bt_rx_gain = u32_get_bits(rf_para.bt_rx_gain,
- RTW89_BTC_WL_DEF_TX_PWR);
- dm->trx_info.cn = wl->cn_report;
- dm->trx_info.nhm = wl->nhm.pwr;
- rtw89_fw_h2c_cxdrv_trx(rtwdev, type);
+ if (ver->fcxtrx == 7)
+ rtw89_fw_h2c_cxdrv_trx_v7(rtwdev, type);
+ else if (ver->fcxtrx == 9)
+ rtw89_fw_h2c_cxdrv_trx_v9(rtwdev, type);
break;
case CXDRVINFO_RFK:
if (ver->drvinfo_type == 1)
@@ -2832,6 +2838,14 @@ static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 type)
rtw89_fw_h2c_cxdrv_rfk(rtwdev, type);
break;
case CXDRVINFO_TXPWR:
+ if (ver->drvinfo_type == 3)
+ type = 4;
+
+ if (ver->fcxtrx == 7)
+ rtw89_fw_h2c_cxtxpwr_v7(rtwdev, type);
+ else if (ver->fcxtrx == 9)
+ rtw89_fw_h2c_cxtxpwr_v9(rtwdev, type);
+ break;
case CXDRVINFO_FDDT:
case CXDRVINFO_MLO:
case CXDRVINFO_OSI:
@@ -3025,53 +3039,84 @@ static void _set_bt_ignore_wlan_act(struct rtw89_dev *rtwdev, u8 enable)
#define B_BTC_WL_TX_POWER_SIGN BIT(7)
#define B_TSSI_WL_TX_POWER_SIGN BIT(8)
-static void _set_wl_tx_power(struct rtw89_dev *rtwdev, u32 level)
+static void _set_wl_tx_power(struct rtw89_dev *rtwdev, u32 level, u8 phy_map)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_wl_info *wl = &btc->cx.wl;
+ const struct rtw89_btc_ver *ver = btc->ver;
+ struct rtw89_btc_dm *dm = &btc->dm;
+ bool level_chg = false;
u32 pwr_val;
- if (wl->rf_para.tx_pwr_freerun == level)
+ if (phy_map & BIT(RTW89_PHY_0))
+ level_chg = !(dm->rf_trx_para.wl_tx_power[RTW89_PHY_0] == level);
+
+ if (phy_map & BIT(RTW89_PHY_1))
+ level_chg |= !(dm->rf_trx_para.wl_tx_power[RTW89_PHY_1] == level);
+
+ if (!level_chg && !btc->cli_h2c_cmd)
return;
- wl->rf_para.tx_pwr_freerun = level;
- btc->dm.rf_trx_para.wl_tx_power = level;
+ if (phy_map & BIT(RTW89_PHY_0))
+ dm->rf_trx_para.wl_tx_power[RTW89_PHY_0] = level;
- rtw89_debug(rtwdev, RTW89_DBG_BTC,
- "[BTC], %s(): level = %d\n",
- __func__, level);
+ if (phy_map & BIT(RTW89_PHY_1))
+ dm->rf_trx_para.wl_tx_power[RTW89_PHY_1] = level;
- if (level == RTW89_BTC_WL_DEF_TX_PWR) {
- pwr_val = WL_TX_POWER_NO_BTC_CTRL;
- } else { /* only apply "force tx power" */
- pwr_val = FIELD_PREP(WL_TX_POWER_INT_PART, level);
- if (pwr_val > RTW89_BTC_WL_DEF_TX_PWR)
- pwr_val = RTW89_BTC_WL_DEF_TX_PWR;
+ dm->wl_tx_pwr_phy_map = phy_map;
+ rtw89_debug(rtwdev, RTW89_DBG_BTC,
+ "[BTC], %s(): phy_map=0x%x, wl_tx_pwr-> phy0=%d, phy1=%d\n",
+ __func__, phy_map,
+ dm->rf_trx_para.wl_tx_power[RTW89_PHY_0],
+ dm->rf_trx_para.wl_tx_power[RTW89_PHY_1]);
+
+ if (ver->fcxtrx == 7 && chip->chip_id == RTL8922A) {
+ _fw_set_drv_info(rtwdev, CXDRVINFO_TXPWR);
+ } else if (ver->fcxtrx == 9) {
+ _fw_set_drv_info(rtwdev, CXDRVINFO_TXPWR);
+ } else {
+ if (level == RTW89_BTC_WL_DEF_TX_PWR) {
+ pwr_val = WL_TX_POWER_NO_BTC_CTRL;
+ } else { /* only apply "force tx power" */
+ pwr_val = FIELD_PREP(WL_TX_POWER_INT_PART, level);
+ if (pwr_val > RTW89_BTC_WL_DEF_TX_PWR)
+ pwr_val = RTW89_BTC_WL_DEF_TX_PWR;
- if (level & B_BTC_WL_TX_POWER_SIGN)
- pwr_val |= B_TSSI_WL_TX_POWER_SIGN;
- pwr_val |= WL_TX_POWER_WITH_BT;
+ if (level & B_BTC_WL_TX_POWER_SIGN)
+ pwr_val |= B_TSSI_WL_TX_POWER_SIGN;
+ pwr_val |= WL_TX_POWER_WITH_BT;
+ }
+ chip->ops->btc_set_wl_txpwr_ctrl(rtwdev, pwr_val);
}
-
- chip->ops->btc_set_wl_txpwr_ctrl(rtwdev, pwr_val);
}
-static void _set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
+static void _set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level, u8 phy_map)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_wl_info *wl = &btc->cx.wl;
+ struct rtw89_btc_dm *dm = &btc->dm;
+ bool level_chg = false;
+
+ if (phy_map & BIT(RTW89_PHY_0))
+ level_chg = !(dm->rf_trx_para.wl_rx_gain[RTW89_PHY_0] == level);
- if (wl->rf_para.rx_gain_freerun == level)
+ if (phy_map & BIT(RTW89_PHY_1))
+ level_chg |= !(dm->rf_trx_para.wl_rx_gain[RTW89_PHY_1] == level);
+
+ if (!level_chg && !btc->cli_h2c_cmd)
return;
- wl->rf_para.rx_gain_freerun = level;
- btc->dm.rf_trx_para.wl_rx_gain = level;
+ if (phy_map & BIT(RTW89_PHY_0))
+ dm->rf_trx_para.wl_rx_gain[RTW89_PHY_0] = level;
+
+ if (phy_map & BIT(RTW89_PHY_1))
+ dm->rf_trx_para.wl_rx_gain[RTW89_PHY_1] = level;
rtw89_debug(rtwdev, RTW89_DBG_BTC,
- "[BTC], %s(): level = %d\n",
- __func__, level);
+ "[BTC], %s(): phy_map=0x%x, wl_rx_gain-> phy0=%d, phy1=%d\n",
+ __func__, phy_map,
+ dm->rf_trx_para.wl_rx_gain[RTW89_PHY_0],
+ dm->rf_trx_para.wl_rx_gain[RTW89_PHY_1]);
chip->ops->btc_set_wl_rx_gain(rtwdev, level);
}
@@ -3097,7 +3142,7 @@ static void _set_bt_tx_power(struct rtw89_dev *rtwdev, u8 level)
ret = _send_fw_cmd(rtwdev, BTFC_SET, SET_BT_TX_PWR, &buf, 1);
if (!ret) {
bt->rf_para.tx_pwr_freerun = level;
- btc->dm.rf_trx_para.bt_tx_power = level;
+ btc->dm.rf_trx_para.bt_tx_power[BTC_BT_1ST] = level;
}
}
@@ -3117,7 +3162,7 @@ static void _set_bt_rx_gain(struct rtw89_dev *rtwdev, u8 level)
return;
bt->rf_para.rx_gain_freerun = level;
- btc->dm.rf_trx_para.bt_rx_gain = level;
+ btc->dm.rf_trx_para.bt_rx_gain[BTC_BT_1ST] = level;
rtw89_debug(rtwdev, RTW89_DBG_BTC,
"[BTC], %s(): level = %d\n",
@@ -3141,9 +3186,10 @@ static void _set_rf_trx_para(struct rtw89_dev *rtwdev)
struct rtw89_btc_bt_info *bt = &btc->cx.bt0;
struct rtw89_btc_bt_link_info *b = &bt->link_info;
struct rtw89_btc_wl_smap *wl_smap = &wl->status.map;
- struct rtw89_btc_rf_trx_para para;
+ struct rtw89_btc_rf_trx_para_v9 para;
+ u8 lv, link_mode = 0, i, dbcc_2g_phy = 0;
+ u8 ul_para_num, dl_para_num;
u32 wl_stb_chg = 0;
- u8 level_id = 0, link_mode = 0, i, dbcc_2g_phy = 0;
if (ver->fwlrole == 0) {
link_mode = wl->role_info.link_mode;
@@ -3159,6 +3205,18 @@ static void _set_rf_trx_para(struct rtw89_dev *rtwdev)
dbcc_2g_phy = wl->role_info_v2.dbcc_2g_phy;
}
+ if (ver->fcxtrx == 9 && chip->rf_para_ulink_v9) {
+ ul_para_num = chip->rf_para_ulink_num_v9;
+ dl_para_num = chip->rf_para_dlink_num_v9;
+ } else if (ver->fcxtrx == 0 && chip->rf_para_ulink_v0) {
+ ul_para_num = chip->rf_para_ulink_num_v0;
+ dl_para_num = chip->rf_para_dlink_num_v0;
+ } else {
+ rtw89_warn(rtwdev, "[BTC]%s(), No rf_para for verseion %d\n",
+ __func__, ver->fcxtrx);
+ goto next;
+ }
+
/* decide trx_para_level */
if (btc->ant_type == BTC_ANT_SHARED) {
/* fix LNA2 + TIA gain not change by GNT_BT */
@@ -3180,30 +3238,54 @@ static void _set_rf_trx_para(struct rtw89_dev *rtwdev)
}
}
- level_id = dm->trx_para_level;
- if (level_id >= chip->rf_para_dlink_num ||
- level_id >= chip->rf_para_ulink_num) {
+ lv = dm->trx_para_level;
+ if (lv >= ul_para_num ||
+ lv >= dl_para_num) {
rtw89_debug(rtwdev, RTW89_DBG_BTC,
"[BTC], %s(): invalid level_id: %d\n",
- __func__, level_id);
+ __func__, lv);
return;
}
- if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL))
- para = chip->rf_para_ulink[level_id];
- else
- para = chip->rf_para_dlink[level_id];
+ if (wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) {
+ if (ver->fcxtrx == 9) {
+ para = chip->rf_para_ulink_v9[lv];
+ } else {
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++) {
+ para.wl_tx_power[i] = chip->rf_para_ulink_v0[lv].wl_tx_power;
+ para.wl_rx_gain[i] = chip->rf_para_ulink_v0[lv].wl_rx_gain;
+ }
+ for (i = BTC_BT_1ST; i < BTC_ALL_BT; i++) {
+ para.bt_tx_power[i] = chip->rf_para_ulink_v0[lv].bt_tx_power;
+ para.bt_rx_gain[i] = chip->rf_para_ulink_v0[lv].bt_rx_gain;
+ }
+ }
+ } else {
+ if (ver->fcxtrx == 9) {
+ para = chip->rf_para_dlink_v9[lv];
+ } else {
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++) {
+ para.wl_tx_power[i] = chip->rf_para_dlink_v0[lv].wl_tx_power;
+ para.wl_rx_gain[i] = chip->rf_para_dlink_v0[lv].wl_rx_gain;
+ }
+ for (i = BTC_BT_1ST; i < BTC_ALL_BT; i++) {
+ para.bt_tx_power[i] = chip->rf_para_dlink_v0[lv].bt_tx_power;
+ para.bt_rx_gain[i] = chip->rf_para_dlink_v0[lv].bt_rx_gain;
+ }
+ }
+ }
if (dm->fddt_train) {
- _set_wl_rx_gain(rtwdev, 1);
+ _set_wl_rx_gain(rtwdev, 1, RTW89_PHY_0);
_write_scbd(rtwdev, BTC_WSCB_RXGAIN, true);
} else {
- _set_wl_tx_power(rtwdev, para.wl_tx_power);
- _set_wl_rx_gain(rtwdev, para.wl_rx_gain);
- _set_bt_tx_power(rtwdev, para.bt_tx_power);
- _set_bt_rx_gain(rtwdev, para.bt_rx_gain);
+ _set_wl_tx_power(rtwdev, para.wl_tx_power[RTW89_PHY_0], RTW89_PHY_0);
+ _set_wl_rx_gain(rtwdev, para.wl_rx_gain[RTW89_PHY_0], RTW89_PHY_0);
+ _set_bt_tx_power(rtwdev, para.bt_tx_power[BTC_BT_1ST]);
+ _set_bt_rx_gain(rtwdev, para.bt_rx_gain[BTC_BT_1ST]);
}
+next:
if (!bt->enable.now || dm->wl_only || wl_smap->rf_off ||
wl_smap->lps == BTC_LPS_RF_OFF ||
link_mode == BTC_WLINK_5G ||
@@ -7836,7 +7918,7 @@ void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode)
}
_set_init_info(rtwdev);
- _set_wl_tx_power(rtwdev, RTW89_BTC_WL_DEF_TX_PWR);
+ _set_wl_tx_power(rtwdev, RTW89_BTC_WL_DEF_TX_PWR, RTW89_PHY_0);
btc_fw_set_monreg(rtwdev);
rtw89_btc_fw_set_slots(rtwdev);
_fw_set_drv_info(rtwdev, CXDRVINFO_INIT);
@@ -9669,25 +9751,19 @@ static int _show_dm_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
(dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ?
"" : "(Mismatch!!)"));
- if (dm->rf_trx_para.wl_tx_power == 0xff)
- p += scnprintf(p, end - p,
- " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:orig, ",
- "[trx_ctrl]", wl->rssi_level,
- dm->trx_para_level);
-
- else
- p += scnprintf(p, end - p,
- " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:%d, ",
- "[trx_ctrl]", wl->rssi_level,
- dm->trx_para_level,
- dm->rf_trx_para.wl_tx_power);
+ p += scnprintf(p, end - p,
+ " %-15s : wl[rssi_lvl:%d/para:%d/tx_pwr:[%d %d]/rx_lvl:[%d %d]/lna2:%d/stb_chg:%d]\n ",
+ "[dm_rf_ctrl]",
+ wl->rssi_level, dm->trx_para_level,
+ dm->rf_trx_para.wl_tx_power[RTW89_PHY_0],
+ dm->rf_trx_para.wl_tx_power[RTW89_PHY_1],
+ dm->rf_trx_para.wl_rx_gain[RTW89_PHY_0],
+ dm->rf_trx_para.wl_rx_gain[RTW89_PHY_1],
+ dm->wl_lna2, dm->wl_stb_chg);
p += scnprintf(p, end - p,
- "wl_rx_lvl:%d, bt_tx_pwr_dec:%d, bt_rx_lna:%d(%s-tbl), wl_btg_rx:%d\n",
- dm->rf_trx_para.wl_rx_gain,
- dm->rf_trx_para.bt_tx_power,
- dm->rf_trx_para.bt_rx_gain,
- (bt->hi_lna_rx ? "Hi" : "Ori"), dm->wl_btg_rx);
+ " %-15s : pre_agc:%d, btg_rx:%d\n ",
+ "[dm_bb_ctrl]", dm->wl_pre_agc, dm->wl_btg_rx);
p += scnprintf(p, end - p,
" %-15s : wl_tx_limit[en:%d/max_t:%dus/max_retry:%d], bt_slot_reg:%d-TU, bt_scan_rx_low_pri:%d\n",
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 2366894bf609..70c6ee1a6da2 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -2275,6 +2275,14 @@ struct rtw89_btc_bt_info {
u32 bcnt[BTC_BCNT_NUM];
};
+#define RTW89_BTC_WL_DEF_TX_PWR GENMASK(7, 0)
+struct rtw89_btc_rf_trx_para_v0 {
+ u32 wl_tx_power; /* absolute Tx power (dBm), 0xff-> no BTC control */
+ u32 wl_rx_gain; /* rx gain table index (TBD.) */
+ u8 bt_tx_power; /* decrease Tx power (dB) */
+ u8 bt_rx_gain; /* LNA constrain level */
+};
+
struct rtw89_btc_rf_trx_para_v9 {
u32 wl_tx_power[RTW89_PHY_NUM]; /* absolute Tx power (dBm), 1's complement -5->0x85 */
u32 wl_rx_gain[RTW89_PHY_NUM]; /* rx gain table index (TBD.) */
@@ -2289,6 +2297,7 @@ struct rtw89_btc_cx {
struct rtw89_btc_bt_info bt0;
struct rtw89_btc_bt_info bt1;
struct rtw89_btc_extsoc_info bt_ext;
+ struct rtw89_btc_rf_trx_para_v9 rf_para;
u32 state_map;
};
@@ -3068,24 +3077,18 @@ struct rtw89_btc_fbtc_btdevinfo {
__le32 flush_time;
} __packed;
-#define RTW89_BTC_WL_DEF_TX_PWR GENMASK(7, 0)
-struct rtw89_btc_rf_trx_para {
- u32 wl_tx_power; /* absolute Tx power (dBm), 0xff-> no BTC control */
- u32 wl_rx_gain; /* rx gain table index (TBD.) */
- u8 bt_tx_power; /* decrease Tx power (dB) */
- u8 bt_rx_gain; /* LNA constrain level */
-};
-
struct rtw89_btc_trx_info {
u8 tx_lvl;
u8 rx_lvl;
u8 wl_rssi;
u8 bt_rssi;
- s8 tx_power; /* absolute Tx power (dBm), 0xff-> no BTC control */
- s8 rx_gain; /* rx gain table index (TBD.) */
- s8 bt_tx_power; /* decrease Tx power (dB) */
- s8 bt_rx_gain; /* LNA constrain level */
+ s8 wl_tx_power[RTW89_PHY_NUM]; /* absolute Tx power (dBm), 0xff-> no BTC control */
+ s8 wl_rx_gain[RTW89_PHY_NUM]; /* rx gain table index (TBD.) */
+ s8 bt_tx_power[BTC_ALL_BT]; /* decrease Tx power (dB) */
+ s8 bt_rx_gain[BTC_ALL_BT]; /* LNA constrain level */
+ s8 zb_tx_power[BTC_ALL_BT];
+ s8 zb_rx_gain[BTC_ALL_BT];
u8 cn; /* condition_num */
s8 nhm;
@@ -3132,7 +3135,7 @@ struct rtw89_btc_dm {
struct rtw89_btc_fbtc_tdma tdma_now;
struct rtw89_mac_ax_coex_gnt gnt;
union rtw89_btc_init_info_u init_info; /* pass to wl_fw if offload */
- struct rtw89_btc_rf_trx_para rf_trx_para;
+ struct rtw89_btc_rf_trx_para_v9 rf_trx_para;
struct rtw89_btc_wl_tx_limit_para wl_tx_limit;
struct rtw89_btc_dm_step dm_step;
struct rtw89_btc_wl_scc_ctrl wl_scc;
@@ -3169,6 +3172,7 @@ struct rtw89_btc_dm {
u8 run_reason;
u8 run_action;
+ u8 wl_tx_pwr_phy_map;
u8 wl_pre_agc: 2;
u8 wl_lna2: 1;
@@ -3367,6 +3371,7 @@ struct rtw89_btc_ver {
u8 fcxosi;
u8 fcxmlo;
u8 bt_desired;
+ u8 fcxtrx;
};
struct rtw89_btc_btf_fwinfo {
@@ -3424,6 +3429,7 @@ struct rtw89_btc {
bool update_policy_force;
bool lps;
bool manual_ctrl;
+ bool cli_h2c_cmd;
};
enum rtw89_btc_hmsg {
@@ -4772,10 +4778,10 @@ struct rtw89_chip_info {
u8 mon_reg_num;
const struct rtw89_btc_fbtc_mreg *mon_reg;
- u8 rf_para_ulink_num;
- const struct rtw89_btc_rf_trx_para *rf_para_ulink;
- u8 rf_para_dlink_num;
- const struct rtw89_btc_rf_trx_para *rf_para_dlink;
+ const struct rtw89_btc_rf_trx_para_v0 *rf_para_ulink_v0;
+ const struct rtw89_btc_rf_trx_para_v0 *rf_para_dlink_v0;
+ u8 rf_para_ulink_num_v0;
+ u8 rf_para_dlink_num_v0;
const struct rtw89_btc_rf_trx_para_v9 *rf_para_ulink_v9;
const struct rtw89_btc_rf_trx_para_v9 *rf_para_dlink_v9;
u8 rf_para_ulink_num_v9;
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index d6a594b75ab2..804ae2a1130d 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -6303,48 +6303,158 @@ int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type)
return ret;
}
-#define H2C_LEN_CXDRVINFO_TRX (28 + H2C_LEN_CXDRVHDR)
-int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type)
+int rtw89_fw_h2c_cxdrv_trx_v7(struct rtw89_dev *rtwdev, u8 type)
{
struct rtw89_btc *btc = &rtwdev->btc;
+ struct rtw89_btc_rf_trx_para_v9 rf_para = btc->dm.rf_trx_para;
struct rtw89_btc_trx_info *trx = &btc->dm.trx_info;
+ struct rtw89_btc_wl_info *wl = &btc->cx.wl;
+ struct rtw89_h2c_cxtrx_v7 *h2c;
+ u32 len = sizeof(*h2c);
struct sk_buff *skb;
- u8 *cmd;
int ret;
+ u8 i;
- skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_CXDRVINFO_TRX);
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
+ trx->wl_tx_power[i] = u32_get_bits(rf_para.wl_tx_power[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->wl_rx_gain[i] = u32_get_bits(rf_para.wl_rx_gain[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ }
+ for (i = 0; i < BTC_ALL_BT; i++) {
+ trx->bt_tx_power[i] = u32_get_bits(rf_para.bt_tx_power[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->bt_rx_gain[i] = u32_get_bits(rf_para.bt_rx_gain[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->zb_tx_power[i] = u32_get_bits(rf_para.zb_tx_power[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->zb_rx_gain[i] = u32_get_bits(rf_para.zb_rx_gain[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ }
+ trx->cn = wl->cn_report;
+ trx->nhm = wl->nhm.pwr;
+
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
if (!skb) {
- rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_trx\n");
+ rtw89_err(rtwdev, "failed to alloc skb for h2c cxtrx_v9\n");
return -ENOMEM;
}
- skb_put(skb, H2C_LEN_CXDRVINFO_TRX);
- cmd = skb->data;
+ skb_put(skb, len);
+ h2c = (struct rtw89_h2c_cxtrx_v7 *)skb->data;
- RTW89_SET_FWCMD_CXHDR_TYPE(cmd, type);
- RTW89_SET_FWCMD_CXHDR_LEN(cmd, H2C_LEN_CXDRVINFO_TRX - H2C_LEN_CXDRVHDR);
-
- RTW89_SET_FWCMD_CXTRX_TXLV(cmd, trx->tx_lvl);
- RTW89_SET_FWCMD_CXTRX_RXLV(cmd, trx->rx_lvl);
- RTW89_SET_FWCMD_CXTRX_WLRSSI(cmd, trx->wl_rssi);
- RTW89_SET_FWCMD_CXTRX_BTRSSI(cmd, trx->bt_rssi);
- RTW89_SET_FWCMD_CXTRX_TXPWR(cmd, trx->tx_power);
- RTW89_SET_FWCMD_CXTRX_RXGAIN(cmd, trx->rx_gain);
- RTW89_SET_FWCMD_CXTRX_BTTXPWR(cmd, trx->bt_tx_power);
- RTW89_SET_FWCMD_CXTRX_BTRXGAIN(cmd, trx->bt_rx_gain);
- RTW89_SET_FWCMD_CXTRX_CN(cmd, trx->cn);
- RTW89_SET_FWCMD_CXTRX_NHM(cmd, trx->nhm);
- RTW89_SET_FWCMD_CXTRX_BTPROFILE(cmd, trx->bt_profile);
- RTW89_SET_FWCMD_CXTRX_RSVD2(cmd, trx->rsvd2);
- RTW89_SET_FWCMD_CXTRX_TXRATE(cmd, trx->tx_rate);
- RTW89_SET_FWCMD_CXTRX_RXRATE(cmd, trx->rx_rate);
- RTW89_SET_FWCMD_CXTRX_TXTP(cmd, trx->tx_tp);
- RTW89_SET_FWCMD_CXTRX_RXTP(cmd, trx->rx_tp);
- RTW89_SET_FWCMD_CXTRX_RXERRRA(cmd, trx->rx_err_ratio);
+ h2c->hdr.type = type;
+ h2c->hdr.ver = btc->ver->fcxtrx;
+ h2c->hdr.len = sizeof(*h2c) - H2C_LEN_CXDRVHDR_V7;
+
+ h2c->v7_u8.tx_lvl = trx->tx_lvl;
+ h2c->v7_u8.rx_lvl = trx->rx_lvl;
+ h2c->v7_u8.wl_rssi = trx->wl_rssi;
+ h2c->v7_u8.bt_rssi = trx->bt_rssi;
+ h2c->v7_u8.wl_tx_power = trx->wl_tx_power[RTW89_PHY_0];
+ h2c->v7_u8.wl_rx_gain = trx->wl_rx_gain[RTW89_PHY_0];
+ h2c->v7_u8.bt_tx_power = trx->bt_tx_power[BTC_BT_1ST];
+ h2c->v7_u8.bt_rx_gain = trx->bt_rx_gain[BTC_BT_1ST];
+ h2c->v7_u8.zb_tx_power = trx->zb_tx_power[BTC_BT_1ST];
+ h2c->v7_u8.zb_rx_gain = trx->zb_rx_gain[BTC_BT_1ST];
+ h2c->v7_u8.cn = trx->cn;
+ h2c->v7_u8.nhm = trx->nhm;
+ h2c->v7_u8.bt_profile = trx->bt_profile;
+ h2c->v7_u8.rsvd2 = trx->rsvd2;
+ h2c->v7_le.tx_rate = cpu_to_le16(trx->tx_rate);
+ h2c->v7_le.rx_rate = cpu_to_le16(trx->rx_rate);
+ h2c->v7_le.tx_tp = cpu_to_le32(trx->tx_tp);
+ h2c->v7_le.rx_tp = cpu_to_le32(trx->rx_tp);
+ h2c->v7_le.rx_err_ratio = cpu_to_le32(trx->rx_err_ratio);
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_OUTSRC, BTFC_SET,
- SET_DRV_INFO, 0, 0,
- H2C_LEN_CXDRVINFO_TRX);
+ SET_DRV_INFO, 0, 0, len);
+
+ ret = rtw89_h2c_tx(rtwdev, skb, false);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to send h2c\n");
+ goto fail;
+ }
+
+ return 0;
+fail:
+ dev_kfree_skb_any(skb);
+
+ return ret;
+}
+
+int rtw89_fw_h2c_cxdrv_trx_v9(struct rtw89_dev *rtwdev, u8 type)
+{
+ struct rtw89_btc *btc = &rtwdev->btc;
+ struct rtw89_btc_rf_trx_para_v9 rf_para = btc->dm.rf_trx_para;
+ struct rtw89_btc_trx_info *trx = &btc->dm.trx_info;
+ struct rtw89_btc_wl_info *wl = &btc->cx.wl;
+ struct rtw89_h2c_cxtrx_v9 *h2c;
+ u32 len = sizeof(*h2c);
+ struct sk_buff *skb;
+ int ret;
+ u8 i;
+
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
+ trx->wl_tx_power[i] = u32_get_bits(rf_para.wl_tx_power[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->wl_rx_gain[i] = u32_get_bits(rf_para.wl_rx_gain[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ }
+ for (i = 0; i < BTC_ALL_BT; i++) {
+ trx->bt_tx_power[i] = u32_get_bits(rf_para.bt_tx_power[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->bt_rx_gain[i] = u32_get_bits(rf_para.bt_rx_gain[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->zb_tx_power[i] = u32_get_bits(rf_para.zb_tx_power[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ trx->zb_rx_gain[i] = u32_get_bits(rf_para.zb_rx_gain[i],
+ RTW89_BTC_WL_DEF_TX_PWR);
+ }
+ trx->cn = wl->cn_report;
+ trx->nhm = wl->nhm.pwr;
+
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+ if (!skb) {
+ rtw89_err(rtwdev, "failed to alloc skb for h2c cxtrx_v9\n");
+ return -ENOMEM;
+ }
+ skb_put(skb, len);
+ h2c = (struct rtw89_h2c_cxtrx_v9 *)skb->data;
+
+ h2c->hdr.type = type;
+ h2c->hdr.ver = btc->ver->fcxtrx;
+ h2c->hdr.len = sizeof(*h2c) - H2C_LEN_CXDRVHDR_V7;
+
+ h2c->v9_u8.tx_lvl = trx->tx_lvl;
+ h2c->v9_u8.rx_lvl = trx->rx_lvl;
+ h2c->v9_u8.wl_rssi = trx->wl_rssi;
+ h2c->v9_u8.bt_rssi = trx->bt_rssi;
+
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
+ h2c->v9_u8.wl_tx_power[i] = trx->wl_tx_power[i];
+ h2c->v9_u8.wl_rx_gain[i] = trx->wl_rx_gain[i];
+ }
+
+ for (i = 0; i < BTC_ALL_BT; i++) {
+ h2c->v9_u8.bt_tx_power[i] = trx->bt_tx_power[i];
+ h2c->v9_u8.bt_rx_gain[i] = trx->bt_rx_gain[i];
+ h2c->v9_u8.zb_tx_power[i] = trx->zb_tx_power[i];
+ h2c->v9_u8.zb_rx_gain[i] = trx->zb_rx_gain[i];
+ }
+ h2c->v9_u8.cn = trx->cn;
+ h2c->v9_u8.nhm = trx->nhm;
+ h2c->v9_u8.bt_profile = trx->bt_profile;
+ h2c->v9_u8.rsvd2 = trx->rsvd2;
+ h2c->v9_le.tx_rate = cpu_to_le16(trx->tx_rate);
+ h2c->v9_le.rx_rate = cpu_to_le16(trx->rx_rate);
+ h2c->v9_le.tx_tp = cpu_to_le32(trx->tx_tp);
+ h2c->v9_le.rx_tp = cpu_to_le32(trx->rx_tp);
+ h2c->v9_le.rx_err_ratio = cpu_to_le32(trx->rx_err_ratio);
+
+ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+ H2C_CAT_OUTSRC, BTFC_SET,
+ SET_DRV_INFO, 0, 0, len);
ret = rtw89_h2c_tx(rtwdev, skb, false);
if (ret) {
@@ -6404,6 +6514,90 @@ int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type)
return ret;
}
+int rtw89_fw_h2c_cxtxpwr_v7(struct rtw89_dev *rtwdev, u8 type)
+{
+ struct rtw89_btc *btc = &rtwdev->btc;
+ struct rtw89_btc_dm *dm = &btc->dm;
+ struct rtw89_btc_rf_trx_para_v9 rp = dm->rf_trx_para;
+ struct rtw89_h2c_cxtxpwr_v7 *h2c;
+ u32 len = sizeof(*h2c);
+ struct sk_buff *skb;
+ int ret;
+
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+ if (!skb) {
+ rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
+ return -ENOMEM;
+ }
+ skb_put(skb, len);
+ h2c = (struct rtw89_h2c_cxtxpwr_v7 *)skb->data;
+
+ h2c->hdr.type = type;
+ h2c->hdr.ver = btc->ver->fcxtrx;
+ h2c->hdr.len = sizeof(*h2c) - H2C_LEN_CXDRVHDR_V7;
+ h2c->pwr = rp.wl_tx_power[RTW89_PHY_0] & 0xff;
+
+ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+ H2C_CAT_OUTSRC, BTFC_SET,
+ SET_DRV_INFO, 0, 0, len);
+
+ ret = rtw89_h2c_tx(rtwdev, skb, false);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to send h2c\n");
+ goto fail;
+ }
+
+ return 0;
+fail:
+ dev_kfree_skb_any(skb);
+
+ return ret;
+}
+
+int rtw89_fw_h2c_cxtxpwr_v9(struct rtw89_dev *rtwdev, u8 type)
+{
+ struct rtw89_btc *btc = &rtwdev->btc;
+ struct rtw89_btc_dm *dm = &btc->dm;
+ struct rtw89_btc_rf_trx_para_v9 rp = dm->rf_trx_para;
+ struct rtw89_h2c_cxtxpwr_v9 *h2c;
+ u32 len = sizeof(*h2c);
+ struct sk_buff *skb;
+ int ret;
+
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+ if (!skb) {
+ rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
+ return -ENOMEM;
+ }
+ skb_put(skb, len);
+ h2c = (struct rtw89_h2c_cxtxpwr_v9 *)skb->data;
+
+ h2c->hdr.type = type;
+ h2c->hdr.ver = btc->ver->fcxtrx;
+ h2c->hdr.len = sizeof(*h2c) - H2C_LEN_CXDRVHDR_V7;
+ if (dm->wl_tx_pwr_phy_map == BIT(RTW89_PHY_1))
+ h2c->pwr = rp.wl_tx_power[RTW89_PHY_1] & 0xff;
+ else
+ h2c->pwr = rp.wl_tx_power[RTW89_PHY_0] & 0xff;
+ h2c->band = dm->wl_tx_pwr_phy_map;
+
+ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+ H2C_CAT_OUTSRC, BTFC_SET,
+ SET_DRV_INFO, 0, 0, len);
+
+ ret = rtw89_h2c_tx(rtwdev, skb, false);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to send h2c\n");
+ goto fail;
+ }
+
+ return 0;
+fail:
+ dev_kfree_skb_any(skb);
+
+ return ret;
+}
+
#define H2C_LEN_PKT_OFLD 4
int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id)
{
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
index 20721d5209aa..36c8430a2e7a 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.h
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
@@ -2499,6 +2499,76 @@ struct rtw89_h2c_cxinit {
u8 rsvd1;
} __packed;
+struct rtw89_btc_trx_info_u8 {
+ u8 tx_lvl;
+ u8 rx_lvl;
+ u8 wl_rssi;
+ u8 bt_rssi;
+
+ s8 wl_tx_power[RTW89_PHY_NUM]; /* absolute Tx power (dBm), 0xff-> no BTC control */
+ s8 wl_rx_gain[RTW89_PHY_NUM]; /* rx gain table index (TBD.) */
+ s8 bt_tx_power[BTC_ALL_BT]; /* decrease Tx power (dB) */
+ s8 bt_rx_gain[BTC_ALL_BT]; /* LNA constrain level */
+ s8 zb_tx_power[BTC_ALL_BT];
+ s8 zb_rx_gain[BTC_ALL_BT];
+
+ u8 cn; /* condition_num */
+ s8 nhm;
+ u8 bt_profile;
+ u8 rsvd2;
+} __packed;
+
+struct rtw89_btc_trx_info_v7_u8 {
+ u8 tx_lvl;
+ u8 rx_lvl;
+ u8 wl_rssi;
+ u8 bt_rssi;
+
+ s8 wl_tx_power;
+ s8 wl_rx_gain;
+ s8 bt_tx_power;
+ s8 bt_rx_gain;
+ s8 zb_tx_power;
+ s8 zb_rx_gain;
+
+ u8 cn;
+ s8 nhm;
+ u8 bt_profile;
+ u8 rsvd2;
+} __packed;
+
+struct rtw89_btc_trx_info_le {
+ __le16 tx_rate;
+ __le16 rx_rate;
+
+ __le32 tx_tp;
+ __le32 rx_tp;
+ __le32 rx_err_ratio;
+} __packed;
+
+struct rtw89_h2c_cxtrx_v9 {
+ struct rtw89_h2c_cxhdr_v7 hdr;
+ struct rtw89_btc_trx_info_u8 v9_u8;
+ struct rtw89_btc_trx_info_le v9_le;
+} __packed;
+
+struct rtw89_h2c_cxtrx_v7 {
+ struct rtw89_h2c_cxhdr_v7 hdr;
+ struct rtw89_btc_trx_info_v7_u8 v7_u8;
+ struct rtw89_btc_trx_info_le v7_le;
+} __packed;
+
+struct rtw89_h2c_cxtxpwr_v7 {
+ struct rtw89_h2c_cxhdr_v7 hdr;
+ u8 pwr;
+} __packed;
+
+struct rtw89_h2c_cxtxpwr_v9 {
+ struct rtw89_h2c_cxhdr_v7 hdr;
+ u8 pwr;
+ u8 band;
+} __packed;
+
#define RTW89_H2C_CXINIT_ANT_INFO_POS BIT(0)
#define RTW89_H2C_CXINIT_ANT_INFO_DIVERSITY BIT(1)
#define RTW89_H2C_CXINIT_ANT_INFO_BTG_POS GENMASK(3, 2)
@@ -2760,91 +2830,6 @@ static inline void RTW89_SET_FWCMD_CXCTRL_TRACE_STEP(void *cmd, u32 val)
le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(18, 3));
}
-static inline void RTW89_SET_FWCMD_CXTRX_TXLV(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 2, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_RXLV(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 3, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_WLRSSI(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 4, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_BTRSSI(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 5, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_TXPWR(void *cmd, s8 val)
-{
- u8p_replace_bits((u8 *)cmd + 6, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_RXGAIN(void *cmd, s8 val)
-{
- u8p_replace_bits((u8 *)cmd + 7, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_BTTXPWR(void *cmd, s8 val)
-{
- u8p_replace_bits((u8 *)cmd + 8, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_BTRXGAIN(void *cmd, s8 val)
-{
- u8p_replace_bits((u8 *)cmd + 9, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_CN(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 10, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_NHM(void *cmd, s8 val)
-{
- u8p_replace_bits((u8 *)cmd + 11, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_BTPROFILE(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 12, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_RSVD2(void *cmd, u8 val)
-{
- u8p_replace_bits((u8 *)cmd + 13, val, GENMASK(7, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_TXRATE(void *cmd, u16 val)
-{
- le16p_replace_bits((__le16 *)((u8 *)cmd + 14), val, GENMASK(15, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_RXRATE(void *cmd, u16 val)
-{
- le16p_replace_bits((__le16 *)((u8 *)cmd + 16), val, GENMASK(15, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_TXTP(void *cmd, u32 val)
-{
- le32p_replace_bits((__le32 *)((u8 *)cmd + 18), val, GENMASK(31, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_RXTP(void *cmd, u32 val)
-{
- le32p_replace_bits((__le32 *)((u8 *)cmd + 22), val, GENMASK(31, 0));
-}
-
-static inline void RTW89_SET_FWCMD_CXTRX_RXERRRA(void *cmd, u32 val)
-{
- le32p_replace_bits((__le32 *)((u8 *)cmd + 26), val, GENMASK(31, 0));
-}
-
static inline void RTW89_SET_FWCMD_CXRFK_STATE(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(1, 0));
@@ -5399,8 +5384,11 @@ int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type);
int rtw89_fw_h2c_cxdrv_osi_info(struct rtw89_dev *rtwdev, u8 type);
int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type);
int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type);
-int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type);
+int rtw89_fw_h2c_cxdrv_trx_v7(struct rtw89_dev *rtwdev, u8 type);
+int rtw89_fw_h2c_cxdrv_trx_v9(struct rtw89_dev *rtwdev, u8 type);
int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type);
+int rtw89_fw_h2c_cxtxpwr_v7(struct rtw89_dev *rtwdev, u8 type);
+int rtw89_fw_h2c_cxtxpwr_v9(struct rtw89_dev *rtwdev, u8 type);
int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id);
int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id,
struct sk_buff *skb_ofld);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index 60f362593696..4caf231c6287 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -355,7 +355,7 @@ static const struct rtw89_pmac_regs rtw8851b_pmac_regs = {
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8851b_rf_ul[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8851b_rf_ul_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -367,7 +367,7 @@ static const struct rtw89_btc_rf_trx_para rtw89_btc_8851b_rf_ul[] = {
{13, 1, 0, 7}
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8851b_rf_dl[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8851b_rf_dl_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -2730,10 +2730,10 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8851b_mon_reg),
.mon_reg = rtw89_btc_8851b_mon_reg,
- .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8851b_rf_ul),
- .rf_para_ulink = rtw89_btc_8851b_rf_ul,
- .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8851b_rf_dl),
- .rf_para_dlink = rtw89_btc_8851b_rf_dl,
+ .rf_para_ulink_v0 = rtw89_btc_8851b_rf_ul_v0,
+ .rf_para_dlink_v0 = rtw89_btc_8851b_rf_dl_v0,
+ .rf_para_ulink_num_v0 = ARRAY_SIZE(rtw89_btc_8851b_rf_ul_v0),
+ .rf_para_dlink_num_v0 = ARRAY_SIZE(rtw89_btc_8851b_rf_dl_v0),
.rf_para_ulink_v9 = NULL,
.rf_para_dlink_v9 = NULL,
.rf_para_ulink_num_v9 = 0,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
index 94027e5b8d28..78addc0aef69 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
@@ -2049,7 +2049,7 @@ s8 rtw8852a_btc_get_bt_rssi(struct rtw89_dev *rtwdev, s8 val)
return clamp_t(s8, val + 6, -100, 0) + 100;
}
-static struct rtw89_btc_rf_trx_para rtw89_btc_8852a_rf_ul[] = {
+static struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852a_rf_ul_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -2061,7 +2061,7 @@ static struct rtw89_btc_rf_trx_para rtw89_btc_8852a_rf_ul[] = {
{13, 1, 0, 7}
};
-static struct rtw89_btc_rf_trx_para rtw89_btc_8852a_rf_dl[] = {
+static struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852a_rf_dl_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -2468,10 +2468,10 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8852a_mon_reg),
.mon_reg = rtw89_btc_8852a_mon_reg,
- .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852a_rf_ul),
- .rf_para_ulink = rtw89_btc_8852a_rf_ul,
- .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852a_rf_dl),
- .rf_para_dlink = rtw89_btc_8852a_rf_dl,
+ .rf_para_ulink_v0 = rtw89_btc_8852a_rf_ul_v0,
+ .rf_para_dlink_v0 = rtw89_btc_8852a_rf_dl_v0,
+ .rf_para_ulink_num_v0 = ARRAY_SIZE(rtw89_btc_8852a_rf_ul_v0),
+ .rf_para_dlink_num_v0 = ARRAY_SIZE(rtw89_btc_8852a_rf_dl_v0),
.rf_para_ulink_v9 = NULL,
.rf_para_dlink_v9 = NULL,
.rf_para_ulink_num_v9 = 0,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
index 4e7b068aaa75..debcdb2eacd6 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
@@ -307,7 +307,7 @@ static const struct rtw89_pmac_regs rtw8852b_pmac_regs = {
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_ul[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852b_rf_ul_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -319,7 +319,7 @@ static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_ul[] = {
{13, 1, 0, 7}
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_dl[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852b_rf_dl_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -1063,10 +1063,10 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8852b_mon_reg),
.mon_reg = rtw89_btc_8852b_mon_reg,
- .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852b_rf_ul),
- .rf_para_ulink = rtw89_btc_8852b_rf_ul,
- .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852b_rf_dl),
- .rf_para_dlink = rtw89_btc_8852b_rf_dl,
+ .rf_para_ulink_v0 = rtw89_btc_8852b_rf_ul_v0,
+ .rf_para_dlink_v0 = rtw89_btc_8852b_rf_dl_v0,
+ .rf_para_ulink_num_v0 = ARRAY_SIZE(rtw89_btc_8852b_rf_ul_v0),
+ .rf_para_dlink_num_v0 = ARRAY_SIZE(rtw89_btc_8852b_rf_dl_v0),
.rf_para_ulink_v9 = NULL,
.rf_para_dlink_v9 = NULL,
.rf_para_ulink_num_v9 = 0,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
index 7fcc877f6ea0..fc8a17fb95f4 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
@@ -250,7 +250,7 @@ static const struct rtw89_pmac_regs rtw8852bt_pmac_regs = {
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_ul[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852bt_rf_ul_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -262,7 +262,7 @@ static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_ul[] = {
{13, 1, 0, 7}
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_dl[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852bt_rf_dl_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -902,10 +902,10 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8852bt_mon_reg),
.mon_reg = rtw89_btc_8852bt_mon_reg,
- .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852bt_rf_ul),
- .rf_para_ulink = rtw89_btc_8852bt_rf_ul,
- .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852bt_rf_dl),
- .rf_para_dlink = rtw89_btc_8852bt_rf_dl,
+ .rf_para_ulink_v0 = rtw89_btc_8852bt_rf_ul_v0,
+ .rf_para_dlink_v0 = rtw89_btc_8852bt_rf_dl_v0,
+ .rf_para_ulink_num_v0 = ARRAY_SIZE(rtw89_btc_8852bt_rf_ul_v0),
+ .rf_para_dlink_num_v0 = ARRAY_SIZE(rtw89_btc_8852bt_rf_dl_v0),
.rf_para_ulink_v9 = NULL,
.rf_para_dlink_v9 = NULL,
.rf_para_ulink_num_v9 = 0,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 3861cce42b1b..bec6aa574e9d 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -2863,7 +2863,7 @@ s8 rtw8852c_btc_get_bt_rssi(struct rtw89_dev *rtwdev, s8 val)
return clamp_t(s8, val + 6, -100, 0) + 100;
}
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8852c_rf_ul[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852c_rf_ul_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -2875,7 +2875,7 @@ static const struct rtw89_btc_rf_trx_para rtw89_btc_8852c_rf_ul[] = {
{13, 1, 0, 7}
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8852c_rf_dl[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8852c_rf_dl_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -3270,10 +3270,10 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8852c_mon_reg),
.mon_reg = rtw89_btc_8852c_mon_reg,
- .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852c_rf_ul),
- .rf_para_ulink = rtw89_btc_8852c_rf_ul,
- .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852c_rf_dl),
- .rf_para_dlink = rtw89_btc_8852c_rf_dl,
+ .rf_para_ulink_v0 = rtw89_btc_8852c_rf_ul_v0,
+ .rf_para_dlink_v0 = rtw89_btc_8852c_rf_dl_v0,
+ .rf_para_ulink_num_v0 = ARRAY_SIZE(rtw89_btc_8852c_rf_ul_v0),
+ .rf_para_dlink_num_v0 = ARRAY_SIZE(rtw89_btc_8852c_rf_dl_v0),
.rf_para_ulink_v9 = NULL,
.rf_para_dlink_v9 = NULL,
.rf_para_ulink_num_v9 = 0,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
index 91897aeced28..6d4301661b04 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
@@ -2874,7 +2874,7 @@ s8 rtw8922a_btc_get_bt_rssi(struct rtw89_dev *rtwdev, s8 val)
return clamp_t(s8, val, -100, 0) + 100;
}
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8922a_rf_ul[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8922a_rf_ul_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -2886,7 +2886,7 @@ static const struct rtw89_btc_rf_trx_para rtw89_btc_8922a_rf_ul[] = {
{13, 1, 0, 7}
};
-static const struct rtw89_btc_rf_trx_para rtw89_btc_8922a_rf_dl[] = {
+static const struct rtw89_btc_rf_trx_para_v0 rtw89_btc_8922a_rf_dl_v0[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
@@ -3254,10 +3254,10 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8922a_mon_reg),
.mon_reg = rtw89_btc_8922a_mon_reg,
- .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8922a_rf_ul),
- .rf_para_ulink = rtw89_btc_8922a_rf_ul,
- .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8922a_rf_dl),
- .rf_para_dlink = rtw89_btc_8922a_rf_dl,
+ .rf_para_ulink_v0 = rtw89_btc_8922a_rf_ul_v0,
+ .rf_para_dlink_v0 = rtw89_btc_8922a_rf_dl_v0,
+ .rf_para_ulink_num_v0 = ARRAY_SIZE(rtw89_btc_8922a_rf_ul_v0),
+ .rf_para_dlink_num_v0 = ARRAY_SIZE(rtw89_btc_8922a_rf_dl_v0),
.rf_para_ulink_v9 = NULL,
.rf_para_dlink_v9 = NULL,
.rf_para_ulink_num_v9 = 0,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922d.c b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
index 888973f4ef95..f78d6d46e65f 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922d.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
@@ -3430,6 +3430,10 @@ const struct rtw89_chip_info rtw8922d_chip_info = {
.rssi_tol = 2,
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8922d_mon_reg),
.mon_reg = rtw89_btc_8922d_mon_reg,
+ .rf_para_ulink_v0 = NULL,
+ .rf_para_dlink_v0 = NULL,
+ .rf_para_ulink_num_v0 = 0,
+ .rf_para_dlink_num_v0 = 0,
.rf_para_ulink_v9 = rtw89_btc_8922d_rf_ul_v9,
.rf_para_dlink_v9 = rtw89_btc_8922d_rf_dl_v9,
.rf_para_ulink_num_v9 = ARRAY_SIZE(rtw89_btc_8922d_rf_ul_v9),
--
2.25.1
next prev parent reply other threads:[~2026-06-24 3:41 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-24 3:39 [PATCH rtw-next 00/10] wifi: rtw89: coex: update BT coexistence to support dual BT for RTL8922D Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 01/10] wifi: rtw89: coex: force to exit Wi-Fi LPS while Bluetooth profile exist Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 02/10] wifi: rtw89: coex: offset current BT info to BT0 for dual BT configuration Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 03/10] wifi: rtw89: coex: Move wifi related counters to wifi info Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 04/10] wifi: rtw89: coex: Extend bt_slot_req for dual MAC wifi Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 05/10] wifi: rtw89: coex: Move Bluetooth related counters to BT info Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 06/10] wifi: rtw89: coex: Refine third party module related coexistence Ping-Ke Shih
2026-06-24 3:39 ` Ping-Ke Shih [this message]
2026-06-24 3:39 ` [PATCH rtw-next 08/10] wifi: rtw89: coex: Renaming drvinfo_type to drvinfo_ver Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 09/10] wifi: rtw89: coex: Add Wi-Fi firmware 0.35.94.1 support for RTL8922D Ping-Ke Shih
2026-06-24 3:39 ` [PATCH rtw-next 10/10] wifi: rtw89: coex: Add RTL8922D chip string 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=20260624033941.45918-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.