diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2012-10-18 06:38:37 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-10-23 09:24:19 -0400 |
commit | 6c3fd3f00c67105b49d57525614fcfa6816d604d (patch) | |
tree | a93ab28fa107a3fc2971e21064460ffa62bdbfb8 /drivers | |
parent | 4e760f1ab267edcd6e4b232ff732fc9cdc659ebb (diff) |
iwlwifi: don't leak Tx skb when a queue is disabled
Since the queue might not be empty, we need to free the
pending Tx packets.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/internal.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/tx.c | 2 |
3 files changed, 5 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h index 401178f44a3b..6ce58f03bc53 100644 --- a/drivers/net/wireless/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/iwlwifi/pcie/internal.h | |||
@@ -346,6 +346,7 @@ void iwl_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq, | |||
346 | enum dma_data_direction dma_dir); | 346 | enum dma_data_direction dma_dir); |
347 | int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index, | 347 | int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index, |
348 | struct sk_buff_head *skbs); | 348 | struct sk_buff_head *skbs); |
349 | void iwl_tx_queue_unmap(struct iwl_trans *trans, int txq_id); | ||
349 | int iwl_queue_space(const struct iwl_queue *q); | 350 | int iwl_queue_space(const struct iwl_queue *q); |
350 | 351 | ||
351 | /***************************************************** | 352 | /***************************************************** |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index f95d88df7772..a6a518116c7f 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -442,10 +442,10 @@ static int iwl_trans_txq_init(struct iwl_trans *trans, struct iwl_tx_queue *txq, | |||
442 | return 0; | 442 | return 0; |
443 | } | 443 | } |
444 | 444 | ||
445 | /** | 445 | /* |
446 | * iwl_tx_queue_unmap - Unmap any remaining DMA mappings and free skb's | 446 | * iwl_tx_queue_unmap - Unmap any remaining DMA mappings and free skb's |
447 | */ | 447 | */ |
448 | static void iwl_tx_queue_unmap(struct iwl_trans *trans, int txq_id) | 448 | void iwl_tx_queue_unmap(struct iwl_trans *trans, int txq_id) |
449 | { | 449 | { |
450 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 450 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
451 | struct iwl_tx_queue *txq = &trans_pcie->txq[txq_id]; | 451 | struct iwl_tx_queue *txq = &trans_pcie->txq[txq_id]; |
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c index db3efbb84d92..5db03145186c 100644 --- a/drivers/net/wireless/iwlwifi/pcie/tx.c +++ b/drivers/net/wireless/iwlwifi/pcie/tx.c | |||
@@ -494,6 +494,8 @@ void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id) | |||
494 | _iwl_write_targ_mem_dwords(trans, stts_addr, | 494 | _iwl_write_targ_mem_dwords(trans, stts_addr, |
495 | zero_val, ARRAY_SIZE(zero_val)); | 495 | zero_val, ARRAY_SIZE(zero_val)); |
496 | 496 | ||
497 | iwl_tx_queue_unmap(trans, txq_id); | ||
498 | |||
497 | IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); | 499 | IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); |
498 | } | 500 | } |
499 | 501 | ||