summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-05-17 09:37:32 (GMT)
committerReinette Chatre <reinette.chatre@intel.com>2010-06-06 06:17:51 (GMT)
commit6f80240e0a738a6c5cef005291a90522959f3ba2 (patch)
tree27bc143650166fbaae1f621b7a10e4fa1e1c1753
parent4f5fa2376f3ca46fa497632844872a6f4e224c09 (diff)
downloadlinux-6f80240e0a738a6c5cef005291a90522959f3ba2.tar.xz
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>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c11
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 9c85e1b..a61d567 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)
iwl_tfd_tb_get_len(tfd, i), PCI_DMA_TODEVICE);
if (txq->txb) {
- dev_kfree_skb(txq->txb[txq->q.read_ptr].skb[i - 1]);
- txq->txb[txq->q.read_ptr].skb[i - 1] = NULL;
+ struct sk_buff *skb;
+
+ skb = txq->txb[txq->q.read_ptr].skb[i - 1];
+
+ /* can be called from irqs-disabled context */
+ if (skb) {
+ dev_kfree_skb_any(skb);
+ txq->txb[txq->q.read_ptr].skb[i - 1] = NULL;
+ }
}
}
}