On Thu, Jun 07, 2001 at 11:21:11AM -0400, Pavel Roskin wrote: > I've made a patch for devfs support in USB scanners (against 2.4.5-ac9). > It can be found here: > > http://www.red-bean.com/~proski/linux/scanner-devfs.diff It looks almost like the one I sent a few weeks ago. :) Hopefully this one will get picked up.. BTW, it sort of looks like yours misses a few things, look at the attached.. (I basically took what printer.c did and moved it into scanner.[ch] -- 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) + err("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, /* ... */};