diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-04-28 10:27:10 -0400 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-05-06 13:46:23 -0400 |
commit | 2c46f72e069eef5e98f2b04df08cde6bdc673aa7 (patch) | |
tree | 62243e8844fd39864bffacbd50b393d1470b8000 /drivers/net/wireless/iwlwifi/iwl-tx.c | |
parent | 94b00658ffc719427c9c09d7920957bc35915c6f (diff) |
iwlagn: check DMA mapping errors
DMA mappings can fail, but the current code
doesn't check for that. Add checking, which
requires some restructuring for proper error
paths.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-tx.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 5a7cd177fe5e..e69597ea43e2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -500,7 +500,6 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
500 | } | 500 | } |
501 | 501 | ||
502 | memset(out_meta, 0, sizeof(*out_meta)); /* re-initialize to NULL */ | 502 | memset(out_meta, 0, sizeof(*out_meta)); /* re-initialize to NULL */ |
503 | out_meta->flags = cmd->flags | CMD_MAPPED; | ||
504 | if (cmd->flags & CMD_WANT_SKB) | 503 | if (cmd->flags & CMD_WANT_SKB) |
505 | out_meta->source = cmd; | 504 | out_meta->source = cmd; |
506 | if (cmd->flags & CMD_ASYNC) | 505 | if (cmd->flags & CMD_ASYNC) |
@@ -538,13 +537,20 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
538 | q->write_ptr, idx, priv->cmd_queue); | 537 | q->write_ptr, idx, priv->cmd_queue); |
539 | } | 538 | } |
540 | #endif | 539 | #endif |
541 | txq->need_update = 1; | ||
542 | |||
543 | phys_addr = pci_map_single(priv->pci_dev, &out_cmd->hdr, | 540 | phys_addr = pci_map_single(priv->pci_dev, &out_cmd->hdr, |
544 | fix_size, PCI_DMA_BIDIRECTIONAL); | 541 | fix_size, PCI_DMA_BIDIRECTIONAL); |
542 | if (unlikely(pci_dma_mapping_error(priv->pci_dev, phys_addr))) { | ||
543 | idx = -ENOMEM; | ||
544 | goto out; | ||
545 | } | ||
546 | |||
545 | dma_unmap_addr_set(out_meta, mapping, phys_addr); | 547 | dma_unmap_addr_set(out_meta, mapping, phys_addr); |
546 | dma_unmap_len_set(out_meta, len, fix_size); | 548 | dma_unmap_len_set(out_meta, len, fix_size); |
547 | 549 | ||
550 | out_meta->flags = cmd->flags | CMD_MAPPED; | ||
551 | |||
552 | txq->need_update = 1; | ||
553 | |||
548 | trace_iwlwifi_dev_hcmd(priv, &out_cmd->hdr, fix_size, cmd->flags); | 554 | trace_iwlwifi_dev_hcmd(priv, &out_cmd->hdr, fix_size, cmd->flags); |
549 | 555 | ||
550 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, | 556 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, |
@@ -555,6 +561,7 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
555 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); | 561 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); |
556 | iwl_txq_update_write_ptr(priv, txq); | 562 | iwl_txq_update_write_ptr(priv, txq); |
557 | 563 | ||
564 | out: | ||
558 | spin_unlock_irqrestore(&priv->hcmd_lock, flags); | 565 | spin_unlock_irqrestore(&priv->hcmd_lock, flags); |
559 | return idx; | 566 | return idx; |
560 | } | 567 | } |