diff options
author | Johannes Berg <johannes.berg@intel.com> | 2014-08-05 09:24:44 -0400 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2014-09-14 05:56:38 -0400 |
commit | f7f89e7baef643788f09d9629012ea1612d827bb (patch) | |
tree | 95431ff0b1106a0f91969e18216aa9173dee7971 /drivers/net/wireless/iwlwifi/mvm/sta.c | |
parent | f58220f6b9ba69c782eafbfe703be8c4bca6b33d (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.c | 12 |
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 | ||