diff options
-rw-r--r-- | drivers/usb/core/devio.c | 27 | ||||
-rw-r--r-- | include/linux/usbdevice_fs.h | 7 |
2 files changed, 28 insertions, 6 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 039ba23cc8b6..6c4cd82d7d14 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -948,8 +948,11 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
948 | int ret, ifnum = -1; | 948 | int ret, ifnum = -1; |
949 | int is_in; | 949 | int is_in; |
950 | 950 | ||
951 | if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP|USBDEVFS_URB_SHORT_NOT_OK| | 951 | if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP | |
952 | URB_NO_FSBR|URB_ZERO_PACKET)) | 952 | USBDEVFS_URB_SHORT_NOT_OK | |
953 | USBDEVFS_URB_NO_FSBR | | ||
954 | USBDEVFS_URB_ZERO_PACKET | | ||
955 | USBDEVFS_URB_NO_INTERRUPT)) | ||
953 | return -EINVAL; | 956 | return -EINVAL; |
954 | if (!uurb->buffer) | 957 | if (!uurb->buffer) |
955 | return -EINVAL; | 958 | return -EINVAL; |
@@ -1104,8 +1107,24 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
1104 | as->urb->pipe = (uurb->type << 30) | | 1107 | as->urb->pipe = (uurb->type << 30) | |
1105 | __create_pipe(ps->dev, uurb->endpoint & 0xf) | | 1108 | __create_pipe(ps->dev, uurb->endpoint & 0xf) | |
1106 | (uurb->endpoint & USB_DIR_IN); | 1109 | (uurb->endpoint & USB_DIR_IN); |
1107 | as->urb->transfer_flags = uurb->flags | | 1110 | |
1108 | (is_in ? URB_DIR_IN : URB_DIR_OUT); | 1111 | /* This tedious sequence is necessary because the URB_* flags |
1112 | * are internal to the kernel and subject to change, whereas | ||
1113 | * the USBDEVFS_URB_* flags are a user API and must not be changed. | ||
1114 | */ | ||
1115 | u = (is_in ? URB_DIR_IN : URB_DIR_OUT); | ||
1116 | if (uurb->flags & USBDEVFS_URB_ISO_ASAP) | ||
1117 | u |= URB_ISO_ASAP; | ||
1118 | if (uurb->flags & USBDEVFS_URB_SHORT_NOT_OK) | ||
1119 | u |= URB_SHORT_NOT_OK; | ||
1120 | if (uurb->flags & USBDEVFS_URB_NO_FSBR) | ||
1121 | u |= URB_NO_FSBR; | ||
1122 | if (uurb->flags & USBDEVFS_URB_ZERO_PACKET) | ||
1123 | u |= URB_ZERO_PACKET; | ||
1124 | if (uurb->flags & USBDEVFS_URB_NO_INTERRUPT) | ||
1125 | u |= URB_NO_INTERRUPT; | ||
1126 | as->urb->transfer_flags = u; | ||
1127 | |||
1109 | as->urb->transfer_buffer_length = uurb->buffer_length; | 1128 | as->urb->transfer_buffer_length = uurb->buffer_length; |
1110 | as->urb->setup_packet = (unsigned char *)dr; | 1129 | as->urb->setup_packet = (unsigned char *)dr; |
1111 | as->urb->start_frame = uurb->start_frame; | 1130 | as->urb->start_frame = uurb->start_frame; |
diff --git a/include/linux/usbdevice_fs.h b/include/linux/usbdevice_fs.h index 17cb108b7db0..3118ede2c67b 100644 --- a/include/linux/usbdevice_fs.h +++ b/include/linux/usbdevice_fs.h | |||
@@ -77,8 +77,11 @@ struct usbdevfs_connectinfo { | |||
77 | unsigned char slow; | 77 | unsigned char slow; |
78 | }; | 78 | }; |
79 | 79 | ||
80 | #define USBDEVFS_URB_SHORT_NOT_OK 1 | 80 | #define USBDEVFS_URB_SHORT_NOT_OK 0x01 |
81 | #define USBDEVFS_URB_ISO_ASAP 2 | 81 | #define USBDEVFS_URB_ISO_ASAP 0x02 |
82 | #define USBDEVFS_URB_NO_FSBR 0x20 | ||
83 | #define USBDEVFS_URB_ZERO_PACKET 0x40 | ||
84 | #define USBDEVFS_URB_NO_INTERRUPT 0x80 | ||
82 | 85 | ||
83 | #define USBDEVFS_URB_TYPE_ISO 0 | 86 | #define USBDEVFS_URB_TYPE_ISO 0 |
84 | #define USBDEVFS_URB_TYPE_INTERRUPT 1 | 87 | #define USBDEVFS_URB_TYPE_INTERRUPT 1 |