aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/intel
diff options
context:
space:
mode:
authorOren Givon <oren.givon@intel.com>2016-05-29 07:05:50 -0400
committerLuca Coelho <luciano.coelho@intel.com>2016-07-05 18:24:44 -0400
commit2c4a247e42526d9aae8f5ce1f190b893532f2806 (patch)
tree8b7abcb6f0b24ce083c13574bac00828cdb05f86 /drivers/net/wireless/intel
parent5a7d87da8d9b9f04ecdbebe7e5710a1391f85fa8 (diff)
iwlwifi: mvm: fix txq aggregation bug
Fix an issue where nullfunc frames and block ack requests had the same tid as aggregation frames and were queued on a non aggregation queue. The pending frames counter included those frames but the check whether to decrement the pending frames counter relied on the tid status and not on the txq id. The result was an inconsistent state of the pending frames counter followed by a failure to remove the station. This failure triggered SYSASSERT 0x3421. In addition, fix a situation in DQA mode where the number of pending frames turned negative. This was due to the TX queue being on the IWL_EMPTYING_HW_QUEUE_DELBA state and its frames were still decremented. Even though the SYSASSERT issue is fixed when DQA is disabled, the issue is not completely solved when DQA is enabled and should still be fixed. Signed-off-by: Oren Givon <oren.givon@intel.com> Fixes: cf961e16620f ("iwlwifi: mvm: support dqa-mode agg on non-shared queue") Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/tx.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index d91edabc9b8b..1f23ceeb2350 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -1329,7 +1329,15 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
1329 bool send_eosp_ndp = false; 1329 bool send_eosp_ndp = false;
1330 1330
1331 spin_lock_bh(&mvmsta->lock); 1331 spin_lock_bh(&mvmsta->lock);
1332 txq_agg = (mvmsta->tid_data[tid].state == IWL_AGG_ON); 1332 if (iwl_mvm_is_dqa_supported(mvm)) {
1333 enum iwl_mvm_agg_state state;
1334
1335 state = mvmsta->tid_data[tid].state;
1336 txq_agg = (state == IWL_AGG_ON ||
1337 state == IWL_EMPTYING_HW_QUEUE_DELBA);
1338 } else {
1339 txq_agg = txq_id >= mvm->first_agg_queue;
1340 }
1333 1341
1334 if (!is_ndp) { 1342 if (!is_ndp) {
1335 tid_data->next_reclaimed = next_reclaimed; 1343 tid_data->next_reclaimed = next_reclaimed;