[PATCH] bcm43xx: Fix crash on ifdown, by being careful in pio/dma freeing.
authorMichael Buesch <mbuesch@freenet.de>
Tue, 14 Mar 2006 15:05:26 +0000 (16:05 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 27 Mar 2006 16:19:38 +0000 (11:19 -0500)
This bug was caused by the packing of the bcm43xx_dma and bcm43xx_pio
structures into a union.

Signed-off-by: Michael Buesch <mbuesch@freenet.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/bcm43xx/bcm43xx_dma.c
drivers/net/wireless/bcm43xx/bcm43xx_pio.c

index 7ed368a..9c64438 100644 (file)
@@ -531,7 +531,11 @@ static void bcm43xx_destroy_dmaring(struct bcm43xx_dmaring *ring)
 
 void bcm43xx_dma_free(struct bcm43xx_private *bcm)
 {
-       struct bcm43xx_dma *dma = bcm43xx_current_dma(bcm);
+       struct bcm43xx_dma *dma;
+
+       if (bcm43xx_using_pio(bcm))
+               return;
+       dma = bcm43xx_current_dma(bcm);
 
        bcm43xx_destroy_dmaring(dma->rx_ring1);
        dma->rx_ring1 = NULL;
index 7bddae9..5b6f0a8 100644 (file)
@@ -377,7 +377,11 @@ static void bcm43xx_destroy_pioqueue(struct bcm43xx_pioqueue *queue)
 
 void bcm43xx_pio_free(struct bcm43xx_private *bcm)
 {
-       struct bcm43xx_pio *pio = bcm43xx_current_pio(bcm);
+       struct bcm43xx_pio *pio;
+
+       if (!bcm43xx_using_pio(bcm))
+               return;
+       pio = bcm43xx_current_pio(bcm);
 
        bcm43xx_destroy_pioqueue(pio->queue3);
        pio->queue3 = NULL;