|
@@ -1104,13 +1104,25 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
|
|
|
case USB_ENDPOINT_XFER_CONTROL:
|
|
|
case USB_ENDPOINT_XFER_ISOC:
|
|
|
return -EINVAL;
|
|
|
- /* allow single-shot interrupt transfers, at bogus rates */
|
|
|
+ case USB_ENDPOINT_XFER_INT:
|
|
|
+ /* allow single-shot interrupt transfers */
|
|
|
+ uurb->type = USBDEVFS_URB_TYPE_INTERRUPT;
|
|
|
+ goto interrupt_urb;
|
|
|
}
|
|
|
uurb->number_of_packets = 0;
|
|
|
if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
|
|
|
return -EINVAL;
|
|
|
break;
|
|
|
|
|
|
+ case USBDEVFS_URB_TYPE_INTERRUPT:
|
|
|
+ if (!usb_endpoint_xfer_int(&ep->desc))
|
|
|
+ return -EINVAL;
|
|
|
+ interrupt_urb:
|
|
|
+ uurb->number_of_packets = 0;
|
|
|
+ if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
|
|
|
+ return -EINVAL;
|
|
|
+ break;
|
|
|
+
|
|
|
case USBDEVFS_URB_TYPE_ISO:
|
|
|
/* arbitrary limit */
|
|
|
if (uurb->number_of_packets < 1 ||
|
|
@@ -1143,14 +1155,6 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
|
|
|
uurb->buffer_length = totlen;
|
|
|
break;
|
|
|
|
|
|
- case USBDEVFS_URB_TYPE_INTERRUPT:
|
|
|
- uurb->number_of_packets = 0;
|
|
|
- if (!usb_endpoint_xfer_int(&ep->desc))
|
|
|
- return -EINVAL;
|
|
|
- if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
|
|
|
- return -EINVAL;
|
|
|
- break;
|
|
|
-
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|