mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 08:46:46 +00:00
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: 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
This commit is contained in:
parent
3788c599da
commit
487b7b7025
3 changed files with 25 additions and 10 deletions
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue