Check result of dma_map_single(), print warnings and propagate errors up the
call stack.

Signed-off-by: Will Dyson <[EMAIL PROTECTED]>
---
.../net/wireless/mac80211/bcm43xx/bcm43xx_dma.c    |   39
+++++++++++++++-----
1 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
b/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
index d53679d..4abc6c8 100644
--- a/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
+++ b/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
@@ -525,9 +525,11 @@ static int setup_rx_descbuffer(struct bcm43xx_dmaring
*ring,
        return -ENOMEM;
    dmaaddr = map_descbuffer(ring, skb->data,
                 ring->rx_buffersize, 0);
+    if (dma_mapping_error(dmaaddr))
+        return -EIO;
+
    meta->skb = skb;
    meta->dmaaddr = dmaaddr;
-
    ring->ops->fill_descriptor(ring, desc, dmaaddr,
                   ring->rx_buffersize, 0, 0, 0);

@@ -552,8 +554,10 @@ static int alloc_initial_descbuffers(struct
bcm43xx_dmaring *ring)
        desc = ring->ops->idx2desc(ring, i, &meta);

        err = setup_rx_descbuffer(ring, desc, meta, GFP_KERNEL);
-        if (err)
+        if (err) {
+            printk(KERN_ERR PFX "Failed to allocate initial
descbuffers\n");
            goto err_unwind;
+        }
    }
    mb();
    ring->used_slots = ring->nr_slots;
@@ -1017,7 +1021,7 @@ struct bcm43xx_dmaring * parse_cookie(struct
bcm43xx_wldev *dev,
    return ring;
}

-static void dma_tx_fragment(struct bcm43xx_dmaring *ring,
+static int dma_tx_fragment(struct bcm43xx_dmaring *ring,
                struct sk_buff *skb,
                struct ieee80211_tx_control *ctl)
{
@@ -1026,23 +1030,26 @@ static void dma_tx_fragment(struct bcm43xx_dmaring
*ring,
    int slot;
    struct bcm43xx_dmadesc_generic *desc;
    struct bcm43xx_dmadesc_meta *meta;
+    struct bcm43xx_dmadesc_meta *meta_hdr;

#define SLOTS_PER_PACKET  2
    assert(skb_shinfo(skb)->nr_frags == 0);

    /* Get a slot for the header. */
    slot = request_slot(ring);
-    desc = ops->idx2desc(ring, slot, &meta);
-    memset(meta, 0, sizeof(*meta));
+    desc = ops->idx2desc(ring, slot, &meta_hdr);
+    memset(meta_hdr, 0, sizeof(*meta_hdr));

    header = &(ring->txhdr_cache[slot * sizeof(struct bcm43xx_txhdr_fw4)]);
    bcm43xx_generate_txhdr(ring->dev, header,
                   skb->data, skb->len, ctl,
                   generate_cookie(ring, slot));

-    meta->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
+    meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
                       sizeof(struct bcm43xx_txhdr_fw4), 1);
-    ops->fill_descriptor(ring, desc, meta->dmaaddr,
+    if (dma_mapping_error(meta_hdr->dmaaddr))
+        return -EIO;
+    ops->fill_descriptor(ring, desc, meta_hdr->dmaaddr,
                 sizeof(struct bcm43xx_txhdr_fw4), 1, 0, 0);

    /* Get a slot for the payload. */
@@ -1052,8 +1059,10 @@ static void dma_tx_fragment(struct bcm43xx_dmaring
*ring,

    memcpy(&meta->txstat.control, ctl, sizeof(*ctl));
    meta->skb = skb;
-    meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
    meta->is_last_fragment = 1;
+    meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
+    if(dma_mapping_error(meta->dmaaddr))
+        goto out_unmap_hdr;

    ops->fill_descriptor(ring, desc, meta->dmaaddr,
                 skb->len, 0, 1, 1);
@@ -1061,6 +1070,12 @@ static void dma_tx_fragment(struct bcm43xx_dmaring
*ring,
    /* Now transfer the whole frame. */
    wmb();
    ops->poke_tx(ring, next_slot(ring, slot));
+    return 0;
+
+out_unmap_hdr:
+    unmap_descbuffer(ring, meta_hdr->dmaaddr,
+            sizeof(struct bcm43xx_txhdr_fw4), 1);
+    return -EIO;
}

int bcm43xx_dma_tx(struct bcm43xx_wldev *dev,
@@ -1068,6 +1083,7 @@ int bcm43xx_dma_tx(struct bcm43xx_wldev *dev,
           struct ieee80211_tx_control *ctl)
{
    struct bcm43xx_dmaring *ring = dev->dma.tx_ring1;
+    int err = 0;

    assert(ring->tx);
    if (unlikely(free_slots(ring) < SLOTS_PER_PACKET)) {
@@ -1078,7 +1094,12 @@ int bcm43xx_dma_tx(struct bcm43xx_wldev *dev,
        return NETDEV_TX_BUSY;
    }

-    dma_tx_fragment(ring, skb, ctl);
+    err = dma_tx_fragment(ring, skb, ctl);
+    if (unlikely(err)) {
+        printkl(KERN_ERR PFX "DMA tx mapping failure\n");
+        return NETDEV_TX_BUSY;
+    }
+
    ring->nr_tx_packets++;
    if (free_slots(ring) < SLOTS_PER_PACKET) {
        /* FIXME: we currently only have one queue */
--
1.5.0.3



--
Will Dyson
http://www.lucidts.com/
Linux/Mac/Win consulting
_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to