diff options
Diffstat (limited to 'drivers/usb/core/devio.c')
-rw-r--r-- | drivers/usb/core/devio.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index a678186f218f..431d17287a86 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -1104,13 +1104,25 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
1104 | case USB_ENDPOINT_XFER_CONTROL: | 1104 | case USB_ENDPOINT_XFER_CONTROL: |
1105 | case USB_ENDPOINT_XFER_ISOC: | 1105 | case USB_ENDPOINT_XFER_ISOC: |
1106 | return -EINVAL; | 1106 | return -EINVAL; |
1107 | /* allow single-shot interrupt transfers, at bogus rates */ | 1107 | case USB_ENDPOINT_XFER_INT: |
1108 | /* allow single-shot interrupt transfers */ | ||
1109 | uurb->type = USBDEVFS_URB_TYPE_INTERRUPT; | ||
1110 | goto interrupt_urb; | ||
1108 | } | 1111 | } |
1109 | uurb->number_of_packets = 0; | 1112 | uurb->number_of_packets = 0; |
1110 | if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE) | 1113 | if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE) |
1111 | return -EINVAL; | 1114 | return -EINVAL; |
1112 | break; | 1115 | break; |
1113 | 1116 | ||
1117 | case USBDEVFS_URB_TYPE_INTERRUPT: | ||
1118 | if (!usb_endpoint_xfer_int(&ep->desc)) | ||
1119 | return -EINVAL; | ||
1120 | interrupt_urb: | ||
1121 | uurb->number_of_packets = 0; | ||
1122 | if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE) | ||
1123 | return -EINVAL; | ||
1124 | break; | ||
1125 | |||
1114 | case USBDEVFS_URB_TYPE_ISO: | 1126 | case USBDEVFS_URB_TYPE_ISO: |
1115 | /* arbitrary limit */ | 1127 | /* arbitrary limit */ |
1116 | if (uurb->number_of_packets < 1 || | 1128 | if (uurb->number_of_packets < 1 || |
@@ -1143,14 +1155,6 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
1143 | uurb->buffer_length = totlen; | 1155 | uurb->buffer_length = totlen; |
1144 | break; | 1156 | break; |
1145 | 1157 | ||
1146 | case USBDEVFS_URB_TYPE_INTERRUPT: | ||
1147 | uurb->number_of_packets = 0; | ||
1148 | if (!usb_endpoint_xfer_int(&ep->desc)) | ||
1149 | return -EINVAL; | ||
1150 | if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE) | ||
1151 | return -EINVAL; | ||
1152 | break; | ||
1153 | |||
1154 | default: | 1158 | default: |
1155 | return -EINVAL; | 1159 | return -EINVAL; |
1156 | } | 1160 | } |