summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2022-06-24 15:14:26 +0200
committerJohannes Berg <johannes.berg@intel.com>2022-07-15 11:43:15 +0200
commit8c7c6b581987dda035c73661cf83973a02a055d8 (patch)
tree5a8655d448c9e3940616ab01b0f581256ebe9aa0
parenta3b8008dc1421a6f1d0d92cfc1352d729f6756c1 (diff)
downloadlinux-8c7c6b581987dda035c73661cf83973a02a055d8.tar.bz2
wifi: mac80211: expect powersave handling in driver for MLO
In MLO, expect the driver fully handles powersave handling, including tracking whether or not a beacon was received, the DTIM period, etc. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/mac80211/main.c3
-rw-r--r--net/mac80211/mlme.c4
2 files changed, 5 insertions, 2 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 1258e506377e..8d5b18318b20 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -984,7 +984,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
return -EINVAL;
if (WARN_ON(ieee80211_hw_check(hw, SUPPORTS_PS) &&
- !ieee80211_hw_check(hw, SUPPORTS_DYNAMIC_PS)))
+ (!ieee80211_hw_check(hw, SUPPORTS_DYNAMIC_PS) ||
+ ieee80211_hw_check(hw, PS_NULLFUNC_STACK))))
return -EINVAL;
if (WARN_ON(!ieee80211_hw_check(hw, MFP_CAPABLE)))
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index f8be05804e59..5400b3e567fa 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1786,6 +1786,7 @@ static void ieee80211_change_ps(struct ieee80211_local *local)
static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
{
+ struct ieee80211_local *local = sdata->local;
struct ieee80211_if_managed *mgd = &sdata->u.mgd;
struct sta_info *sta = NULL;
bool authorized = false;
@@ -1802,7 +1803,8 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
if (mgd->flags & IEEE80211_STA_CONNECTION_POLL)
return false;
- if (!sdata->deflink.u.mgd.have_beacon)
+ if (!(local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO) &&
+ !sdata->deflink.u.mgd.have_beacon)
return false;
rcu_read_lock();