ChangeSet 1.808.2.19, 2002/10/28 11:50:05-08:00, [EMAIL PROTECTED]
USB: fix the usb misc drivers due to interrupt urb no automatic resubmission change to
the usb core.
diff -Nru a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c
--- a/drivers/usb/misc/auerswald.c Mon Oct 28 13:52:48 2002
+++ b/drivers/usb/misc/auerswald.c Mon Oct 28 13:52:48 2002
@@ -1014,30 +1014,39 @@
pauerbuf_t bp = NULL;
pauerswald_t cp = (pauerswald_t) urb->context;
- dbg ("auerswald_int_complete called");
+ dbg ("%s called", __FUNCTION__);
- /* do not respond to an error condition */
- if (urb->status != 0) {
- dbg ("nonzero URB status = %d", urb->status);
- return;
- }
+ switch (urb->status) {
+ case 0:
+ /* success */
+ break;
+ case -ECONNRESET:
+ case -ENOENT:
+ case -ESHUTDOWN:
+ /* this urb is terminated, clean up */
+ dbg("%s - urb shutting down with status: %d", __FUNCTION__,
+urb->status);
+ return;
+ default:
+ dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
+ goto exit;
+ }
/* check if all needed data was received */
if (urb->actual_length < AU_IRQMINSIZE) {
dbg ("invalid data length received: %d bytes", urb->actual_length);
- return;
+ goto exit;
}
/* check the command code */
if (cp->intbufp[0] != AU_IRQCMDID) {
dbg ("invalid command received: %d", cp->intbufp[0]);
- return;
+ goto exit;
}
/* check the command type */
if (cp->intbufp[1] != AU_BLOCKRDY) {
dbg ("invalid command type received: %d", cp->intbufp[1]);
- return;
+ goto exit;
}
/* now extract the information */
@@ -1047,13 +1056,13 @@
/* check the channel id */
if (channelid >= AUH_TYPESIZE) {
dbg ("invalid channel id received: %d", channelid);
- return;
+ goto exit;
}
/* check the byte count */
if (bytecount > (cp->maxControlLength+AUH_SIZE)) {
dbg ("invalid byte count received: %d", bytecount);
- return;
+ goto exit;
}
dbg ("Service Channel = %d", channelid);
dbg ("Byte Count = %d", bytecount);
@@ -1077,7 +1086,7 @@
The only real solution is: having enought buffers!
Or perhaps temporary disabling the int endpoint?
*/
- return;
+ goto exit;
}
/* fill the control message */
@@ -1098,6 +1107,11 @@
auerswald_ctrlread_complete( bp->urbp);
/* here applies the same problem as above: device locking! */
}
+exit:
+ ret = usb_submit_urb (urb, GFP_ATOMIC);
+ if (ret)
+ err ("%s - usb_submit_urb failed with result %d",
+ __FUNCTION__, ret);
}
/* int memory deallocation
diff -Nru a/drivers/usb/misc/brlvger.c b/drivers/usb/misc/brlvger.c
--- a/drivers/usb/misc/brlvger.c Mon Oct 28 13:52:48 2002
+++ b/drivers/usb/misc/brlvger.c Mon Oct 28 13:52:48 2002
@@ -846,14 +846,21 @@
{
struct brlvger_priv *priv = urb->context;
int intr_idx, read_idx;
+ int status;
- if( urb->status ) {
- if(urb->status == -ETIMEDOUT)
- dbg2("Status -ETIMEDOUT, "
- "probably disconnected");
- else if(urb->status != -ENOENT)
- err("Status: %d", urb->status);
+ switch (urb->status) {
+ case 0:
+ /* success */
+ break;
+ case -ECONNRESET:
+ case -ENOENT:
+ case -ESHUTDOWN:
+ /* this urb is terminated, clean up */
+ dbg("%s - urb shutting down with status: %d", __FUNCTION__,
+urb->status);
return;
+ default:
+ dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
+ goto exit;
}
read_idx = atomic_read(&priv->read_idx);
@@ -862,7 +869,7 @@
if(read_idx == intr_idx) {
dbg2("Queue full, dropping braille display input");
spin_unlock(&priv->intr_idx_lock);
- return; /* queue full */
+ goto exit; /* queue full */
}
memcpy(priv->event_queue[intr_idx], urb->transfer_buffer,
@@ -873,6 +880,12 @@
spin_unlock(&priv->intr_idx_lock);
wake_up_interruptible(&priv->read_wait);
+
+exit:
+ status = usb_submit_urb (urb, GFP_ATOMIC);
+ if (status)
+ err ("%s - usb_submit_urb failed with result %d",
+ __FUNCTION__, status);
}
/* ----------------------------------------------------------------------- */
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel