aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/pcie/tx.c
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2012-09-30 10:25:43 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-10-16 10:31:53 -0400
commit986ea6c9e3834c9669fe69514fa90d916356bedc (patch)
tree2f4f11ff141a1d8b418f2ee01dcc2bdda73ac3e1 /drivers/net/wireless/iwlwifi/pcie/tx.c
parent26c7af7cad587455f5335af02eb94af772992ace (diff)
iwlwifi: wipe out the status of the SCD when we disable a queue
When we disable a queue, we don't want the SCD to remember anything about this queue (what packet was transmitted but not acked, what packed was acked etc...). Wipe out all this data in its SRAM. Constify the arguments to iwl_write_targ_mem_dwords on the way. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/pcie/tx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/tx.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c
index b50d1b4a4fcf..f3c23afbbe63 100644
--- a/drivers/net/wireless/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/tx.c
@@ -481,6 +481,9 @@ void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id)
481{ 481{
482 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 482 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
483 u16 rd_ptr, wr_ptr; 483 u16 rd_ptr, wr_ptr;
484 u32 stts_addr = trans_pcie->scd_base_addr +
485 SCD_TX_STTS_QUEUE_OFFSET(txq_id);
486 static const u32 zero_val[4] = {};
484 int n_bd = trans_pcie->txq[txq_id].q.n_bd; 487 int n_bd = trans_pcie->txq[txq_id].q.n_bd;
485 488
486 if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) { 489 if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) {
@@ -494,6 +497,9 @@ void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id)
494 WARN_ONCE(rd_ptr != wr_ptr, "queue %d isn't empty: [%d,%d]", 497 WARN_ONCE(rd_ptr != wr_ptr, "queue %d isn't empty: [%d,%d]",
495 txq_id, rd_ptr, wr_ptr); 498 txq_id, rd_ptr, wr_ptr);
496 499
500 _iwl_write_targ_mem_dwords(trans, stts_addr,
501 zero_val, ARRAY_SIZE(zero_val));
502
497 iwl_txq_set_inactive(trans, txq_id); 503 iwl_txq_set_inactive(trans, txq_id);
498 IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); 504 IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id);
499} 505}