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