From: Ivo van Doorn <[EMAIL PROTECTED]>

Fix panics when the interrupt handlers are being
run while the ring is empty.
During the interrupt handling break the loop
correctly when an error has been detected,
more work is being done after the loop.

Signed-off-by: Ivo van Doorn <[EMAIL PROTECTED]>

diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 
wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c  
2006-04-27 21:49:59.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.c    
2006-04-27 21:50:36.000000000 +0200
@@ -844,7 +844,7 @@ rt2400pci_rxdone(void *data)
                && !rt2x00_get_field32(rxd->word0, RXD_W0_PHYSICAL_ERROR)) {
                        skb = dev_alloc_skb(size + NET_IP_ALIGN);
                        if (!skb)
-                               return;
+                               break;
 
                        skb_reserve(skb, NET_IP_ALIGN);
 
@@ -859,7 +859,7 @@ rt2400pci_rxdone(void *data)
 
                rt2x00_set_field32(&rxd->word0, RXD_W0_OWNER_NIC, 1);
 
-               rt2x00_ring_index_inc(&rt2x00pci->rx);
+               rt2x00_ring_index_inc(ring);
        }
 
        /*
@@ -879,7 +879,7 @@ rt2400pci_txdone(void *data)
        int                     tx_status;
        int                     ack;
 
-       do {
+        while (!rt2x00_ring_empty(ring)) {
                entry = rt2x00_get_data_entry_done(ring);
                txd = entry->desc_addr;
 
@@ -925,7 +925,7 @@ rt2400pci_txdone(void *data)
                entry->skb = NULL;
 
                rt2x00_ring_index_done_inc(ring);
-       } while (!rt2x00_ring_empty(ring));
+       }
 
        /*
         * Check if we are waiting on an empty queue
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 
wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c  
2006-04-27 21:49:59.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.c    
2006-04-27 21:50:36.000000000 +0200
@@ -926,7 +926,7 @@ rt2500pci_rxdone(void *data)
                && !rt2x00_get_field32(rxd->word0, RXD_W0_PHYSICAL_ERROR)) {
                        skb = dev_alloc_skb(size + NET_IP_ALIGN);
                        if (!skb)
-                               return;
+                               break;
 
                        skb_reserve(skb, NET_IP_ALIGN);
 
@@ -943,7 +943,7 @@ rt2500pci_rxdone(void *data)
                }
                rt2x00_set_field32(&rxd->word0, RXD_W0_OWNER_NIC, 1);
 
-               rt2x00_ring_index_inc(&rt2x00pci->rx);
+               rt2x00_ring_index_inc(ring);
        }
 
        /*
@@ -964,7 +964,7 @@ rt2500pci_txdone(void *data)
        int                     tx_status;
        int                     ack;
 
-       do {
+        while (!rt2x00_ring_empty(ring)) {
                entry = rt2x00_get_data_entry_done(ring);
                txd = entry->desc_addr;
 
@@ -1010,7 +1010,7 @@ rt2500pci_txdone(void *data)
                entry->skb = NULL;
 
                rt2x00_ring_index_done_inc(ring);
-       } while (!rt2x00_ring_empty(ring));
+       }
 
        /*
         * Check if we are waiting on an empty queue
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 
wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c  
2006-04-27 21:49:59.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.c    
2006-04-27 21:50:36.000000000 +0200
@@ -808,7 +808,7 @@ rt2500usb_txdone(void *data)
        struct txd              *txd;
        int                     ack;
 
-       do {
+        while (!rt2x00_ring_empty(ring)) {
                entry = rt2x00_get_data_entry_done(ring);
                txd = entry->desc_addr;
 
@@ -843,7 +843,7 @@ rt2500usb_txdone(void *data)
                entry->skb = NULL;
        
                rt2x00_ring_index_done_inc(entry->ring);
-       } while (!rt2x00_ring_empty(ring));
+       }
 
        /*
         * Check if we are waiting on an empty queue

Attachment: pgprpPT39wqU1.pgp
Description: PGP signature

Reply via email to