]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/misc/iowarrior.c
Merge branch 'for-2.6.27' of git://git.infradead.org/users/dwmw2/firmware-2.6
[linux-2.6-omap-h63xx.git] / drivers / usb / misc / iowarrior.c
index d372fbc4effbb0a44c31213142c92f720a13bea3..1cb54a28347f0fe332363df6c3dcac7d11770573 100644 (file)
@@ -66,6 +66,7 @@ module_param(debug, bool, 0644);
 MODULE_PARM_DESC(debug, "debug=1 enables debugging messages");
 
 static struct usb_driver iowarrior_driver;
+static DEFINE_MUTEX(iowarrior_open_disc_lock);
 
 /*--------------*/
 /*     data     */
@@ -153,7 +154,7 @@ MODULE_DEVICE_TABLE(usb, iowarrior_ids);
  */
 static void iowarrior_callback(struct urb *urb)
 {
-       struct iowarrior *dev = (struct iowarrior *)urb->context;
+       struct iowarrior *dev = urb->context;
        int intr_idx;
        int read_idx;
        int aux_idx;
@@ -217,7 +218,7 @@ exit:
        retval = usb_submit_urb(urb, GFP_ATOMIC);
        if (retval)
                dev_err(&dev->interface->dev, "%s - usb_submit_urb failed with result %d\n",
-                       __FUNCTION__, retval);
+                       __func__, retval);
 
 }
 
@@ -229,7 +230,7 @@ static void iowarrior_write_callback(struct urb *urb)
        struct iowarrior *dev;
        int status = urb->status;
 
-       dev = (struct iowarrior *)urb->context;
+       dev = urb->context;
        /* sync/async unlink faults aren't errors */
        if (status &&
            !(status == -ENOENT ||
@@ -351,7 +352,7 @@ static ssize_t iowarrior_write(struct file *file,
 
        mutex_lock(&dev->mutex);
        /* verify that the device wasn't unplugged */
-       if (dev == NULL || !dev->present) {
+       if (!dev->present) {
                retval = -ENODEV;
                goto exit;
        }
@@ -452,7 +453,7 @@ static ssize_t iowarrior_write(struct file *file,
        default:
                /* what do we have here ? An unsupported Product-ID ? */
                dev_err(&dev->interface->dev, "%s - not supported for product=0x%x\n",
-                       __FUNCTION__, dev->product_id);
+                       __func__, dev->product_id);
                retval = -EFAULT;
                goto exit;
                break;
@@ -603,16 +604,20 @@ static int iowarrior_open(struct inode *inode, struct file *file)
 
        interface = usb_find_interface(&iowarrior_driver, subminor);
        if (!interface) {
-               err("%s - error, can't find device for minor %d", __FUNCTION__,
+               err("%s - error, can't find device for minor %d", __func__,
                    subminor);
                return -ENODEV;
        }
 
+       mutex_lock(&iowarrior_open_disc_lock);
        dev = usb_get_intfdata(interface);
-       if (!dev)
+       if (!dev) {
+               mutex_unlock(&iowarrior_open_disc_lock);
                return -ENODEV;
+       }
 
        mutex_lock(&dev->mutex);
+       mutex_unlock(&iowarrior_open_disc_lock);
 
        /* Only one process can open each device, no sharing. */
        if (dev->opened) {
@@ -710,7 +715,7 @@ static unsigned iowarrior_poll(struct file *file, poll_table * wait)
  * would use "struct net_driver" instead, and a serial
  * device would use "struct tty_driver".
  */
-static struct file_operations iowarrior_fops = {
+static const struct file_operations iowarrior_fops = {
        .owner = THIS_MODULE,
        .write = iowarrior_write,
        .read = iowarrior_read,
@@ -866,6 +871,7 @@ static void iowarrior_disconnect(struct usb_interface *interface)
        int minor;
 
        dev = usb_get_intfdata(interface);
+       mutex_lock(&iowarrior_open_disc_lock);
        usb_set_intfdata(interface, NULL);
 
        minor = dev->minor;
@@ -879,6 +885,7 @@ static void iowarrior_disconnect(struct usb_interface *interface)
        dev->present = 0;
 
        mutex_unlock(&dev->mutex);
+       mutex_unlock(&iowarrior_open_disc_lock);
 
        if (dev->opened) {
                /* There is a process that holds a filedescriptor to the device ,