kingst-la2016: setup usb transfer sizes to be multiple of endpoint max packet size...
authorKevin Grant <planet911@gmx.com>
Fri, 1 Oct 2021 17:04:08 +0000 (18:04 +0100)
committerSoeren Apel <soeren@apelpie.net>
Sat, 2 Oct 2021 12:58:13 +0000 (14:58 +0200)
src/hardware/kingst-la2016/api.c
src/hardware/kingst-la2016/protocol.c
src/hardware/kingst-la2016/protocol.h

index 9ab2e564f944435750e44afdd5ef344a5bb0f512..1b1b425a0204169440429807430067f4ac58064a 100644 (file)
@@ -641,8 +641,11 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
        devc->n_bytes_to_read -= transfer->actual_length;
        if (devc->n_bytes_to_read) {
                uint32_t to_read = devc->n_bytes_to_read;
-               if (to_read > LA2016_BULK_MAX)
-                       to_read = LA2016_BULK_MAX;
+               /* determine read size for the next usb transfer */
+               if (to_read >= LA2016_USB_BUFSZ)
+                       to_read = LA2016_USB_BUFSZ;
+               else /* last transfer, make read size some multiple of LA2016_EP6_PKTSZ */
+                       to_read = (to_read + (LA2016_EP6_PKTSZ-1)) & ~(LA2016_EP6_PKTSZ-1);
                libusb_fill_bulk_transfer(
                        transfer, usb->devhdl,
                        0x86, transfer->buffer, to_read,
index 22d944110c92c48ba375099aba08e9b221489583..ecb21e3faa7af4c34eabccc3a6f85edf576f6a62 100644 (file)
@@ -723,9 +723,11 @@ SR_PRIV int la2016_start_retrieval(const struct sr_dev_inst *sdi, libusb_transfe
        }
 
        to_read = devc->n_bytes_to_read;
-       if (to_read > LA2016_BULK_MAX)
-               to_read = LA2016_BULK_MAX;
-
+       /* choose a buffer size for all of the usb transfers */
+       if (to_read >= LA2016_USB_BUFSZ)
+               to_read = LA2016_USB_BUFSZ; /* multiple transfers */
+       else /* one transfer, make buffer size some multiple of LA2016_EP6_PKTSZ */
+               to_read = (to_read + (LA2016_EP6_PKTSZ-1)) & ~(LA2016_EP6_PKTSZ-1);
        buffer = g_try_malloc(to_read);
        if (!buffer) {
                sr_err("Failed to allocate %d bytes for bulk transfer", to_read);
index 58998b24290bd0b9f7251f48e376aa86384822bf..09e12be6577d8739b860745a152f7f67648b0a4c 100644 (file)
 
 #define LA2016_BULK_MAX         8388608
 
+/*
+ * On Windows sigrok uses WinUSB RAW_IO policy which requires the
+ * USB transfer buffer size to be a multiple of the endpoint max packet
+ * size, which is 512 bytes in this case. Also, the maximum allowed size of
+ * the transfer buffer is normally read from WinUSB_GetPipePolicy API but
+ * libusb does not expose this function. Typically, max size is 2MB.
+ */
+#define LA2016_EP6_PKTSZ       512 /* endpoint 6 max packet size */
+#define LA2016_USB_BUFSZ       (256 * 2 * LA2016_EP6_PKTSZ) /* 256KB buffer */
+
 #define MAX_RENUM_DELAY_MS     3000
 #define DEFAULT_TIMEOUT_MS      200