diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/ops.c')
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 26 |
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[] = { | |||
431 | static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = { | 431 | static 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 | ||
495 | static void iwl_mvm_fw_error_dump_wk(struct work_struct *work); | 496 | static void iwl_mvm_fw_error_dump_wk(struct work_struct *work); |
496 | 497 | ||
498 | static 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); | ||
517 | unlock: | ||
518 | mutex_unlock(&mvm->mutex); | ||
519 | } | ||
520 | |||
497 | static struct iwl_op_mode * | 521 | static struct iwl_op_mode * |
498 | iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, | 522 | iwl_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. |