wifi: rtw89: set wifi_role of P2P
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 22 Sep 2022 01:04:33 +0000 (09:04 +0800)
committerKalle Valo <kvalo@kernel.org>
Sat, 24 Sep 2022 12:36:27 +0000 (15:36 +0300)
Consider vif->p2p to set wifi_role to let firmware know current vif is
running as GC or GO. And, allow GC to enter PS mode, but disallow to enter
deep PS for now.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220922010435.12167-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/ps.c
drivers/net/wireless/realtek/rtw89/ps.h

index ee8cb7ab7e82795849d2c9734619c329ffad686a..87938c9e24e1793ca2045b9912ca21b6b6baa833 100644 (file)
@@ -2167,12 +2167,13 @@ static bool rtw89_traffic_stats_track(struct rtw89_dev *rtwdev)
 
 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)
@@ -2333,9 +2334,19 @@ void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc)
        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:
index ea3260178e666d37667352db798c25d0921ba11b..3c56a5ef40f841ed8a60d77216cab8db9bffe291 100644 (file)
@@ -59,8 +59,11 @@ static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
                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;
 
@@ -111,20 +114,21 @@ void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
        __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);
index a184b68994aa42420b0e02f1894d7a41f4a3c2df..7d371293d6bc9ca295436762be5dbdf8f6d02e53 100644 (file)
@@ -5,7 +5,7 @@
 #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);