# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.586   -> 1.587  
#	 include/linux/usb.h	1.33    -> 1.34   
#	drivers/usb/core/usb-debug.c	1.4     -> 1.5    
#	drivers/usb/core/devio.c	1.25    -> 1.26   
#	drivers/usb/core/hcd.c	1.18    -> 1.19   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/22	david-b@pacbell.net	1.587
# [PATCH] usbcore, remove urb->next
# 
# Given the discussions of last week, this removes urb->next from
# the USB core API.  This change simplifies the driver API by getting
# rid of a superfluous feature (and related new-developer confusion),
# gets rid of a hidden failure mode (drivers can now see resubmit
# failures), lets us get rid of a HCD feature that isn't consistently
# implemented, and so on.
# 
# This will break some code.  There are ISO drivers that don't use
# urb->next (like audio), but most video drivers do.  My patch #2
# fixes one such driver.  My patch #3 fixes host controller drivers,
# most of which were already converted.
# --------------------------------------------
#
diff -Nru a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
--- a/drivers/usb/core/devio.c	Wed May 22 13:52:21 2002
+++ b/drivers/usb/core/devio.c	Wed May 22 13:52:21 2002
@@ -892,7 +892,6 @@
 		free_async(as);
 		return -ENOMEM;
 	}
-        as->urb->next = NULL;
         as->urb->dev = ps->dev;
         as->urb->pipe = (uurb.type << 30) | __create_pipe(ps->dev, uurb.endpoint & 0xf) | (uurb.endpoint & USB_DIR_IN);
         as->urb->transfer_flags = uurb.flags;
diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c	Wed May 22 13:52:21 2002
+++ b/drivers/usb/core/hcd.c	Wed May 22 13:52:21 2002
@@ -1407,11 +1407,6 @@
 	if (urb->transfer_buffer_length < 0)
 		return -EINVAL;
 
-	if (urb->next) {
-		warn ("use explicit queuing not urb->next");
-		return -EINVAL;
-	}
-
 #ifdef DEBUG
 	/* stuff that drivers shouldn't do, but which shouldn't
 	 * cause problems in HCDs if they get it wrong.
@@ -1785,10 +1780,6 @@
  * HCDs must not use this for periodic URBs that are still scheduled
  * and will be reissued.  They should just call their completion handlers
  * until the urb is returned to the device driver by unlinking.
- *
- * NOTE that no urb->next processing is done, even for isochronous URBs.
- * ISO streaming functionality can be achieved by having completion handlers
- * re-queue URBs.  Such explicit queuing doesn't discard error reports.
  */
 void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb)
 {
diff -Nru a/drivers/usb/core/usb-debug.c b/drivers/usb/core/usb-debug.c
--- a/drivers/usb/core/usb-debug.c	Wed May 22 13:52:21 2002
+++ b/drivers/usb/core/usb-debug.c	Wed May 22 13:52:21 2002
@@ -184,7 +184,6 @@
 void usb_dump_urb (struct urb *urb)
 {
 	printk ("urb                   :%p\n", urb);
-	printk ("next                  :%p\n", urb->next);
 	printk ("dev                   :%p\n", urb->dev);
 	printk ("pipe                  :%08X\n", urb->pipe);
 	printk ("status                :%d\n", urb->status);
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h	Wed May 22 13:52:21 2002
+++ b/include/linux/usb.h	Wed May 22 13:52:21 2002
@@ -767,7 +767,6 @@
 /**
  * struct urb - USB Request Block
  * @urb_list: For use by current owner of the URB.
- * @next: Used to link ISO requests into rings.
  * @pipe: Holds endpoint number, direction, type, and max packet size.
  *	Create these values with the eight macros available;
  *	usb_{snd,rcv}TYPEpipe(dev,endpoint), where the type is "ctrl"
@@ -827,7 +826,7 @@
  *
  * Initialization:
  *
- * All URBs submitted must initialize dev, pipe, next (may be null),
+ * All URBs submitted must initialize dev, pipe,
  * transfer_flags (may be zero), complete, timeout (may be zero).
  * The USB_ASYNC_UNLINK transfer flag affects later invocations of
  * the usb_unlink_urb() routine.
@@ -873,7 +872,9 @@
  * the quality of service is only "best effort".  Callers provide specially
  * allocated URBs, with number_of_packets worth of iso_frame_desc structures
  * at the end.  Each such packet is an individual ISO transfer.  Isochronous
- * URBs are normally submitted with urb->next fields set up as a ring, so
+ * URBs are normally queued (no flag like USB_BULK_QUEUE is needed) so that
+ * transfers are at least double buffered, and then explicitly resubmitted
+ * in completion handlers, so
  * that data (such as audio or video) streams at as constant a rate as the
  * host controller scheduler can support.
  *
@@ -891,14 +892,15 @@
  * When completion callback is invoked for non-isochronous URBs, the
  * actual_length field tells how many bytes were transferred.
  *
- * For interrupt and isochronous URBs, the URB provided to the callback
+ * For interrupt URBs, the URB provided to the callback
  * function is still "owned" by the USB core subsystem unless the status
  * indicates that the URB has been unlinked.  Completion handlers should
  * not modify such URBs until they have been unlinked.
  *
  * ISO transfer status is reported in the status and actual_length fields
  * of the iso_frame_desc array, and the number of errors is reported in
- * error_count.
+ * error_count.  Completion callbacks for ISO transfers will normally
+ * (re)submit URBs to ensure a constant transfer rate.
  */
 struct urb
 {
@@ -906,7 +908,6 @@
 	atomic_t count;			/* reference count of the URB */
 	void *hcpriv;			/* private data for host controller */
 	struct list_head urb_list;	/* list pointer to all active urbs */
-	struct urb *next; 		/* (in) pointer to next URB */
 	struct usb_device *dev; 	/* (in) pointer to associated device */
 	unsigned int pipe;		/* (in) pipe information */
 	int status;			/* (return) non-ISO status */
