Re: [PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
Series applied, thanks. All untested, of course, as I don't have such a machine. -- Greetings Michael. ___ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
Re: [PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
Series applied, thanks. All untested, of course, as I don't have such a machine. -- Greetings Michael. ___ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
Re: [PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
What the hell? I CCed Will, but somebody stripped it off on its way from my server to the list... On Tuesday 10 April 2007 20:12, Michael Buesch wrote: Series applied, thanks. All untested, of course, as I don't have such a machine. -- Greetings Michael. ___ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
Re: [PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
On Friday 06 April 2007 03:35, Will Dyson wrote: On 4/5/07, Michael Buesch [EMAIL PROTECTED] wrote: On Thursday 05 April 2007 06:03, Will Dyson wrote: @@ -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)) Codingstyle. Space between if and ( Sigh. I did try ./scripts/Lindent, by the way. Pretty useless. It tries to change almost every line. Yeah, lindent is useless when patching existing code. Is there a set of indent args that will actually help with this, without generating so much noise that I can't see what I messed up? I'm sorry, I don't know. -- Greetings Michael. ___ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
Re: [PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
On Thursday 05 April 2007 06:03, Will Dyson wrote: @@ -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)) Codingstyle. Space between if and ( -- Greetings Michael. ___ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
Re: [PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
On 4/5/07, Michael Buesch [EMAIL PROTECTED] wrote: On Thursday 05 April 2007 06:03, Will Dyson wrote: @@ -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)) Codingstyle. Space between if and ( Sigh. I did try ./scripts/Lindent, by the way. Pretty useless. It tries to change almost every line. Is there a set of indent args that will actually help with this, without generating so much noise that I can't see what I messed up? -- 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
[PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
From: will [EMAIL PROTECTED](none) 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 ___
[PATCH 1/3] bcm43xx-mac80211: Catch dma mapping failures.
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