aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
diff options
context:
space:
mode:
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>2016-02-28 10:12:21 -0500
committerLuca Coelho <luciano.coelho@intel.com>2016-07-01 11:09:45 -0400
commitd3a108a48dc670d539c58d4339d211b914a1e1b5 (patch)
tree860fddc03aa5c5b0076a3e219497abb4470deca6 /drivers/net/wireless/intel/iwlwifi/mvm/ops.c
parentab2e696bd25c11bf4baf84f285555b069ae2dd30 (diff)
iwlwifi: mvm: Support CSA countdown offloading
Add support CSA countdown offloading. When CSA starts, the driver specifies the offsets to the eCSA and CSA IEs in the beacon template command and the fw performs the countdown. The fw notifies the driver when the channel switch flow should be performed. Beacon sent notifications are not used anymore. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/ops.c')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/ops.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 55f114d24148..ddc400436782 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -431,6 +431,7 @@ static const struct iwl_hcmd_names iwl_mvm_system_names[] = {
431static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = { 431static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = {
432 HCMD_NAME(LINK_QUALITY_MEASUREMENT_CMD), 432 HCMD_NAME(LINK_QUALITY_MEASUREMENT_CMD),
433 HCMD_NAME(LINK_QUALITY_MEASUREMENT_COMPLETE_NOTIF), 433 HCMD_NAME(LINK_QUALITY_MEASUREMENT_COMPLETE_NOTIF),
434 HCMD_NAME(CHANNEL_SWITCH_NOA_NOTIF),
434}; 435};
435 436
436/* Please keep this array *SORTED* by hex value. 437/* Please keep this array *SORTED* by hex value.
@@ -494,6 +495,29 @@ static u32 calc_min_backoff(struct iwl_trans *trans, const struct iwl_cfg *cfg)
494 495
495static void iwl_mvm_fw_error_dump_wk(struct work_struct *work); 496static void iwl_mvm_fw_error_dump_wk(struct work_struct *work);
496 497
498static void iwl_mvm_tx_unblock_dwork(struct work_struct *work)
499{
500 struct iwl_mvm *mvm =
501 container_of(work, struct iwl_mvm, cs_tx_unblock_dwork.work);
502 struct ieee80211_vif *tx_blocked_vif;
503 struct iwl_mvm_vif *mvmvif;
504
505 mutex_lock(&mvm->mutex);
506
507 tx_blocked_vif =
508 rcu_dereference_protected(mvm->csa_tx_blocked_vif,
509 lockdep_is_held(&mvm->mutex));
510
511 if (!tx_blocked_vif)
512 goto unlock;
513
514 mvmvif = iwl_mvm_vif_from_mac80211(tx_blocked_vif);
515 iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, false);
516 RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL);
517unlock:
518 mutex_unlock(&mvm->mutex);
519}
520
497static struct iwl_op_mode * 521static struct iwl_op_mode *
498iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, 522iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
499 const struct iwl_fw *fw, struct dentry *dbgfs_dir) 523 const struct iwl_fw *fw, struct dentry *dbgfs_dir)
@@ -595,6 +619,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
595 619
596 SET_IEEE80211_DEV(mvm->hw, mvm->trans->dev); 620 SET_IEEE80211_DEV(mvm->hw, mvm->trans->dev);
597 621
622 INIT_DELAYED_WORK(&mvm->cs_tx_unblock_dwork, iwl_mvm_tx_unblock_dwork);
623
598 /* 624 /*
599 * Populate the state variables that the transport layer needs 625 * Populate the state variables that the transport layer needs
600 * to know about. 626 * to know about.