]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/core/devio.c
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
[linux-2.6-omap-h63xx.git] / drivers / usb / core / devio.c
index ae94176c64e41245efa23335d6a4787741ef9e7f..de17738f3acbab5c69066a81a31b041d25c5bf38 100644 (file)
@@ -647,6 +647,7 @@ static int proc_control(struct dev_state *ps, void __user *arg)
        struct usbdevfs_ctrltransfer ctrl;
        unsigned int tmo;
        unsigned char *tbuf;
+       unsigned wLength;
        int i, j, ret;
 
        if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
@@ -654,7 +655,8 @@ static int proc_control(struct dev_state *ps, void __user *arg)
        ret = check_ctrlrecip(ps, ctrl.bRequestType, ctrl.wIndex);
        if (ret)
                return ret;
-       if (ctrl.wLength > PAGE_SIZE)
+       wLength = ctrl.wLength;         /* To suppress 64k PAGE_SIZE warning */
+       if (wLength > PAGE_SIZE)
                return -EINVAL;
        tbuf = (unsigned char *)__get_free_page(GFP_KERNEL);
        if (!tbuf)
@@ -946,8 +948,11 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
        int ret, ifnum = -1;
        int is_in;
 
-       if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP|USBDEVFS_URB_SHORT_NOT_OK|
-                          URB_NO_FSBR|URB_ZERO_PACKET))
+       if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP |
+                               USBDEVFS_URB_SHORT_NOT_OK |
+                               USBDEVFS_URB_NO_FSBR |
+                               USBDEVFS_URB_ZERO_PACKET |
+                               USBDEVFS_URB_NO_INTERRUPT))
                return -EINVAL;
        if (!uurb->buffer)
                return -EINVAL;
@@ -1102,8 +1107,24 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
        as->urb->pipe = (uurb->type << 30) |
                        __create_pipe(ps->dev, uurb->endpoint & 0xf) |
                        (uurb->endpoint & USB_DIR_IN);
-       as->urb->transfer_flags = uurb->flags |
-                       (is_in ? URB_DIR_IN : URB_DIR_OUT);
+
+       /* This tedious sequence is necessary because the URB_* flags
+        * are internal to the kernel and subject to change, whereas
+        * the USBDEVFS_URB_* flags are a user API and must not be changed.
+        */
+       u = (is_in ? URB_DIR_IN : URB_DIR_OUT);
+       if (uurb->flags & USBDEVFS_URB_ISO_ASAP)
+               u |= URB_ISO_ASAP;
+       if (uurb->flags & USBDEVFS_URB_SHORT_NOT_OK)
+               u |= URB_SHORT_NOT_OK;
+       if (uurb->flags & USBDEVFS_URB_NO_FSBR)
+               u |= URB_NO_FSBR;
+       if (uurb->flags & USBDEVFS_URB_ZERO_PACKET)
+               u |= URB_ZERO_PACKET;
+       if (uurb->flags & USBDEVFS_URB_NO_INTERRUPT)
+               u |= URB_NO_INTERRUPT;
+       as->urb->transfer_flags = u;
+
        as->urb->transfer_buffer_length = uurb->buffer_length;
        as->urb->setup_packet = (unsigned char *)dr;
        as->urb->start_frame = uurb->start_frame;
@@ -1509,60 +1530,60 @@ static int usbdev_ioctl(struct inode *inode, struct file *file,
 
        switch (cmd) {
        case USBDEVFS_CONTROL:
-               snoop(&dev->dev, "%s: CONTROL\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: CONTROL\n", __func__);
                ret = proc_control(ps, p);
                if (ret >= 0)
                        inode->i_mtime = CURRENT_TIME;
                break;
 
        case USBDEVFS_BULK:
-               snoop(&dev->dev, "%s: BULK\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: BULK\n", __func__);
                ret = proc_bulk(ps, p);
                if (ret >= 0)
                        inode->i_mtime = CURRENT_TIME;
                break;
 
        case USBDEVFS_RESETEP:
-               snoop(&dev->dev, "%s: RESETEP\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: RESETEP\n", __func__);
                ret = proc_resetep(ps, p);
                if (ret >= 0)
                        inode->i_mtime = CURRENT_TIME;
                break;
 
        case USBDEVFS_RESET:
-               snoop(&dev->dev, "%s: RESET\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: RESET\n", __func__);
                ret = proc_resetdevice(ps);
                break;
 
        case USBDEVFS_CLEAR_HALT:
-               snoop(&dev->dev, "%s: CLEAR_HALT\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: CLEAR_HALT\n", __func__);
                ret = proc_clearhalt(ps, p);
                if (ret >= 0)
                        inode->i_mtime = CURRENT_TIME;
                break;
 
        case USBDEVFS_GETDRIVER:
-               snoop(&dev->dev, "%s: GETDRIVER\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: GETDRIVER\n", __func__);
                ret = proc_getdriver(ps, p);
                break;
 
        case USBDEVFS_CONNECTINFO:
-               snoop(&dev->dev, "%s: CONNECTINFO\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: CONNECTINFO\n", __func__);
                ret = proc_connectinfo(ps, p);
                break;
 
        case USBDEVFS_SETINTERFACE:
-               snoop(&dev->dev, "%s: SETINTERFACE\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: SETINTERFACE\n", __func__);
                ret = proc_setintf(ps, p);
                break;
 
        case USBDEVFS_SETCONFIGURATION:
-               snoop(&dev->dev, "%s: SETCONFIGURATION\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: SETCONFIGURATION\n", __func__);
                ret = proc_setconfig(ps, p);
                break;
 
        case USBDEVFS_SUBMITURB:
-               snoop(&dev->dev, "%s: SUBMITURB\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: SUBMITURB\n", __func__);
                ret = proc_submiturb(ps, p);
                if (ret >= 0)
                        inode->i_mtime = CURRENT_TIME;
@@ -1571,60 +1592,60 @@ static int usbdev_ioctl(struct inode *inode, struct file *file,
 #ifdef CONFIG_COMPAT
 
        case USBDEVFS_SUBMITURB32:
-               snoop(&dev->dev, "%s: SUBMITURB32\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: SUBMITURB32\n", __func__);
                ret = proc_submiturb_compat(ps, p);
                if (ret >= 0)
                        inode->i_mtime = CURRENT_TIME;
                break;
 
        case USBDEVFS_REAPURB32:
-               snoop(&dev->dev, "%s: REAPURB32\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: REAPURB32\n", __func__);
                ret = proc_reapurb_compat(ps, p);
                break;
 
        case USBDEVFS_REAPURBNDELAY32:
-               snoop(&dev->dev, "%s: REAPURBDELAY32\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: REAPURBDELAY32\n", __func__);
                ret = proc_reapurbnonblock_compat(ps, p);
                break;
 
        case USBDEVFS_IOCTL32:
-               snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: IOCTL\n", __func__);
                ret = proc_ioctl_compat(ps, ptr_to_compat(p));
                break;
 #endif
 
        case USBDEVFS_DISCARDURB:
-               snoop(&dev->dev, "%s: DISCARDURB\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: DISCARDURB\n", __func__);
                ret = proc_unlinkurb(ps, p);
                break;
 
        case USBDEVFS_REAPURB:
-               snoop(&dev->dev, "%s: REAPURB\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: REAPURB\n", __func__);
                ret = proc_reapurb(ps, p);
                break;
 
        case USBDEVFS_REAPURBNDELAY:
-               snoop(&dev->dev, "%s: REAPURBDELAY\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: REAPURBDELAY\n", __func__);
                ret = proc_reapurbnonblock(ps, p);
                break;
 
        case USBDEVFS_DISCSIGNAL:
-               snoop(&dev->dev, "%s: DISCSIGNAL\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: DISCSIGNAL\n", __func__);
                ret = proc_disconnectsignal(ps, p);
                break;
 
        case USBDEVFS_CLAIMINTERFACE:
-               snoop(&dev->dev, "%s: CLAIMINTERFACE\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: CLAIMINTERFACE\n", __func__);
                ret = proc_claiminterface(ps, p);
                break;
 
        case USBDEVFS_RELEASEINTERFACE:
-               snoop(&dev->dev, "%s: RELEASEINTERFACE\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: RELEASEINTERFACE\n", __func__);
                ret = proc_releaseinterface(ps, p);
                break;
 
        case USBDEVFS_IOCTL:
-               snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__);
+               snoop(&dev->dev, "%s: IOCTL\n", __func__);
                ret = proc_ioctl_default(ps, p);
                break;
        }