Merge 3.4-rc6 into usb-next
[deliverable/linux.git] / drivers / usb / class / cdc-wdm.c
index 0bb2b3248dad99b0e114b83dc1028edd5fadb4a1..5d151653ae432b86385d8159660200b0b0d1c7d9 100644 (file)
@@ -369,6 +369,7 @@ static ssize_t wdm_write
        r = usb_autopm_get_interface(desc->intf);
        if (r < 0) {
                kfree(buf);
+               rv = usb_translate_errors(r);
                goto outnp;
        }
 
@@ -384,6 +385,7 @@ static ssize_t wdm_write
 
        if (r < 0) {
                kfree(buf);
+               rv = r;
                goto out;
        }
 
@@ -415,6 +417,7 @@ static ssize_t wdm_write
                desc->outbuf = NULL;
                clear_bit(WDM_IN_USE, &desc->flags);
                dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv);
+               rv = usb_translate_errors(rv);
        } else {
                dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
                        req->wIndex);
@@ -534,7 +537,7 @@ static int wdm_flush(struct file *file, fl_owner_t id)
                dev_err(&desc->intf->dev, "Error in flush path: %d\n",
                        desc->werr);
 
-       return desc->werr;
+       return usb_translate_errors(desc->werr);
 }
 
 static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)
@@ -596,6 +599,7 @@ static int wdm_open(struct inode *inode, struct file *file)
                        desc->count--;
                        dev_err(&desc->intf->dev,
                                "Error submitting int urb - %d\n", rv);
+                       rv = usb_translate_errors(rv);
                }
        } else {
                rv = 0;
@@ -623,8 +627,12 @@ static int wdm_release(struct inode *inode, struct file *file)
        if (!desc->count) {
                dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
                kill_urbs(desc);
-               if (!test_bit(WDM_DISCONNECTING, &desc->flags))
+               if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
                        desc->manage_power(desc->intf, 0);
+               } else {
+                       dev_dbg(&desc->intf->dev, "%s: device gone - cleaning up\n", __func__);
+                       cleanup(desc);
+               }
        }
        mutex_unlock(&wdm_mutex);
        return 0;
@@ -898,6 +906,8 @@ static void wdm_disconnect(struct usb_interface *intf)
        mutex_unlock(&desc->rlock);
        if (!desc->count)
                cleanup(desc);
+       else
+               dev_dbg(&intf->dev, "%s: %d open files - postponing cleanup\n", __func__, desc->count);
        mutex_unlock(&wdm_mutex);
 }
 
This page took 0.0499 seconds and 5 git commands to generate.