aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/libusb/files/libusb-shortok.patch
blob: 4e7831af3698fdd8ccc5dd26f8bf329de51f97ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
The USBFS_URB_SHORT_NOT_OK flag is valid for IN urbs only.  When USB
debugging is enabled in the linux kernel its usb_submit_urb() function
will validate and reject OUT urbs where this flag is set.

E.g. you will see something like

  usb 1-1.4: BOGUS urb flags, 1 --> 0

when sending bulk urbs.

This patch sets USBFS_URB_SHORT_NOT_OK only for IN urbs.


Index: libusb-1.0.6/libusb/os/linux_usbfs.c
===================================================================
--- libusb-1.0.6.orig/libusb/os/linux_usbfs.c
+++ libusb-1.0.6/libusb/os/linux_usbfs.c
@@ -1360,11 +1360,13 @@ static int submit_bulk_transfer(struct u
 
 	for (i = 0; i < num_urbs; i++) {
 		struct usbfs_urb *urb = &urbs[i];
+		int is_out = ((transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK)
+			      == LIBUSB_ENDPOINT_OUT);
 		urb->usercontext = itransfer;
 		urb->type = urb_type;
 		urb->endpoint = transfer->endpoint;
 		urb->buffer = transfer->buffer + (i * MAX_BULK_BUFFER_LENGTH);
-		if (supports_flag_bulk_continuation)
+		if (supports_flag_bulk_continuation && !is_out)
 			urb->flags = USBFS_URB_SHORT_NOT_OK;
 		if (i == num_urbs - 1 && last_urb_partial)
 			urb->buffer_length = transfer->length % MAX_BULK_BUFFER_LENGTH;