aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorChing-Te Ku <ku920601@realtek.com>2026-07-12 11:04:59 +0800
committerPing-Ke Shih <pkshih@realtek.com>2026-07-17 10:47:03 +0800
commita20edfbc15a50ad5a445db2dc13a6a5780308deb (patch)
tree7a15a992c29d259b7cd821e4bbb255f9f81c53f5
parentwifi: rtw89: coex: Update driver outsource info to firmware version 6 (diff)
wifi: rtw89: ceox: Update antenna & grant signal setting
Merge set antenna & grant signal logic. Combine all information to big structure for runtime logic using, only separate to version format while it is going to assign value to register or offload to firmware. Add new format for dual-BT & external BT for RTL8922D. Signed-off-by: Ching-Te Ku <ku920601@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Link: https://patch.msgid.link/20260712030506.43438-5-pkshih@realtek.com
-rw-r--r--drivers/net/wireless/realtek/rtw89/coex.c501
-rw-r--r--drivers/net/wireless/realtek/rtw89/core.h4
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac.c27
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac_be.c21
4 files changed, 216 insertions, 337 deletions
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
index 78360e73d959..2ca6090e9f62 100644
--- a/drivers/net/wireless/realtek/rtw89/coex.c
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
@@ -492,7 +492,7 @@ enum btc_ant_phase {
BTC_ANT_WONLY,
BTC_ANT_WOFF,
BTC_ANT_W2G,
- BTC_ANT_W5G,
+ BTC_ANT_FDD,
BTC_ANT_W25G,
BTC_ANT_FREERUN,
BTC_ANT_WRFK,
@@ -841,7 +841,9 @@ enum btc_gnt_state {
BTC_GNT_HW = 0,
BTC_GNT_SW_LO,
BTC_GNT_SW_HI,
- BTC_GNT_MAX
+ BTC_GNT_MAX,
+
+ BTC_GNT_SET_SKIP = 0xff,
};
enum btc_ctr_path {
@@ -1787,8 +1789,8 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
dm->wl_fw_cx_offload = !!le32_to_cpu(prpt->v4.wl_fw_info.cx_offload);
for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
- memcpy(&dm->gnt.band[i], &prpt->v4.gnt_val[i],
- sizeof(dm->gnt.band[i]));
+ memcpy(&dm->gnt_set[i], &prpt->v4.gnt_val[i],
+ sizeof(dm->gnt_set[i]));
bt->bcnt[BTC_BCNT_HIPRI_TX] =
le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_TX]);
@@ -1819,8 +1821,8 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
dm->wl_fw_cx_offload = 0;
for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
- memcpy(&dm->gnt.band[i], &prpt->v5.gnt_val[i][0],
- sizeof(dm->gnt.band[i]));
+ memcpy(&dm->gnt_set[i], &prpt->v5.gnt_val[i],
+ sizeof(dm->gnt_set[i]));
bt->bcnt[BTC_BCNT_HIPRI_TX] =
le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_TX]);
@@ -1846,8 +1848,8 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
dm->wl_fw_cx_offload = 0;
for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
- memcpy(&dm->gnt.band[i], &prpt->v105.gnt_val[i][0],
- sizeof(dm->gnt.band[i]));
+ memcpy(&dm->gnt_set[i], &prpt->v105.gnt_val[i],
+ sizeof(dm->gnt_set[i]));
bt->bcnt[BTC_BCNT_HIPRI_TX] =
le16_to_cpu(prpt->v105.bt_cnt[BTC_BCNT_HI_TX_V105]);
@@ -1872,8 +1874,8 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw = le32_to_cpu(prpt->v7.rpt_info.fw_ver);
for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
- memcpy(&dm->gnt.band[i], &prpt->v7.gnt_val[i][0],
- sizeof(dm->gnt.band[i]));
+ memcpy(&dm->gnt_set[i], &prpt->v7.gnt_val[i],
+ sizeof(dm->gnt_set[i]));
bt->bcnt[BTC_BCNT_HIPRI_TX] =
le16_to_cpu(prpt->v7.bt_cnt[BTC_BCNT_HI_TX_V105]);
@@ -1904,8 +1906,8 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw = le32_to_cpu(prpt->v8.rpt_info.fw_ver);
for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
- memcpy(&dm->gnt.band[i], &prpt->v8.gnt_val[i][0],
- sizeof(dm->gnt.band[i]));
+ memcpy(&dm->gnt_set[i], &prpt->v8.gnt_val[i],
+ sizeof(dm->gnt_set[i]));
bt->bcnt[BTC_BCNT_HIPRI_TX] =
le16_to_cpu(prpt->v8.bt_cnt[BTC_BCNT_HI_TX_V105]);
@@ -2971,11 +2973,14 @@ void btc_fw_event(struct rtw89_dev *rtwdev, u8 evt_id, void *data, u32 len)
btc->dm.scbd_b2w_update = 0;
}
-static void _set_gnt(struct rtw89_dev *rtwdev, u8 phy_map, u8 wl_state, u8 bt_state)
+static void _set_gnt(struct rtw89_dev *rtwdev, u8 phy_map,
+ u8 wl_state, u8 bt_state, u8 wlact_state)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_dm *dm = &btc->dm;
- struct rtw89_mac_ax_gnt *g = dm->gnt.band;
+ struct rtw89_btc_fbtc_outsrc_set_info *o = &dm->ost_info;
+ struct rtw89_mac_ax_wl_act *wlact_set;
+ struct rtw89_mac_ax_coex_gnt mg;
u8 i;
if (phy_map > BTC_PHY_ALL)
@@ -2987,126 +2992,118 @@ static void _set_gnt(struct rtw89_dev *rtwdev, u8 phy_map, u8 wl_state, u8 bt_st
switch (wl_state) {
case BTC_GNT_HW:
- g[i].gnt_wl_sw_en = 0;
- g[i].gnt_wl = 0;
+ dm->gnt_set[i].gnt_wl_sw_en = 0;
+ dm->gnt_set[i].gnt_wl = 0;
break;
case BTC_GNT_SW_LO:
- g[i].gnt_wl_sw_en = 1;
- g[i].gnt_wl = 0;
+ dm->gnt_set[i].gnt_wl_sw_en = 1;
+ dm->gnt_set[i].gnt_wl = 0;
break;
case BTC_GNT_SW_HI:
- g[i].gnt_wl_sw_en = 1;
- g[i].gnt_wl = 1;
+ dm->gnt_set[i].gnt_wl_sw_en = 1;
+ dm->gnt_set[i].gnt_wl = 1;
+ break;
+ case BTC_GNT_SET_SKIP:
+ default:
break;
}
switch (bt_state) {
case BTC_GNT_HW:
- g[i].gnt_bt_sw_en = 0;
- g[i].gnt_bt = 0;
+ dm->gnt_set[i].gnt_bt0_sw_en = 0;
+ dm->gnt_set[i].gnt_bt0 = 0;
+ dm->gnt_set[i].gnt_bt1_sw_en = 0;
+ dm->gnt_set[i].gnt_bt1 = 0;
+ dm->gnt_set[i].gnt_zb_sw_en = 0;
+ dm->gnt_set[i].gnt_zb = 0;
break;
case BTC_GNT_SW_LO:
- g[i].gnt_bt_sw_en = 1;
- g[i].gnt_bt = 0;
+ dm->gnt_set[i].gnt_bt0_sw_en = 1;
+ dm->gnt_set[i].gnt_bt0 = 0;
+ dm->gnt_set[i].gnt_bt1_sw_en = 1;
+ dm->gnt_set[i].gnt_bt1 = 0;
+ dm->gnt_set[i].gnt_zb_sw_en = 1;
+ dm->gnt_set[i].gnt_zb = 0;
break;
case BTC_GNT_SW_HI:
- g[i].gnt_bt_sw_en = 1;
- g[i].gnt_bt = 1;
+ dm->gnt_set[i].gnt_bt0_sw_en = 1;
+ dm->gnt_set[i].gnt_bt0 = 1;
+ dm->gnt_set[i].gnt_bt1_sw_en = 1;
+ dm->gnt_set[i].gnt_bt1 = 1;
+ dm->gnt_set[i].gnt_zb_sw_en = 1;
+ dm->gnt_set[i].gnt_zb = 1;
+ break;
+ case BTC_GNT_SET_SKIP:
+ default:
break;
}
}
- rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt);
-}
-
-static void _set_gnt_v1(struct rtw89_dev *rtwdev, u8 phy_map,
- u8 wl_state, u8 bt_state, u8 wlact_state)
-{
- struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_dm *dm = &btc->dm;
- struct rtw89_btc_fbtc_outsrc_set_info *osi = &dm->ost_info;
- struct rtw89_mac_ax_wl_act *b = dm->gnt.bt;
- struct rtw89_mac_ax_gnt *g = dm->gnt.band;
- u8 i, bt_idx = dm->bt_select + 1;
-
- if (phy_map > BTC_PHY_ALL)
- return;
-
- for (i = 0; i < RTW89_PHY_NUM; i++) {
- if (!(phy_map & BIT(i)))
- continue;
+ for (i = 0; i < BTC_ALL_BT_EZL; i++) {
+ if (!(rtwdev->chip->para_ver & BTC_FEAT_WLAN_ACT_MUX))
+ break;
- switch (wl_state) {
- case BTC_GNT_HW:
- g[i].gnt_wl_sw_en = 0;
- g[i].gnt_wl = 0;
+ switch (wlact_state) {
+ case BTC_WLACT_HW:
+ dm->wlact_set[i].wlan_act_en = 0;
+ dm->wlact_set[i].wlan_act = 0;
break;
- case BTC_GNT_SW_LO:
- g[i].gnt_wl_sw_en = 1;
- g[i].gnt_wl = 0;
+ case BTC_WLACT_SW_LO:
+ dm->wlact_set[i].wlan_act_en = 1;
+ dm->wlact_set[i].wlan_act = 0;
break;
- case BTC_GNT_SW_HI:
- g[i].gnt_wl_sw_en = 1;
- g[i].gnt_wl = 1;
+ case BTC_WLACT_SW_HI:
+ dm->wlact_set[i].wlan_act_en = 1;
+ dm->wlact_set[i].wlan_act = 1;
+ break;
+ default:
break;
}
- switch (bt_state) {
- case BTC_GNT_HW:
- g[i].gnt_bt_sw_en = 0;
- g[i].gnt_bt = 0;
- break;
- case BTC_GNT_SW_LO:
- g[i].gnt_bt_sw_en = 1;
- g[i].gnt_bt = 0;
- break;
- case BTC_GNT_SW_HI:
- g[i].gnt_bt_sw_en = 1;
- g[i].gnt_bt = 1;
+ if (!(rtwdev->chip->para_ver & BTC_FEAT_DUAL_BT))
break;
- }
}
- if (rtwdev->chip->para_ver & BTC_FEAT_WLAN_ACT_MUX) {
- for (i = 0; i < 2; i++) {
- if (!(bt_idx & BIT(i)))
- continue;
+ rtw89_debug(rtwdev, RTW89_DBG_BTC,
+ "[BTC], %s(): phy_map=0x%x, gnt_wl:%d, gnt_bt:%d, wl_act:%d\n",
+ __func__, phy_map, wl_state, bt_state, wlact_state);
- switch (wlact_state) {
- case BTC_WLACT_HW:
- b[i].wlan_act_en = 0;
- b[i].wlan_act = 0;
- break;
- case BTC_WLACT_SW_LO:
- b[i].wlan_act_en = 1;
- b[i].wlan_act = 0;
- break;
- case BTC_WLACT_SW_HI:
- b[i].wlan_act_en = 1;
- b[i].wlan_act = 1;
- break;
+ if (rtwdev->chip->para_ver & BTC_FEAT_H2C_MACRO) {
+ if (o->rf_band[BTC_RF_S0] == 1 && o->rf_band[BTC_RF_S1] == 0)
+ o->rf_gbt_source = BTC_RF_S1;
+ else
+ o->rf_gbt_source = BTC_RF_S0;
+
+ memcpy(o->wlact_set, dm->wlact_set, sizeof(o->wlact_set));
+
+ if (btc->ver->fcxosi == 6) {
+ memcpy(o->gnt_set_be, dm->gnt_set, sizeof(o->gnt_set_be));
+ return;
+ } else if (btc->ver->fcxosi == 1) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) { /* gnt[MAC0/MAC1] */
+ mg.band[i].gnt_bt_sw_en = dm->gnt_set[i].gnt_bt0_sw_en;
+ mg.band[i].gnt_bt = dm->gnt_set[i].gnt_bt0;
+ mg.band[i].gnt_wl_sw_en = dm->gnt_set[i].gnt_wl_sw_en;
+ mg.band[i].gnt_wl = dm->gnt_set[i].gnt_wl;
+ memcpy(o->gnt_set, mg.band, sizeof(o->gnt_set));
}
+ return;
}
}
- if (!btc->ver->fcxosi) {
- rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt);
- return;
+ for (i = 0; i < RTW89_PHY_NUM; i++) { /* gnt[MAC0/MAC1] */
+ mg.band[i].gnt_bt_sw_en = dm->gnt_set[i].gnt_bt0_sw_en;
+ mg.band[i].gnt_bt = dm->gnt_set[i].gnt_bt0;
+ mg.band[i].gnt_wl_sw_en = dm->gnt_set[i].gnt_wl_sw_en;
+ mg.band[i].gnt_wl = dm->gnt_set[i].gnt_wl;
}
-
- memcpy(osi->gnt_set, dm->gnt.band, sizeof(osi->gnt_set));
-
- for (i = 0; i < BTC_ALL_BT; i++) {
- osi->wlact_set[i].wlan_act_en = dm->gnt.bt[i].wlan_act_en;
- osi->wlact_set[i].wlan_act = dm->gnt.bt[i].wlan_act;
+ for (i = 0; i < BTC_ALL_BT; i++) { /* wlact[BT0/BT1] */
+ wlact_set = &dm->wlact_set[i];
+ mg.bt[i].wlan_act_en = wlact_set->wlan_act_en;
+ mg.bt[i].wlan_act = wlact_set->wlan_act;
}
- /* GBT source should be GBT_S1 in 1+1 (HWB0:5G + HWB1:2G) case */
- if (osi->rf_band[BTC_RF_S0] == 1 &&
- osi->rf_band[BTC_RF_S1] == 0)
- osi->rf_gbt_source = BTC_RF_S1;
- else
- osi->rf_gbt_source = BTC_RF_S0;
+ rtw89_chip_mac_cfg_gnt(rtwdev, &mg);
}
#define BTC_TDMA_WLROLE_MAX 3
@@ -4961,157 +4958,22 @@ static void _set_bt_plut(struct rtw89_dev *rtwdev, u8 phy_map,
}
}
-static void _set_ant_v0(struct rtw89_dev *rtwdev, bool force_exec,
- u8 phy_map, u8 type)
+static void _set_ant(struct rtw89_dev *rtwdev, bool force_exec,
+ u8 phy_map, u8 type)
{
struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_dm *dm = &btc->dm;
struct rtw89_btc_cx *cx = &btc->cx;
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
- struct rtw89_btc_wl_role_info *r = &btc->cx.wl.role_info;
- struct rtw89_btc_bt_info *bt = &cx->bt0;
- struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
- u8 gwl, gwl0, gwl1, gbt, plt_ctrl, i, b2g = 0;
- u32 ant_path_type;
-
- ant_path_type = ((phy_map << 8) + type);
-
- if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF ||
- btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE ||
- btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || r->dbcc_chg)
- force_exec = FC_EXEC;
-
- if (!force_exec && ant_path_type == dm->set_ant_path) {
- rtw89_debug(rtwdev, RTW89_DBG_BTC,
- "[BTC], %s(): return by no change!!\n",
- __func__);
- return;
- } else if (bt->rfk_info.map.run) {
- rtw89_debug(rtwdev, RTW89_DBG_BTC,
- "[BTC], %s(): return by bt rfk!!\n", __func__);
- return;
- } else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK &&
- wl->rfk_info.state != BTC_WRFK_STOP) {
- rtw89_debug(rtwdev, RTW89_DBG_BTC,
- "[BTC], %s(): return by wl rfk!!\n", __func__);
- return;
- }
-
- dm->set_ant_path = ant_path_type;
-
- rtw89_debug(rtwdev,
- RTW89_DBG_BTC,
- "[BTC], %s(): path=0x%x, set_type=0x%x\n",
- __func__, phy_map, dm->set_ant_path & 0xff);
-
- switch (type) {
- case BTC_ANT_WPOWERON:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_BT);
- break;
- case BTC_ANT_WINIT:
- if (bt->enable.now)
- _set_gnt(rtwdev, phy_map, BTC_GNT_SW_LO, BTC_GNT_SW_HI);
- else
- _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO);
-
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_BT, BTC_PLT_BT);
- break;
- case BTC_ANT_WONLY:
- _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO);
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
- break;
- case BTC_ANT_WOFF:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_BT);
- _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
- break;
- case BTC_ANT_W2G:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- if (rtwdev->dbcc_en) {
- for (i = 0; i < RTW89_PHY_NUM; i++) {
- b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G);
-
- gwl = b2g ? BTC_GNT_HW : BTC_GNT_SW_HI;
- gbt = b2g ? BTC_GNT_HW : BTC_GNT_SW_HI;
- /* BT should control by GNT_BT if WL_2G at S0 */
- if (i == 1 &&
- wl_dinfo->real_band[0] == RTW89_BAND_2G &&
- wl_dinfo->real_band[1] == RTW89_BAND_5G)
- gbt = BTC_GNT_HW;
- _set_gnt(rtwdev, BIT(i), gwl, gbt);
- plt_ctrl = b2g ? BTC_PLT_BT : BTC_PLT_NONE;
- _set_bt_plut(rtwdev, BIT(i),
- plt_ctrl, plt_ctrl);
- }
- } else {
- _set_gnt(rtwdev, phy_map, BTC_GNT_HW, BTC_GNT_HW);
- _set_bt_plut(rtwdev, BTC_PHY_ALL,
- BTC_PLT_BT, BTC_PLT_BT);
- }
- break;
- case BTC_ANT_W5G:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_HW);
- _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
- break;
- case BTC_ANT_W25G:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_gnt(rtwdev, phy_map, BTC_GNT_HW, BTC_GNT_HW);
- _set_bt_plut(rtwdev, BTC_PHY_ALL,
- BTC_PLT_GNT_WL, BTC_PLT_GNT_WL);
- break;
- case BTC_ANT_FREERUN:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_HI);
- _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE);
- break;
- case BTC_ANT_WRFK:
- case BTC_ANT_WRFK2:
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_gnt(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO);
- _set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE);
- break;
- case BTC_ANT_PTA:
- default:
- gbt = BTC_GNT_HW;
- if ((rtwdev->chip->para_ver & BTC_FEAT_MULTI_PTA) ||
- !r->dbcc_en) {
- gwl = BTC_GNT_HW;
- _set_gnt(rtwdev, BTC_PHY_ALL, gwl, gbt);
- } else {
- /* for DBCC Only-1-PTA */
- if (r->dbcc_2g_phy == RTW89_PHY_0) {
- gwl0 = BTC_GNT_HW;
- gwl1 = BTC_GNT_SW_HI;
- } else {
- gwl0 = BTC_GNT_SW_HI;
- gwl1 = BTC_GNT_HW;
- }
- _set_gnt(rtwdev, BTC_PHY_0, gwl0, gbt);
- _set_gnt(rtwdev, BTC_PHY_1, gwl1, gbt);
- }
- rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
- _set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE);
- break;
- }
-}
-
-static void _set_ant_v1(struct rtw89_dev *rtwdev, bool force_exec,
- u8 phy_map, u8 type)
-{
- struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_wl_info *wl = &btc->cx.wl;
- struct rtw89_btc_bt_info *bt = &btc->cx.bt0;
struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info;
u32 ant_path_type = rtw89_get_antpath_type(phy_map, type);
- struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
struct rtw89_btc_dm *dm = &btc->dm;
u8 gwl = BTC_GNT_HW, gwl0, gwl1, gbt;
+ bool cx_ctrl;
- if (btc->dm.run_reason == BTC_RSN_NTFY_POWEROFF ||
- btc->dm.run_reason == BTC_RSN_NTFY_RADIO_STATE ||
- btc->dm.run_reason == BTC_RSN_CMD_SET_COEX || wl_rinfo->dbcc_chg)
+ if (btc->cli_h2c_cmd || wl_rinfo->dbcc_chg ||
+ dm->run_reason == BTC_RSN_NTFY_POWEROFF ||
+ dm->run_reason == BTC_RSN_NTFY_RADIO_STATE ||
+ dm->run_reason == BTC_RSN_CMD_SET_COEX)
force_exec = FC_EXEC;
if (wl_rinfo->link_mode != BTC_WLINK_DB_MCC &&
@@ -5123,10 +4985,6 @@ static void _set_ant_v1(struct rtw89_dev *rtwdev, bool force_exec,
"[BTC], %s(): return by no change!!\n",
__func__);
return;
- } else if (bt->rfk_info.map.run) {
- rtw89_debug(rtwdev, RTW89_DBG_BTC,
- "[BTC], %s(): return by bt rfk!!\n", __func__);
- return;
} else if (btc->dm.run_reason != BTC_RSN_NTFY_WL_RFK &&
wl->rfk_info.state != BTC_WRFK_STOP) {
rtw89_debug(rtwdev, RTW89_DBG_BTC,
@@ -5141,64 +4999,38 @@ static void _set_ant_v1(struct rtw89_dev *rtwdev, bool force_exec,
__func__, phy_map, dm->set_ant_path & 0xff);
switch (type) {
+ case BTC_ANT_WPOWERON:
+ cx_ctrl = BTC_CTRL_BY_BT;
+ break;
case BTC_ANT_WINIT:
+ cx_ctrl = BTC_CTRL_BY_WL;
/* To avoid BT MP driver case (bt_enable but no mailbox) */
- if (bt->enable.now && bt->run_patch_code)
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_LO, BTC_GNT_SW_HI,
- BTC_WLACT_SW_LO);
+ if ((cx->bt0.enable.now && cx->bt0.run_patch_code) ||
+ (cx->bt1.enable.now && cx->bt1.run_patch_code))
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_LO, BTC_GNT_SW_HI,
+ BTC_WLACT_SW_LO);
else
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
- BTC_WLACT_SW_HI);
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
+ BTC_WLACT_SW_HI);
break;
case BTC_ANT_WONLY:
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
- BTC_WLACT_SW_HI);
+ cx_ctrl = BTC_CTRL_BY_WL;
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
+ BTC_WLACT_SW_HI);
break;
case BTC_ANT_WOFF:
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_LO, BTC_GNT_SW_HI,
- BTC_WLACT_SW_LO);
- break;
- case BTC_ANT_W2G:
- case BTC_ANT_W25G:
- if (wl_rinfo->dbcc_en) {
- if (wl_dinfo->real_band[RTW89_PHY_0] == RTW89_BAND_2G)
- gwl = BTC_GNT_HW;
- else
- gwl = BTC_GNT_SW_HI;
- _set_gnt_v1(rtwdev, BTC_PHY_0, gwl, BTC_GNT_HW, BTC_WLACT_HW);
-
- if (wl_dinfo->real_band[RTW89_PHY_1] == RTW89_BAND_2G)
- gwl = BTC_GNT_HW;
- else
- gwl = BTC_GNT_SW_HI;
- _set_gnt_v1(rtwdev, BTC_PHY_1, gwl, BTC_GNT_HW, BTC_WLACT_HW);
- } else {
- gwl = BTC_GNT_HW;
- _set_gnt_v1(rtwdev, phy_map, gwl, BTC_GNT_HW, BTC_WLACT_HW);
- }
- break;
- case BTC_ANT_W5G:
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_HW, BTC_WLACT_HW);
- break;
- case BTC_ANT_FREERUN:
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_HI,
- BTC_WLACT_SW_LO);
- break;
- case BTC_ANT_WRFK:
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
- BTC_WLACT_HW);
- break;
- case BTC_ANT_WRFK2:
- _set_gnt_v1(rtwdev, phy_map, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
- BTC_WLACT_SW_HI); /* no BT-Tx */
+ cx_ctrl = BTC_CTRL_BY_BT;
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_LO, BTC_GNT_SW_HI,
+ BTC_WLACT_SW_LO);
break;
case BTC_ANT_PTA:
default:
+ cx_ctrl = BTC_CTRL_BY_WL;
gbt = BTC_GNT_HW;
if ((rtwdev->chip->para_ver & BTC_FEAT_MULTI_PTA) ||
!wl_rinfo->dbcc_en) {
gwl = BTC_GNT_HW;
- _set_gnt_v1(rtwdev, BTC_PHY_ALL, gwl, gbt, BTC_WLACT_HW);
+ _set_gnt(rtwdev, BTC_PHY_ALL, gwl, gbt, BTC_WLACT_HW);
} else {
/* for DBCC Only-1-PTA */
if (wl_rinfo->dbcc_2g_phy == RTW89_PHY_0) {
@@ -5208,24 +5040,36 @@ static void _set_ant_v1(struct rtw89_dev *rtwdev, bool force_exec,
gwl0 = BTC_GNT_SW_HI;
gwl1 = BTC_GNT_HW;
}
- _set_gnt_v1(rtwdev, BTC_PHY_0, gwl0, gbt, BTC_WLACT_HW);
- _set_gnt_v1(rtwdev, BTC_PHY_1, gwl1, gbt, BTC_WLACT_HW);
+ _set_gnt(rtwdev, BTC_PHY_0, gwl0, gbt, BTC_WLACT_HW);
+ _set_gnt(rtwdev, BTC_PHY_1, gwl1, gbt, BTC_WLACT_HW);
}
break;
+ case BTC_ANT_FDD:
+ cx_ctrl = BTC_CTRL_BY_WL;
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_HI, BTC_GNT_HW,
+ BTC_WLACT_HW);
+ break;
+ case BTC_ANT_FREERUN:
+ cx_ctrl = BTC_CTRL_BY_WL;
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_HI, BTC_GNT_SW_HI,
+ BTC_WLACT_SW_LO);
+ break;
+ case BTC_ANT_WRFK:
+ cx_ctrl = BTC_CTRL_BY_WL;
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
+ BTC_WLACT_HW);
+ break;
+ case BTC_ANT_WRFK2:
+ cx_ctrl = BTC_CTRL_BY_WL;
+ _set_gnt(rtwdev, BTC_PHY_ALL, BTC_GNT_SW_HI, BTC_GNT_SW_LO,
+ BTC_WLACT_SW_HI); /* no BT-Tx */
+ break;
}
+ rtw89_chip_cfg_ctrl_path(rtwdev, cx_ctrl);
_set_bt_plut(rtwdev, phy_map, BTC_PLT_GNT_WL, BTC_PLT_GNT_WL);
}
-static void _set_ant(struct rtw89_dev *rtwdev, bool force_exec,
- u8 phy_map, u8 type)
-{
- if (rtwdev->chip->chip_id >= RTL8922A)
- _set_ant_v1(rtwdev, force_exec, phy_map, type);
- else
- _set_ant_v0(rtwdev, force_exec, phy_map, type);
-}
-
static void _action_wl_only(struct rtw89_dev *rtwdev)
{
_set_ant(rtwdev, FC_EXEC, BTC_PHY_ALL, BTC_ANT_WONLY);
@@ -5619,7 +5463,7 @@ static void _action_bt_a2dp_pan_hid(struct rtw89_dev *rtwdev)
static void _action_wl_5g(struct rtw89_dev *rtwdev)
{
- _set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W5G);
+ _set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_FDD);
_set_policy(rtwdev, BTC_CXP_OFF_EQ0, BTC_ACT_WL_5G);
}
@@ -9674,7 +9518,7 @@ static const char *id_to_ant(u32 id)
CASE_BTC_ANTPATH_STR(WONLY);
CASE_BTC_ANTPATH_STR(WOFF);
CASE_BTC_ANTPATH_STR(W2G);
- CASE_BTC_ANTPATH_STR(W5G);
+ CASE_BTC_ANTPATH_STR(FDD);
CASE_BTC_ANTPATH_STR(W25G);
CASE_BTC_ANTPATH_STR(FREERUN);
CASE_BTC_ANTPATH_STR(WRFK);
@@ -10898,6 +10742,7 @@ out:
static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt_cfg)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_mac_ax_wl_act *bt;
struct rtw89_mac_ax_gnt *gnt;
u32 val, status;
@@ -10932,7 +10777,39 @@ static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt
gnt->gnt_bt = !!(status & B_AX_GNT_BT_RFC_S1);
gnt->gnt_wl_sw_en = !!(val & B_AX_GNT_WL_RFC_S1_SWCTRL);
gnt->gnt_wl = !!(status & B_AX_GNT_WL_RFC_S1);
- } else {
+
+ bt = &gnt_cfg->bt[0];
+ bt->wlan_act_en = !!(val & B_BE_WL_ACT_SWCTRL);
+ bt->wlan_act = !!(status & B_BE_WL_ACT_VAL);
+
+ bt = &gnt_cfg->bt[1];
+ bt->wlan_act_en = !!(val & B_BE_WL_ACT2_SWCTRL);
+ bt->wlan_act = !!(status & B_BE_WL_ACT2_VAL);
+ } else if (chip->chip_id == RTL8922A) {
+ val = rtw89_read32(rtwdev, R_BE_GNT_SW_CTRL);
+ status = rtw89_read32(rtwdev, R_BE_PTA_GNT_VAL);
+
+ gnt = &gnt_cfg->band[0];
+ gnt->gnt_bt_sw_en = !!(val & B_BE_GNT_BT_BB0_SWCTRL);
+ gnt->gnt_bt = !!(status & B_BE_GNT_BT_BB0_VAL);
+ gnt->gnt_wl_sw_en = !!(val & B_BE_GNT_WL_BB0_SWCTRL);
+ gnt->gnt_wl = !!(status & B_BE_GNT_WL_BB0_VAL);
+
+ gnt = &gnt_cfg->band[1];
+ gnt->gnt_bt_sw_en = !!(val & B_BE_GNT_BT_BB1_SWCTRL);
+ gnt->gnt_bt = !!(status & B_BE_GNT_BT_BB1_VAL);
+ gnt->gnt_wl_sw_en = !!(val & B_BE_GNT_WL_BB1_SWCTRL);
+ gnt->gnt_wl = !!(status & B_BE_GNT_WL_BB1_VAL);
+
+ bt = &gnt_cfg->bt[0];
+ bt->wlan_act_en = !!(val & B_BE_WL_ACT_SWCTRL);
+ bt->wlan_act = !!(status & B_BE_WL_ACT_VAL);
+
+ bt = &gnt_cfg->bt[1];
+ bt->wlan_act_en = !!(val & B_BE_WL_ACT2_SWCTRL);
+ bt->wlan_act = !!(status & B_BE_WL_ACT2_VAL);
+ } else if (chip->chip_id == RTL8922D) {
+ /* Get from firmware */
return;
}
}
@@ -11181,7 +11058,6 @@ static int _show_mreg_v7(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
struct rtw89_btc_bt_info *bt0 = &cx->bt0;
struct rtw89_btc_bt_info *bt1 = &cx->bt1;
struct rtw89_btc_wl_info *wl = &cx->wl;
- struct rtw89_mac_ax_gnt *gnt = NULL;
struct rtw89_btc_dm *dm = &btc->dm;
char *p = buf, *end = buf + bufsz;
u8 i, type, cnt = 0;
@@ -11219,18 +11095,19 @@ static int _show_mreg_v7(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
wl->pta_req_mac,
id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
- gnt = &dm->gnt.band[RTW89_PHY_0];
-
p += scnprintf(p, end - p, ", phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d]",
- gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
- gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
+ dm->gnt_set[RTW89_PHY_0].gnt_wl_sw_en ? "SW" : "HW",
+ dm->gnt_set[RTW89_PHY_0].gnt_wl,
+ dm->gnt_set[RTW89_PHY_0].gnt_bt0_sw_en ? "SW" : "HW",
+ dm->gnt_set[RTW89_PHY_0].gnt_bt0);
if (rtwdev->dbcc_en) {
- gnt = &dm->gnt.band[RTW89_PHY_1];
p += scnprintf(p, end - p,
", phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]",
- gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
- gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
+ dm->gnt_set[RTW89_PHY_1].gnt_wl_sw_en ? "SW" : "HW",
+ dm->gnt_set[RTW89_PHY_1].gnt_wl,
+ dm->gnt_set[RTW89_PHY_1].gnt_bt0_sw_en ? "SW" : "HW",
+ dm->gnt_set[RTW89_PHY_1].gnt_bt0);
}
pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 676d3ba855d7..a928140300b9 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -3481,7 +3481,9 @@ struct rtw89_btc_dm {
union rtw89_btc_fbtc_slot_u slot_now;
struct rtw89_btc_fbtc_tdma tdma;
struct rtw89_btc_fbtc_tdma tdma_now;
- struct rtw89_mac_ax_coex_gnt gnt;
+ struct rtw89_btc_gnt_ctrl gnt_set[RTW89_MAC_AX_COEX_GNT_NR];
+ struct rtw89_btc_gnt_ctrl gnt_val[RTW89_MAC_AX_COEX_GNT_NR];
+ struct rtw89_mac_ax_wl_act wlact_set[BTC_ALL_BT_EZL];
union rtw89_btc_init_info_u init_info; /* pass to wl_fw if offload */
struct rtw89_btc_rf_trx_para_v9 rf_trx_para;
struct rtw89_btc_wl_tx_limit_para wl_tx_limit;
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 6e3da5e4a1b3..b9cd7fd8d76b 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -6538,8 +6538,6 @@ int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev,
if (gnt_cfg->band[0].gnt_bt)
val |= B_AX_GNT_BT_RFC_S0_VAL | B_AX_GNT_BT_RX_VAL |
B_AX_GNT_BT_TX_VAL;
- else
- val |= B_AX_WL_ACT_VAL;
if (gnt_cfg->band[0].gnt_bt_sw_en)
val |= B_AX_GNT_BT_RFC_S0_SWCTRL | B_AX_GNT_BT_RX_SWCTRL |
@@ -6556,8 +6554,6 @@ int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev,
if (gnt_cfg->band[1].gnt_bt)
val |= B_AX_GNT_BT_RFC_S1_VAL | B_AX_GNT_BT_RX_VAL |
B_AX_GNT_BT_TX_VAL;
- else
- val |= B_AX_WL_ACT_VAL;
if (gnt_cfg->band[1].gnt_bt_sw_en)
val |= B_AX_GNT_BT_RFC_S1_SWCTRL | B_AX_GNT_BT_RX_SWCTRL |
@@ -6571,6 +6567,15 @@ int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev,
val |= B_AX_GNT_WL_RFC_S1_SWCTRL | B_AX_GNT_WL_RX_SWCTRL |
B_AX_GNT_WL_TX_SWCTRL | B_AX_GNT_WL_BB_SWCTRL;
+ if (gnt_cfg->bt[0].wlan_act_en)
+ val |= B_AX_WL_ACT_SWCTRL;
+ if (gnt_cfg->bt[0].wlan_act)
+ val |= B_AX_WL_ACT_VAL;
+ if (gnt_cfg->bt[1].wlan_act_en)
+ val |= B_AX_WL_ACT2_SWCTRL;
+ if (gnt_cfg->bt[1].wlan_act)
+ val |= B_AX_WL_ACT2_VAL;
+
rtw89_write32(rtwdev, R_AX_GNT_SW_CTRL, val);
return 0;
@@ -6645,22 +6650,20 @@ EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path);
int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl)
{
- struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_dm *dm = &btc->dm;
- struct rtw89_mac_ax_gnt *g = dm->gnt.band;
+ struct rtw89_mac_ax_coex_gnt gnt = {};
int i;
if (wl)
return 0;
for (i = 0; i < RTW89_PHY_NUM; i++) {
- g[i].gnt_bt_sw_en = 1;
- g[i].gnt_bt = 1;
- g[i].gnt_wl_sw_en = 1;
- g[i].gnt_wl = 0;
+ gnt.band[i].gnt_bt_sw_en = 1;
+ gnt.band[i].gnt_bt = 1;
+ gnt.band[i].gnt_wl_sw_en = 1;
+ gnt.band[i].gnt_wl = 0;
}
- return rtw89_mac_cfg_gnt_v1(rtwdev, &dm->gnt);
+ return rtw89_mac_cfg_gnt_v1(rtwdev, &gnt);
}
EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path_v1);
diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
index 4bdf20b7ba6d..33513b283d84 100644
--- a/drivers/net/wireless/realtek/rtw89/mac_be.c
+++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
@@ -2466,29 +2466,26 @@ EXPORT_SYMBOL(rtw89_mac_cfg_gnt_v3);
int rtw89_mac_cfg_ctrl_path_v2(struct rtw89_dev *rtwdev, bool wl)
{
- struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_dm *dm = &btc->dm;
- struct rtw89_mac_ax_gnt *g = dm->gnt.band;
- struct rtw89_mac_ax_wl_act *gbt = dm->gnt.bt;
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_mac_ax_coex_gnt gnt = {};
int i;
if (wl)
return 0;
for (i = 0; i < RTW89_PHY_NUM; i++) {
- g[i].gnt_bt_sw_en = 1;
- g[i].gnt_bt = 1;
- g[i].gnt_wl_sw_en = 1;
- g[i].gnt_wl = 0;
- gbt[i].wlan_act = 1;
- gbt[i].wlan_act_en = 0;
+ gnt.band[i].gnt_bt_sw_en = 1;
+ gnt.band[i].gnt_bt = 1;
+ gnt.band[i].gnt_wl_sw_en = 1;
+ gnt.band[i].gnt_wl = 0;
+ gnt.bt[i].wlan_act = 1;
+ gnt.bt[i].wlan_act_en = 0;
}
if (chip->chip_id == RTL8922A)
- return rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt);
+ return rtw89_mac_cfg_gnt_v2(rtwdev, &gnt);
else
- return rtw89_mac_cfg_gnt_v3(rtwdev, &dm->gnt);
+ return rtw89_mac_cfg_gnt_v3(rtwdev, &gnt);
}
EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path_v2);