static void rtw89_vif_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
-       if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION)
+       if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION &&
+           rtwvif->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT)
                return;
 
        if (rtwvif->stats.tx_tfc_lv == RTW89_TFC_IDLE &&
            rtwvif->stats.rx_tfc_lv == RTW89_TFC_IDLE)
-               rtw89_enter_lps(rtwdev, rtwvif->mac_id);
+               rtw89_enter_lps(rtwdev, rtwvif);
 }
 
 static void rtw89_enter_lps_track(struct rtw89_dev *rtwdev)
        struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
 
        switch (vif->type) {
+       case NL80211_IFTYPE_STATION:
+               if (vif->p2p)
+                       rtwvif->wifi_role = RTW89_WIFI_ROLE_P2P_CLIENT;
+               else
+                       rtwvif->wifi_role = RTW89_WIFI_ROLE_STATION;
+               break;
+       case NL80211_IFTYPE_AP:
+               if (vif->p2p)
+                       rtwvif->wifi_role = RTW89_WIFI_ROLE_P2P_GO;
+               else
+                       rtwvif->wifi_role = RTW89_WIFI_ROLE_AP;
+               break;
        RTW89_TYPE_MAPPING(ADHOC);
-       RTW89_TYPE_MAPPING(STATION);
-       RTW89_TYPE_MAPPING(AP);
        RTW89_TYPE_MAPPING(MONITOR);
        RTW89_TYPE_MAPPING(MESH_POINT);
        default:
 
                rtw89_mac_power_mode_change(rtwdev, enter);
 }
 
-static void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev)
+static void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
+       if (rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT)
+               return;
+
        if (!rtwdev->ps_mode)
                return;
 
        __rtw89_leave_ps_mode(rtwdev);
 }
 
-void rtw89_enter_lps(struct rtw89_dev *rtwdev, u8 mac_id)
+void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
        lockdep_assert_held(&rtwdev->mutex);
 
        if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
                return;
 
-       __rtw89_enter_lps(rtwdev, mac_id);
-       __rtw89_enter_ps_mode(rtwdev);
+       __rtw89_enter_lps(rtwdev, rtwvif->mac_id);
+       __rtw89_enter_ps_mode(rtwdev, rtwvif);
 }
 
 static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
-       if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION)
+       if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION &&
+           rtwvif->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT)
                return;
 
        __rtw89_leave_lps(rtwdev, rtwvif->mac_id);
 
 #ifndef __RTW89_PS_H_
 #define __RTW89_PS_H_
 
-void rtw89_enter_lps(struct rtw89_dev *rtwdev, u8 mac_id);
+void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
 void rtw89_leave_lps(struct rtw89_dev *rtwdev);
 void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
 void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);