Merge tag 'armsoc-defconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[cascardo/linux.git] / drivers / usb / class / cdc-wdm.c
index a051a7a..61ea879 100644 (file)
@@ -245,7 +245,7 @@ static void wdm_int_callback(struct urb *urb)
        case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
                dev_dbg(&desc->intf->dev,
                        "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
-                       dr->wIndex, dr->wLength);
+                       le16_to_cpu(dr->wIndex), le16_to_cpu(dr->wLength));
                break;
 
        case USB_CDC_NOTIFY_NETWORK_CONNECTION:
@@ -262,7 +262,9 @@ static void wdm_int_callback(struct urb *urb)
                clear_bit(WDM_POLL_RUNNING, &desc->flags);
                dev_err(&desc->intf->dev,
                        "unknown notification %d received: index %d len %d\n",
-                       dr->bNotificationType, dr->wIndex, dr->wLength);
+                       dr->bNotificationType,
+                       le16_to_cpu(dr->wIndex),
+                       le16_to_cpu(dr->wLength));
                goto exit;
        }
 
@@ -339,7 +341,7 @@ static ssize_t wdm_write
        desc->werr = 0;
        spin_unlock_irq(&desc->iuspin);
        if (we < 0)
-               return -EIO;
+               return usb_translate_errors(we);
 
        buf = kmalloc(count, GFP_KERNEL);
        if (!buf) {
@@ -349,30 +351,25 @@ static ssize_t wdm_write
 
        r = copy_from_user(buf, buffer, count);
        if (r > 0) {
-               kfree(buf);
                rv = -EFAULT;
-               goto outnl;
+               goto out_free_mem;
        }
 
        /* concurrent writes and disconnect */
        r = mutex_lock_interruptible(&desc->wlock);
        rv = -ERESTARTSYS;
-       if (r) {
-               kfree(buf);
-               goto outnl;
-       }
+       if (r)
+               goto out_free_mem;
 
        if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
-               kfree(buf);
                rv = -ENODEV;
-               goto outnp;
+               goto out_free_mem_lock;
        }
 
        r = usb_autopm_get_interface(desc->intf);
        if (r < 0) {
-               kfree(buf);
                rv = usb_translate_errors(r);
-               goto outnp;
+               goto out_free_mem_lock;
        }
 
        if (!(file->f_flags & O_NONBLOCK))
@@ -386,9 +383,8 @@ static ssize_t wdm_write
                r = -EIO;
 
        if (r < 0) {
-               kfree(buf);
                rv = r;
-               goto out;
+               goto out_free_mem_pm;
        }
 
        req = desc->orq;
@@ -408,28 +404,35 @@ static ssize_t wdm_write
                             USB_RECIP_INTERFACE);
        req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
        req->wValue = 0;
-       req->wIndex = desc->inum;
+       req->wIndex = desc->inum; /* already converted */
        req->wLength = cpu_to_le16(count);
        set_bit(WDM_IN_USE, &desc->flags);
        desc->outbuf = buf;
 
        rv = usb_submit_urb(desc->command, GFP_KERNEL);
        if (rv < 0) {
-               kfree(buf);
                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);
+               goto out_free_mem_pm;
        } else {
                dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
-                       req->wIndex);
+                       le16_to_cpu(req->wIndex));
        }
-out:
+
        usb_autopm_put_interface(desc->intf);
-outnp:
        mutex_unlock(&desc->wlock);
 outnl:
        return rv < 0 ? rv : count;
+
+out_free_mem_pm:
+       usb_autopm_put_interface(desc->intf);
+out_free_mem_lock:
+       mutex_unlock(&desc->wlock);
+out_free_mem:
+       kfree(buf);
+       return rv;
 }
 
 /*
@@ -519,9 +522,9 @@ retry:
                spin_lock_irq(&desc->iuspin);
 
                if (desc->rerr) { /* read completed, error happened */
+                       rv = usb_translate_errors(desc->rerr);
                        desc->rerr = 0;
                        spin_unlock_irq(&desc->iuspin);
-                       rv = -EIO;
                        goto err;
                }
                /*
@@ -820,7 +823,7 @@ static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor
        desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
        desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
        desc->irq->wValue = 0;
-       desc->irq->wIndex = desc->inum;
+       desc->irq->wIndex = desc->inum; /* already converted */
        desc->irq->wLength = cpu_to_le16(desc->wMaxCommand);
 
        usb_fill_control_urb(