aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/sta.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2014-08-05 09:24:44 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-09-14 05:56:38 -0400
commitf7f89e7baef643788f09d9629012ea1612d827bb (patch)
tree95431ff0b1106a0f91969e18216aa9173dee7971 /drivers/net/wireless/iwlwifi/mvm/sta.c
parentf58220f6b9ba69c782eafbfe703be8c4bca6b33d (diff)
iwlwifi: mvm: disable aggregation queues in station DB in FW
When disabling aggregation, disable the queues in the station DB in the firmware, otherwise we leave the tfd_queue_mask in a wrong state after an aggregation session has been torn down. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/sta.c')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c
index dd9f3a4347f6..666f16b4bed9 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.c
@@ -948,8 +948,16 @@ int iwl_mvm_sta_tx_agg_stop(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
948 } 948 }
949 949
950 tid_data->ssn = 0xffff; 950 tid_data->ssn = 0xffff;
951 tid_data->state = IWL_AGG_OFF;
952 mvm->queue_to_mac80211[txq_id] = IWL_INVALID_MAC80211_QUEUE;
953 spin_unlock_bh(&mvmsta->lock);
954
955 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
956
957 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false);
958
951 iwl_trans_txq_disable(mvm->trans, txq_id, true); 959 iwl_trans_txq_disable(mvm->trans, txq_id, true);
952 /* fall through */ 960 return 0;
953 case IWL_AGG_STARTING: 961 case IWL_AGG_STARTING:
954 case IWL_EMPTYING_HW_QUEUE_ADDBA: 962 case IWL_EMPTYING_HW_QUEUE_ADDBA:
955 /* 963 /*
@@ -1003,6 +1011,8 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1003 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) 1011 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
1004 IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); 1012 IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
1005 1013
1014 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false);
1015
1006 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id, true); 1016 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id, true);
1007 } 1017 }
1008 1018