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) | |
download | src-5f51814803d36f2201fa05b95975671aaf6bf7d7.tar.gz src-5f51814803d36f2201fa05b95975671aaf6bf7d7.zip |
Fix array size issue when using the pre-scaling feature for
ISOCHRONOUS USB transfers. Make sure enough length and buffer pointers
are allocated when setting up the libusb transfer structure to support
the maximum number of frames the kernel can handle.
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=305284
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); |