diff options
| author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2016-09-02 08:44:14 +0000 |
|---|---|---|
| committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2016-09-02 08:44:14 +0000 |
| commit | 5f51814803d36f2201fa05b95975671aaf6bf7d7 (patch) | |
| tree | 4ee9b30132904639aa4aaad0f5e790c9f5a2a322 /lib/libusb | |
| parent | 7a83ecc454aac6dfc05b2c9901b5c4d2bc44448d (diff) | |
Notes
Diffstat (limited to 'lib/libusb')
| -rw-r--r-- | lib/libusb/libusb20.c | 15 |
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); |
