Greg,

the appended patch adds some sanity checking to the buffer handling code
and fixes an kernel oops at disconnect or reconnect time because of an 
endless urb resubmit.

Please apply to 2.4.

best regards
Wolfgang Mües


diff -urN linux-2.4.26/drivers/usb/auerbuf.c 
linux-2.4.26-auerusb-1.2.7/drivers/usb/auerbuf.c
--- linux-2.4.26/drivers/usb/auerbuf.c  2003-06-13 16:51:36.000000000 
+0200
+++ linux-2.4.26-auerusb-1.2.7/drivers/usb/auerbuf.c    2004-05-15 
23:19:32.000000000 +0200
@@ -45,7 +45,15 @@
        struct auerbuf *bp;
 
        dbg("auerbuf_free_list");
+       if (!q) {
+               dbg("q == NULL");
+               return;
+       }
        for (p = q->next; p != q;) {
+               if (!p) {
+                       dbg("p == NULL");
+                       return;
+               }
                bp = list_entry(p, struct auerbuf, buff_list);
                tmp = p->next;
                list_del(p);
@@ -59,6 +67,10 @@
 {
        unsigned long flags;
        dbg("auerbuf_free_buffers");
+       if (!bcp) {
+               dbg("bcp == NULL");
+               return;
+       }
 
        spin_lock_irqsave(&bcp->lock, flags);
 
@@ -140,10 +152,19 @@
 void auerbuf_releasebuf(struct auerbuf *bp)
 {
        unsigned long flags;
-       struct auerbufctl *bcp = bp->list;
+       struct auerbufctl *bcp;
+       dbg ("auerbuf_releasebuf called");
+       if (!bp) {
+               dbg("bp == NULL");
+               return;  
+       }        
        bp->retries = 0;
+       bcp = bp->list;
+       if (!bcp) {
+               dbg("bcp == NULL");
+               return;
+       }
 
-       dbg("auerbuf_releasebuf called");
        spin_lock_irqsave(&bcp->lock, flags);
        list_add_tail(&bp->buff_list, &bcp->free_buff_list);
        spin_unlock_irqrestore(&bcp->lock, flags);
diff -urN linux-2.4.26/drivers/usb/auermain.c 
linux-2.4.26-auerusb-1.2.7/drivers/usb/auermain.c
--- linux-2.4.26/drivers/usb/auermain.c 2004-02-18 14:36:31.000000000 
+0100
+++ linux-2.4.26-auerusb-1.2.7/drivers/usb/auermain.c   2004-05-15 
23:35:54.000000000 +0200
@@ -55,7 +55,7 @@
 
 /*-------------------------------------------------------------------*/
 /* Version Information */
-#define DRIVER_VERSION "1.2.6"
+#define DRIVER_VERSION "1.2.7"
 #define DRIVER_AUTHOR  "Wolfgang Mües <[EMAIL PROTECTED]>"
 #define DRIVER_DESC    "Auerswald PBX/System Telephone usb driver"
 
@@ -110,20 +110,20 @@
        case 0:
        case -ETIMEDOUT:
        case -EOVERFLOW:
+       case -EFBIG:
        case -EAGAIN:
-       case -EPIPE:
        case -EPROTO:
        case -EILSEQ:
        case -ENOSR:
        case -EREMOTEIO:
                return 1;       /* do a retry */
        }
        return 0;               /* no retry possible */
 }
 
 
 /* Completion of asynchronous write block */
 void auerchar_ctrlwrite_complete(struct urb *urb)
 {
        struct auerbuf *bp = (struct auerbuf *) urb->context;
        struct auerswald *cp =


-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id%62&alloc_ida84&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to