diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-05-17 05:37:32 -0400 |
---|---|---|
committer | Reinette Chatre <reinette.chatre@intel.com> | 2010-06-06 02:17:51 -0400 |
commit | 6f80240e0a738a6c5cef005291a90522959f3ba2 (patch) | |
tree | 27bc143650166fbaae1f621b7a10e4fa1e1c1753 /drivers/net/wireless/iwlwifi/iwl-agn.c | |
parent | 4f5fa2376f3ca46fa497632844872a6f4e224c09 (diff) |
iwlagn: fix bug in txq freeing
The iwl_hw_txq_free_tfd() function can be
called from contexts with IRQs disabled,
so it must not call dev_kfree_skb() but
rather dev_kfree_skb_any() instead.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 9c85e1bd2971..a61d5674d13e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -484,8 +484,15 @@ void iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq) | |||
484 | iwl_tfd_tb_get_len(tfd, i), PCI_DMA_TODEVICE); | 484 | iwl_tfd_tb_get_len(tfd, i), PCI_DMA_TODEVICE); |
485 | 485 | ||
486 | if (txq->txb) { | 486 | if (txq->txb) { |
487 | dev_kfree_skb(txq->txb[txq->q.read_ptr].skb[i - 1]); | 487 | struct sk_buff *skb; |
488 | txq->txb[txq->q.read_ptr].skb[i - 1] = NULL; | 488 | |
489 | skb = txq->txb[txq->q.read_ptr].skb[i - 1]; | ||
490 | |||
491 | /* can be called from irqs-disabled context */ | ||
492 | if (skb) { | ||
493 | dev_kfree_skb_any(skb); | ||
494 | txq->txb[txq->q.read_ptr].skb[i - 1] = NULL; | ||
495 | } | ||
489 | } | 496 | } |
490 | } | 497 | } |
491 | } | 498 | } |