static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
 {
-       if (rtwdev->chip->low_power_hci_modes & BIT(rtwdev->ps_mode))
+       if (rtwdev->chip->low_power_hci_modes & BIT(rtwdev->ps_mode) &&
+           !test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags))
                rtw89_ps_power_mode_change_with_hci(rtwdev, enter);
        else
                rtw89_mac_power_mode_change(rtwdev, enter);
 
        struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
        struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
        struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
+       enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
        const struct rtw89_chip_info *chip = rtwdev->chip;
        bool include_bb = !!chip->bbmcu_nr;
+       bool disable_intr_for_dlfw = false;
        struct ieee80211_sta *wow_sta;
        struct rtw89_sta *rtwsta = NULL;
        bool is_conn = true;
        int ret;
 
-       rtw89_hci_disable_intr(rtwdev);
+       if (chip_id == RTL8852C || chip_id == RTL8922A)
+               disable_intr_for_dlfw = true;
 
        wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid);
        if (wow_sta)
        else
                is_conn = false;
 
+       if (disable_intr_for_dlfw)
+               rtw89_hci_disable_intr(rtwdev);
+
        ret = rtw89_fw_download(rtwdev, fw_type, include_bb);
        if (ret) {
                rtw89_warn(rtwdev, "download fw failed\n");
                return ret;
        }
 
+       if (disable_intr_for_dlfw)
+               rtw89_hci_enable_intr(rtwdev);
+
        rtw89_phy_init_rf_reg(rtwdev, true);
 
        ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
                rtw89_phy_rfk_pre_ntfy_and_wait(rtwdev, RTW89_PHY_0, 5);
 
        rtw89_mac_hw_mgnt_sec(rtwdev, wow);
-       rtw89_hci_enable_intr(rtwdev);
 
        return 0;
 }