aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
diff options
context:
space:
mode:
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.