ChangeSet 1.808.2.22, 2002/10/28 11:52:34-08:00, greg@kroah.com

USB: fix the usb drivers outside the drivers/usb tree due to interrupt urb no automatic resubmission change to the usb core.


diff -Nru a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c
--- a/drivers/bluetooth/hci_usb.c	Mon Oct 28 13:52:13 2002
+++ b/drivers/bluetooth/hci_usb.c	Mon Oct 28 13:52:13 2002
@@ -438,16 +438,34 @@
 	__u8 *data = urb->transfer_buffer;
 	int count = urb->actual_length;
 	int len = HCI_EVENT_HDR_SIZE;
+	int status;
 
 	BT_DBG("%s urb %p count %d", husb->hdev.name, urb, count);
 
 	if (!test_bit(HCI_RUNNING, &husb->hdev.flags))
 		return;
 
-	if (urb->status || !count) {
+	switch (urb->status) {
+	case 0:
+		/* success */
+		break;
+	case -ECONNRESET:
+	case -ENOENT:
+	case -ESHUTDOWN:
+		/* this urb is terminated, clean up */
+		BT_DBG("%s urb shutting down with status: %d",
+				husb->hdev.name, urb->status);
+		return;
+	default:
+		BT_ERR("%s nonzero urb status received: %d",
+				husb->hdev.name, urb->status);
+		goto exit;
+	}
+
+	if (!count) {
 		BT_DBG("%s intr status %d, count %d", 
 				husb->hdev.name, urb->status, count);
-		return;
+		goto exit;
 	}
 
 	read_lock(&husb->completion_lock);
@@ -499,12 +517,18 @@
 
 done:
 	read_unlock(&husb->completion_lock);
-	return;
+	goto exit;
 
 bad_len:
 	BT_ERR("%s bad frame len %d expected %d", husb->hdev.name, count, len);
 	husb->hdev.stat.err_rx++;
 	read_unlock(&husb->completion_lock);
+
+exit:
+	status = usb_submit_urb (urb, GFP_ATOMIC);
+	if (status)
+		BT_ERR ("%s usb_submit_urb failed with result %d",
+				husb->hdev.name, status);
 }
 
 static void hci_usb_tx_complete(struct urb *urb)
diff -Nru a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c
--- a/drivers/input/joystick/iforce/iforce-usb.c	Mon Oct 28 13:52:13 2002
+++ b/drivers/input/joystick/iforce/iforce-usb.c	Mon Oct 28 13:52:13 2002
@@ -77,9 +77,32 @@
 static void iforce_usb_irq(struct urb *urb)
 {
 	struct iforce *iforce = urb->context;
-	if (urb->status) return;
+	int 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 - urb has status of: %d", __FUNCTION__, urb->status);
+		goto exit;
+	}
+
 	iforce_process_packet(iforce,
 		(iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1);
+
+exit:
+	status = usb_submit_urb (urb, GFP_ATOMIC);
+	if (status)
+		err ("%s - usb_submit_urb failed with result %d",
+		     __FUNCTION__, status);
 }
 
 static void iforce_usb_out(struct urb *urb)
diff -Nru a/drivers/isdn/hisax/st5481_usb.c b/drivers/isdn/hisax/st5481_usb.c
--- a/drivers/isdn/hisax/st5481_usb.c	Mon Oct 28 13:52:13 2002
+++ b/drivers/isdn/hisax/st5481_usb.c	Mon Oct 28 13:52:13 2002
@@ -182,21 +182,28 @@
 	u_char irqbyte;
 	struct st5481_adapter *adapter = urb->context;
 	int j;
+	int status;
 
-	if (urb->status < 0) {
-		if (urb->status != -ENOENT) {
-			WARN("urb status %d",urb->status);
-			urb->actual_length = 0;
-		} else {
-			DBG(1,"urb killed");
-			return; // Give up
-		}
+	switch (urb->status) {
+	case 0:
+		/* success */
+		break;
+	case -ECONNRESET:
+	case -ENOENT:
+	case -ESHUTDOWN:
+		/* this urb is terminated, clean up */
+		DBG(1, "urb shutting down with status: %d", urb->status);
+		return;
+	default:
+		WARN("nonzero urb status received: %d", urb->status);
+		goto exit;
 	}
+
 	
 	DBG_PACKET(1, data, INT_PKT_SIZE);
 		
 	if (urb->actual_length == 0) {
-		return;
+		goto exit;
 	}
 
 	irqbyte = data[MPINT];
@@ -221,6 +228,11 @@
 		adapter->bcs[j].b_out.flow_event |= data[FFINT_B1 + j];
 
 	urb->actual_length = 0;
+
+exit:
+	status = usb_submit_urb (urb, GFP_ATOMIC);
+	if (status)
+		WARN("usb_submit_urb failed with result %d", status);
 }
 
 /* ======================================================================
