On Thu, Jun 07, 2001 at 04:46:11PM -0700, Greg KH wrote: > On Thu, Jun 07, 2001 at 04:42:45PM -0700, Tom Rini wrote: > > > > I changed that in the version I use but forgot to do that here as well, > > sorry. Want me to re-sent w/o this or can you just edit it out? It would > > be nice if this made it upstream :) > > That's up to the current maintainer of the USB scanner driver, not me :) Good point. David, the attached is vs 2.4.3ish but should apply cleanly to anything later then that. It adds devfs support to the USB scanner driver, and only prints as a debug msg if this failed so it shouldn't create any noise on !devfs systems. -- Tom Rini (TR1265) http://gate.crashing.org/~trini/
===== scanner.c 1.4 vs edited ===== --- 1.4/drivers/usb/scanner.c Fri Apr 20 10:17:25 2001 +++ edited/scanner.c Mon May 14 14:29:50 2001 @@ -362,7 +362,7 @@ } scn = p_scn_table[scn_minor]; - + devfs_unregister(scn->devfs); scn->isopen = 0; file->private_data = NULL; @@ -579,6 +579,17 @@ return ret ? ret : bytes_read; } +static struct +file_operations usb_scanner_fops = { + read: read_scanner, + write: write_scanner, +#ifdef SCN_IOCTL + ioctl: ioctl_scanner, +#endif /* SCN_IOCTL */ + open: open_scanner, + release: close_scanner, +}; + static void * probe_scanner(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id) @@ -594,6 +605,7 @@ char valid_device = 0; char have_bulk_in, have_bulk_out, have_intr; + char name[10]; if (vendor != -1 && product != -1) { info("probe_scanner: User specified USB scanner -- Vendor:Product - %x:%x", vendor, product); @@ -811,6 +823,16 @@ scn->scn_minor = scn_minor; scn->isopen = 0; + sprintf(name, "scanner%d", scn->scn_minor); + + scn->devfs = devfs_register(usb_devfs_handle, name, + DEVFS_FL_DEFAULT, USB_MAJOR, + SCN_BASE_MNR + scn->scn_minor, + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | + S_IWGRP | S_IROTH, &usb_scanner_fops, NULL); + if (scn->devfs == NULL) + dbg("scanner%d: device node registration failed", scn_minor); + init_MUTEX(&(scn->gen_lock)); return p_scn_table[scn_minor] = scn; @@ -832,6 +854,7 @@ kfree(scn->obuf); dbg("disconnect_scanner: De-allocating minor:%d", scn->scn_minor); + devfs_unregister(scn->devfs); p_scn_table[scn->scn_minor] = NULL; kfree (scn); } @@ -914,17 +937,6 @@ return 0; } #endif /* SCN_IOCTL */ - -static struct -file_operations usb_scanner_fops = { - read: read_scanner, - write: write_scanner, -#ifdef SCN_IOCTL - ioctl: ioctl_scanner, -#endif /* SCN_IOCTL */ - open: open_scanner, - release: close_scanner, -}; static struct usb_driver scanner_driver = { ===== scanner.h 1.3 vs edited ===== --- 1.3/drivers/usb/scanner.h Mon Mar 5 04:29:01 2001 +++ edited/scanner.h Mon May 14 14:29:50 2001 @@ -31,6 +31,7 @@ #include <linux/ioctl.h> #include <linux/sched.h> #include <linux/smp_lock.h> +#include <linux/devfs_fs_kernel.h> // #define DEBUG @@ -168,6 +169,7 @@ struct scn_usb_data { struct usb_device *scn_dev; + devfs_handle_t devfs; /* devfs device */ struct urb scn_irq; unsigned int ifnum; /* Interface number of the USB device */ kdev_t scn_minor; /* Scanner minor - used in disconnect() */ @@ -180,6 +182,8 @@ struct semaphore gen_lock; /* lock to prevent concurrent reads or writes */ unsigned int rd_nak_timeout; /* Seconds to wait before read() timeout. */ }; + +extern devfs_handle_t usb_devfs_handle; static struct scn_usb_data *p_scn_table[SCN_MAX_MNR] = { NULL, /* ... */};