u8 gnt_wl;
 } __packed;
 
+struct rtw89_mac_ax_wl_act {
+       u8 wlan_act_en;
+       u8 wlan_act;
+};
+
 #define RTW89_MAC_AX_COEX_GNT_NR 2
 struct rtw89_mac_ax_coex_gnt {
        struct rtw89_mac_ax_gnt band[RTW89_MAC_AX_COEX_GNT_NR];
+       struct rtw89_mac_ax_wl_act bt[RTW89_MAC_AX_COEX_GNT_NR];
 };
 
 enum rtw89_btc_ncnt {
 
                      const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
 int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev,
                         const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
+int rtw89_mac_cfg_gnt_v2(struct rtw89_dev *rtwdev,
+                        const struct rtw89_mac_ax_coex_gnt *gnt_cfg);
 
 static inline
 int rtw89_mac_cfg_plt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt)
 bool rtw89_mac_get_ctrl_path(struct rtw89_dev *rtwdev);
 int rtw89_mac_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl);
 int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl);
+int rtw89_mac_cfg_ctrl_path_v2(struct rtw89_dev *rtwdev, bool wl);
 void rtw89_mac_power_mode_change(struct rtw89_dev *rtwdev, bool enter);
 void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev);
 
 
        return 0;
 }
 
+int rtw89_mac_cfg_gnt_v2(struct rtw89_dev *rtwdev,
+                        const struct rtw89_mac_ax_coex_gnt *gnt_cfg)
+{
+       u32 val = 0;
+
+       if (gnt_cfg->band[0].gnt_bt)
+               val |= B_BE_GNT_BT_BB0_VAL | B_BE_GNT_BT_RX_BB0_VAL |
+                      B_BE_GNT_BT_TX_BB0_VAL;
+
+       if (gnt_cfg->band[0].gnt_bt_sw_en)
+               val |= B_BE_GNT_BT_BB0_SWCTRL | B_BE_GNT_BT_RX_BB0_SWCTRL |
+                      B_BE_GNT_BT_TX_BB0_SWCTRL;
+
+       if (gnt_cfg->band[0].gnt_wl)
+               val |= B_BE_GNT_WL_BB0_VAL | B_BE_GNT_WL_RX_VAL |
+                      B_BE_GNT_WL_TX_VAL | B_BE_GNT_WL_BB_PWR_VAL;
+
+       if (gnt_cfg->band[0].gnt_wl_sw_en)
+               val |= B_BE_GNT_WL_BB0_SWCTRL | B_BE_GNT_WL_RX_SWCTRL |
+                      B_BE_GNT_WL_TX_SWCTRL | B_BE_GNT_WL_BB_PWR_SWCTRL;
+
+       if (gnt_cfg->band[1].gnt_bt)
+               val |= B_BE_GNT_BT_BB1_VAL | B_BE_GNT_BT_RX_BB1_VAL |
+                      B_BE_GNT_BT_TX_BB1_VAL;
+
+       if (gnt_cfg->band[1].gnt_bt_sw_en)
+               val |= B_BE_GNT_BT_BB1_SWCTRL | B_BE_GNT_BT_RX_BB1_SWCTRL |
+                      B_BE_GNT_BT_TX_BB1_SWCTRL;
+
+       if (gnt_cfg->band[1].gnt_wl)
+               val |= B_BE_GNT_WL_BB1_VAL | B_BE_GNT_WL_RX_VAL |
+                      B_BE_GNT_WL_TX_VAL | B_BE_GNT_WL_BB_PWR_VAL;
+
+       if (gnt_cfg->band[1].gnt_wl_sw_en)
+               val |= B_BE_GNT_WL_BB1_SWCTRL | B_BE_GNT_WL_RX_SWCTRL |
+                      B_BE_GNT_WL_TX_SWCTRL | B_BE_GNT_WL_BB_PWR_SWCTRL;
+
+       if (gnt_cfg->bt[0].wlan_act_en)
+               val |= B_BE_WL_ACT_SWCTRL;
+       if (gnt_cfg->bt[0].wlan_act)
+               val |= B_BE_WL_ACT_VAL;
+       if (gnt_cfg->bt[1].wlan_act_en)
+               val |= B_BE_WL_ACT2_SWCTRL;
+       if (gnt_cfg->bt[1].wlan_act)
+               val |= B_BE_WL_ACT2_VAL;
+
+       rtw89_write32(rtwdev, R_BE_GNT_SW_CTRL, val);
+
+       return 0;
+}
+EXPORT_SYMBOL(rtw89_mac_cfg_gnt_v2);
+
+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;
+       int i;
+
+       if (wl)
+               return 0;
+
+       for (i = 0; i < RTW89_PHY_MAX; 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;
+       }
+
+       return rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt);
+}
+EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path_v2);
+
 static
 int rtw89_mac_cfg_plt_be(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt)
 {
 
 #define B_BE_MACID_ACQ_GRP0_CLR_P BIT(2)
 #define B_BE_R_MACID_ACQ_CHK_EN BIT(0)
 
+#define R_BE_GNT_SW_CTRL 0x0E348
+#define B_BE_WL_ACT2_VAL BIT(25)
+#define B_BE_WL_ACT2_SWCTRL BIT(24)
+#define B_BE_WL_ACT_VAL BIT(23)
+#define B_BE_WL_ACT_SWCTRL BIT(22)
+#define B_BE_GNT_BT_RX_BB1_VAL BIT(21)
+#define B_BE_GNT_BT_RX_BB1_SWCTRL BIT(20)
+#define B_BE_GNT_BT_TX_BB1_VAL BIT(19)
+#define B_BE_GNT_BT_TX_BB1_SWCTRL BIT(18)
+#define B_BE_GNT_BT_RX_BB0_VAL BIT(17)
+#define B_BE_GNT_BT_RX_BB0_SWCTRL BIT(16)
+#define B_BE_GNT_BT_TX_BB0_VAL BIT(15)
+#define B_BE_GNT_BT_TX_BB0_SWCTRL BIT(14)
+#define B_BE_GNT_WL_RX_VAL BIT(13)
+#define B_BE_GNT_WL_RX_SWCTRL BIT(12)
+#define B_BE_GNT_WL_TX_VAL BIT(11)
+#define B_BE_GNT_WL_TX_SWCTRL BIT(10)
+#define B_BE_GNT_BT_BB1_VAL BIT(9)
+#define B_BE_GNT_BT_BB1_SWCTRL BIT(8)
+#define B_BE_GNT_WL_BB1_VAL BIT(7)
+#define B_BE_GNT_WL_BB1_SWCTRL BIT(6)
+#define B_BE_GNT_BT_BB0_VAL BIT(5)
+#define B_BE_GNT_BT_BB0_SWCTRL BIT(4)
+#define B_BE_GNT_WL_BB0_VAL BIT(3)
+#define B_BE_GNT_WL_BB0_SWCTRL BIT(2)
+#define B_BE_GNT_WL_BB_PWR_VAL BIT(1)
+#define B_BE_GNT_WL_BB_PWR_SWCTRL BIT(0)
+
 #define R_BE_PWR_MACID_PATH_BASE 0x0E500
 #define R_BE_PWR_MACID_LMT_BASE 0x0ED00
 
 
        .query_rxdesc           = rtw89_core_query_rxdesc_v2,
        .fill_txdesc            = rtw89_core_fill_txdesc_v2,
        .fill_txdesc_fwcmd      = rtw89_core_fill_txdesc_fwcmd_v2,
+       .cfg_ctrl_path          = rtw89_mac_cfg_ctrl_path_v2,
+       .mac_cfg_gnt            = rtw89_mac_cfg_gnt_v2,
        .stop_sch_tx            = rtw89_mac_stop_sch_tx_v2,
        .resume_sch_tx          = rtw89_mac_resume_sch_tx_v2,
        .h2c_dctl_sec_cam       = rtw89_fw_h2c_dctl_sec_cam_v2,