wifi: iwlwifi: mvm: enable FILS DF Tx on non-PSC channel
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>
This commit is contained in:
parent
bdd940613b
commit
3d66848f03
@ -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 :
|
||||
|
@ -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 |
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user