wifi: iwlwifi: mvm: enable FILS DF Tx on non-PSC channel
authorShaul Triebitz <shaul.triebitz@intel.com>
Wed, 13 Sep 2023 11:56:44 +0000 (14:56 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 13 Sep 2023 14:11:40 +0000 (16:11 +0200)
If the channel bandwidth is greater or equal than 80MHz,
enable FILS DF transmittion, even if the control channel is non-PSC.
That's because that in 80MHz there must be a sub 20MHz PSC
channel, and since the FILS DF is duplicated on all sub 20MHz
channels, within the 80MHz (hence it will be sent on a PSC channel).

Also, if FILS DF Tx is enabled, always configure the firmware
with the actual channel bandwidth, even before there is a connected
client (rather than the minimum bandwidth e.g. 20MHz), since FILS
DF transmission on a PSC channel take presedent over power
consumption.

Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230913145231.83b9a76fc6c4.I6703111cc6befcd0e9cd9adf3cb127a648dbb7b1@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index b97b805d34865e9dad8d0ac56b1a8b0cc91704dc..06bbd6212df0be9b631306ff79b65cc5d8026f25 100644 (file)
@@ -1083,6 +1083,19 @@ static int iwl_mvm_mac_ctxt_send_beacon_v7(struct iwl_mvm *mvm,
                                                sizeof(beacon_cmd));
 }
 
+bool iwl_mvm_enable_fils(struct iwl_mvm *mvm,
+                        struct ieee80211_chanctx_conf *ctx)
+{
+       if (IWL_MVM_DISABLE_AP_FILS)
+               return false;
+
+       if (cfg80211_channel_is_psc(ctx->def.chan))
+               return true;
+
+       return (ctx->def.chan->band == NL80211_BAND_6GHZ &&
+               ctx->def.width >= NL80211_CHAN_WIDTH_80);
+}
+
 static int iwl_mvm_mac_ctxt_send_beacon_v9(struct iwl_mvm *mvm,
                                           struct ieee80211_vif *vif,
                                           struct sk_buff *beacon,
@@ -1102,8 +1115,7 @@ static int iwl_mvm_mac_ctxt_send_beacon_v9(struct iwl_mvm *mvm,
        ctx = rcu_dereference(link_conf->chanctx_conf);
        channel = ieee80211_frequency_to_channel(ctx->def.chan->center_freq);
        WARN_ON(channel == 0);
-       if (cfg80211_channel_is_psc(ctx->def.chan) &&
-           !IWL_MVM_DISABLE_AP_FILS) {
+       if (iwl_mvm_enable_fils(mvm, ctx)) {
                flags |= iwl_fw_lookup_cmd_ver(mvm->fw, BEACON_TEMPLATE_CMD,
                                               0) > 10 ?
                        IWL_MAC_BEACON_FILS :
index 93223f8c07b48845d7980b91b17281d17273e250..2fb5fb41f508847ce46a88b80350ff6eb2f8fe62 100644 (file)
@@ -4736,8 +4736,9 @@ static int __iwl_mvm_add_chanctx(struct iwl_mvm *mvm,
 {
        u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
        struct iwl_mvm_phy_ctxt *phy_ctxt;
-       bool responder = iwl_mvm_is_ftm_responder_chanctx(mvm, ctx);
-       struct cfg80211_chan_def *def = responder ? &ctx->def : &ctx->min_def;
+       bool use_def = iwl_mvm_is_ftm_responder_chanctx(mvm, ctx) ||
+               iwl_mvm_enable_fils(mvm, ctx);
+       struct cfg80211_chan_def *def = use_def ? &ctx->def : &ctx->min_def;
        int ret;
 
        lockdep_assert_held(&mvm->mutex);
@@ -4804,8 +4805,9 @@ void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
        struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
-       bool responder = iwl_mvm_is_ftm_responder_chanctx(mvm, ctx);
-       struct cfg80211_chan_def *def = responder ? &ctx->def : &ctx->min_def;
+       bool use_def = iwl_mvm_is_ftm_responder_chanctx(mvm, ctx) ||
+               iwl_mvm_enable_fils(mvm, ctx);
+       struct cfg80211_chan_def *def = use_def ? &ctx->def : &ctx->min_def;
 
        if (WARN_ONCE((phy_ctxt->ref > 1) &&
                      (changed & ~(IEEE80211_CHANCTX_CHANGE_WIDTH |
index bbc552170c9f9b41c63fa33918946a638660ff99..afb6584daefe612ea8b1eb65c91189d95e124036 100644 (file)
@@ -2740,4 +2740,6 @@ int iwl_mvm_set_hw_timestamp(struct ieee80211_hw *hw,
                             struct ieee80211_vif *vif,
                             struct cfg80211_set_hw_timestamp *hwts);
 int iwl_mvm_update_mu_groups(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
+bool iwl_mvm_enable_fils(struct iwl_mvm *mvm,
+                        struct ieee80211_chanctx_conf *ctx);
 #endif /* __IWL_MVM_H__ */