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,
}
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);
#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