ChangeSet 1.876, 2002/12/12 14:49:26-08:00, [EMAIL PROTECTED]
[PATCH] USB: usb-skeleton: removed static array of devices.
This allowed a lock to be removed.
Also removed the MOD_* functions, and some remove logic was cleaned
up by Oliver Neukum.
diff -Nru a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c
--- a/drivers/usb/usb-skeleton.c Fri Dec 13 17:18:45 2002
+++ b/drivers/usb/usb-skeleton.c Fri Dec 13 17:18:45 2002
@@ -1,5 +1,5 @@
/*
- * USB Skeleton driver - 0.8
+ * USB Skeleton driver - 0.9
*
* Copyright (c) 2001-2002 Greg Kroah-Hartman ([EMAIL PROTECTED])
*
@@ -17,10 +17,10 @@
*
* TODO:
* - fix urb->status race condition in write sequence
- * - move minor_table to a dynamic list.
*
* History:
*
+ * 2002_12_12 - 0.9 - compile fixes and got rid of fixed minor array.
* 2002_09_26 - 0.8 - changes due to USB core conversion to struct device
* driver.
* 2002_02_12 - 0.7 - zero out dev in probe function for devices that do
@@ -83,18 +83,10 @@
#ifdef CONFIG_USB_DYNAMIC_MINORS
-/*
- * if the user wants to use dynamic minor numbers, then we can have up to 256
- * devices
- */
#define USB_SKEL_MINOR_BASE 0
-#define MAX_DEVICES 256
#else
/* Get a minor range for your devices from the usb maintainer */
#define USB_SKEL_MINOR_BASE 200
-
-/* we can have up to this number of device plugged in at once */
-#define MAX_DEVICES 16
#endif
/* Structure to hold all of our device specific stuff */
@@ -117,8 +109,8 @@
struct urb * write_urb; /* the urb used to send data */
__u8 bulk_out_endpointAddr; /* the address of the bulk out
endpoint */
- struct work_struct work; /* work queue
entry for line discipline waking up */
- int open_count; /* number of times this port
has been opened */
+ struct work_struct work; /* work queue entry for line
+discipline waking up */
+ int open; /* if the port is open or not
+*/
struct semaphore sem; /* locks this structure */
};
@@ -139,13 +131,6 @@
static void skel_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
-
-/* array of pointers to our devices that are currently connected */
-static struct usb_skel *minor_table[MAX_DEVICES];
-
-/* lock to protect the minor_table structure */
-static DECLARE_MUTEX (minor_table_mutex);
-
/*
* File operations needed when we register this driver.
* This assumes that this driver NEEDS file operations,
@@ -218,7 +203,6 @@
*/
static inline void skel_delete (struct usb_skel *dev)
{
- minor_table[dev->minor] = NULL;
if (dev->bulk_in_buffer != NULL)
kfree (dev->bulk_in_buffer);
if (dev->bulk_out_buffer != NULL)
@@ -235,41 +219,31 @@
static int skel_open (struct inode *inode, struct file *file)
{
struct usb_skel *dev = NULL;
+ struct usb_interface *interface;
int subminor;
int retval = 0;
dbg("%s", __FUNCTION__);
- subminor = minor (inode->i_rdev) - USB_SKEL_MINOR_BASE;
- if ((subminor < 0) ||
- (subminor >= MAX_DEVICES)) {
- return -ENODEV;
- }
+ subminor = minor (inode->i_rdev);
- /* Increment our usage count for the module.
- * This is redundant here, because "struct file_operations"
- * has an "owner" field. This line is included here soley as
- * a reference for drivers using lesser structures... ;-)
- */
- MOD_INC_USE_COUNT;
-
- /* lock our minor table and get our local data for this minor */
- down (&minor_table_mutex);
- dev = minor_table[subminor];
- if (dev == NULL) {
- up (&minor_table_mutex);
- MOD_DEC_USE_COUNT;
+ interface = usb_find_interface (&skel_driver,
+ mk_kdev(USB_MAJOR, subminor));
+ if (!interface) {
+ err ("%s - error, can't find device for minor %d",
+ __FUNCTION__, subminor);
return -ENODEV;
}
+
+ dev = dev_get_drvdata (&interface->dev);
+ if (!dev)
+ return -ENODEV;
/* lock this device */
down (&dev->sem);
- /* unlock the minor table */
- up (&minor_table_mutex);
-
/* increment our usage count for the driver */
- ++dev->open_count;
+ ++dev->open;
/* save our object in the file's private structure */
file->private_data = dev;
@@ -297,13 +271,10 @@
dbg("%s - minor %d", __FUNCTION__, dev->minor);
- /* lock our minor table */
- down (&minor_table_mutex);
-
/* lock our device */
down (&dev->sem);
- if (dev->open_count <= 0) {
+ if (dev->open <= 0) {
dbg ("%s - device not opened", __FUNCTION__);
retval = -ENODEV;
goto exit_not_opened;
@@ -313,25 +284,16 @@
/* the device was unplugged before the file was released */
up (&dev->sem);
skel_delete (dev);
- up (&minor_table_mutex);
- MOD_DEC_USE_COUNT;
return 0;
}
- /* decrement our usage count for the device */
- --dev->open_count;
- if (dev->open_count <= 0) {
- /* shutdown any bulk writes that might be going on */
- usb_unlink_urb (dev->write_urb);
- dev->open_count = 0;
- }
+ /* shutdown any bulk writes that might be going on */
+ usb_unlink_urb (dev->write_urb);
- /* decrement our usage count for the module */
- MOD_DEC_USE_COUNT;
+ dev->open = 0;
exit_not_opened:
up (&dev->sem);
- up (&minor_table_mutex);
return retval;
}
@@ -529,7 +491,6 @@
return -ENODEV;
}
- down (&minor_table_mutex);
retval = usb_register_dev (&skel_fops, USB_SKEL_MINOR_BASE, 1, &minor);
if (retval) {
/* something prevented us from registering this driver */
@@ -544,7 +505,6 @@
goto exit_minor;
}
memset (dev, 0x00, sizeof (*dev));
- minor_table[minor] = dev;
init_MUTEX (&dev->sem);
dev->udev = udev;
@@ -600,13 +560,17 @@
dev->devfs = devfs_register (usb_devfs_handle, name,
DEVFS_FL_DEFAULT, USB_MAJOR,
- USB_SKEL_MINOR_BASE + dev->minor,
+ dev->minor,
S_IFCHR | S_IRUSR | S_IWUSR |
S_IRGRP | S_IWGRP | S_IROTH,
&skel_fops, NULL);
/* let the user know what node this device is now attached to */
info ("USB Skeleton device now attached to USBSkel%d", dev->minor);
+
+ /* add device id so the device works when advertised */
+ interface->kdev = mk_kdev(USB_MAJOR, dev->minor);
+
goto exit;
error:
@@ -617,7 +581,6 @@
usb_deregister_dev (1, minor);
exit:
- up (&minor_table_mutex);
if (dev) {
dev_set_drvdata (&interface->dev, dev);
return 0;
@@ -642,9 +605,11 @@
if (!dev)
return;
- down (&minor_table_mutex);
down (&dev->sem);
+ /* remove device id to disable open() */
+ interface->kdev = NODEV;
+
minor = dev->minor;
/* remove our devfs node */
@@ -654,7 +619,7 @@
usb_deregister_dev (1, minor);
/* if the device is not opened, then we clean up right now */
- if (!dev->open_count) {
+ if (!dev->open) {
up (&dev->sem);
skel_delete (dev);
} else {
@@ -663,7 +628,6 @@
}
info("USB Skeleton #%d now disconnected", minor);
- up (&minor_table_mutex);
}
-------------------------------------------------------
This sf.net email is sponsored by:
With Great Power, Comes Great Responsibility
Learn to use your power at OSDN's High Performance Computing Channel
http://hpc.devchannel.org/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel