libusb: add patch to fix "BOGUS urb flags" issue
authorSteve Sakoman <steve@sakoman.com>
Wed, 3 Mar 2010 05:47:05 +0000 (21:47 -0800)
committerKoen Kooi <koen@openembedded.org>
Fri, 5 Mar 2010 09:05:08 +0000 (10:05 +0100)
issue occurs when using gphoto2 to download photos from digital cameras

recipes/libusb/files/libusb-shortok.patch [new file with mode: 0644]
recipes/libusb/libusb1_1.0.4.bb

diff --git a/recipes/libusb/files/libusb-shortok.patch b/recipes/libusb/files/libusb-shortok.patch
new file mode 100644 (file)
index 0000000..4e7831a
--- /dev/null
@@ -0,0 +1,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;
index d2d4937..1e56006 100644 (file)
@@ -3,7 +3,12 @@ HOMEPAGE = "http://libusb.sf.net"
 SECTION = "libs"
 LICENSE = "LGPL"
 
-SRC_URI = "${SOURCEFORGE_MIRROR}/libusb/libusb-${PV}.tar.bz2"
+PR = "r1"
+
+SRC_URI = " \
+           ${SOURCEFORGE_MIRROR}/libusb/libusb-${PV}.tar.bz2 \
+           file://libusb-shortok.patch;patch=1 \
+          "
 S = "${WORKDIR}/libusb-${PV}"
 
 inherit autotools