ChangeSet 1.808.2.16, 2002/10/28 11:47:41-08:00, [EMAIL PROTECTED]
USB: fix the usb class drivers due to interrupt urb no automatic resubmission change
to the usb core
diff -Nru a/drivers/usb/class/bluetty.c b/drivers/usb/class/bluetty.c
--- a/drivers/usb/class/bluetty.c Mon Oct 28 13:53:26 2002
+++ b/drivers/usb/class/bluetty.c Mon Oct 28 13:53:26 2002
@@ -767,6 +767,7 @@
unsigned int i;
unsigned int count = urb->actual_length;
unsigned int packet_size;
+ int status;
dbg("%s", __FUNCTION__);
@@ -775,14 +776,24 @@
return;
}
- if (urb->status) {
- dbg("%s - nonzero int status received: %d", __FUNCTION__, 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;
}
if (!count) {
dbg("%s - zero length int", __FUNCTION__);
- return;
+ goto exit;
}
@@ -803,7 +814,7 @@
}
if (count == 0) {
urb->actual_length = 0;
- return;
+ goto exit;
}
#endif
/* We add a packet type identifier to the beginning of each
@@ -820,7 +831,7 @@
if (bluetooth->int_packet_pos + count > EVENT_BUFFER_SIZE) {
err("%s - exceeded EVENT_BUFFER_SIZE", __FUNCTION__);
bluetooth->int_packet_pos = 0;
- return;
+ goto exit;
}
memcpy (&bluetooth->int_buffer[bluetooth->int_packet_pos],
@@ -831,12 +842,12 @@
if (bluetooth->int_packet_pos >= EVENT_HDR_SIZE)
packet_size = bluetooth->int_buffer[2];
else
- return;
+ goto exit;
if (packet_size + EVENT_HDR_SIZE < bluetooth->int_packet_pos) {
err("%s - packet was too long", __FUNCTION__);
bluetooth->int_packet_pos = 0;
- return;
+ goto exit;
}
if (packet_size + EVENT_HDR_SIZE == bluetooth->int_packet_pos) {
@@ -851,6 +862,12 @@
bluetooth->int_packet_pos = 0;
}
+
+exit:
+ status = usb_submit_urb (urb, GFP_ATOMIC);
+ if (status)
+ err ("%s - usb_submit_urb failed with result %d",
+ __FUNCTION__, status);
}
diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
--- a/drivers/usb/class/cdc-acm.c Mon Oct 28 13:53:26 2002
+++ b/drivers/usb/class/cdc-acm.c Mon Oct 28 13:53:26 2002
@@ -185,20 +185,32 @@
struct usb_ctrlrequest *dr = urb->transfer_buffer;
unsigned char *data = (unsigned char *)(dr + 1);
int newctrl;
+ int status;
- if (!ACM_READY(acm)) return;
-
- if (urb->status < 0) {
- dbg("nonzero ctrl irq status received: %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;
}
+ if (!ACM_READY(acm))
+ goto exit;
+
switch (dr->bRequest) {
case ACM_IRQ_NETWORK:
dbg("%s network", data[0] ? "connected to" : "disconnected
from");
- return;
+ break;
case ACM_IRQ_LINE_STATE:
@@ -217,13 +229,18 @@
acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-',
acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
- return;
+ break;
default:
dbg("unknown control event received: request %d index %d len
%d data0 %d data1 %d",
dr->bRequest, dr->wIndex, dr->wLength, data[0],
data[1]);
- return;
+ break;
}
+exit:
+ status = usb_submit_urb (urb, GFP_ATOMIC);
+ if (status)
+ err ("%s - usb_submit_urb failed with result %d",
+ __FUNCTION__, status);
}
static void acm_read_bulk(struct urb *urb)
-------------------------------------------------------
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