]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/usb-skeleton.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm
[linux-2.6-omap-h63xx.git] / drivers / usb / usb-skeleton.c
index 59973aecd96828269bf7b72d6e6575726a111ee0..be76084c8d7e6a8f8429e389c9a5149e01d1db6d 100644 (file)
@@ -88,7 +88,7 @@ static int skel_open(struct inode *inode, struct file *file)
        interface = usb_find_interface(&skel_driver, subminor);
        if (!interface) {
                err ("%s - error, can't find device for minor %d",
-                    __FUNCTION__, subminor);
+                    __func__, subminor);
                retval = -ENODEV;
                goto exit;
        }
@@ -125,6 +125,7 @@ static int skel_open(struct inode *inode, struct file *file)
 
        /* save our object in the file's private structure */
        file->private_data = dev;
+       mutex_unlock(&dev->io_mutex);
 
 exit:
        return retval;
@@ -211,7 +212,7 @@ static void skel_write_bulk_callback(struct urb *urb)
 {
        struct usb_skel *dev;
 
-       dev = (struct usb_skel *)urb->context;
+       dev = urb->context;
 
        /* sync/async unlink faults aren't errors */
        if (urb->status) {
@@ -219,7 +220,7 @@ static void skel_write_bulk_callback(struct urb *urb)
                    urb->status == -ECONNRESET ||
                    urb->status == -ESHUTDOWN))
                        err("%s - nonzero write bulk status received: %d",
-                           __FUNCTION__, urb->status);
+                           __func__, urb->status);
 
                spin_lock(&dev->err_lock);
                dev->errors = urb->status;
@@ -300,7 +301,7 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
        retval = usb_submit_urb(urb, GFP_KERNEL);
        mutex_unlock(&dev->io_mutex);
        if (retval) {
-               err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
+               err("%s - failed submitting write urb, error %d", __func__, retval);
                goto error_unanchor;
        }
 
@@ -467,12 +468,35 @@ static int skel_resume (struct usb_interface *intf)
        return 0;
 }
 
+static int skel_pre_reset(struct usb_interface *intf)
+{
+       struct usb_skel *dev = usb_get_intfdata(intf);
+
+       mutex_lock(&dev->io_mutex);
+       skel_draw_down(dev);
+
+       return 0;
+}
+
+static int skel_post_reset(struct usb_interface *intf)
+{
+       struct usb_skel *dev = usb_get_intfdata(intf);
+
+       /* we are sure no URBs are active - no locking needed */
+       dev->errors = -EPIPE;
+       mutex_unlock(&dev->io_mutex);
+
+       return 0;
+}
+
 static struct usb_driver skel_driver = {
        .name =         "skeleton",
        .probe =        skel_probe,
        .disconnect =   skel_disconnect,
        .suspend =      skel_suspend,
        .resume =       skel_resume,
+       .pre_reset =    skel_pre_reset,
+       .post_reset =   skel_post_reset,
        .id_table =     skel_table,
        .supports_autosuspend = 1,
 };