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