diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c index f1bf54031901..9a7ab837b4d6 100644 --- a/drivers/net/wireless/ath/wil6210/cfg80211.c +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c @@ -2155,7 +2155,8 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy, if (pbss) wmi_nettype = WMI_NETTYPE_P2P; - wil_dbg_misc(wil, "start_ap: mid=%d, is_go=%d\n", vif->mid, is_go); + wil_dbg_misc(wil, "start_ap: mid=%d, is_go=%d ap_ps=%d\n", vif->mid, + is_go, wil->ap_ps); if (is_go && !pbss) { wil_err(wil, "P2P GO must be in PBSS\n"); return -ENOTSUPP; @@ -2247,6 +2248,14 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy, if (rc) goto err_bcast; + if (test_bit(WMI_FW_CAPABILITY_AP_POWER_MANAGEMENT, + wil->fw_capabilities)) { + enum wmi_ps_profile_type ps_profile = wil->ap_ps ? + wil->ps_profile : WMI_PS_PROFILE_TYPE_PS_DISABLED; + + wil_ps_update(wil, ps_profile); + } + goto out; /* success */ err_bcast: diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c index f603bf60ea45..7207a879e45d 100644 --- a/drivers/net/wireless/ath/wil6210/debugfs.c +++ b/drivers/net/wireless/ath/wil6210/debugfs.c @@ -2460,6 +2460,7 @@ static const struct dbg_off dbg_wil_off[] = { WIL_FIELD(rx_buff_id_count, 0644, doff_u32), WIL_FIELD(amsdu_en, 0644, doff_u8), WIL_FIELD(force_edmg_channel, 0644, doff_u8), + WIL_FIELD(ap_ps, 0644, doff_u8), {}, }; diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c index b3d60bdf9c1b..88b6ff9d4948 100644 --- a/drivers/net/wireless/ath/wil6210/main.c +++ b/drivers/net/wireless/ath/wil6210/main.c @@ -1309,6 +1309,8 @@ void wil_refresh_fw_capabilities(struct wil6210_priv *wil) } update_supported_bands(wil); + + wil->ap_ps = test_bit(WIL_PLATFORM_CAPA_AP_PS, wil->platform_capa); } void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r) diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h index 8d7b8ce2d554..c01c3afb949d 100644 --- a/drivers/net/wireless/ath/wil6210/wil6210.h +++ b/drivers/net/wireless/ath/wil6210/wil6210.h @@ -1047,6 +1047,7 @@ struct wil6210_priv { void *platform_handle; struct wil_platform_ops platform_ops; bool keep_radio_on_during_sleep; + u8 ap_ps; /* AP mode power save enabled */ struct pmc_ctx pmc; diff --git a/drivers/net/wireless/ath/wil6210/wil_platform.h b/drivers/net/wireless/ath/wil6210/wil_platform.h index d3816498c2dc..e6730afe8a46 100644 --- a/drivers/net/wireless/ath/wil6210/wil_platform.h +++ b/drivers/net/wireless/ath/wil6210/wil_platform.h @@ -32,6 +32,7 @@ enum wil_platform_capa { WIL_PLATFORM_CAPA_T_PWR_ON_0 = 1, WIL_PLATFORM_CAPA_EXT_CLK = 2, WIL_PLATFORM_CAPA_SMMU = 3, + WIL_PLATFORM_CAPA_AP_PS = 4, WIL_PLATFORM_CAPA_MAX, }; diff --git a/drivers/net/wireless/ath/wil6210/wmi.h b/drivers/net/wireless/ath/wil6210/wmi.h index c2d4eac96fb3..39029bc45d93 100644 --- a/drivers/net/wireless/ath/wil6210/wmi.h +++ b/drivers/net/wireless/ath/wil6210/wmi.h @@ -100,6 +100,7 @@ enum wmi_fw_capability { WMI_FW_CAPABILITY_IPA = 27, WMI_FW_CAPABILITY_TEMPERATURE_ALL_RF = 30, WMI_FW_CAPABILITY_SPLIT_REKEY = 31, + WMI_FW_CAPABILITY_AP_POWER_MANAGEMENT = 32, WMI_FW_CAPABILITY_MAX, };