aboutsummaryrefslogtreecommitdiff
path: root/lib/libusb
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2016-09-02 08:44:14 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2016-09-02 08:44:14 +0000
commit5f51814803d36f2201fa05b95975671aaf6bf7d7 (patch)
tree4ee9b30132904639aa4aaad0f5e790c9f5a2a322 /lib/libusb
parent7a83ecc454aac6dfc05b2c9901b5c4d2bc44448d (diff)
Notes
Diffstat (limited to 'lib/libusb')
-rw-r--r--lib/libusb/libusb20.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c
index 2f4ee780cabc..91ed9d797afd 100644
--- a/lib/libusb/libusb20.c
+++ b/lib/libusb/libusb20.c
@@ -176,6 +176,12 @@ libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
return (LIBUSB20_ERROR_BUSY);
if (MaxFrameCount & LIBUSB20_MAX_FRAME_PRE_SCALE) {
MaxFrameCount &= ~LIBUSB20_MAX_FRAME_PRE_SCALE;
+ /*
+ * The kernel can setup 8 times more frames when
+ * pre-scaling ISOCHRONOUS transfers. Make sure the
+ * length and pointer buffers are big enough:
+ */
+ MaxFrameCount *= 8;
pre_scale = 1;
} else {
pre_scale = 0;
@@ -200,8 +206,13 @@ libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
}
memset(xfer->ppBuffer, 0, size);
- error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
- MaxFrameCount, ep_no, stream_id, pre_scale);
+ if (pre_scale) {
+ error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
+ MaxFrameCount / 8, ep_no, stream_id, 1);
+ } else {
+ error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
+ MaxFrameCount, ep_no, stream_id, 0);
+ }
if (error) {
free(xfer->ppBuffer);