# 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.531.1.3 -> 1.531.1.4
#	drivers/usb/image/mdc800.c	1.15    -> 1.16   
#	drivers/usb/core/drivers.c	1.6     -> 1.7    
#	drivers/usb/misc/rio500.c	1.10    -> 1.11   
#	drivers/usb/class/printer.c	1.19    -> 1.20   
#	drivers/usb/image/scanner.c	1.17    -> 1.18   
#	drivers/usb/media/dsbr100.c	1.10    -> 1.11   
#	drivers/usb/misc/auerswald.c	1.9     -> 1.10   
#	drivers/usb/input/hiddev.c	1.9     -> 1.10   
#	 include/linux/usb.h	1.27    -> 1.28   
#	drivers/usb/usb-skeleton.c	1.9     -> 1.10   
#	drivers/usb/core/usb.c	1.43    -> 1.44   
#	drivers/usb/media/dabusb.c	1.13    -> 1.14   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/19	greg@kroah.com	1.531.1.4
# USB core
# 
# Took out the limitation that drivers had to take up 16 minors.  Now
# they can use only 1 if they want to.
# --------------------------------------------
#
diff -Nru a/drivers/usb/class/printer.c b/drivers/usb/class/printer.c
--- a/drivers/usb/class/printer.c	Fri Apr 19 09:30:46 2002
+++ b/drivers/usb/class/printer.c	Fri Apr 19 09:30:46 2002
@@ -1090,6 +1090,7 @@
 	disconnect:	usblp_disconnect,
 	fops:		&usblp_fops,
 	minor:		USBLP_MINOR_BASE,
+	num_minors:	USBLP_MINORS,
 	id_table:	usblp_ids,
 };
 
diff -Nru a/drivers/usb/core/drivers.c b/drivers/usb/core/drivers.c
--- a/drivers/usb/core/drivers.c	Fri Apr 19 09:30:46 2002
+++ b/drivers/usb/core/drivers.c	Fri Apr 19 09:30:46 2002
@@ -71,8 +71,10 @@
 		int minor = driver->fops ? driver->minor : -1;
 		if (minor == -1)
 			start += sprintf (start, "         %s\n", driver->name);
+		else if (driver->num_minors == 1)
+			start += sprintf (start, "    %3d: %s\n", minor, driver->name);
 		else
-			start += sprintf (start, "%3d-%3d: %s\n", minor, minor + 15, driver->name);
+			start += sprintf (start, "%3d-%3d: %s\n", minor, minor + driver->num_minors - 1, driver->name);
 		if (start > end) {
 			start += sprintf(start, "(truncated)\n");
 			break;
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/core/usb.c	Fri Apr 19 09:30:47 2002
@@ -59,7 +59,7 @@
 
 devfs_handle_t usb_devfs_handle;	/* /dev/usb dir. */
 
-static struct usb_driver *usb_minors[16];
+static struct usb_driver *usb_minors[256];
 
 /**
  *	usb_register - register a USB driver
@@ -72,12 +72,17 @@
  */
 int usb_register(struct usb_driver *new_driver)
 {
+	int i;
+
 	if (new_driver->fops != NULL) {
-		if (usb_minors[new_driver->minor/16]) {
-			 err("error registering %s driver", new_driver->name);
-			return -EINVAL;
+		for (i = new_driver->minor; i < new_driver->minor + new_driver->num_minors; ++i) {
+			if (usb_minors[i]) {
+				err("error registering %s driver", new_driver->name);
+				return -EINVAL;
+			}
 		}
-		usb_minors[new_driver->minor/16] = new_driver;
+		for (i = new_driver->minor; i < new_driver->minor + new_driver->num_minors; ++i)
+			usb_minors[i] = new_driver;
 	}
 
 	info("registered new driver %s", new_driver->name);
@@ -172,10 +177,12 @@
 void usb_deregister(struct usb_driver *driver)
 {
 	struct list_head *tmp;
+	int i;
 
 	info("deregistering driver %s", driver->name);
 	if (driver->fops != NULL)
-		usb_minors[driver->minor/16] = NULL;
+		for (i = driver->minor; i < driver->minor + driver->num_minors; ++i)
+			usb_minors[i] = NULL;
 
 	/*
 	 * first we remove the driver, to be sure it doesn't get used by
@@ -2517,7 +2524,7 @@
 static int usb_open(struct inode * inode, struct file * file)
 {
 	int minor = minor(inode->i_rdev);
-	struct usb_driver *c = usb_minors[minor/16];
+	struct usb_driver *c = usb_minors[minor];
 	int err = -ENODEV;
 	struct file_operations *old_fops, *new_fops = NULL;
 
diff -Nru a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c
--- a/drivers/usb/image/mdc800.c	Fri Apr 19 09:30:46 2002
+++ b/drivers/usb/image/mdc800.c	Fri Apr 19 09:30:46 2002
@@ -933,6 +933,7 @@
 	disconnect:	mdc800_usb_disconnect,
 	fops:		&mdc800_device_ops,
 	minor:		MDC800_DEVICE_MINOR_BASE,
+	num_minors:	1,
 	id_table:	mdc800_table
 };
 
diff -Nru a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c
--- a/drivers/usb/image/scanner.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/image/scanner.c	Fri Apr 19 09:30:47 2002
@@ -1100,6 +1100,7 @@
 	disconnect:	disconnect_scanner,
 	fops:		&usb_scanner_fops,
 	minor:		SCN_BASE_MNR,
+	num_minors:	SCN_MAX_MNR,
 	id_table:	NULL, /* This would be scanner_device_ids, but we
 				 need to check every USB device, in case
 				 we match a user defined vendor/product ID. */
diff -Nru a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c
--- a/drivers/usb/input/hiddev.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/input/hiddev.c	Fri Apr 19 09:30:47 2002
@@ -678,10 +678,11 @@
 
 
 static /* const */ struct usb_driver hiddev_driver = {
-	name:	"hiddev",
-	probe:	hiddev_usbd_probe,
-	fops:	&hiddev_fops,
-	minor:	HIDDEV_MINOR_BASE
+	name:		"hiddev",
+	probe:		hiddev_usbd_probe,
+	fops:		&hiddev_fops,
+	minor:		HIDDEV_MINOR_BASE,
+	num_minors:	HIDDEV_MINORS,
 };
 
 int __init hiddev_init(void)
diff -Nru a/drivers/usb/media/dabusb.c b/drivers/usb/media/dabusb.c
--- a/drivers/usb/media/dabusb.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/media/dabusb.c	Fri Apr 19 09:30:47 2002
@@ -801,6 +801,7 @@
 	disconnect:	dabusb_disconnect,
 	fops:		&dabusb_fops,
 	minor:		DABUSB_MINOR,
+	num_minors:	NRDABUSB,
 	id_table:	dabusb_ids,
 };
 
diff -Nru a/drivers/usb/media/dsbr100.c b/drivers/usb/media/dsbr100.c
--- a/drivers/usb/media/dsbr100.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/media/dsbr100.c	Fri Apr 19 09:30:47 2002
@@ -128,8 +128,6 @@
 	name:		"dsbr100",
 	probe:		usb_dsbr100_probe,
 	disconnect:	usb_dsbr100_disconnect,
-	fops:		NULL,
-	minor:		0,
 	id_table:	usb_dsbr100_table,
 };
 
diff -Nru a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c
--- a/drivers/usb/misc/auerswald.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/misc/auerswald.c	Fri Apr 19 09:30:47 2002
@@ -2138,6 +2138,7 @@
 	disconnect:	auerswald_disconnect,
 	fops:		&auerswald_fops,
 	minor:		AUER_MINOR_BASE,
+	num_minors:	AUER_MAX_DEVICES,
 	id_table:	auerswald_ids,
 };
 
diff -Nru a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c
--- a/drivers/usb/misc/rio500.c	Fri Apr 19 09:30:46 2002
+++ b/drivers/usb/misc/rio500.c	Fri Apr 19 09:30:46 2002
@@ -517,6 +517,7 @@
 	disconnect:	disconnect_rio,
 	fops:		&usb_rio_fops,
 	minor:		RIO_MINOR,
+	num_minors:	1,
 	id_table:	rio_table,
 };
 
diff -Nru a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c
--- a/drivers/usb/usb-skeleton.c	Fri Apr 19 09:30:47 2002
+++ b/drivers/usb/usb-skeleton.c	Fri Apr 19 09:30:47 2002
@@ -187,6 +187,7 @@
 	disconnect:	skel_disconnect,
 	fops:		&skel_fops,
 	minor:		USB_SKEL_MINOR_BASE,
+	num_minors:	MAX_DEVICES,
 	id_table:	skel_table,
 };
 
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h	Fri Apr 19 09:30:47 2002
+++ b/include/linux/usb.h	Fri Apr 19 09:30:47 2002
@@ -493,6 +493,8 @@
  * @minor: Used with fops to simplify creating USB character devices.
  *	Such drivers have sixteen character devices, using the USB
  *	major number and starting with this minor number.
+ * @num_minors: Used with minor to specify how many minors are used by
+ *	this driver.
  * @ioctl: Used for drivers that want to talk to userspace through
  *	the "usbfs" filesystem.  This lets devices provide ways to
  *	expose information to user space regardless of where they
@@ -534,6 +536,7 @@
 
 	struct file_operations *fops;
 	int minor;
+	int num_minors;
 
 	struct semaphore serialize;