# 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;