summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2017-09-14 15:45:44 +0300
committerLuca Coelho <luciano.coelho@intel.com>2017-10-06 14:57:22 +0300
commit7a20bcceeddd7162801bb37d992c5a2bfd5ca3ce (patch)
tree1e30c2f011558daf23f98ec56ef8020fb31c9742 /drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
parenta2ff48af65ad661a257987fa05973351c595002e (diff)
iwlwifi: mvm: don't send identical PHY_CTXT_CMD
When we have an AP which supports HT and a single HT station is connected, we change the min_width from NL80211_CHAN_WIDTH_20_NOHT to NL80211_CHAN_WIDTH_20. This of course has no implication on the channel width but still sends a command to the firmware. Remember the last width that was sent and refrain from sending unnecessary commands to the firmware. Sending a PHY_CTXT_CMD to the firmware has a cost since it recalculates the presence on the medium and because of that it closes the transmit queues for a short while. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index d7530474c1d3..d6180463e92f 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3406,10 +3406,24 @@ static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
return;
mutex_lock(&mvm->mutex);
+
+ /* we are only changing the min_width, may be a noop */
+ if (changed == IEEE80211_CHANCTX_CHANGE_MIN_WIDTH) {
+ if (phy_ctxt->width == ctx->min_def.width)
+ goto out_unlock;
+
+ /* we are just toggling between 20_NOHT and 20 */
+ if (phy_ctxt->width <= NL80211_CHAN_WIDTH_20 &&
+ ctx->min_def.width <= NL80211_CHAN_WIDTH_20)
+ goto out_unlock;
+ }
+
iwl_mvm_bt_coex_vif_change(mvm);
iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
ctx->rx_chains_static,
ctx->rx_chains_dynamic);
+
+out_unlock:
mutex_unlock(&mvm->mutex);
}