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
This commit is contained in:
Ching-Te Ku
2026-07-12 11:04:59 +08:00
committed by Ping-Ke Shih
parent 404edeea3b
commit a20edfbc15
4 changed files with 218 additions and 339 deletions

View File

@@ -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;
switch (wl_state) {
case BTC_GNT_HW:
g[i].gnt_wl_sw_en = 0;
g[i].gnt_wl = 0;
for (i = 0; i < BTC_ALL_BT_EZL; i++) {
if (!(rtwdev->chip->para_ver & BTC_FEAT_WLAN_ACT_MUX))
break;
case BTC_GNT_SW_LO:
g[i].gnt_wl_sw_en = 1;
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_HI:
g[i].gnt_wl_sw_en = 1;
g[i].gnt_wl = 1;
case BTC_WLACT_SW_LO:
dm->wlact_set[i].wlan_act_en = 1;
dm->wlact_set[i].wlan_act = 0;
break;
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;
if (!(rtwdev->chip->para_ver & BTC_FEAT_DUAL_BT))
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;
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;
}
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;
}
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;
}
/* 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 @@ static int _show_fw_dm_msg(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);