iwlwifi: unmap memory before use
authorReinette Chatre <reinette.chatre@intel.com>
Fri, 30 Oct 2009 21:36:10 +0000 (14:36 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 2 Nov 2009 20:39:46 +0000 (15:39 -0500)
Handling responses to driver originated commands include passing the
original command buffer to the caller. At this time it is possible for a
callback to be invoked that is passed this command buffer and thus likely
to access it.

We need to make sure that the memory associated with that buffer is not DMA
mapped at the time.

Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-tx.c

index 8ae4c9b614e7b00cca2c457f4dd7a91637d63725..b46967ff3806145ab58de0ddecba92849b1ab6ec 100644 (file)
@@ -1121,11 +1121,6 @@ static void iwl_hcmd_queue_reclaim(struct iwl_priv *priv, int txq_id,
                return;
        }
 
-       pci_unmap_single(priv->pci_dev,
-               pci_unmap_addr(&txq->meta[cmd_idx], mapping),
-               pci_unmap_len(&txq->meta[cmd_idx], len),
-               PCI_DMA_BIDIRECTIONAL);
-
        for (idx = iwl_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx;
             q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
 
@@ -1173,6 +1168,11 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
        cmd = priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_index];
        meta = &priv->txq[IWL_CMD_QUEUE_NUM].meta[cmd_index];
 
+       pci_unmap_single(priv->pci_dev,
+                        pci_unmap_addr(meta, mapping),
+                        pci_unmap_len(meta, len),
+                        PCI_DMA_BIDIRECTIONAL);
+
        /* Input error checking is done when commands are added to queue. */
        if (meta->flags & CMD_WANT_SKB) {
                meta->source->reply_page = (unsigned long)rxb_addr(rxb);