Linux: fix sending of zero length bulk packets
authorDaniel Drake <dsd@gentoo.org>
Sat, 20 Jun 2009 21:33:21 +0000 (22:33 +0100)
committerDaniel Drake <dsd@gentoo.org>
Sat, 20 Jun 2009 21:33:21 +0000 (22:33 +0100)
Note that there are is a kernel bug preventing this from working
properly at the moment, even after this fix.

libusb/os/linux_usbfs.c

index 08de28c1f6f48529ab20aa28bebc62fe1f470d99..f9899cfcfe08732bae2966dd78e29520835c2770 100644 (file)
@@ -1276,7 +1276,9 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer,
        int num_urbs = transfer->length / MAX_BULK_BUFFER_LENGTH;
        int last_urb_partial = 0;
 
-       if ((transfer->length % MAX_BULK_BUFFER_LENGTH) > 0) {
+       if (transfer->length == 0) {
+               num_urbs = 1;
+       } else if ((transfer->length % MAX_BULK_BUFFER_LENGTH) > 0) {
                last_urb_partial = 1;
                num_urbs++;
        }
@@ -1300,6 +1302,8 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer,
                urb->buffer = transfer->buffer + (i * MAX_BULK_BUFFER_LENGTH);
                if (i == num_urbs - 1 && last_urb_partial)
                        urb->buffer_length = transfer->length % MAX_BULK_BUFFER_LENGTH;
+               else if (transfer->length == 0)
+                       urb->buffer_length = 0;
                else
                        urb->buffer_length = MAX_BULK_BUFFER_LENGTH;