_set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W2G);
 
+       if (a2dp.vendor_id == 0x4c || dm->leak_ap || bt_linfo->slave_role)
+               dm->slot_dur[CXST_W1] = 20;
+       else
+               dm->slot_dur[CXST_W1] = 40;
+
+       dm->slot_dur[CXST_B1] = BTC_B1_MAX;
+
        switch (btc->cx.state_map) {
        case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP */
-               if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
-                       dm->slot_dur[CXST_W1] = 40;
-                       dm->slot_dur[CXST_B1] = 200;
-                       _set_policy(rtwdev,
-                                   BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP);
-               } else {
-                       _set_policy(rtwdev,
-                                   BTC_CXP_PAUTO_TD50B1, BTC_ACT_BT_A2DP);
-               }
+               _set_policy(rtwdev, BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP);
                break;
        case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP */
                _set_policy(rtwdev, BTC_CXP_PAUTO2_TD3050, BTC_ACT_BT_A2DP);
                break;
        case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP */
        case BTC_WLINKING: /* wl-connecting + bt-A2DP */
-               if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
-                       dm->slot_dur[CXST_W1] = 40;
-                       dm->slot_dur[CXST_B1] = 200;
-                       _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1,
-                                   BTC_ACT_BT_A2DP);
-               } else {
-                       _set_policy(rtwdev, BTC_CXP_AUTO_TD50B1,
-                                   BTC_ACT_BT_A2DP);
-               }
+               if (btc->cx.wl.rfk_info.con_rfk)
+                       _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_BT_A2DP);
+               else
+                       _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1, BTC_ACT_BT_A2DP);
                break;
        case BTC_WIDLE:  /* wl-idle + bt-A2DP */
                _set_policy(rtwdev, BTC_CXP_AUTO_TD20B1, BTC_ACT_BT_A2DP);
                _set_policy(rtwdev, BTC_CXP_FIX_TD2060, BTC_ACT_BT_A2DPSINK);
                break;
        case BTC_WLINKING: /* wl-connecting + bt-A2dp_Sink */
-               _set_policy(rtwdev, BTC_CXP_FIX_TD3030, BTC_ACT_BT_A2DPSINK);
+               if (btc->cx.wl.rfk_info.con_rfk)
+                       _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_BT_A2DPSINK);
+               else
+                       _set_policy(rtwdev, BTC_CXP_FIX_TD3030, BTC_ACT_BT_A2DPSINK);
                break;
        case BTC_WIDLE: /* wl-idle + bt-A2dp_Sink */
                _set_policy(rtwdev, BTC_CXP_FIX_TD2080, BTC_ACT_BT_A2DPSINK);
 
        _set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W2G);
 
+       if (a2dp.vendor_id == 0x4c || dm->leak_ap || bt_linfo->slave_role)
+               dm->slot_dur[CXST_W1] = 20;
+       else
+               dm->slot_dur[CXST_W1] = 40;
+
+       dm->slot_dur[CXST_B1] = BTC_B1_MAX;
+
        switch (btc->cx.state_map) {
        case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+HID */
        case BTC_WIDLE:  /* wl-idle + bt-A2DP */
-               if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
-                       dm->slot_dur[CXST_W1] = 40;
-                       dm->slot_dur[CXST_B1] = 200;
-                       _set_policy(rtwdev,
-                                   BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP_HID);
-               } else {
-                       _set_policy(rtwdev,
-                                   BTC_CXP_PAUTO_TD50B1, BTC_ACT_BT_A2DP_HID);
-               }
+               _set_policy(rtwdev, BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP_HID);
                break;
        case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+HID */
-               _set_policy(rtwdev, BTC_CXP_PAUTO2_TD3050, BTC_ACT_BT_A2DP_HID);
+               _set_policy(rtwdev, BTC_CXP_PAUTO2_TD3070, BTC_ACT_BT_A2DP_HID);
                break;
 
        case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+HID */
                break;
        case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+HID */
        case BTC_WLINKING: /* wl-connecting + bt-A2DP+HID */
-               if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
-                       dm->slot_dur[CXST_W1] = 40;
-                       dm->slot_dur[CXST_B1] = 200;
-                       _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1,
-                                   BTC_ACT_BT_A2DP_HID);
-               } else {
-                       _set_policy(rtwdev, BTC_CXP_AUTO_TD50B1,
-                                   BTC_ACT_BT_A2DP_HID);
-               }
+               if (btc->cx.wl.rfk_info.con_rfk)
+                       _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_BT_A2DP_HID);
+               else
+                       _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1, BTC_ACT_BT_A2DP_HID);
                break;
        }
 }
                goto exit;
        }
 
-       if (wl->status.val & btc_scanning_map.val) {
+       if (wl->status.val & btc_scanning_map.val && !wl->rfk_info.con_rfk) {
                _action_wl_scan(rtwdev);
                bt->scan_rx_low_pri = true;
                goto exit;
        rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC] use version def[%d] = 0x%08x\n",
                    (int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code);
 }
+
+void rtw89_btc_ntfy_preserve_bt_time(struct rtw89_dev *rtwdev, u32 ms)
+{
+       struct rtw89_btc_bt_link_info *bt_linfo = &rtwdev->btc.cx.bt.link_info;
+       struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
+
+       if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags))
+               return;
+
+       if (!a2dp.exist)
+               return;
+
+       fsleep(ms * 1000);
+}
+EXPORT_SYMBOL(rtw89_btc_ntfy_preserve_bt_time);
+
+void rtw89_btc_ntfy_conn_rfk(struct rtw89_dev *rtwdev, bool state)
+{
+       rtwdev->btc.cx.wl.rfk_info.con_rfk = state;
+}
+EXPORT_SYMBOL(rtw89_btc_ntfy_conn_rfk);