Commit 487b7b70 authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

wifi: rtw89: set wifi_role of P2P

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: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220922010435.12167-4-pkshih@realtek.com
parent 3788c599
...@@ -2167,12 +2167,13 @@ static bool rtw89_traffic_stats_track(struct rtw89_dev *rtwdev) ...@@ -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) 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; return;
if (rtwvif->stats.tx_tfc_lv == RTW89_TFC_IDLE && if (rtwvif->stats.tx_tfc_lv == RTW89_TFC_IDLE &&
rtwvif->stats.rx_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) 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) ...@@ -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; struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
switch (vif->type) { 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(ADHOC);
RTW89_TYPE_MAPPING(STATION);
RTW89_TYPE_MAPPING(AP);
RTW89_TYPE_MAPPING(MONITOR); RTW89_TYPE_MAPPING(MONITOR);
RTW89_TYPE_MAPPING(MESH_POINT); RTW89_TYPE_MAPPING(MESH_POINT);
default: default:
......
...@@ -59,8 +59,11 @@ static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter) ...@@ -59,8 +59,11 @@ static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
rtw89_mac_power_mode_change(rtwdev, 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) if (!rtwdev->ps_mode)
return; return;
...@@ -111,20 +114,21 @@ void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev) ...@@ -111,20 +114,21 @@ void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
__rtw89_leave_ps_mode(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); lockdep_assert_held(&rtwdev->mutex);
if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags)) if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
return; return;
__rtw89_enter_lps(rtwdev, mac_id); __rtw89_enter_lps(rtwdev, rtwvif->mac_id);
__rtw89_enter_ps_mode(rtwdev); __rtw89_enter_ps_mode(rtwdev, rtwvif);
} }
static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *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; return;
__rtw89_leave_lps(rtwdev, rtwvif->mac_id); __rtw89_leave_lps(rtwdev, rtwvif->mac_id);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#ifndef __RTW89_PS_H_ #ifndef __RTW89_PS_H_
#define __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_lps(struct rtw89_dev *rtwdev);
void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev); void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev); void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment